Frollz is a self-hosted film photography tracking application. If you shoot on film and want a personal logbook for your rolls — where they are, what stock you used, when they were shot and developed, and what came back from the lab — Frollz is built for that.
- Track every roll from purchase to receiving negatives back from the lab, with a full state history
- Catalog your film stocks with manufacturer, process, speed, format, and tags
- Record transition details — storage temperatures, shot ISO, lab name, push/pull stops, scan links, and more
- Auto-tag rolls with
expired,pushed,pulled, andcross-processedbased on the data you enter - Correct mistakes — backward transitions are supported and flagged as corrections in the roll's history
![]() |
![]() |
![]() |
![]() |
![]() |
Frollz is designed to be self-hosted. The baseline stack runs as four containers:
nginx(ingress reverse proxy)web(built Next.js web app)api(built NestJS API)postgres(PostgreSQL 18)
- Docker with the Compose plugin (
docker compose)
1. Clone the repository
git clone https://github.com/joshholl/frollz.git
cd frollz2. Create your environment file
cp .env.example .envOpen .env and set at least:
DATABASE_PASSWORDJWT_ACCESS_SECRET
The defaults are safe for local testing only.
3. Start the stack
docker compose up -dThe ingress container publishes port 80 (http://localhost by default). API and database traffic stay on the internal Docker network.
4. Access Frollz
On first start, the API boot process auto-applies database changes and seeds reference data when AUTO_MIGRATE_SEED=true.
docker compose logs -f
docker compose ps
docker compose downdocker compose pull
docker compose up -dDatabase updates run automatically on startup when AUTO_MIGRATE_SEED=true.
docker compose build api web
docker compose up -d| Variable | Default | Description |
|---|---|---|
DATABASE_DRIVER |
postgres |
Selects DB runtime (postgres or sqlite) |
DATABASE_HOST |
postgres |
PostgreSQL hostname (Compose service name) |
DATABASE_PORT |
5432 |
PostgreSQL port |
DATABASE_NAME |
frollz |
PostgreSQL database name |
DATABASE_USER |
frollz |
PostgreSQL user |
DATABASE_PASSWORD |
changeme |
PostgreSQL password (change this) |
DATABASE_URL |
frollz2.sqlite |
SQLite file path when DATABASE_DRIVER=sqlite |
JWT_ACCESS_SECRET |
change-me |
JWT signing secret |
ALLOWED_ORIGINS |
http://localhost |
CORS allowlist (comma-separated) |
AUTO_MIGRATE_SEED |
true |
Runs driver-specific migrations (migrations-postgres or migrations) and seeds reference data |
SEED_DEMO_USER |
false |
Seeds demo user when true |
PORT |
3000 |
API listen port |
- Fork the repository
- Create a feature branch from
development - Make your changes with tests
- Submit a pull request against
development
MIT




