Docs The app
Launch and gates
A gate is one thing that must be true before you launch. You write gates, and the store texts you fill in by hand, in files in your repository. Turnkeel shows them, keeps their state, and says whose turn each one is. Edit the file, never the rows.
What a gate is
Each gate has a title, a text that says what done means, and the one it waits on: a person, an agent, or a party such as Apple or Google Play. Its state is Open, Passed, Failed or Not applicable. A gate that is open or failed is a line in the Your turn of whoever it waits on.
The launch check counts the launch gates and says "ready", or "X of N open".
The gate file
One file per area, in .turnkeel/gates/. The front matter sets defaults for the file. Each ## heading is a gate, the list under it holds its fields, and the text after the list says what done means.
---
area: App Store
waitsOn: Apple
---
## Screenshots uploaded for every locale
- id: asc-screenshots
- waitsOn: @owner
- pass: human
- due: 2026-11-18
- byHand: true
- where: App Store Connect, App Store tab, each locale
All five sizes, English and German.
## Review status is "Ready for distribution"
- id: asc-review
- pass: check
- check: app-store-connect.review-status
| Field | Values |
|---|---|
id |
Letters, digits and hyphens. Required, unique in the project, and must not change: the gate's state and evidence are kept by it. |
waitsOn |
@handle for a person, @owner for the workspace Owner, agent:name for an agent, any other text for a party |
pass |
human (the default), agent or check |
check, install, params |
Only with pass: check: the connector's check, the install to run it on when the project has several, and text values for it |
due |
A date |
milestone |
The key of one of the project's milestones |
byHand |
true or false; a by-hand gate shows under By hand |
where, link |
Where the person does it |
A gate that leaves the files is marked removed, not deleted. A file with a missing or repeated id, an unknown field, or an unknown handle or agent fails the sync with the file and line, and nothing is changed.
Who may pass a gate
pass |
Who sets the state |
|---|---|
human |
Only a person. An agent's check is kept as evidence. |
agent |
An agent may report it passed or failed, with evidence. For plain facts an agent can check. |
check |
Only the named connector check, on the install's schedule or on Run now. Nobody sets it by hand; people and agents add evidence. Until the connector is installed the gate says "No install of app-store-connect yet". |
An agent with gates:check records a check:
turnkeel gate check build-signed --pass --evidence "Signed with the release key."
Held changes
A sync arrives with an agent's token. So a change that would weaken a gate an agent may not pass is held: its pass moving away from human or check, a changed check on a pass: check gate, or the removal of such a gate. The gate shows "Waiting for a person to confirm" with what would change, and the earlier definition stands until someone who may pass gates presses Confirm. Everything else in the same sync applies. A held change that a later sync no longer asks for is dropped.
A gate that is passed and whose title, text, pass or check then changes keeps its state and says "Changed since it was passed", with the earlier text in its history.
Listing files
A listing holds the texts for a store or a profile, or a numbered list of steps to do by hand. One file per listing, in .turnkeel/listings/. The front matter needs id, title and store (appstore, play, chrome, firefox, social or other). Each ## is a group and each ### a row; the text after a row's list is its value, copied exactly.
---
id: chrome-web-store
title: Chrome Web Store
store: chrome
---
## Store listing
### Summary
- id: summary
- limit: 132
- where: Store listing tab, Description
Save any page with one click.
A row's fields are id, limit, locale, where, do, when, link, note and file (an image, a video or a PDF in the repository, repeatable). Markdown before the first group, or between a group and its first row, is shown above the rows, tables included. When a row's value, label or files change, sync clears its done tick. A step that an agent does is not a row; it is a gate with waitsOn: agent:<name>.
Sending the files
turnkeel sync --dry-run
turnkeel sync
turnkeel sync sends the gate files, the listing files and the docs in one call that applies all of it or nothing. --dry-run prints what would change and changes nothing. It uploads the files that listing rows name, and only files that git tracks. It needs gates:sync for gates and listings and docs:sync for docs. It never sends turnkeel.yml or step templates. --all-removed sends an empty folder on purpose, which marks every gate or listing removed; the removal of a gate a person must pass is still held.
The four views of Launch
- Overview. Days to the launch date, the launch check with when each automated check last ran, and what is open grouped by who it waits on, parties first.
- Checklist. Every gate by area, with its state, who it waits on, its due date, its milestone and its evidence. A person who may pass gates sets Passed, Failed or Not applicable, sets a gate back to Open, and adds evidence; a
pass: checkgate takes evidence only. Each gate links to its file. "Edit the file, and this follows." - By hand. What a person has to do in another place: open by-hand gates that wait on a person, open by-hand cards, approved posts to put out, and one line per listing with rows left. Grouped as Do now, On a date, and Waiting on someone else. Done does what the item's own tab would do, and a toast offers Undo for ten seconds.
- Listings. Each listing's rows in file order, each with Copy, a character count against its limit, where and when to do it, its files, and a Done tick. "Nothing here uploads or submits anything."
The source of this page will be on GitHub when the repository opens. Something wrong or unclear? Write to us.