Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ docs/

# Implementation tracking
.impl-tracker*
.impl-preferences*
.impl-verification/

# Binaries (Tailwind standalone CLI for local dev)
bin/

# Old codebase
_old/
Expand All @@ -52,13 +57,23 @@ _old/

# Claude Code
.claude/
CLAUDE.local.md

# Issue pipeline and worktrees
.issue-pipeline/
.worktrees/

# Image cache
.image-cache/

# Docker (avoid recursive copies)
docker-compose.yml
Dockerfile

# Media (runtime data, not build artifact)
# Runtime/dev data (not build artifacts)
src/media/
src/staticfiles/
src/db.sqlite3

# Traefik config
traefik/
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ CELERY_RESULT_BACKEND=redis://redis:6379/0
# SERVER_EMAIL=errors@example.com
# ADMIN_EMAIL=admin@example.com

# Sentry error tracking (feature disabled if SENTRY_DSN not set)
# For self-hosted Sentry, use your instance's DSN
# SENTRY_DSN=https://examplePublicKey@sentry.yourdomain.com/1
# SENTRY_DSN_JS=https://examplePublicKey@sentry.yourdomain.com/2
# SENTRY_ENVIRONMENT=production
# SENTRY_TRACES_SAMPLE_RATE=0.1
Comment on lines +83 to +88
Copy link

Copilot AI Mar 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment says Sentry is disabled if SENTRY_DSN isn’t set, but the frontend templates are gated by SENTRY_DSN_JS. As written, you can end up with frontend-only or backend-only Sentry depending on which DSN is set. Consider clarifying the wording to reflect that SENTRY_DSN enables backend reporting and SENTRY_DSN_JS enables browser/admin reporting.

Copilot uses AI. Check for mistakes.

# Production-only
# DOMAIN=assets.yourdomain.com
# ACME_EMAIL=admin@yourdomain.com
Expand Down
3 changes: 3 additions & 0 deletions requirements.in
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ weasyprint
# AI (optional at runtime, required at build)
anthropic

# Error tracking
sentry-sdk[django,celery]

# Colour
coloraide

Expand Down
139 changes: 77 additions & 62 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
# This file is autogenerated by pip-compile with Python 3.13
# by the following command:
#
# pip-compile --output-file=/Users/andrewya/dev/props/.worktrees/issue-10/requirements.txt /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# pip-compile requirements.in
#
amqp==5.3.1
# via kombu
annotated-types==0.7.0
# via pydantic
anthropic==0.78.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
anthropic==0.84.0
# via -r requirements.in
anyio==4.12.1
# via
# anthropic
Expand All @@ -25,42 +25,47 @@ attrs==25.4.0
# via
# service-identity
# twisted
autobahn==24.4.2
autobahn==25.12.2
# via daphne
automat==25.4.16
# via twisted
billiard==4.2.4
# via celery
black==26.1.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
boto3==1.42.43
black==26.3.0
# via -r requirements.in
boto3==1.42.63
# via django-storages
botocore==1.42.43
botocore==1.42.63
# via
# boto3
# s3transfer
brotli==1.2.0
# via fonttools
build==1.4.0
# via pip-tools
cbor2==5.8.0
# via autobahn
celery[redis]==5.6.2
# via
# -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# -r requirements.in
# django-celery-beat
certifi==2026.1.4
# sentry-sdk
certifi==2026.2.25
# via
# httpcore
# httpx
# sentry-sdk
cffi==2.0.0
# via
# autobahn
# cryptography
# weasyprint
channels==4.3.2
# via
# -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# -r requirements.in
# channels-redis
channels-redis==4.3.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
click==8.3.1
# via
# black
Expand All @@ -75,13 +80,13 @@ click-plugins==1.1.1.2
# via celery
click-repl==0.3.0
# via celery
coloraide==8.3
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
coloraide==8.6
# via -r requirements.in
constantly==23.10.4
# via twisted
coverage[toml]==7.13.3
coverage[toml]==7.13.4
# via pytest-cov
cron-descriptor==2.0.6
cron-descriptor==1.4.5
# via django-celery-beat
cryptography==46.0.5
# via
Expand All @@ -91,48 +96,49 @@ cryptography==46.0.5
cssselect2==0.9.0
# via weasyprint
daphne==4.2.1
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
distro==1.9.0
# via anthropic
django==5.2.11
django==5.2.12
# via
# -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# -r requirements.in
# channels
# django-celery-beat
# django-htmx
# django-storages
# django-timezone-field
# django-unfold
django-celery-beat==2.8.1
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
django-gravatar2==1.4.4
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# sentry-sdk
django-celery-beat==2.9.0
# via -r requirements.in
django-gravatar2==1.4.5
# via -r requirements.in
django-htmx==1.27.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
django-ratelimit==4.1.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
django-storages[boto3]==1.14.6
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
django-timezone-field==7.2.1
# via django-celery-beat
django-unfold==0.78.1
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
django-unfold==0.83.1
# via -r requirements.in
docstring-parser==0.17.0
# via anthropic
et-xmlfile==2.0.0
# via openpyxl
execnet==2.1.2
# via pytest-xdist
factory-boy==3.3.3
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
faker==40.1.2
# via -r requirements.in
faker==40.8.0
# via factory-boy
flake8==7.3.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
fonttools[woff]==4.61.1
# via weasyprint
gunicorn==25.0.2
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
gunicorn==25.1.0
# via -r requirements.in
h11==0.16.0
# via httpcore
httpcore==1.0.9
Expand All @@ -153,8 +159,8 @@ incremental==24.11.0
# via twisted
iniconfig==2.3.0
# via pytest
isort==7.0.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
isort==8.0.1
# via -r requirements.in
jiter==0.13.0
# via anthropic
jmespath==1.1.0
Expand All @@ -166,11 +172,13 @@ kombu[redis]==5.6.2
mccabe==0.7.0
# via flake8
msgpack==1.1.2
# via channels-redis
# via
# autobahn
# channels-redis
mypy-extensions==1.1.0
# via black
openpyxl==3.1.5
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
packaging==26.0
# via
# black
Expand All @@ -182,29 +190,31 @@ packaging==26.0
# wheel
pathspec==1.0.4
# via black
pi-heif==1.2.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
pi-heif==1.3.0
# via -r requirements.in
pillow==12.1.1
# via
# -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# -r requirements.in
# pi-heif
# python-barcode
# qrcode
# weasyprint
pip-tools==7.5.2
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
platformdirs==4.5.1
pip-tools==7.5.3
# via -r requirements.in
platformdirs==4.9.4
# via black
pluggy==1.6.0
# via
# pytest
# pytest-cov
prompt-toolkit==3.0.52
# via click-repl
psycopg[binary]==3.3.2
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
psycopg-binary==3.3.2
psycopg[binary]==3.3.3
# via -r requirements.in
psycopg-binary==3.3.3
# via psycopg
py-ubjson==0.16.1
# via autobahn
pyasn1==0.6.2
# via
# pyasn1-modules
Expand Down Expand Up @@ -240,15 +250,15 @@ pytest==9.0.2
# pytest-django
# pytest-xdist
pytest-asyncio==1.3.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
pytest-cov==7.0.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
pytest-django==4.11.1
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
pytest-django==4.12.0
# via -r requirements.in
pytest-xdist==3.8.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
python-barcode[images]==0.16.1
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
python-crontab==3.3.0
# via django-celery-beat
python-dateutil==2.9.0.post0
Expand All @@ -258,14 +268,16 @@ python-dateutil==2.9.0.post0
pytokens==0.4.1
# via black
qrcode[pil]==8.2
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
redis==6.4.0
# via
# -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# -r requirements.in
# channels-redis
# kombu
s3transfer==0.16.0
# via boto3
sentry-sdk[celery,django]==2.54.0
# via -r requirements.in
service-identity==24.2.0
# via twisted
six==1.17.0
Expand All @@ -278,16 +290,15 @@ tinycss2==1.5.1
# via
# cssselect2
# weasyprint
tinyhtml5==2.0.0
tinyhtml5==2.1.0
# via weasyprint
twisted[tls]==25.5.0
# via daphne
txaio==25.9.2
txaio==25.12.2
# via autobahn
typing-extensions==4.15.0
# via
# anthropic
# cron-descriptor
# pydantic
# pydantic-core
# twisted
Expand All @@ -300,26 +311,30 @@ tzdata==2025.3
# kombu
tzlocal==5.3.1
# via celery
ujson==5.11.0
# via autobahn
urllib3==2.6.3
# via botocore
# via
# botocore
# sentry-sdk
vine==5.1.0
# via
# amqp
# celery
# kombu
wcwidth==0.5.3
wcwidth==0.6.0
# via prompt-toolkit
weasyprint==68.1
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
# via -r requirements.in
webencodings==0.5.1
# via
# cssselect2
# tinycss2
# tinyhtml5
wheel==0.46.3
# via pip-tools
whitenoise==6.11.0
# via -r /Users/andrewya/dev/props/.worktrees/issue-10/requirements.in
whitenoise==6.12.0
# via -r requirements.in
zope-interface==8.2
# via twisted
zopfli==0.4.1
Expand Down
Loading