No description
Find a file
Alec Perkins 1af217f6fb Add accounts and organizations (Phase 1)
Sign-in via django-allauth: emailed one-time codes, GitHub, Discord,
and Forgejo instances as OpenID Connect apps registered in admin.
Regular users never have a password; sysadmins sign in only at
/admin/ and are redirected there from the normal sign-in.

Organizations at the URL root with owner and collaborator roles, a
per-member project-create grant, and invites by username or email.
Email invites carry a bearer token stored only as a hash. The last
owner can't leave, be removed or be demoted. Permission checks live
in intent/access.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 07:10:27 -04:00
.forgejo/workflows Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
bin Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
config Add accounts and organizations (Phase 1) 2026-10-27 07:10:27 -04:00
docs Add accounts and organizations (Phase 1) 2026-10-27 07:10:27 -04:00
intent Add accounts and organizations (Phase 1) 2026-10-27 07:10:27 -04:00
static Add accounts and organizations (Phase 1) 2026-10-27 07:10:27 -04:00
templates Add accounts and organizations (Phase 1) 2026-10-27 07:10:27 -04:00
tests Add accounts and organizations (Phase 1) 2026-10-27 07:10:27 -04:00
.dockerignore Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
.env.example Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
.gitignore Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
.python-version Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
compose.yaml Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
Dockerfile Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
fly.toml Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
litestream.yml Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
manage.py Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
pyproject.toml Add accounts and organizations (Phase 1) 2026-10-27 07:10:27 -04:00
README.md Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
uv.lock Add accounts and organizations (Phase 1) 2026-10-27 07:10:27 -04:00

Intent

Track the why behind features, across implementations. See docs/concept.md and docs/plan.md.

Local development

With uv:

uv sync
uv run python manage.py migrate
uv run python manage.py runserver

Or with Docker:

docker compose up --build

Then open http://localhost:8000. Data lives in data/ (uv) or the data volume (Docker).

Checks:

uv run ruff check . && uv run ruff format --check . && uv run pytest

Production

Fly.io, one machine with a volume at /data. bin/start restores the database from B2 if the volume is empty, runs migrations, and starts gunicorn under Litestream.

Secrets (fly secrets set):

Name Purpose
DJANGO_SECRET_KEY Django secret key
LITESTREAM_BUCKET, LITESTREAM_ENDPOINT, LITESTREAM_ACCESS_KEY_ID, LITESTREAM_SECRET_ACCESS_KEY B2 backup bucket
BUCKET_NAME, AWS_* Tigris uploads; set by fly storage create
SENTRY_DSN Optional error reporting

Restore drill: create a fresh volume, deploy, and confirm bin/start logs a restore before migrating.