A new store is a database row on the site now, not a release of the client: the `Store` model and the public /api/stores endpoint live in the host app, and the Electron client reads them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
devarea
Workspace management repo for TTG: use it to clone the whole workspace in
its category-folder structure, and to verify that the clone list is in sync
with the Gitea server (git.teletypegames.org).
Quick start
On a fresh machine:
mkdir TTG && cd TTG
git clone ssh://git@git.teletypegames.org:2222/tools/devarea
cd devarea
make setup # install tea + clone all repos + check
Repos are cloned into the parent directory of the devarea checkout (the
workspace root). To use a different target: make clone ROOT=/path/to/workspace.
Make targets
| Target | What it does |
|---|---|
make help |
List available targets (default) |
make tea |
Install tea (Gitea CLI) via Homebrew if missing, and verify the login |
make clone |
Clone all repos based on scripts/repos.list; existing ones are skipped |
make check |
Compare the clone list against the server (tea repo list --output json) |
make setup |
All three in one: tea + clone + check |
Scripts
All scripts live under scripts/ and can also be run standalone:
install-tea.sh— installs tea and verifies the login. Without a login it prints the setup command (tea login add --name ttg --url https://git.teletypegames.org).clone-repos.sh [target-dir]— clones every line ofrepos.listinto the given structure. Idempotent: existing clones are skipped.check-repos.sh— checks in both directions: repos that exist on the server but are missing from the list (MISSING), and repos listed as Gitea repos but absent from the server (STALE). Exits with 1 on any hit, so it is CI-friendly. It pages through the server list: Gitea caps a page at 50 items whatever--limitasks for, and before this was fixed (2026-08-18, at 51 repos) the check quietly compared against the first 50 and reported a real repo as STALE.
Data files
scripts/repos.list— the repos to clone, one per line in<workspace-relative path>|<clone URL>form. New repo on the server → add it here (make checkwill complain if it is missing). Non-Gitea repos (GitHub) may also appear; the check skips those.scripts/repos.ignore— repos that exist on the server but are intentionally not cloned (<owner>/<name>); the check does not report these as missing.
Workspace structure
Every folder is a Gitea org, one to one — that is the rule since 2026-08-16, and
it is why a repo's path in repos.list is simply <org>/<name>:
TTG/
├── devarea/ # this repo — has to sit here, clone-repos.sh clones into its parent
├── bbs/ # BBS servers and showcases
├── build/ # CI toolchains and builder images (*-tools)
├── demos/ # one per engine: shows a platform, not a product
├── engines/ # own engines and libraries other repos depend on
├── games/ # catalog products
├── infra/ # the server environment itself (nginx, backups, wiki-pages)
├── services/ # what runs on our server (public site, bots)
├── stores/ # store engines and the stores built on them
├── tools/ # what one person installs and runs for themselves
├── media/ # reference images and documents — not git repos
└── memory/ # working agreements the assistants read (not a git repo)
Two exceptions to the one-to-one rule: devarea itself, which stays at the
workspace root because clone-repos.sh clones into its parent directory, and
media/ + memory/, which are not repos at all. repos.ignore lists the
server-side repos that are deliberately not cloned.
The org taxonomy — what each org is for, and why a repo belongs to one rather than another — is in REPO_REFACT.md.
Estate documentation
These describe the estate as a whole, which is why they live here rather than in any single repo:
- WIKI_CONNECTION.md — which repo is documented by which wiki page, and which Gitea org each repo belongs to.
- REPO_REFACT.md — the Gitea org structure: what each org is for and what it contains.
- ECOSYSTEM_PLAN.md — what we have per org towards a complete game development lifecycle, and what is still missing.
- MORE_STORES.md — which further host platforms could get a store like the Batocera one, measured against what the catalog actually ships.
The ttg-ops plugin in ttg-marketplace reads these rather than carrying its
own copy of the rules.