Independent ProjectIndependent Project
    /On the List

    On the List: A personal project

    Photograph the wobbly banister or mumble at your phone while holding a paint tray. The app works out the room, the job, and how long it honestly takes, then hands you three things each morning.

    At a glance

    Problem
    Renovation to-dos live in camera rolls, notes apps, whiteboards and half-remembered conversations, so nothing ever gets finished.
    Approach
    A punch-list app where capture is a photo or a voice ramble, and AI does the structuring instead of the person holding the paint tray.
    Outcome
    A working beta: one shared house list, three suggested tasks a day, and a progress view that makes slow work feel like progress.
    Role
    Product, design, and build
    Team
    Me, my husband, plus the house 

    See it in action

    A walkthrough of On the List: capturing a task by photo or voice, letting the parser fill in room, work type, and effort, and getting three things to do today.

    From many lists, to one

    We had purchased an old house that was in need of serious renovation. The bulk of the work had been done by the time I got involved with the project, but that last 20% of course takes forever to complete. Keeping track of it was even worse. My husband finally asked me to start a list so that I wasn't just pointing out things that needed to be done. Aha! There's a better way, I thought. And On the List was born.

    The positioning came straight from the research: the list already exists, it is just scattered across a camera roll, a notes app, a whiteboard, and dinner conversation.

    Make capture a snap

    Capture is one decision: point, talk, and let the parser fill in the rest.

    The entire capture flow is one decision: point the camera at the problem and talk. Blurry is fine. Everything else, the room, the type of work, how long it honestly takes, gets inferred after the fact and shown back to you as editable fields.

    The voice path runs a two-step pipeline. Audio goes to a speech-to-text model, then the transcript goes to a fast reasoning model with the house's own rooms, work types, and people passed in as candidate ids. The model returns a small JSON object: title, room ids, type ids, effort, whether to hire it out, and who it was assigned to.

    Two rules in that prompt matter more than the rest. It may never invent work that was not said, and it may never set priority. Priority is a household negotiation, not a model output. Anything it returns that is not in the supplied id lists is discarded before it reaches the database.

    Just three things a day

    A house with ninety open tasks does not have a prioritization problem, it has a starting problem. The home screen never shows ninety. It guesses from the day of the week and the time as to how much time you have to complete tasks and serves three tasks that fit that window.

    The ordering is deliberately unglamorous. Effort and priority rank the pool, but tasks that block other tasks come first, because a coat of primer has to dry before anything else happens that day, and tasks in the same room cluster together so you are not carrying tools up and down stairs. You can swap one out, snooze it for the day, or reshuffle the set.

    The Today view: three tasks sized to the time you actually have, with swap, snooze, and shuffle.

    Shared lists for the whole household

    Here a task lands in one place both people can see, filed to the right room, and either person can put their name on it (or assign it... iykyk) or leave it open for whoever gets there first.

    The daily three respects that: you can ask for your tasks or the whole house's. The argument moves off the individual task and onto the list, on a Sunday, which is a much cheaper place to have it.

    Making slow work feel like progress

    Renovation is a long grind with almost no feedback, so the app keeps two records of it. A burn down chart tracks how many tasks are added and how many are completed.

    The second record is trade levels, which came at the request of my husband because he loves badges and gamification. Finish three tasks tagged with a given trade and you are an apprentice, ten makes you a journeyman, twenty-five a master, using real trade titles played straight: painter, tile setter, finish carpenter, caulker. There are one-off badges too, for walking the whole house or catching something early. It is a small thing that turned out to shape behavior, because the tiers give you a reason to finish a boring caulking task.

    What I built it on

    The app is TanStack Start with a Supabase backend: rooms, tasks, task-to-work-type links, room photos, and an activity log.

    Transcription and parsing run server-side through the Lovable AI Gateway so no keys touch the client, with speech-to-text and a fast reasoning model behind two thin server functions. Access is limited to an allowlist of household members rather than open signup, because the I'm not made of money!

    Positioning it

    The waitlist site: capture by photo or voice, sorted by room, effort, and order, serving three tasks a day.

    I wrote and built the marketing site alongside the app, because the pitch is what forced the product to stay narrow. "Put it on the list. Do three things. Go outside." is a promise the app has to keep, and it killed a lot of tempting scope: no tutorials, no project management, no Gantt chart of your own home.

    Key Takeaways

    The hardest part of a to-do app is the first ten seconds.

    Every renovation list dies at capture. If logging a task costs a form, people take a photo instead and never come back to it. Making capture a photo or a sentence, and letting a model do the filing, is the entire product.

    Let AI structure the work, not decide the work.

    The model infers room, type of work, effort, and who was named. It is explicitly forbidden from setting priority or inventing tasks that were not said out loud. Judgment stays with the humans who live in the house.

    Constrain the model with the user's own data.

    Rooms, work types, and people are passed in as ids, and any id the model returns that is not on those lists gets thrown away. That single validation step turned a chatty transcript parser into something reliable enough to trust.

    Three is the feature.

    A house has ninety open tasks and that is exactly why nobody starts. Serving three that fit the time available, ordered so you do not walk the same trip twice, is the difference between a list and a Saturday.

    More case studies