Turborepo monorepo containing three musical web apps, deployed as static sites behind Nginx on Dokku.
| App | Path | Description |
|---|---|---|
| game-of-life | /life/ |
Musical cellular automaton |
| two-strike-approach | /2sa/ |
Polyrhythmic pattern sequencer |
| in-tempo | /tempo/ |
Minimalist ensemble performance |
apps/
game-of-life/ React + Vite app
two-strike-approach/ React + Vite app
in-tempo/ React + Vite app
packages/
ui/ Shared shadcn/ui components (source-only, no build step)
tsconfig/ Shared TypeScript configs
eslint-config-custom/ Shared ESLint flat config
npm install
npm run dev # all apps
npx turbo dev --filter=game-of-life # single app
npm run build # turbo build — produces dist/ in each app
npm run deploy-prep # build + assemble public/ directory
deploy-prep runs scripts/deploy-prep.sh, which:
- Runs
turbo build(Vite builds each app toapps/<name>/dist/) - Copies each app's
dist/intopublic/life/,public/2sa/,public/tempo/ - Generates a landing page at
public/index.html
The result is a flat public/ directory of static files ready to serve.
Deployment targets Dokku with two buildpacks (configured in .buildpacks):
- heroku-buildpack-nodejs — installs dependencies, runs
heroku-postbuild(which callsdeploy-prep.sh) - heroku-buildpack-nginx — serves
public/as static files
git push dokku main
Nginx routing is configured in app-nginx.conf.sigil with try_files fallback for SPA support on each subpath.
npm test # vitest across apps
npm run lint
make clean # remove node_modules, dist, .turbo, public