Inspiration
For every minute I spent grinding data structures and algorithms, I was probably spending five to ten times as long bingeing YouTube to make up for the mental damage. I got curious about where my attention actually went. What you can't measure, you can't change. So I set out to build an always-on background tracker.
As Spindle came together, something else became obvious. With all the data we capture about how someone spends their day, we can do more than show it back to them. We can suggest what to automate to free them from their routines.
That matters because of a pattern I keep seeing with my non-technical friends. They tell me they don't know where to start with AI. Most of them stay on the free plan, not because AI couldn't help, but because they can't picture what it could do for them. That's a cold-start problem. You can't ask an assistant to automate a chore you've never thought of as automatable. Spindle sidesteps the question: it already knows what eats your time, so it can come to you with "you've filled three forms from the same passbook this month - want me to do the next one?"
The tagline followed from that: a time tracker that saves you time. Most of us get about four thousand weeks (80 × 52 ≈ 4,160) to live. Spindle wants fewer of them spent on busywork.
What it does
Spindle has three parts that close one loop:
- Observe. A native Mac (Swift) and Windows (C#) app plus a Chrome extension capture activity across apps and websites. Nemotron then turns raw window titles into meaning: not "Chrome - 40 min" but "Researching visa requirements". You can finally see where your attention went, and correct it.
- Lock in. Block distractions, or earn leisure time by working towards a goal (Pomodoro + earned-leisure ring). Blocking is AI-gated, because YouTube can be a lecture or a reaction video. Nemotron classifies the screen context, Spindle recommends, and you decide.
- Automate. Spindle spots repetitive work and proposes doing it for you. In our demo run, a fellowship email arrives in Gmail asking for an ID photo and a completed bank form. Spindle picks it up automatically, gathers the official photo requirements with Tavily web search, prepares a photo that meets the spec (without changing who you are), reads your bank passbook, fills in the form, and drafts the reply with the attachments. All you do is click Send. Nothing goes out without that click.
Time returned
Done by hand, this one email costs most of an afternoon's momentum.
Time returned = Σ (manual time − review time) ≈ 75 estimated − 2 ≈ 73 min per application
Instead of spending money and going to a proper studio and back, our run takes about 9 minutes in the background while you do something else. That's roughly an hour back every time the "same drill" comes around: visas, fellowships, bank forms, school admin. Over time, Spindle measures manual time from your own tracked history instead of our estimate.
The loop: Observe the work → Spot the pattern → Automate it → Measure the time returned.
How we built it
I didn't want the biggest model on every call. I wanted the cheapest model that's reliably right for each one:
Nemotron Models on Nebius Token Factory routed by job
- Nemotron Nano for everyday, high frequency tasks
- Nemotron 3 Super (nemotron-3-super-120b-a12b) as agent workhorse
- Nemotron 3.5 Super VL to extract data from photos of documents
- Nemotron 3 Ultra for serious reasoning
Nebius Serverless for the heavy asynchronous work
Token Factory is where the models think. Serverless is where our own code runs when it's too slow or heavy for a web request:
- Preparation runs as a Serverless Job. A detected request email starts a job that runs the whole pipeline above and then exits. The UI streams progress and stops at the draft for your approval, and a 9-minute run never times out a web request.
- The image worker runs as a Serverless Endpoint. BiRefNet matting, retouching and fitting are packaged as a container the agent calls like any other tool.
- A weekly pattern-mining Job sends a week of labelled activity to Nemotron 3 Ultra and returns candidate automations.
Real-time labelling and block decisions call Token Factory directly from the app, because they need low latency.
Challenges we ran into
Not knowing if the demo was even possible. I wasn't sure AI could produce a passport-ready photo or fill a real bank form. The photo is the hard one because it demands exactness: you cannot change the identity of the person. Generative image models are great at making a photo look better and terrible at keeping it the same person. The breakthrough was remembering how retouchers have always done it, with masks and a clone stamp. So I didn't ask a model to generate image edits. I asked Nemotron to find the face, the mark and a clean donor patch, and let deterministic code do a bounded clone fill. Exactness then comes from code, judgement from the model.
OCR that's confidently wrong. On an angled passbook photo, a single read can return a plausible but wrong name. I added measured deskew, zoomed region reads, two independent readers, and a grounding check that rejects any field not copied verbatim from a cited span. That check caught a real misread in our demo run.
The coding agents themselves. Most of Spindle was built with AI coding agents running in parallel panes, and some of our hardest bugs were in that process, not in the product:
Finding the right model for the job. The first decision model was configured as Nemotron Nano with a 1,024-token output cap, and long agent turns overflowed it. That's why the routing table exists: Nano for short classification, Super for agent turns.
Coordination churn. With five or more agent panes relaying approval packets and "hold" notices, approved work sat blocked while scope questions kept going back to me. I fixed it by making one pane the single owner of the demo end to end, with every other pane stopping writes.
Agents reporting a state that wasn't real. One agent reported the Mac app as stopped while ps showed it still running. Another made two public rollouts on a wrong assumption about where Cloudflare injects a script into served pages, and both had to be rolled back before an independent review approved the fix. The lesson: verify against the system, not the agent's summary. Process checks and hash-bound release files became mandatory.
Fitting a long agent run into a budget. With a 24-call cap, every wasted turn counts. A form label that didn't match exactly, or re-inspecting the same page, used up the budget before the run finished. Batched skill loading, normalised label matching and moving runs into Serverless Jobs got the full email-to-draft run inside the budget.
Accomplishments that we're proud of
- It actually works! The identity photo output is usable, which means time and money saved already.
- The look and feel of the product - it took a lot of work but I felt it was important for getting non-technical users in
- The possible, low-friction insight to onboard non-technical users onto agentic AI via time-tracking
What we learned
- "Model decides, code executes" is how you get exactness out of a probabilistic system. It's also how you keep token use low.
- Matching each call to the right model mattered more than using the biggest one. Nano keeps the app responsive, Super does the work, and Ultra is kept for the questions that are actually hard.
- Agents, both the ones we built and the ones we built with, become trustworthy through evidence: hashed inputs and outputs, visible traces, and a human click at the point of no return.
What's next for Spindle
- One-click acceptance of the automations Ultra proposes from your week
- More "same drill" templates: visa applications, reimbursements, recurring reports, chasing status updates
- Measuring time returned from each user's own tracked history instead of estimates
- Windows capture at the same level as Mac, and fully local processing for people who want nothing to leave their machine
- Capability engine that builds tools and skills on-the-fly as requested
Built With
- cloudflare
- nemotron