Latch

Hey there, pup.
You look lost.

Come here. Sit. Latch is a lock game you play by yourself β€” a Handler that asks after you, a wheel that messes with your clock, training that wants proof, and a log that remembers all of it.

Built for pups who are tired of waiting for a handler to show up. You don't need one to be held to something. You need a rule, a voice, and a record you can look back at without flinching.

Free forever Open source Self-hosted No account Zero outbound calls
The Latch dashboard: a glowing countdown ring reading one day and eleven hours remaining, with cards for the Handler, wheel, training and kit. The same dashboard on a phone.

🐾 No handler? Good.

It's just you and the game.

Most chastity apps assume there is somebody else holding the key β€” a keyholder to find, to keep interested, to wait on. Latch assumes there isn't, and builds the structure instead. This is self-play with the volume turned up: something that notices, that asks, that keeps score honestly, and that never once needs another person to log in.

🐢

You always hold the key

Latch never talks to a physical device and never will. The emergency key is one tap, costs you nothing but the clean-unlock XP, and is never hidden, throttled, or shamed. Stopping is the game working.

πŸŽ€

A Handler, not a person

It asks for a reflection every day you're locked, checks in on a cadence, hands you mantras, and notices when you skip. Firm and affirming. Every word it says is yours to rewrite.

πŸ““

A record you can trust

Append-only. The clock is derived from the log, never stored, so nothing in a browser can quietly change the truth. Undo strikes through; it never deletes. Late is marked late, forever.

🏠

On a box you own

One container, one SQLite file, one media folder. No account, no cloud, no telemetry, no CDN β€” this page included. If this website vanished tomorrow your instance would keep working, guide and all.

The loop

  1. Cage up.Pick a sentence β€” or roll dice for one, or hide it from yourself so you genuinely don't know when it ends.
  2. Live locked.The Handler wants a reflection and periodic check-ins. Training gets assigned, some of it wanting a verification photo. The wheel adds time, takes it away, freezes the clock, or drops a task in your lap.
  3. Log everything.Photos, notes, voice memos, mantras, headspace sessions. Finished something on the train? Log it for when it actually happened β€” it'll carry a logged later badge and that's the point.
  4. Time served.Unlock clean for the XP, or use the emergency key. Either way it becomes a record: a recap card, stamped photos, a row in your stats.
  5. Look back.Streaks, a 26-week heatmap, rates per week, headspace over time. Then cage up again, good boy.

πŸ“Έ Have a sniff around

Every screen, nothing staged

These are real screenshots of a real instance β€” running a seeded demo log of about five months of play, so you can see what the charts, the streaks and the badges actually look like once there's something in them. Click any of them to see it properly.

The kennelLive clock, quick adjustments, and the action row.
The HandlerReflection, check-ins, mantras β€” and it noticed you slept badly.
Wheel of FortuneGive up a little control.
ProgressTotals, streaks, heatmap.
TrendsHand-drawn SVG, no library.
InsightOnly what clears the floors.
TrainingDeadlines and proof.
KitGear, toys, consumables.
BadgesThe whole catalogue.
HealthYour body moves the clock.
The logAppend-only, honest.
GalleryEXIF stripped on the way in.
Share cardsFacts travel; prose doesn't.
HeadspaceThe quiet half.
CalendarMonth by month.
The guideShips inside the app.
SettingsAll of it, in one place.
Kit, full pageScroll the whole thing.

…and it's built for a phone

Dashboard
Progress
Handler
Kit

🐾 Why it's built like this

Headspace is the point

The cage is the least important part. What Latch is really for is the pup headspace β€” the calm that comes from a clear rule, something that notices, and a day with a shape. The timer gives the day an edge; the Handler gives it a voice; training gives it work; the log gives it a memory.

✍️

You have to write. You have to talk.

Reflection is required, not optional. A paragraph a day, or thirty seconds spoken. Missing it is an event with a cost.

Denial without reflection is just waiting. Writing down where your head went is what turns a locked day into training.

πŸ…

Winning isn't the streak

Streaks and levels are there because they feel good, and because a heatmap with a hole in it is honest.

Winning is a day where you were locked, did the training, wrote the reflection, and can read it back a month later and recognise yourself. Best boy is a rank you reach by showing up.

πŸ•―οΈ

Pace is yours

Some weeks are a four-hour lock and a mantra. Some are a week with a hidden timer and the Handler at full strictness. Both are the game.

Consent here is with yourself, and it's renewable. You chose the strict setting; you can change it, and the record will show you did.

Three rules nothing gets to bend

Your data never leaves your box. No cloud AI on any of it, ever. When the Handler becomes a real AI persona it will be a model on your hardware β€” your words stay on your LAN.
The core makes zero outbound calls. Not a font, not a script, not an analytics ping β€” and there's a test in the repository that fails if a served page ever references one. A module that does reach the network has to declare it, and the app tells you before you turn it on.
The log stays honest. Append-only, clock derived, undo voids rather than deletes, late is marked late. A feature that needs to edit history doesn't get built.
What leaves, when you make it. A stamped photo, a recap card, an export β€” those go because you tapped a button, and they go re-encoded with location and camera metadata stripped. Your reflections and check-ins are never on a share card and never on the API's event feed. Facts are shareable; prose is yours.

🦴 Where it's at

Young, but real

Latch is being handed to a small number of people to try. It is used daily by the person who writes it, it has a full manual, and it does not eat your data β€” but it is early, it is one person's project, and the roadmap below is a direction rather than a schedule.

v0.8.0 released 20 September 2026 Β· AGPL-3.0-or-later
Tests
505
Dependencies
6
Outbound calls
0
Modules
6
JS frameworks
0
Price
Free

Shipped

Next

Ideas, not promises

Before your first lock. Always have a backup key for any physical lock, within reach, before you start. Pain, numbness, swelling, colour change, or a device that has shifted β€” it comes off. No timer is worth an injury; the app cannot see your body and you can. Latch is not medical advice and nothing in it should override a doctor.

🏠 Take me home

Get it running

Latch runs as one container on anything that has Docker β€” a spare laptop, a NAS, the box in the closet. It takes about two minutes. There is nothing to sign up for and nothing to pay.

The quick way

# grab the source, then:
docker compose up -d --build

# it's now at http://localhost:8770 β€” that's it.

Your play data lives in a Docker volume called latch_data, not in the folder, so you can update or reinstall without losing anything.

πŸ“¦

Source

The whole app. Run it with Docker, or with the included setup wizard if you'd rather click through it. This is the one most people want β€” or clone it from Forgejo.

latch-0.8.0 Β· tar.gz Download source
🧩

Setup wizard

A dependency-free installer with Windows-98 chrome and a pup aesthetic. Checks Docker, writes your config, builds, starts, and opens Latch for you.

macOS Β· Apple Silicon Β· unsigned Download for macOS
πŸ“–

The manual

All twenty-five pages, right here β€” your first lock, every module, the privacy model, rewriting every word the Handler says, and getting your data back out. Read it before you install anything.

the same guide your instance serves Read the guide
On the macOS app: it's unsigned, so the first launch is right-click β†’ Open rather than a double-click. If you already have Python 3 (macOS and Linux both ship it) you don't need it at all β€” ./setup.sh in the source is the whole installer. Windows and the ISO are on the way.
The guide ships inside the app. Your own instance renders it at /guide from the markdown in docs/, so it is always the manual for the version you are running and it works with the internet unplugged. The same pages are here if you want to read them first.

πŸ’¬ Come say hi

Tell me it's broken

Latch is one person's project and it is early. A good bug report or a clear suggestion is genuinely the most useful thing you can give it β€” more than a star, more than a thank you. Come find me on Matrix.

🐾

The pack room

Open room for anyone playing Latch β€” questions, setup help, feature arguments, showing off a streak.

#latch:matrix.aurionblack.com
βœ‰οΈ

Me, directly

For anything you'd rather not say in a room. I'm the person who writes it.

@lockedtrainee:matrix.aurionblack.com
πŸ—ƒοΈ

The code

All of it. Browse it, clone it, read every line that touches your data β€” or file an issue when it misbehaves. AGPL-3.0-or-later, Β© Lockedtrainee.

forge.aurionblack.com/lockedtrainee/latch sign-up is open Β· accounts activated by hand
Never attach an export to a bug report. latch.json, the CSVs and the bundle are your whole journal in plaintext. No bug needs them β€” if I need data I'll ask for one specific row. Same for your API token and anything from .env. A screenshot is fine, after you've looked at what's in it.