23 votes

I made a tool to generate AI powered recaps of TTRPG sessions

My party recently finished Descent into Avernus, which we played over Discord and FoundryVTT given how scattered across the country we all are. A regular party of the campaign was the DM poking and prodding players for "someone write up a recap of last session", helping keep us all in the loop, players who were absent in particular.

A few weeks ago it occurred to me that this could be automated, and Scribble was born.

Scribble is just a bash script wrapper that will:

  1. Take a .zip of FLAC files from the Craig discord bot, recordings of each player present for the session
  2. Use the tool whisperx to transcribe those audio files to text
  3. Compile a transcript of the session and send it off to Gemini to come up with the recap
  4. Parse the recap and send it along to Discord via webhook

After some trial and errors and tweaking, I've got it in a pretty good place, it's working very well for our campaign. So I docker-ized it and published it to share with the world anyone else who might get use from it. I'm not sure where else I could put the word out about this for anyone who might want to use it, so here it is. If you might find this useful, please, enjoy!

https://github.com/goose-ws/scribble

11 comments

  1. [4]
    papasquat
    Link
    Lol, honestly, as someone who has DMed a bit in the past, when I asked players to write a recap of the session, I'm not doing it because I can't remember the session. A DM usually remembers the...

    Lol, honestly, as someone who has DMed a bit in the past, when I asked players to write a recap of the session, I'm not doing it because I can't remember the session. A DM usually remembers the session better than anyone; they designed and ran the whole thing. I could easily recap any of my sessions from memory to anyone who missed the previous session if I wanted to.

    I did it as a forcing function to make sure players are paying attention to things even when it's not their turn. Otherwise, some players have a tendency to let their minds wander, have their noses in their character sheets, or the worst of all, be on their phones. Instead, I made one of them recap the previous session at the beginning of each new one. If they had some blank spots, other players would step in to fill in the blanks.

    I found that if I could potentially put them on the spot during the next session to recap our previous session, it made them pay more attention to what was actually happening and thus be more engaged with the campaign.

    If one of them brought an AI tool and went "look! We don't have to do that work anymore!" I'd tell them that it wasn't work, it was part of the gameplay.

    14 votes
    1. [2]
      kaffo
      Link Parent
      I mostly agree with you. For the vast majority of my games I'd actually award some XP for whoever gave the recap that week and ho boy, suddenly everyone was keen to remember what happened. But...

      I mostly agree with you. For the vast majority of my games I'd actually award some XP for whoever gave the recap that week and ho boy, suddenly everyone was keen to remember what happened.
      But there are a subset of games I've run where actually I want direction over the recap. The recap is the start of the session, it sets the tone. It's a tool to bring up events, people and places that you want to weave into this "episode" if you're running a TV show kinda game.

      But for most campaigns yeah sure, just try and get some engagement it's good.
      Also, if you're real start you can use it as a feedback tool to work out what your players actually found memorable. I've been shocked in the past they've totally forgotten specific people or quests or whatever but others stuck.

      6 votes
      1. papasquat
        Link Parent
        Yeah true, I've noticed that too. I can't count how many times I've put some random NPC into a session as a side character to run a shop or answer a question or something, and my players just...

        Yeah true, I've noticed that too. I can't count how many times I've put some random NPC into a session as a side character to run a shop or answer a question or something, and my players just completely fixate on them and become OBSESSED, and they'll bring up that character in the recap, and then I have to totally retool the direction I had in mind for the campaign to include this random one-off character I came up with off the top of my head with a silly voice that I'd wish I hadn't done.

        4 votes
    2. goose
      Link Parent
      Yeah, our DM also did it for similar reasons. But some weeks it would just get missed. Sometimes details were left out. And often it was the same one or two PC's with their POV's in the recap. The...

      Yeah, our DM also did it for similar reasons. But some weeks it would just get missed. Sometimes details were left out. And often it was the same one or two PC's with their POV's in the recap. The DM offered inspiration for a good recap, but they could still be hit or miss. We ended up using this as a tool to provide a pretty good session recap, and we could build off any incorrect or missed information.

      3 votes
  2. [2]
    archevel
    Link
    This is kind of neat! As an aside, at work we use slack and they have a feature to summarize meetings which we tested out. Unfortunately it is set up to work only on English so our meeting in...

    This is kind of neat! As an aside, at work we use slack and they have a feature to summarize meetings which we tested out. Unfortunately it is set up to work only on English so our meeting in swedish.

    XXX makes several unclear statements about "multibo", "Cape", "South Africa", and other locations/entities.

    XXX makes references to "the boy", "the dog", and other unspecified entities, but the meaning is unclear.

    We found it hilarious. Feels like Slack at least could have detected that this probably isn't English and just given up on summarizing!

    8 votes
    1. goose
      Link Parent
      I think whisperx has multi language support!

      I think whisperx has multi language support!

      2 votes
  3. [3]
    Gazook89
    Link
    How does it work with multiple people talking at once?

    How does it work with multiple people talking at once?

    4 votes
    1. goose
      Link Parent
      The discord bot that provides the session recording, Craig, does per-user recordings. So once it's done, you get a .zip of audio files for each user, that are all time-synced. So when I run...

      The discord bot that provides the session recording, Craig, does per-user recordings. So once it's done, you get a .zip of audio files for each user, that are all time-synced. So when I run whisperx on the audio file, it's only transcribing the audio for the individual person in that file. Once all the files are transcribed, each individual transcript is combined into the master session transcript, organized chronologically. So people talking over each other will have their own lines in the master transcript, just with overlapping timestamps.

      4 votes
    2. cdb
      Link Parent
      I know OP has already answered, but I've tried a similar thing with live sessions by recording audio with my phone, using the on device transcription, then giving it to Gemini, prompting to...

      I know OP has already answered, but I've tried a similar thing with live sessions by recording audio with my phone, using the on device transcription, then giving it to Gemini, prompting to generate summaries with the context of a DND session, keeping in mind that it's a transcription with errors, and asking it to ignore irrelevant banter. The summaries were really good, including a comprehensive rundown of what happened in the campaign while ignoring all the side chatter. I didn't ask any specific questions about the session though.

      1 vote
  4. [2]
    Dr_Amazing
    (edited )
    Link
    I tried doing this once using premire pro's auto captions pasted into chatGPT. Then told it to summarize in the tone of a fantasy novel. It couldn't do a whole session at once, but the sections...

    I tried doing this once using premire pro's auto captions pasted into chatGPT. Then told it to summarize in the tone of a fantasy novel.

    It couldn't do a whole session at once, but the sections came out ok. But I got a lot of passages like:

    "With a final fireball, the powerful wizard killed the evil lich. The heroes began searching the room, bravely checking for dangerous traps. The search was rewarded with a powerful magic sword. The heros cleverly discussed how to unlock the sword's true potential. Would it be given to the fighter or sold for money. The players shrewedly looked up the rules to removing an enchantment from one weapon and transferring it to another. At last a wise decision was reached. They would hang on to the sword for now and make a decision at a later time."

    3 votes
    1. goose
      Link Parent
      For reference, here's the first recap it put together for me (spoilers for Descent Into Avernus), it came out pretty good imo. # September 4, 2025 session recap With the aid of a newly redeemed...

      For reference, here's the first recap it put together for me (spoilers for Descent Into Avernus), it came out pretty good imo.

      # September 4, 2025 session recap

      With the aid of a newly redeemed Zariel, the party dove headfirst into the final battle against the demon lord Yeenoghu on the war-torn ground beneath Elturel.

      The Final Battle Begins

      The session opened in the heat of combat. Ragtag’s radiant Holy Aura enveloped the party, creating a protective bastion that hampered the demonic hordes' attacks. Yeenoghu lashed out with his butcher’s flail, a terrifying blow that left Maw momentarily paralyzed by fear. Springing to his aid, Elias used a magical trinket—a gift from a unicorn—to instantly break the paralysis. He then summoned a massive Wall of Fire, incinerating a wave of lesser demons and creating a barrier against further reinforcements.

      In a flash of light, a portal opened and a familiar face was unceremoniously spat out onto the battlefield: Jesper Mellerel had returned! Emerging from his magical snail companion, the tortle ranger took a moment to stretch before casting Daylight, bathing the hellish landscape in brilliant, pure light.

      It's Raining Gnolls

      The tide of the battle shifted dramatically thanks to a moment of brilliant, and brutal, ingenuity from Malakor. Tapping into his sorcerous power, he unleashed Reverse Gravity in a massive cylinder, catching dozens of gnolls, dretches, and even Yeenoghu’s monstrous pet, the Crokatoic. The creatures were helplessly launched hundreds of feet into the air.

      While the airborne enemies screamed towards the sky, the party dealt with the remaining threats on the ground. Yeenoghu, enraged, broke through the lines with his Path of the Lord of Ruin, a devastating charge that slammed through multiple party members and broke Malakor’s concentration. As the spell ended, the sky rained gore. The horde of demons plummeted back to the ground, splattering across the battlefield in a horrific, yet highly effective, display that cleared the field of most of Yeenoghu's minions.

      A Demon Lord Cornered

      With the battlefield momentarily cleared, Malakor trapped the demon lord in an impenetrable Wall of Force, hoping to buy the party time to deal with his remaining allies. Zariel fought with divine fury, cutting down demons with her celestial blade, while the party focused their efforts on the hulking Barlgura and the wounded Crokatoic. Scam wove through the combatants with his Jolan's Regal Presence, a whirlwind of bardic magic that damaged and displaced his foes.

      However, a demon lord is not so easily contained. Yeenoghu unleashed his power, shattering the magical prison and charging the party once more. As he bore down on a vulnerable Malakor, Elias’s spectral Echo intercepted the blow, sacrificing itself to save the sorcerer.

      As the party hammered Yeenoghu with relentless attacks, the demon lord's flesh tore open, not from wounds alone, but from within. Six hulking Gnoll Packlords clawed their way out of his body, joining the fray and surrounding the party. Reacting to the sudden overwhelming threat, Malakor cast Scatter, instantly teleporting his allies to a more strategic position away from the demonic host.

      The session ended as Yeenoghu and his newfound packlords closed in, with Ragtag weathering a brutal series of attacks, standing firm as the last line of defense before the party’s new position. The final confrontation has reached its bloody climax.

      1 vote