[Backlog] GM handouts with reveal control #123
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context / Motivation
Research/product brief. GMs prep maps, letters, and portraits before a session and want to reveal them at the dramatic moment — currently that means pasting into Discord and losing them. Image upload infrastructure already exists:
webapp/backend/app/services/image_service.py(JPEG/PNG/WebP/GIF, python-magic validation, Pillow re-encode + EXIF strip, storage undermedia_root/campaigns/{campaign_id}/lore/{entry_id}), size-capped bymedia_max_upload_bytes(config.py:76, default 8 MB) — but it is lore-entry-scoped and one-image-per-entry.Spec (starting sketch)
Model —
Handout:id,campaign_id(FK CASCADE),session_id(nullable FK — session handouts vs campaign handouts),title,media_path(nullable) orbody_text(nullable Text, for text cards) — exactly one required,content_type(image|pdf|text),revealed_at(nullable timestamp — NULL = hidden),revealed_by_id(nullable FK users),created_by_id,created_at.Flow
image_servicepath, e.g.media_root/campaigns/{id}/handouts/{handout_id}; extend allowed types with PDF for this feature only).revealed_atfor player tokens).revealed_at/revealed_by_idAND posts the handout to the campaign's Discord channel via the bot (new event type throughservices/bot_pubsub.pypublish_bot_event; bot uploads the file or embeds the image). Un-reveal (re-hide) supported but does not delete the Discord message (note in UI).Out of scope
Open questions
media_max_upload_bytes(8 MB) or a separate, larger handout cap (PDFs run bigger)? Discord's own upload limit (8-25 MB depending on boost) constrains the reveal-post path — decide fallback (post link instead of file).image_service).Acceptance criteria (for when this is pulled)
image_servicerigor (magic-byte check, size cap) including the PDF path.References
webapp/backend/app/services/image_service.py(validation/storage pattern;_media_dirat:80,_validate_and_saveat:97)webapp/backend/app/config.py:76(media_max_upload_bytes)webapp/backend/app/services/bot_pubsub.py:29(publish_bot_event),bot/questboard_bot/cogs/notifications.py:169(dispatch map for a newhandout_revealedevent)Filed from the July 2026 full-project review.
The wiki design record #593 reshapes this issue (owner decisions, 2026-09-10).
Handouttable with its ownrevealed_at.shelf_reveals). That feature already supports choosing players, withdrawing a reveal, and keeping a copy of what was shown.Two scope changes from the body above:
Still open, and should carry into whichever build issue #593 is split into:
Leaving this open until then.