Skip to content

Repository files navigation

Punchlist

Punchlist app icon — a pink boxing glove on an ocean blue gradient

A task list that stays out of your way.


Most task apps want to be project management software when they grow up. Punchlist doesn't. It's a personal to-do list — fast, opinionated, and intentionally small.

The key insight: your next action belongs at the bottom of the list, not the top. Traditional task lists put your most important item as far from your thumb as possible, then ask you to scroll past everything you're avoiding. Punchlist builds from the bottom up. The thing you need to do next is always right there, close at hand.

Tap an item to finish it. It gets a checkmark, turns green, and floats to the top of the list — as far away from you as it can get. Done means done; it's out of your way but still visible if you want to see what you've accomplished.

Pull an item down to make it next. No drag-and-drop reordering, no priority matrices, no due dates. If something needs to happen next, pull it to the bottom. That's it. One gesture, zero decisions.

Add from the bottom. The input bar lives where your thumbs already are. Type, tap done, keep moving. New items land right where they belong — at the front of the queue.

Punchlist screenshot — a simple task list with completed items at the top and the input bar at the bottom

Why it works

Punchlist is built on a few deliberate constraints:

  • No local database. State lives in Questbook and syncs over SSE. Your list is always current, never stale.
  • No offline anxiety. Mutations fire immediately regardless of connection state, and the SSE reconnect restores current state. If one doesn't reach the server you get one amber line above the input saying so, in the server's own words — never a spinner, never silence.
  • No dependencies. Zero third-party libraries. URLSession for HTTP, URLSession delegate for SSE streaming. That's the whole networking stack.
  • No reordering UI. You can finish things and you can pick what's next. That's the entire interaction model. Fewer choices means less friction.

Wait, wasn't there another list?

There was. Punchlist used to carry a project drawer alongside your personal list — a Knockout agent toggle, pipeline status, #project tag routing, the works. It's gone.

The backend moved to Questbook, which has no equivalent for any of it, and a half-wired drawer is worse than no drawer. What's left is the thing the app was always about: one list, three gestures. Those teeth still aren't going to brush themselves.

Under the hood

Items are Questbook quests in the dedicated punch realm. Reads and writes go through two QQL endpoints (/api/query, /api/mutate); /api/events streams a change-notification feed, and the app refetches the whole list whenever a quest moves. "Next" is the highest priority among open items, which is why bumping something just claims one above the current max.

See INVARIANTS.md for the exact wire shapes.

Building

Punchlist is a SwiftUI app targeting iOS 17+. Builds happen on a remote macOS host via SSH.

cp .env.example .env          # fill in real values
just build                    # simulator build
just build-device             # device build
just distribute               # archive + push IPA for ad-hoc distribution

Development

nix develop                   # enter dev shell
just typecheck                # type-check Swift without full build
just check                    # format + run the test suite
just build                    # full simulator build

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages