A deck of client-side cyberpunk creative tools. Each app is a "program" that runs on the deck: it shares the visual language and code patterns, but ships, versions, and deploys on its own.
No backend server — everything runs in the browser.
| Program | Path | What it does |
|---|---|---|
| ASCII//Convert | apps/ascii |
Image or webcam → interactive ASCII art. Live → |
| GLITCH//Studio | apps/glitch |
A glitch-effect pipeline over image or webcam — live preview, presets, PNG / video export. Live → |
| GOLEM//Console | apps/golem |
A 32-bit fantasy computer: write assembly, assemble it, run it from a command line as registers, memory and the Terminal update live. Live → |
| SPRAWL//Atlas | apps/sprawl |
The deck's first piece, not tool: the world's connected capacity as light. Opens blown white; you repair it by sliding the scale coarser until structure emerges. Live → |
Requirements: Node.js 22+ (see .nvmrc)
npm install # installs every app (npm workspaces)
npm run dev # start ASCII//Convert
npm run build # build every app
npm run test:run # run every app's tests once
npm run check # Biome lint + format, repo-wideScope any app script with --workspace @cyberdeck/ascii.
apps/ascii ASCII//Convert
apps/glitch GLITCH//Studio
apps/golem GOLEM//Console
apps/sprawl SPRAWL//Atlas
packages/deck-kit the shared shell every program builds on
docs/adr architectural decisions, deck-wide
CONTEXT-MAP.md how the programs relate
Tooling is deliberately light: npm workspaces, no Nx or Turborepo. Repo-wide tooling (Biome, lefthook, commitlint, Changesets) sits at the root; each app owns its own build and test dependencies.
For a long time there was no shared packages/ — duplication was kept as a signal of what
actually repeats (ADR 0011). GLITCH//Studio made the
seams obvious, so the proven-shared surface was extracted into
@cyberdeck/deck-kit — the visual language, ui/ primitives, and
generic browser plumbing. It's consumed as source (no build step) and is deliberately not a
domain core: each app's pipeline stays in the app (ADR 0014).
Each app is its own Vercel project pointing at this repo. ASCII//Convert builds from the root
vercel.json; the rest set Root Directory to their apps/<name> and are driven by a nested
vercel.json that cds to the repo root so the @cyberdeck/deck-kit workspace dependency resolves.
Each project's ignoreCommand skips its build when the diff touches nothing it ships. It watches
the app plus packages/deck-kit (consumed as source by all,
ADR 0014), diffs over
$VERCEL_GIT_PREVIOUS_SHA..HEAD (that project's last deploy on the branch), excludes **/*.md, and
fails toward deploying — production, a branch's first deploy, and any git error all build. CI's
paths-ignore is separate; Vercel does not read it.
Commits follow conventional commits (enforced by
commitlint). Releases run on Changesets, per app — a PR that changes
app behavior adds one with npm run changeset
(ADR 0012).
GOLEM//Console's instruction set is inherited from Poxim, the didactic 32-bit architecture
used in the Computer Architecture course at UFS (Universidade Federal de Sergipe), 2017.
The encoding, register file, and 42 mnemonics are Poxim's; the reference programs under
apps/golem/src/golem/__fixtures__/ are the course's example project, kept verbatim as test
oracles. Credit to the course and its instructor —
ADR 0019 explains why the ISA was inherited
rather than designed.