Where the project has been, where it is stuck, and where the trail goes next — in plain language, with every stop linked to its GitHub original.
What Keyboard Studio is: a browser-based studio that lets language experts create production-ready Keyman keyboards through a plain-language survey and show-by-example galleries — no hand-written .kmn. Open the live studio → · Repository →
985 PRs merged1,261 issues closed104 specs (002–105)5 packages22 open issues0 open PRs at snapshotStarted 2 Jun 2026Studio in production
Snapshot: 22 October 2026. Counts verified live from GitHub on that date.
The trail at a glance
Solid line = ground covered. Dotted line = trail ahead. Tap a numbered camp to jump to its card. The project sits at several camps at once — and revisits some.
01 Trailhead · 02 Authoring Walk · 03 Decisions · 04 Marks & Touch · 05 Mobile · 06 Road Home · 07 Privacy · 08 Rough Ground · 09 Trail Ahead · 10 Working Together
The summit — current marker, not a version promise
🏁 First keyboard through upstream review
The destination flag for this stretch of trail: the first studio-authored keyboard carried through a complete keymanapp/keyboards review cycle. No studio keyboard has completed an upstream review cycle yet (#1006). Hybrid shepherding is ruled — a named human shepherd now (still to be named), the studio round-trip later, after one real cycle is observed. Keyman maintainer conversations start November 2026.
Orientation
How to read this map
Camps are stops along one trail, not phases. The project is at several camps at once, and some camps get revisited as the ground shifts. Each camp card shows its own progress, what is done, and what is still on the ground in front of it.
Status badges
ShippedDone, merged, and in the studio or the record.BuildingActively being built right now.PlannedAgreed and queued — not yet started.Known issueOpen problem, honestly marked.OngoingContinuous work with no finish line.
Finished entries are tucked behind a “Show N finished” toggle on each camp so the open work stays visible first. Field notes are the short version of a ruling, a constraint, or a lesson — the GitHub link is always the full record.
ShippedDay-1 spec lockedspec.md v2.0.0 — the founding description of what the studio is and is not.
ShippedContracts packageLocked shared types, 7 service interfaces, and zod schemas in packages/contracts — the one vocabulary every package speaks.
ShippedReview criteria catalogTriaged catalog of the Keyman PR-review criteria in docs/criteria.md — the checklist later lint and review tooling is built from.
ShippedConstitution v2 + Architecture v2Ratified 14 Oct 2026 — precedence by topic; “defaults are proposals”; “done means integrated.”
ShippedProject glossaryShared names for shared things, so specs, code, and issues mean the same words the same way.
02
The main path · the walk most travellers take
The Authoring Walk
The whole journey, end to end — from a starting keyboard to a deliverable package.
8 of 9 done · 1 to goCore walk shipped
The work here
OngoingInternationalisation via Crowdinen / fr live; further locales follow the same pipeline as translations land.
ShippedStart from anywhere sensibleAny release/ Keyman keyboard, the US-English fallback, or an uploaded .kmn.
ShippedKeyboardIR — nothing edits raw textThe base is parsed to a typed KeyboardIR; every edit works on the IR, never on raw .kmn text.
ShippedPlain-language surveyComputes 7 discovery axes and picks from 12 strategies — the author answers questions, not syntax.
ShippedShow-by-example galleriesChoices shown on live mini-keyboards, so the author picks what they can see and try.
Shipped300 ms compile + lint cycleIn-browser WASM compile plus 3-layer lint, fast enough to feel live while authoring.
ShippedTouch layout derivedTouch layout derived from the desktop rules — not a second, hand-maintained keyboard.
ShippedThree ways homeDelivery as .kmp, source .zip, or a GitHub draft PR to keymanapp/keyboards.
ShippedComplete, honest packagesEvery output ships all six documentation members (specs 080 / 102), and a copy never inherits the base keyboard’s identity prose — PR #2304.
03
High ground · specs 088–093, revisited by 105
Decisions, Not Documents
The decision architecture — the studio remembers decisions, and derives everything else.
Revisited
7 of 8 done · 1 to goArchitecture shipped · migration building
ShippedDecisionSet (088)One record per author decision — the single store of author truth.
ShippedPure apply() (089)Decisions applied by a pure function — same decisions in, same keyboard out.
ShippedGalleries as decision modules (090)Each gallery reads and writes decisions, not documents.
ShippedDerived steps (091)Survey steps derived from the decision state, not hard-coded flow.
ShippedLive extraction (092)Decisions extracted live from an existing keyboard when it becomes a base.
ShippedDerived keyboard (093)The keyboard itself is a derivation of the DecisionSet.
ShippedBase switch = retain + recalculateSwitching base keyboards keeps decisions and re-derives against the new base; answers that no longer fit are re-proposed, never silently dropped.
04
Tricky footing · three axes that look like one
Marks & Touch
Diacritics, composition, backspace, placement — and what a touch key really is.
Revisited
6 of 7 done · 1 to goWalk-validated 32 / 32
The work here
BuildingMarks guard follow-ons#2285 — guard defaults and edge cases following the round-3 walk.
Ongoing“Resolve CI” means all lanes greenIncluding the non-blocking e2e lanes. A red non-blocking lane is not resolved CI.
ShippedPRs merge to dev, not mainMain is no longer the direct merge target; it receives promotions.
ShippedNightly soak full-gates devThe full suite runs overnight against dev; dev is then promoted to main. First dev → main promotion: 17 Oct 2026.
ShippedFast gate firstLint / typecheck gate up front, curated impactful tests per PR, full CI overnight — per-PR CI aimed under 10 minutes.
ShippedParallel e2e lanesEnd-to-end split into parallel desktop / mobile / golden-walk jobs.
ShippedTriage: a server service from the first weeksThe /km-triage autonomous PR-review cycle was running unattended on the server within the project’s first week or two (repo created 2 Jun 2026; the km-triage[bot] GitHub App dates to 7 Jun 2026) — a scheduled Claude Code service that walks every open PR, dispatches review crews, and approves-and-parks, requests changes, or escalates as a PR comment. It never merges and never closes issues.
ShippedPersonal mode = escape hatch onlyRunning the same triage by hand under your own GitHub account when you’re sitting there — an accelerator, never the main path (docs/km-triage-personal-mode.md says exactly this).
ShippedMuse’s own triage identity — 10 Oct 2026What changed on 2026-10-10 was Muse’s identity, not triage’s existence: Muse got its own GitHub App, muse-triage, and its own 15-minute scheduled sweep, so in this environment reviews post as muse-triage[bot] and publish the muse-triage/review check.
PlannedDSAR dry-run + breach tabletopThe subject-access and breach-response procedures still need to be exercised end to end.
OngoingSIL controller acceptanceSIL Global is named as controller in the published notice; SIL’s acceptance of that role is not yet evidenced. Resting here until it is.
ShippedPrivacy programme (specs 095–101)Privacy notice naming SIL Global as controller, processing record & retention, subject access requests, erasure, breach response, and governance.
ShippedAnalytics readinessCookieless analytics posture with opt-out; raw events 90 days, aggregates indefinite.
ShippedRetention rulings appliedCrash issues kept permanently as the public bug record, with written justification and an annual residue review; server drafts stay until the user deletes them.
ShippedProgramme mergedPR #2100 merged, carrying its merge gate in the PR body.
08
Loose scree · watch your footing
Rough Ground
Known issues, honestly marked — all open at snapshot, drawn from the 22 open issues.
0 of 8 done · 8 to goOpen ground — cluster actively burning down
The work here
Known issueCopy-track output cluster — #2305–#2308#2305 welcome-folder non-image files carried as images · #2306 welcome-image keyboards get no generated layout charts · #2307 stylesheets shipped under the base’s old release path · #2308 base font / stylesheet dropped from the .kps. Font and welcome-image fixes already landed 22 Oct 2026 (PRs #2324 / #2325) — this cluster is actively burning down.
Known issueCorpus evaluation — #2278#2278 — the strategy recognizer reads 86 deadkey-Latin keyboards as the wrong strategy.
Known issueKeyboard-wide fallback policy — #2178#2178 — a single fallback policy for undefined keys, still to replace per-carve overrides. (KevinPNG; the issue’s engine half is unblocked.)
Known issueSpec-drift flag on spec 105 — #2318#2318 — drift flagged between the spec 105 programme text and the ground as surveyed.
Known issueInvisible-characters pane scope — #2283#2283 — small studio item: what the invisible-characters pane should cover.
Known issueCopyright-holder choice — #2281#2281 — small studio item: letting the author choose the copyright holder.
Known issueWorkspace cleanup archives — #2106#2106 — deciding what to keep from workspace cleanup archives.
Known issueDesign record kept open — #2297#2297 (output composition) remains open even though its feature shipped — the record stays open for follow-ons. See the field note.
Around the campfire
Being worked on right now
What is actually on the fire at snapshot — from live GitHub activity, not from a plan document.
BuildingSpec 105 — derived working copy programme. Phase 0 landed (PR #2292); phases P1–P9 ahead, ending in envelope v3 with ghost tests removed. See Camp 03.
BuildingCopy-track output cluster burn-down (#2305–#2308). Fixes landing today — font and welcome-image fixes already in via PRs #2324 / #2325 on 22 Oct 2026. See Camp 08.
BuildingMarks guard defaults — #2285. Follow-ons from the round-3 validation walk. See Camp 04.
OngoingSpec-104 corpus gate residue. The touch-key resolver’s corpus gate is nightly-class in the dev soak, not per-PR — residue items are worked through the soak, not the PR lane.
OngoingTriage, as ever. The server /km-triage service and Muse’s 15-minute muse-triage sweep keep walking open PRs — approve-and-park, request changes, or escalate. See Camp 06 for the full (corrected) history.
Field journal
What we finished, week by week
From merged PRs. Most recent week in full; earlier weeks in one line each.
19–22 October 2026 — the marks & copy week
ShippedBackspace as its own axisPR #2312 — backspace restored as its own headed question, proposed from composition, overridable.
ShippedOutput composition questionPR #2298 — composition asked in its own terms, one keyboard-wide NFC / NFD policy.
ShippedGuard fixesPRs #2320 / #2323 — walk-1 empty-context guard probe and follow-on fixes; PR CI all lanes green on #2320.
ShippedWalk records, round 3 — 32 / 32 PASSPR #2321 — all 32 axis combinations re-walked through Output, each keyboard .zip saved as evidence.
ShippedCopy-track font + welcome imagesPRs #2324 / #2325 (22 Oct) — first fixes into the #2305–#2308 cluster.
ShippedDev → main promotionsPRs #2317 / #2301 / #2296 — the promotion rhythm from Camp 06, exercised three times in one week.
Earlier in October — the privacy programme (specs 095–101, PR #2100) and the mobile epic (#1853) landed; Constitution v2 + Architecture v2 were ratified on 14 Oct; Muse’s muse-triage identity went live on 10 Oct, joining the server triage service that had run since June.
Late September – October — the decision architecture, specs 088–093, was built stacked in dependency order: DecisionSet, pure apply, gallery modules, derived steps, live extraction, derived keyboard.
09
Dotted line from here · the trail ahead
The Trail Ahead
What is to come — next first, then planned, then the last mile to the summit.
0 of 9 done · 9 to goAll ahead of us
The work here
BuildingSpec 105, phases P1–P9Finish the derived-working-copy migration (Camp 03). Phase 0 landed; the programme is the current main effort.
BuildingSpec 103 — first-class if() guardsCorpus-led: a joint engine + content session on real if() usage decides the shape before any build.
PlannedHybrid authoring epic — #367 (P1 priority)#367 — the hybrid authoring epic, top planned priority.
PlannedRule behaviours + rule editor#1812 rule behaviours, with #1432 de-obfuscating the rule editor.
PlannedCopy-track welcome / help authoring — #2155#2155 — a copy author writes their own welcome / help prose (a copy never inherits identity prose — Camp 02).