Guide βΊ Project
Roadmap
What has shipped β up to the Pup ID, packs, the local AI Handler and the chat bot in 0.13.0, and the reworked Share in 0.14.0 β the milestones that are the build order, and the game layers behind them. A direction, not a schedule.
The roadmap is the issues and milestones in the repository. This page is the readable version of them. It is a direction, not a sprint: horizons flex with energy and interest, and anything below can be reordered by a good argument on an issue.
Shipped
| Version | Date | What |
|---|---|---|
| 0.1.0 | 2026-09-13 | The engine, the Handler, the wheel, training with photo verification, stamped export with five layouts, recap cards, voice memos, undo, the export bundle |
| 0.2.0 | 2026-09-14 | One /settings page with the play pages kept clean, the dashboard actions row, the retroactive log (when on every write), one-tap photo check-in, the share sheet |
| 0.3.0 | 2026-09-14 | This guide, served by the app; issue templates for testers |
| 0.5.0 | 2026-09-19 | The health module: Apple Health and SparkyFitness steer the game |
| 0.6.0 | 2026-09-19 | The kit module β gear, toys and consumables β and the badge engine |
| 0.7.0 | 2026-09-20 | Share cards: three kinds, seven themes, badges on the card |
| 0.8.0 | 2026-09-20 | /progress with four tabs, inline-SVG charts and the Insight block |
| 0.9.0 | 2026-09-22 | Hosted mode: one instance, many profiles behind an invite-only login, each in its own database |
| 0.9.1 | 2026-09-22 | Beta surveys and the tester handbook |
| 0.10.0 | 2026-09-23 | The habits module: one tap, a timer, a Shortcut, or a calendar another app writes; the first module to declare egress |
| 0.11.0 | 2026-09-23 | The coach: the Handler judges every habit, rewards consistency, has a word when you slack, and Insight reads the same facts |
| 0.12.0 | 2026-09-25 | Playsets β content from a file, data never code β and events: a window, a sign, badges from a menu of rules. Locktober 2026 is the first |
| 0.13.0 | 2026-09-29 | The Pup ID and papers, consent and the safeword, packs (dens, collars, whitelists, countersignatures), your own AI Handler, AI kennels, and the chat bot |
| 0.13.1 | 2026-09-30 | A penalty held back on a recovery day is written once, not on every tick |
| 0.14.0 | 2026-10-04 | Share, reworked: Dense and Check-in layouts, the event stamp, post text with hashtags, in-place editing on a phone, presets |
| 0.15.0 | 2026-10-04 | Mischief: marks beside your XP that change how your Handler treats you β lapse questions, the short leash, the doghouse, confessions β and orders: training that names a habit, standing days, and Zoomies for doing something else |
| 0.16.0 | 2026-10-04 | Leave it: the habits you want less of β limits from a menu, the nightly ledger, Dark days and Over the line, passes, and a streak that waits for yesterday to be decided |
| 0.16.1 | 2026-10-04 | A refused save keeps what you typed; log a bout from earlier in one form; Play and Wear said plainly; Progress loses "By activity" |
| 0.16.2 | 2026-10-04 | The nav is five menus β a tab bar on a phone, dropdowns on a wide screen; the Share milestone header no longer overlaps itself |
| 0.18.0 | 2026-10-05 | Quests: a chapter carries a goal β the want in your words, measured by a habit's own target, days locked or days reflected; the Handler carries it, the story and the keepsake say whether it was reached |
| 0.19.0 | 2026-10-11 | Talk to your AI Handler from the chat bot's room (!ask, a switch you turn on); verification challenges β proof asked at a moment you did not choose; the calendar opens a day; a share card can carry your standing; the hosted demo |
| 0.19.1 | 2026-10-11 | Catch up: the missed reflections of the week answered late in one entry β each Blank page becomes a Late page, no XP, the days stay blank |
| 0.20.0 | 2026-10-11 | Your Handler's profile: your AI Handler posts to a fediverse account of its own β pride, exposure, photos you tick, your own words β each post a draft you approve unless you hand that over too |
| 0.21.0 | 2026-10-13 | Hygiene from the room: !hygiene and !relocked in the chat bot's room, behind their own switch, and the bot asks "locked back up?" when a window runs out; π Long soak, a Mischief mark for a window run past its time |
| 0.21.1 | 2026-10-18 | ai.keep_alive_minutes (blank = the cycle plus 10 β a warm model between cycles) and a reply schema with one branch per action type, its keys and ranges, so an empty-shell action is ungrammatical |
| 0.22.0 | 2026-10-19 | Today's mantra, voiced: a 3β5 minute wake and bed track rendered overnight by a local voice (handlr-voice, opt-in), the voice chosen by ear; played to the end counts as recited; the bot can post the wake one |
| 0.23.0 | 2026-10-21 | Kennel Card: your pup homepage β a Tag, your links, a Toy box and a Wishlist β shown through views (one random link each, each its own ticks) and built as a static site you host anywhere; the box never serves it |
| 0.24.0 | 2026-10-21 | Kennel Card publishing: a diff of what each link's holders will see before you publish, take-down pages for old and deleted links, QR codes and a printable card, and the optional kennel host (a read-only nginx serving only the published folder) |
| 0.25.0 | 2026-10-21 | Kennel Card trust: a Stats block and a Trophy case under the same rules packs follow, opt-in signed pages (manifest.sig, checked by tools/kennelcard/verify.py), and a toy-box share card |
| 0.26.0 | 2026-10-21 | Kennel Card reading: keep a checked copy of another pup's card (signature and first signer remembered), the module's first egress, and a DNS-rebinding fix for every hosted fetch |
| 0.27.0 | 2026-10-21 | Kennel Card for your pack: one view each for your Handler and your mates, signed and sent through the den, gated by a new consent grant and cut down to the other grants, withdrawn by the safeword |
| 0.31.0 | 2026-10-22 | Kennel Card Handler's picks: your AI or pack Handler proposes a β or a note on an item, and it shows on your card only after you say yes |
| 0.32.0 | 2026-10-23 | Latch is now Handlr: the package, the words, the images and the HANDLR_* settings change; nothing on disk does, and the old names are read as aliases until November 2027 |
The milestones
M1 Β· Player surface β
A play screen that is a game, settings that live elsewhere, retroactive logging so a game can start mid-stream, photo check-ins one tap away. Shipped in 0.2.0. One issue remains: the decisions only the maintainer can make (display name, licence, secrets to the password manager).
M2 Β· Share and install
- Stats-only share cards β a card for the current state with no photo in it.
- Versioned releases and image publishing β tags, a changelog you can trust, an image you can pull instead of build. Public registry when the maintainer says.
- An installer wizard β Windows-98-style setup, pup aesthetic, for download and for disc.
- A DVD / ISO β
make iso: an autorun disc with the image, the installer and this guide offline. Yes, really. - CI β tests on every push, image build on every tag.
- A README for strangers, CONTRIBUTING, a licence.
M3 Β· Data and immersion
- β
Health import β the
healthmodule, shipped in 0.5.0: sleep, steps, mood and workouts steer the game through rules you tune. Local data only. - β
Gear and toy tracker β the
kitmodule, shipped in 0.6.0: what you own, what it is made of, what it cost, when it was used and what happened. Brought a badge engine with it (see below). - β
Charts and insight β shipped in 0.8.0:
/progressgrew four tabs, a chart primitive that draws gaps as breaks and refuses to invent a scale, and an Insight block whose observations are omitted unless they clear a sample floor and an effect floor. No charting library β every coordinate is computed on your own box. - β
Habits β the
habitsmodule, shipped in 0.10.0: the work you said you wanted, logged with one tap, a timer or a Shortcut, or read out of the calendar a practice tracker or habit app already keeps. A late entry counts and earns no XP; a recurring calendar entry is a schedule and is skipped. 0.11.0 made the Handler read it: verdicts per habit, rewards for consistency, a talking-to for slacking, and Insight observations.
M4 Β· Bots
- A Matrix bot β β the chat bot, shipped in 0.13.0: reminders, today's duties and question, your AI's relay-safe lines and the safeword in a Matrix room of your own, without opening the web UI. One file, standard library only, a client of the API on its own scoped token; talks directly to your homeserver, never through a third party, and stops the moment its room could be read by anyone else. Still to come: media, and end-to-end encryption.
- The Handler as a local AI persona β β
the AI Handler, shipped in 0.13.0: a model
on your own hardware, in its own module, speaking a line a day and acting as
aionly under what you grant on Consent, capped per day, every action an event; in-app chat, where alone your reflections may reach it. β AI kennels (0.13.0): a box whose Pup ID says it is an AI hosts a pack its model handles β reading only what a Handler's kennel view shows, asking for at most three commands and a line per member, clamped to what each granted; see AI kennels. Still to come: its voice on Matrix.
M6 Β· Playsets
β Shipped in 0.12.0: Playsets and events. What remains on the milestone: audio tracks in a playset (spec 2, with the player and the duty-of-care questions), signing (waits on M7), a public catalogue with a page on the site, and art from the badge forge for the shipped playsets.
M5 Β· Packs β (the first version shipped in 0.13.0)
Federated Handlr: a Handler's box hosting a pack, pups joining it with a collar tag, pack-mates on a board, a Handler asking for what the pup grants β with every capability a grant the pup chooses and can revoke. Shipped: joining, collars, grants with item-by-item whitelists, the board and kudos, Handler commands, countersignatures, leaving, hosting and a den on its own listener β see Packs and the design in Packs β how federated Handlr works. The AI kennel β a pack whose Handler is a model on the operator's own Ollama β shipped in 0.13.0 with the rest. Still to come: the Matrix and mesh pipes, pack play, mates cards sealed per mate (today the den relays them and can read them), a host's "close this pack" and a pup's "forget this pack".
M7 Β· Identity β (the Pup ID shipped in 0.13.0)
A pup that is a keypair rather than a server: badges that travel as signed papers, the
collar as a first-class record with a start and an end, stray and collared as real states, and
handles bound to the key instead of the key derived from an account. Shipped: the Pup ID
itself β the key, sealing, the recovery sheet, papers, pup.json, restoring a bundle and moving
boxes β and, with packs, collars and countersignatures. Still to come: handles. See
Identity β the pup, not the box.
Identity was numbered around a gap: the milestone depends on a badge engine to issue papers
about, and there was none. That engine now exists β it arrived in 0.6.0 with the kit
module, in core/badges.py rather than inside kit, precisely so it could be built on.
A badge is already a durable record with a subject, a period and frozen evidence; what M7
adds is signing it and letting it travel. The gap in the numbering stays where it is.
M10 Β· The game (quests, wagers, rites, witness)
The 2026-10-05 design pass: the lock makes the wanting, the Handler aims it, the log proves it, the
pack witnesses it. β
Quests shipped in 0.18.0 β a chapter carries a goal. Still to come, each
its own issue: wagers (stake clock time on a habit target you wrote), sealed orders (training
written now, opened at a time or a tap), strictness that follows rank, a tap event kind
and scan surfaces on the den, Handlers as playsets (a persona in a file), rites (ceremonies
for first lock, first countersign, a hundred locked days), and pack play. The physical side β
a collar tag and a tamper seal for the cage β lives in latch-hardware.
The game layers behind the milestones
The milestones are the build order. These are the layers of the game they add up to:
- P2 Β· Game and training layer β dice as a module, scheduled random events, β achievements (the badge engine, 0.6.0), a hardcore mode (no self-unlock before time; an emergency key with a cost), streak rules, β kit inventory (0.6.0), training goals with targets, headspace trend charts.
- P3 Β· Gallery β albums, tags, page themes you curate, local AI tagging of photos (a local vision model, never a cloud one), a timeline scrubber, recaps with media.
- P4 Β· The Handler goes live β β the AI persona (0.13.0, M4).
- P5 Β· Devices and quantified self β phone and watch notifications, Shortcuts for the share sheet, β correlation with a personal health database (0.5.0) and β a habit tracker β or several, through their calendars (0.10.0).
- P6 Β· The share layer β β first slice in 0.20.0: your Handler's profile. The AI Handler posts to an account of its own (Mastodon's API first: GoToSocial, Mastodon and the like) from exactly the categories you grant β pride, exposure, photos you tick, your own words β each post a draft you approve unless you grant Post without asking. Optional, never hosted here. Still to come: Bluesky, a mesh network page, and a pack's Handler posting the same way.
What gates everything
Three rules no feature gets to bend:
- Class-P. Your data never leaves your box unless you grant it, item by item β never to a cloud AI, and of your health data only one yes/no, to your own AI.
- The core makes zero outbound calls; a module says when it does not. The core contacts nothing. A module that reaches the network β fetching a calendar feed, posting a card, fetching a playset β declares it, and the app tells you before you enable it: optional, informed, per module. Habits is the first module to do so. A declaration is a statement, not a cage β the app can say a module reaches the network, never that one cannot. Anything that leaves is still re-encoded with metadata stripped, and Class-P data (rule 1) never rides along.
- The log stays honest. Append-only, derived clock, undo voids and never deletes, late is marked late. A feature that needs to edit history does not get built.
Have an idea?
Feedback and issues β suggestions are issues with the type/feature label.
The best ones say what you were trying to do, not just what you want added.
This page is docs/roadmap.md in the repo. Spotted a mistake? Tell us how to report it β