A simple OKR app for doing OKRs, and nothing else. Doesn't track progress, but that's coming soon
- Backend: FastAPI + SQLAlchemy + Alembic + Postgres
- Frontend: React + Vite + TypeScript + Tailwind + shadcn/ui
- Auth: Auth0 (RS256 JWT)
- Task queue: Celery + Redis
- Deployment: Docker + docker-compose
- Docker + Docker Compose
- Node 22+ (for local frontend dev)
- Python 3.12+ with
uv(for local backend dev)
Copy the examples and fill in your Auth0 credentials:
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env| Variable | Description |
|---|---|
DATABASE_URL |
Postgres connection string |
AUTH0_DOMAIN |
Auth0 tenant domain (e.g. rmi.auth0.com) |
AUTH0_API_AUDIENCE |
Auth0 API identifier (e.g. https://rokr-api) |
ADMIN_EMAILS |
JSON array of admin email addresses |
CORS_ORIGINS |
JSON array of allowed frontend origins |
CELERY_BROKER_URL |
Redis URL for Celery broker |
CELERY_RESULT_BACKEND |
Redis URL for Celery results |
POSTGRES_PASSWORD |
Postgres password (used by docker-compose) |
| Variable | Description |
|---|---|
VITE_AUTH0_DOMAIN |
Auth0 tenant domain |
VITE_AUTH0_CLIENT_ID |
Auth0 SPA client ID |
VITE_AUTH0_AUDIENCE |
Auth0 API audience (must match backend) |
VITE_API_BASE_URL |
Backend API base URL |
- Create a Single Page Application in Auth0 → get
VITE_AUTH0_CLIENT_IDandVITE_AUTH0_DOMAIN - Set Allowed Callback URLs:
http://localhost:5173/callback - Set Allowed Logout URLs:
http://localhost:5173 - Set Allowed Web Origins:
http://localhost:5173 - Create an API → set identifier (e.g.
https://rokr-api) → use RS256 signing - Use the API identifier as
AUTH0_API_AUDIENCE/VITE_AUTH0_AUDIENCE
docker compose upThis starts:
db— Postgres 17redis— Redis 7backend— FastAPI (runsalembic upgrade headthen starts uvicorn on :8000)celery— Celery workerfrontend— Vite dev server on :5173
Via Docker (while docker compose up is running):
docker compose exec db psql -U rokr -d rokrVia psql on your host (Postgres must be exposed on port 5432):
psql postgresql://rokr:secret@localhost:5432/rokrUseful psql commands once connected:
\dt -- list tables
\d users -- describe a table
SELECT * FROM users; -- query data
SELECT * FROM alembic_version; -- check which migration has run
\q -- quitIf \dt shows no tables, the migration hasn't run. Run it manually:
docker compose exec backend alembic upgrade head# Start Postgres first (or point TEST_DATABASE_URL at an existing instance)
docker compose up db -d
# Create the test database
docker compose exec db psql -U rokr -c "CREATE DATABASE rokr_test;"
# Install dev deps and run tests
cd backend
uv venv .venv --python 3.12
uv pip install --python .venv/bin/python -e ".[dev]"
TEST_DATABASE_URL=postgresql://rokr:secret@localhost:5432/rokr_test .venv/bin/pytest -vcd backend
uv venv .venv --python 3.12
uv pip install --python .venv/bin/python -e ".[dev]"
# Set DATABASE_URL to a local Postgres instance in backend/.env
.venv/bin/alembic upgrade head
.venv/bin/uvicorn app.main:app --reloadcd frontend
npm install
npm run dev