Contributing¶
This site is built from plain Markdown files in the docs/ folder of the
GitHub repository using
MkDocs Material. Every page has an
edit button (pencil icon, top right) that opens the page's Markdown on GitHub.
Principles¶
- Never alter evidence. Screenshots, recordings and witness notes are kept exactly as submitted. Fix typos only in headings and summaries written for the site.
- Redact before adding. Black out private information (real names, faces, addresses, and the identities of minors) in the image itself before it is added. Text that is only blurred by the site can still be read in the page source and in the OCR text.
- Link, don't copy. If one screenshot supports several charges, it lives on one page
and the charge pages link to it (
page/index.md#file-name).
Building the site locally¶
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt # Windows
.venv\Scripts\mkdocs serve # preview at http://127.0.0.1:8000
.venv\Scripts\mkdocs build # static site in site/
Adding new evidence¶
- Put the new screenshots, context
.txtfiles and recordings in a folder. - Run
python tools/new_page.py "<that folder>" testimonies/<witness>/<short-name> "Page Title". This copies the files, reads the text out of every screenshot (Windows OCR) so it is searchable, and writes the page. - Add the page to the
nav:list inmkdocs.yml, and link it from the charge pages it supports.
Recordings over about 90 MB are too large for GitHub. Upload them to
muffinmode.net/stickmandan/ and add the file name and URL to EXTERNAL in
tools/import_evidence.py before running the script.
Remastered chats¶
Discord conversations can be shown as a readable, Discord-style chat instead of a pile of screenshots. The screenshots are kept in a collapsed Original screenshots block at the bottom of the page, and remain the evidence.
- Run
python tools/remaster.py testimonies/<witness>/<page>. This replaces the page's screenshots with a```chatblock pre-filled from the OCR text, and moves the screenshots into the foldout. Links such aspage/index.md#bd3keep working: they now land on the matching point in the chat. - Run
.venv\Scripts\mkdocs serveand open the page. The chat re-renders every time you save. - Clean up the text against each original screenshot (open the image file next to the
Markdown). Join lines that the OCR wrapped, fix misread words, and delete the
//lines once you have dealt with them. - Delete the
!draftline. It shows a "not yet checked" banner until you do.
Inside a ```chat block:
| Line | Meaning |
|---|---|
# Babybel Original Cheese | 8/3/25, 2:09 AM |
a new message from this author, at this time |
# StickManDan [YHWH] | 8/3/25, 2:15 AM |
[YHWH] is the server tag shown next to the name |
| any other line | one message line from the author above (a blank line inside a message is kept) |
^ StickManDan: I just stood up to you... |
a reply preview, placed directly above the author line |
!shot BD2.png |
"from here on, see screenshot BD2.png" (gives the #bd2 anchor) |
!date August 3, 2025 |
a date divider |
!system StickManDan started a call. |
call, join and pin notices |
!image file.png |
a picture sent in the chat (a file in the page's folder) |
!note ... |
a note from the archive, clearly marked as not part of the chat |
!title @StickManDan |
the bar at the top of the chat |
// ... |
a comment, not shown |
\ at the start of a line |
show the line as plain text, even if it looks like one of the above |
In messages you can use Discord formatting: **bold**, *italic*, __underline__,
~~strike~~, `code`, ||spoiler||, > quote, -# small text, @name or
@{name with spaces}, and (edited) at the end of a line. Write [redacted] wherever the
screenshot is blacked out.
Always type names exactly as the screenshot shows them. chat-people.yml (in the
repository root) connects those names to a person, their name colour and their avatar. Add
anyone who is missing. Use anonymous: true for anyone whose real avatar must never be shown.
Colours in VS Code¶
python tools/install_chat_syntax.py installs a small VS Code extension (from
tools/vscode-chat-syntax/) that colours ```chat blocks, so author lines, ! directives,
replies, // comments and formatting stand out from the message text. Reload the window
afterwards. The colours come from your current theme.
Avatars¶
python tools/fetch_avatars.py downloads each person's current Discord avatar (for everyone
with a discord_id in chat-people.yml) into docs/assets/avatars/. Commit those files. The
deploy workflow runs the same script before every build, so the published site always uses
current avatars. If a lookup fails, the committed files are used instead.
The lookup uses the free public services japi.rest and avatar-cyan.vercel.app. For something
more dependable, create a Discord bot and save its token as the repository secret
DISCORD_BOT_TOKEN, which makes the script use Discord's own API. People without an ID
get a coloured initial instead of an avatar.
Page anatomy¶
| Element | Markdown |
|---|---|
| Screenshot | <figure class="evidence" id="bd1" markdown> … </figure> |
| Screenshot with a content warning | add sensitive to the class and a <div class="cw">…</div> |
| Witness note (verbatim) | <div class="verbatim" markdown="0">…</div> |
| Collapsible OCR text | ??? abstract "Text in this screenshot (OCR, may contain errors)" |
| Transcript line link | vex-testimony/index.md#vex-146 |