- Python 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .forgejo/ISSUE_TEMPLATE | ||
| contributors | ||
| locktober-2026 | ||
| tools | ||
| .gitignore | ||
| GUIDE.md | ||
| README.md | ||
Playsets for Latch
Content for the game, made by people, shared as files. A playset is one file that drops training, Handler lines, wheel segments, habits, a trance score and badges into a running Latch — and comes back out as one unit. An event is a playset with a calendar: a window, a sign you wear, a Handler in a new voice, and badges you can only earn inside it.
This repository is the catalogue: every listed playset, the tool that checks and builds them, and the way to get yours listed. Issues and pull requests are open.
| Playset | By | License | |
|---|---|---|---|
locktober-2026 🎃 |
Locktober 2026 — 31 days, the Handler's October voice, 19 days of training, six pumpkin wheel segments, a darker score, nine badges. 18+ | Lockedtrainee | CC-BY-SA-4.0 |
Download a built zip from Releases or from latch.aurionblack.com/playsets, then in Latch: Playsets → choose the file → Install. Needs Latch 0.12 or newer.
The vibe
Latch is a solo game about getting better: a Handler, a clock, training, honest reflection, and rewards for consistency. It ships with one Handler's voice, one set of training and one wheel. Playsets are how it gets more voices than one person can write — a stricter Handler, a gentler one, a month with a theme, a set of workouts, a wheel that is all consequences, a trance score for the dark — without any of it becoming a plugin you have to trust.
The goals, in order:
- A playset can never hurt you. It is data. It cannot touch your clock on its own, write your log, reach the network, or read a word you wrote. The app checks every file against a fixed format and refuses anything else, with the reason. That rule is what makes it safe to install one from a stranger, and it is what makes sharing yours cheap.
- Your game stays yours. Every row a playset adds is tagged. Switch it off and it is hidden; remove it and it is gone — except the badges you earned and the training you actually did, which are history and stay. Nothing you wrote yourself is ever touched.
- Nothing phones home. The app never downloads a playset. You bring the file. There is no telemetry, no rating pings, no "most installed" counter anywhere in the app, because there is no way for it to know and it is built so that it cannot.
- One voice per playset. A playset is a character as much as a list. The best ones read like one Handler wrote every line.
How to use one
- Get the zip (Releases, the site, or from a friend — where it came from is not the app's business).
- Open Playsets in the top bar of your Latch. Choose the file. Install. The app reads it, checks it, and copies it in. If anything is wrong it says exactly what, and writes nothing.
- Its training is in your library, its lines are in the Handler's pool, its segments are on the wheel, its score is on the trance page. Play.
- Switch off to hide everything it added. Remove to take it all back. Badges you earned stay; training you actually did stays in your history, marked.
If the playset is an event, one more step: Join it from the card on your dashboard. Nothing joins you. You can join ahead of the start; you can leave whenever you like.
Locktober 2026 — the worked example
Thirty-one days, the first to the thirty-first of October. Install it, join it, and this is what changes while you are in it:
| Before | During Locktober | |
|---|---|---|
| Header | the clock and your level | 🎃 12/31 — the day count, every page |
| The Handler's line | "Your Handler is waiting. Write today's reflection." | "🎃 Day 12 of 31. It's Locktober, pup. Your Handler is waiting…" |
| Mantras, affirmations, reflection questions, check-ins, headspace scripts | your library | October's only — thirty-three lines in one voice. Your library comes back on 1 November |
| Training | your library | plus eleven October tasks, and on nineteen of the days one is assigned for you at the first tick of the day, due at midnight — roll call most often |
| The wheel | your segments | plus six: 🎃 +2 hours · 🦇 +6 hours · 🌕 +1 day · 🕯 −1 hour · 👻 Freeze 3h · 🍬 Training |
| Trance | Just Beats | plus Hollow — lower carriers, a longer hold at 5.6 Hz, rain instead of surf |
| Share cards and stamped photos | the usual tokens | plus event_day: LOCKTOBER · DAY 12/31 on the things you show, as-of the shutter |
| Sharing (Latch 0.14+) | a card and a picture | a drawn Locktober stamp (DAY 12/31) on your check-in photos, a full-photo Check-in card, and ready-to-paste post text — day 12 of 31, #Locktober #Locktober2026. Nothing to update: it all comes from the event itself |
What you can earn — nine badges, each with the evidence frozen on the day:
| Badge | When | |
|---|---|---|
| 🎃 Locktober Pup | +10 xp | the moment you join |
| 🕯 First Week | +20 xp | locked on seven days of October — lands the seventh day |
| 🌗 Halfway | +30 xp | sixteen days |
| 🦇 Three Weeks | +40 xp | twenty-four days |
| 📓 Confessions | +30 xp | a reflection on twenty days of the month |
| 🐾 Trained | +25 xp | ten pieces of training verified inside the window |
| 🎡 Spun | +15 xp | ten spins inside the window |
| 🌑 Kept the Month | +75 xp | locked on 25+ days and reflected on 20+ — decided on 1 November, not before |
| 🌕 Full Moon | +150 xp | locked on every one of the 31 days — decided on 1 November |
Two rules about those that are worth knowing. The last two are finished badges: a badge
that says you did the whole month is decided when the month is over, the same way the
game's monthly superlatives are, because a claim about October made on the 20th is a claim
about two thirds of it wearing the name of the whole. And every one of them carries
event:locktober-2026 as its period, so Locktober 2027 is a different trophy, not a
re-award of this one.
When the window closes, October's voice, training, segments and score leave the pools. The badges stay, and so does the playset until you remove it — the badges point at it.
Making your own, and getting it listed
The whole format — every field, the badge menu, the rules, the file caps — is in the guide
your own Latch serves at /guide/playsets, and on the site.
The short version and the submission steps are in GUIDE.md in this repo.
The validator the app runs on upload is the validator you run before you submit:
git clone https://forge.aurionblack.com/lockedtrainee/latch # once
cd latch && PYTHONPATH=app python3 -m latch.playsets check ~/my-playset.zip
Badges for people who make playsets
Content is the thing this game cannot make for itself, so the people who make it get marked
for it. These are not earned by anything in your log — they are given, as a tiny personal
playset holding one granted badge each, sent to you by the maintainer and installed like
any other. Until papers can sign them,
they are honestly the maintainer's word — which is what a thank-you is.
| Badge | For |
|---|---|
| ✍️ Playset Author | your first playset listed in the catalogue |
| 📚 Three Deep | three listed playsets |
| 🎪 Event Runner | a listed event that ran its whole window |
| 🎨 Best Art | the maintainer's pick for badge art, once a season |
| 💛 Most Loved | the most 👍 reactions on its catalogue issue in a season |
| 🔍 Reviewer | five review comments on other people's submissions that led to a change |
| 🐛 Bug Finder | a refusal or a rule the validator should have had, reported with a file that shows it |
Loved is counted where it can be counted: reactions on the public forge. Nothing in the
app counts installs, and nothing ever will — the third goal above is not for sale for a
leaderboard. Contributor playsets live under contributors/, one directory
per handle; the template is there too.
Layout
<slug>/ one directory per listed playset
playset.toml the manifest — required
README.md shown on the playset's page in the app
art/*.png badge art, 512×512, transparent, ≤ 300 KB each
scores/*.json trance scores, as [[scores]] file = "scores/x.json"
contributors/ the granted badges, one playset per handle
tools/build.py validate every playset, zip the good ones, write dist/index.json
dist/ built zips + index.json (not committed; the site renders from it)
Everything here is under the license each playset declares; the tooling is AGPL-3.0-or-later
like the app. The maintainer is Lockedtrainee — @lockedtrainee:matrix.aurionblack.com,
#latch:matrix.aurionblack.com.