No description
  • Python 71.2%
  • HTML 20.8%
  • CSS 4.9%
  • JavaScript 2.9%
  • Dockerfile 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Sven 6f4a9bfbc3
All checks were successful
Publish container image / publish (push) Successful in 1m24s
Made Fellowship availability discoverable and editable in place
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>
2026-09-20 18:26:49 +02:00
.forgejo/workflows Moved ci to forgejo 2026-09-03 19:06:48 +02:00
base Made Fellowship availability discoverable and editable in place 2026-09-20 18:26:49 +02:00
contrib Added nginx config; fixed media url 2026-07-17 20:09:38 +02:00
docs Show suggestion drafts to users and notify admins 2026-07-26 20:05:47 +02:00
fellowships Made Fellowship availability discoverable and editable in place 2026-09-20 18:26:49 +02:00
gatherings Fix Discord webhook SSRF, repair the test suite, clean up dead code 2026-09-20 13:59:05 +02:00
locale/de/LC_MESSAGES Made Fellowship availability discoverable and editable in place 2026-09-20 18:26:49 +02:00
profiles Made Fellowship availability discoverable and editable in place 2026-09-20 18:26:49 +02:00
QuestBoard Fix Discord webhook SSRF, repair the test suite, clean up dead code 2026-09-20 13:59:05 +02:00
rpgs Added RPG catalog 2026-07-26 18:49:11 +02:00
static Made Fellowship availability discoverable and editable in place 2026-09-20 18:26:49 +02:00
templates Made Fellowship availability discoverable and editable in place 2026-09-20 18:26:49 +02:00
.dockerignore Fix Discord webhook SSRF, repair the test suite, clean up dead code 2026-09-20 13:59:05 +02:00
.env.docker.example Fix Discord webhook SSRF, repair the test suite, clean up dead code 2026-09-20 13:59:05 +02:00
.env.example Fix Discord webhook SSRF, repair the test suite, clean up dead code 2026-09-20 13:59:05 +02:00
.gitignore Added AGENTS.md 2026-09-20 14:00:52 +02:00
.python-version Initial commit 2026-06-26 14:39:35 +02:00
AGENTS.md Added AGENTS.md 2026-09-20 14:00:52 +02:00
CLAUDE.md Fix Discord webhook SSRF, repair the test suite, clean up dead code 2026-09-20 13:59:05 +02:00
docker-compose.yml Added migrations to app image; updated python 2026-07-17 19:15:54 +02:00
docker-entrypoint.sh Fix Discord webhook SSRF, repair the test suite, clean up dead code 2026-09-20 13:59:05 +02:00
Dockerfile Added migrations to app image; updated python 2026-07-17 19:15:54 +02:00
manage.py Initial commit 2026-06-26 14:39:35 +02:00
pyproject.toml Added django-compressor 2026-07-17 18:36:47 +02:00
README.md Add the possibility to create concrete gathering 2026-09-09 20:39:14 +02:00
uv.lock Dependency update 2026-09-20 12:24:28 +02:00

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_deadlines
  • gatherings.tasks.send_due_reminders

Application Areas

  • base: landing page, imprint, privacy policy
  • profiles: custom profiles.User, profile editing, profile detail, anonymous gathering claiming
  • gatherings: 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.NotificationService so additional providers can be added without changing views.
  • RPG catalog curation and the Wikimedia Attention Index are documented in docs/rpg-catalog.md.