- Python 71.2%
- HTML 20.8%
- CSS 4.9%
- JavaScript 2.9%
- Dockerfile 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
Publish container image / publish (push) Successful in 1m24s
Entering availability used to mean finding the profile, opening the Fellowship calendar, switching on "Input availability", clicking days and pressing "Done editing". Nothing said that was possible, and a member's own days were styled only inside that mode, so the calendar could not answer "have I filled this in?" without entering it. - Own days are now marked in both modes, with a slim underline instead of a filled cell, so a mostly-marked month does not swamp the gathering and today cues. - A quiet hint under the Calendar heading carries the call to action while nothing is marked and becomes a plain count afterwards. It links into the calendar with ?edit=1, which renders it ready for input. - "Input availability"/"Done editing" became an "Edit my availability" switch: the changes save immediately, so there was never anything to confirm on the way out. It sits on the Fellowship page too, so marking the next three months no longer leaves that page. - The full calendar opens at the current month on a fresh navigation, and its toolbar sticks so the switch stays reachable across twelve months. - Days can be painted by dragging, and a weekday heading toggles that weekday for the whole month, for groups that play on a fixed day. - The start and profile Fellowship cards carry the same count as one muted line. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
| .forgejo/workflows | ||
| base | ||
| contrib | ||
| docs | ||
| fellowships | ||
| gatherings | ||
| locale/de/LC_MESSAGES | ||
| profiles | ||
| QuestBoard | ||
| rpgs | ||
| static | ||
| templates | ||
| .dockerignore | ||
| .env.docker.example | ||
| .env.example | ||
| .gitignore | ||
| .python-version | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| docker-compose.yml | ||
| docker-entrypoint.sh | ||
| Dockerfile | ||
| manage.py | ||
| pyproject.toml | ||
| README.md | ||
| uv.lock | ||
QuestBoard
QuestBoard is a lightweight Django scheduling app for tabletop RPG gatherings. It supports anonymous gathering polls with public participation links and private admin links, optional registered game-master accounts, Discord webhook notifications, email notifications, and Celery background jobs.
Stack
- Python 3.12 managed with
uv - Django 6
- PostgreSQL via
POSTGRES_*environment variables - Celery with Redis
- HTMX, vanilla JavaScript, Bootstrap CSS
- Local static assets only, no CDN references in templates
Local Setup
Create the database and Redis service however you prefer, then configure the app:
cp .env.example .env
uv sync
uv run python manage.py migrate
uv run python manage.py createsuperuser
uv run python manage.py runserver
For a quick SQLite-only smoke test:
USE_SQLITE=True uv run python manage.py test
Container publishing and deployment
Pushing to main runs the Forgejo Action in .forgejo/workflows/publish-image.yml.
It publishes lorebase.eu/sven/questboard with both latest and the commit SHA;
it never deploys the application. Configure the repository Action secret
REGISTRY_TOKEN with permission to publish packages before the first push.
Deployments are deliberately manual on the server:
ssh -p 33161 sven@jaar.nimbostratus.de
cd /home/sven/deployments/questboard
./deploy.sh [commit-sha]
Omit the optional commit SHA to deploy latest. The deployment directory's
.env must define FORGEJO_TOKEN with package-read access. REGISTRY_USER
defaults to sven and can be overridden when the token belongs to another
Forgejo account.
Background Jobs
Run a Celery worker:
uv run celery -A QuestBoard worker -l info
Run Celery beat for scheduled deadline and reminder processing:
uv run celery -A QuestBoard beat -l info
The configured periodic tasks are:
gatherings.tasks.process_registration_deadlinesgatherings.tasks.send_due_reminders
Application Areas
base: landing page, imprint, privacy policyprofiles: customprofiles.User, profile editing, profile detail, anonymous gathering claiminggatherings: gathering polls, anonymous participation, admin/public hash URLs, notification services, Celery tasks
Notes
- Production should set a real
SECRET_KEY,ALLOWED_HOSTS, email backend, PostgreSQL settings, and Redis URL. - The imprint and privacy templates are placeholders and must be replaced before public deployment.
- Discord webhook calls are isolated in
gatherings.services.NotificationServiceso additional providers can be added without changing views. - RPG catalog curation and the Wikimedia Attention Index are documented in docs/rpg-catalog.md.