A personal productivity web application. It tracks tasks, habits, books, articles, events, countdowns and recipes, and exposes each of them through a REST API, a browser UI and a command-line client.
| Service | Framework | Purpose |
|---|---|---|
| API | FastAPI | REST backend, Authelia ForwardAuth and OIDC auth |
| Vue | Vue 3 + TypeScript | Single-page frontend, every page |
| Scheduler | APScheduler | Daily jobs — autotasks, autofun |
All three share one PostgreSQL database and a Redis cache. Docker Compose runs them behind Traefik, which terminates TLS and routes by host.
cli/ is a separate Go module building life, a REST client over the same API.
ops/lifeops is the bash tool that drives local environments and deploys.
It and the scripts it calls run on bash 3.2, the version macOS ships, so they
use no bash-4 constructs such as mapfile or declare -A.
Requires Docker, uv, Python 3.14 and Node 24.
./ops/lifeops dev start # build and start every service, then migrate and add users
./ops/lifeops dev health # confirm the containers are upThat serves the app at https://app.docker.localhost/, and the API with its
Swagger docs at https://api.docker.localhost/.
./ops/lifeops dev db seed --scale 1 fills the database with sample data.
task test # every suite but e2e: Python, the CLI and the frontend
task lint # every read-only check; task format rewrites
./ops/lifeops test run # Python suite, against its own Postgres and Redis
./ops/lifeops test e2e # Playwright, inside this checkout's test stack
cd frontend && npm test # TypeScript build check plus unit testsEach pytest session starts and discards its own Postgres and Redis, unless
TEST_DATABASE_URL or TEST_REDIS_URL names a server to use instead. The e2e
suite runs inside a compose project named after the checkout, which publishes
no ports. So two checkouts run either suite at once without touching each
other or the dev stack.
mkdocs serve builds the full documentation at http://127.0.0.1:8000. Start
with Quick Start, then
Testing and
Blue/Green Deployment.