- TypeScript 94.5%
- Shell 2.4%
- PLpgSQL 1.5%
- JavaScript 0.8%
- Rust 0.5%
- Other 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .claude/skills/cazsmos-check | ||
| .githooks | ||
| apps | ||
| docs | ||
| infra | ||
| licensees | ||
| packages | ||
| scripts | ||
| tools | ||
| .dependency-cruiser.cjs | ||
| .dockerignore | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| CLAUDE.md | ||
| LICENSE | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| tsconfig.base.json | ||
| turbo.json | ||
Cazsmos
POS · Inventori · Pembukuan — one system for Indonesian multi-outlet retail and F&B.
Cazsmos runs a retail shop and a café from a single shared catalog and a single double-entry general ledger, with per-outlet and consolidated reporting. The same container image runs on a Raspberry Pi behind the counter or on a cloud server.
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Kasir │ │ Backoffice │ │ KDS │
│ (Tauri) │ │ (PWA) │ │ (browser) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
└────────── HTTPS + WS ─────────────┘
│
┌──────────▼──────────┐
│ cazsmos-server │ Hono · Node 22
│ ┌───────────────┐ │
│ │ posting engine│ │ every business event → journal
│ └───────────────┘ │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ PostgreSQL 16 │
└─────────────────────┘
Status
357 of 379 feature rows shipped (94%), each proven by a test. What remains is not missing code —
it is hardware nobody has plugged in yet, a release path never run against the live registry, and a
shop that has not yet traded a full day on it. All of it is enumerated in
docs/900-next-steps.md, which is the working to-do list and its appendix.
The tests are the checklist: 242 test files across apps/ and packages/.
Quickstart
Requires Docker (or Podman) and Node 22 + pnpm 9.
./scripts/dev-bootstrap.sh # .env with generated secrets, hooks, deps, stack, seed
That is the whole setup. Afterwards pnpm up starts the stack; every other command is indexed in
docs/450-operations.md, one line each.
Backoffice at http://localhost:5173, API at http://localhost:3000, OpenAPI at http://localhost:3000/doc, Adminer at http://localhost:8080, virtual receipt printer at http://localhost:9180.
Everything that can run in a container does; only the Tauri till runs on the host, because it needs
hardware a container on macOS cannot reach. See
docs/620-dev-environment.md.
Working on Cazsmos
./scripts/setup-hooks.sh # once per clone — pre-push runs pnpm check
pnpm check # typecheck + tests + the mechanical checks
A change is done when pnpm check passes and the behaviour has a test that would fail without it.
Anything touching the ledger needs an integration test asserting trial balance = 0.
Slash commands
| Command | Does |
|---|---|
/cazsmos-check |
Runs pnpm check the way this machine needs it, and tells a real failure apart from the known environment traps |
Prompts
For anything else, just say it:
Continue with §1.1 of docs/900-next-steps.md.
Add a recipes/BOM module following docs/600-extending.md.
Screen 1b changed in the design project — update packages/ui to match.
Restructure how stock costing works. Write an ADR for it.
The working rules an agent follows are in CLAUDE.md.
Deployment tiers
One image, three compose overlays — solo (one box), LAN (a shop network), internet (cloud) — plus a
staging overlay that runs every release against a restored shop dump before a Pi sees it. Moving
between tiers is pg_dump / pg_restore plus an .env change. Commands and full instructions in
docs/400-fleet.md.
Images are built for linux/amd64 and linux/arm64 — a Raspberry Pi 5 is a supported production target.
Documentation
Two layers: docs/ explains, docs/500-runbooks/ does. The full map, and which file to open
for which question, is docs/020-reading-guide.md.
CLAUDE.md |
Working rules for this repo — start here |
docs/020-reading-guide.md |
The map — where everything lives, and which file to open |
docs/000-overview.md |
Product one-pager |
docs/010-vocabulary.md |
What we call things — machines, apps, deployment, hardware, domain terms |
docs/100-product.md |
Product requirements |
docs/200-architecture.md |
System architecture |
docs/210-data-model.md |
Data model |
docs/220-ledger.md |
Double-entry rules and posting matrix |
docs/230-tax.md |
PPN / PB1 / PPh Final / e-Faktur |
docs/240-analytics.md |
Rollups, reports, charts, BI access |
docs/250-hardware.md |
Printers, scanners, drawers, KDS, scales |
docs/260-localization.md |
Languages, formats, translations |
docs/300-design-system.md |
Design tokens, components, formatting |
docs/400-fleet.md |
How a running fleet is shaped — tiers, modes, backups |
docs/410-source-and-registry.md |
Source, container registry and generic packages — Forgejo on Lightsail |
docs/420-edge-and-tls.md |
nginx + certbot on the Lightsail box |
docs/430-builds-and-releases.md |
Building the till app, signing, update channels |
docs/440-ip-protection.md |
What ships to a shop, and what doesn't |
docs/450-operations.md |
Command index — every script and alias, one line each |
docs/500-runbooks/ |
Runbooks — numbered steps for the things you actually do |
docs/600-extending.md |
How to add a module |
docs/610-workflow.md |
Development lifecycle — Ready, staging, testing, release, runbook |
docs/620-dev-environment.md |
Testing everything on one Mac |
docs/910-demo.md |
How to demo this to somebody |
docs/900-next-steps.md |
The working to-do list — hardware, staging, pilot |
docs/adr/ |
Architecture decision records, grouped by theme |
Licence
Private. All rights reserved.