Skip to content

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

  1. Put the new screenshots, context .txt files and recordings in a folder.
  2. 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.
  3. Add the page to the nav: list in mkdocs.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.

  1. Run python tools/remaster.py testimonies/<witness>/<page>. This replaces the page's screenshots with a ```chat block pre-filled from the OCR text, and moves the screenshots into the foldout. Links such as page/index.md#bd3 keep working: they now land on the matching point in the chat.
  2. Run .venv\Scripts\mkdocs serve and open the page. The chat re-renders every time you save.
  3. 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.
  4. Delete the !draft line. 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