explaingit

hackswithcoffee/inkwell

0PythonAudience · generalComplexity · 3/5ActiveLicenseSetup · hard

TLDR

Local pipeline that turns a Craigbot Discord D&D recording into a written session recap and running lore files using mlx-whisper and Ollama Mistral models.

Mindmap

mindmap
  root((inkwell))
    Inputs
      Craigbot multitrack zip
      players.json mapping
      Ollama Mistral models
    Outputs
      Dated diary recap
      NPC and lore files
      Structured JSON
    Use Cases
      Auto D&D session log
      Campaign continuity
      Feed recaps to other tools
    Tech Stack
      Python
      mlx-whisper
      Ollama
      Mistral

Things people build with this

USE CASE 1

Turn a Discord Craigbot recording into a dated D&D session recap automatically

USE CASE 2

Keep a growing campaign archive of NPCs, lore, and loot without manual notetaking

USE CASE 3

Generate structured JSON summaries that feed into a wiki or other downstream tool

USE CASE 4

Transcribe and summarize any multi-speaker audio fully offline on an Apple Silicon Mac

Tech stack

Pythonmlx-whisperOllamaMistralMLX

Getting it running

Difficulty · hard Time to first run · 1h+

Requires an Apple Silicon Mac, a local Ollama install with two Mistral models pulled, and Craigbot recordings as input.

Code is MIT licensed; the bundled D&D SRD 5.2 material is reused under Creative Commons Attribution 4.0.

In plain English

Inkwell is a personal tool for Dungeons and Dragons groups that turns a recording of a play session into a written recap. The author frames it in-character: it is a Royal Scribe that quietly listens, then after each session produces a diary entry covering what happened in the game, plus a set of running notes about the world, the people the party met, enemies fought, and loot collected. The point is to have a campaign archive that grows on its own and is useful for catching up after a missed session, for the DM keeping continuity, or for feeding into other tools as source material. The input is a multi-track audio recording from Discord. The group runs a recording bot called Craigbot during the session, which creates one audio track per speaker. After the session you download the resulting .zip file and drop it into a recordings/ folder, and that is the only trigger for the rest of the pipeline. The pipeline does everything else on one machine. It unpacks the zip and transcribes each speaker's track with mlx-whisper, then interleaves all segments chronologically into one transcript so dialogue flows in real time across speakers. Then it sends that transcript to a local Ollama install: a mistral-nemo 12B model writes the chapter-style diary entry in the Scribe's voice, and a mistral 7B model extracts a structured JSON file with decisions, NPCs, lore, and loot. The pipeline saves a dated recap file and appends new findings to running files for world lore, NPCs, and allies. The original zip is moved to an archive folder and the extracted audio is deleted to reclaim disk space. Because mlx-whisper uses Apple's MLX backend, Inkwell requires an Apple Silicon Mac. It also needs Python 3.9 or newer, the packages in requirements.txt, and Ollama running locally with the two Mistral models pulled. A players.json file maps Discord usernames to character names so the recap only refers to characters, not real names. The code is MIT licensed. Material in the dnd rules folder and the summarizer primer comes from the official D&D System Reference Document 5.2 under a Creative Commons Attribution 4.0 license.

Copy-paste prompts

Prompt 1
Walk me through setting up Inkwell on my M-series Mac with Ollama and the two Mistral models pulled
Prompt 2
Show me how the per-speaker tracks get interleaved into a single chronological transcript
Prompt 3
Replace the diary prompt so the Scribe writes in a different in-character voice
Prompt 4
Add a new running file for magic items and have the extractor populate it each session
Prompt 5
Swap mistral-nemo for a larger local model and explain the quality and speed trade-off
Open on GitHub → Explain another repo

Generated 2026-05-22 · Model: sonnet-4-6 · Verify against the repo before relying on details.