No description
Find a file
Alec Perkins f6b7374be7 Add feature files, image pins and implementations (Phase 4)
Files: prototype and documentation files on features, with versions.
Adding, replacing or removing a file is a feature revision with a
change note. Types come from the extension; uploads are capped at
25 MB and stored under opaque paths. Every file URL checks project
access, then redirects to a short-lived signed URL on the bucket, or
streams with nosniff and a CSP sandbox when no bucket is configured.
HTML prototypes run in a sandboxed iframe without same-origin access.

Threads: whole-file threads and pins at a point on an image, drawn as
an SVG overlay in percentages. Pins are placed with number fields, or
by clicking the image with JS.

Implementations: name, link and status, plus a per-feature status grid
stamped with the feature revision, marked behind when the feature
changes, and confirmable without changing the status.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 10:15:30 -04:00
.forgejo/workflows Harden auth, invites and deployment after security review 2026-10-27 08:42:19 -04:00
bin Harden auth, invites and deployment after security review 2026-10-27 08:42:19 -04:00
config Add feature files, image pins and implementations (Phase 4) 2026-10-27 10:15:30 -04:00
docs Add feature files, image pins and implementations (Phase 4) 2026-10-27 10:15:30 -04:00
intent Add feature files, image pins and implementations (Phase 4) 2026-10-27 10:15:30 -04:00
static Add feature files, image pins and implementations (Phase 4) 2026-10-27 10:15:30 -04:00
templates Add feature files, image pins and implementations (Phase 4) 2026-10-27 10:15:30 -04:00
tests Add feature files, image pins and implementations (Phase 4) 2026-10-27 10:15:30 -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 Harden auth, invites and deployment after security review 2026-10-27 08:42:19 -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 projects and features with revision history (Phase 2) 2026-10-27 07:58:16 -04:00
README.md Scaffold Phase 0: Django project, deploy config, base layout 2026-10-27 06:59:34 -04:00
uv.lock Add projects and features with revision history (Phase 2) 2026-10-27 07:58:16 -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.