Stash is a feature-rich, tag-based library web application designed to organize media into searchable collections.
_frontend): Built with SvelteKit and Vite._worker): High-performance background jobs powered by Bun and TypeScript. Handles media thumbnail generation, AI tagging, and metadata extraction._gatekeeper): High-performance media serving and proxying written in Go._desktop_client): Electron-based desktop client for localized usage.docker-compose.example.yml and adjust the volume paths to match your system. Rename it to docker-compose.yml..env.example to .env and configure the necessary environment variables (e.g., database connection string, OpenRouter keys, etc.).docker-compose up -d
End-to-end tests use Playwright (Chromium) to navigate the app like a real user and capture screenshots for visual regression comparison.
pnpm test:all # full lifecycle: infra → seed → server → Playwright → cleanup
| Script | Description |
|---|---|
pnpm test:all |
Run the full test suite (recommended) |
pnpm test:infra:up |
Start Postgres container |
pnpm test:infra:down |
Stop test containers |
pnpm test:seed |
Seed the test database (requires TEST_DATABASE_URL) |
pnpm test:run |
Run Playwright tests (requires a running server) |
pnpm test:update-snapshots |
Run tests and update baseline screenshots |
Screenshots are stored in tests/snapshots/ (tracked via Git LFS). On the first run, use
pnpm test:update-snapshots to create baselines. Subsequent pnpm test:run calls compare
against these baselines with a 1% pixel diff tolerance.
This project uses @changesets/cli for versioning and releases. For instructions on how to create changesets and cut a new release, please see .changeset/README.md.