A bot in your voice channel. A chronicle the next morning.

Lestapenna joins the Discord channel when the DM calls it, records every player on a separate track, and when the session ends it hands the table back three things: a transcript attributed speaker by speaker, a chronicle of the evening written the way a bard would tell it, and a campaign archive — NPCs, places, quests, factions, items — that updates itself instead of waiting for someone to update it.

The bot is not public yet. Write to me and I will send an invite link for your server. Already play at a table that uses it? Log in with Discord.

Free and open source under AGPL-3.0. The AI runs on your own keys, so nothing is billed by this project. There is nothing here to buy.

From a voice channel to a campaign that remembers.

Six stages, and you can point at where each one runs. Nothing happens in the background, and nothing runs on hardware you did not choose.

  1. In Discord

    The bot joins the channel

    /listen

    The bot joins the voice channel. Everyone in it is recorded on their own track and tagged with the character they play, so the transcript says who spoke and not merely that somebody did.

    It refuses to start if the table has no transcription route or no storage bucket configured. Better to hear that now than after four hours of audio nobody will ever be able to read.

  2. On your key

    It becomes text

    Transcription runs on your provider key: Gemini by default, the same key that covers every other stage. Nothing to install, nothing to keep switched on.

    What comes back is the whole evening in text, attributed line by line, already cleaned of the filler a speech model invents when nobody is talking.

    You can point it at a computer your table owns instead. That route is experimental: it needs a companion app running on that machine, and if the machine does not answer, the session is not transcribed.

  3. The analyst

    A pass that reads for what changed

    One model goes through the transcript looking for the world rather than the prose: who appeared, what was promised, which quest moved, what was picked up, where the party ended the night.

    What it duplicates — the same innkeeper under two spellings — is reconciled against the campaign as it already stands, and whatever is left over is proposed in the web app as a merge you confirm.

  4. The writer

    The chronicle

    A second model tells the evening back, in the language your table plays in, from the transcript and from nothing else.

    This is the stage where a better model is actually worth the money, which is why the settings ask you for two choices instead of fifteen: a Quality pair for the analyst and the writer, a Fast one for everything else. Per-phase control exists, in the campaign's advanced settings, where it is out of the way.

  5. The memory

    Indexed into the campaign

    The session is embedded and added to the campaign's searchable memory, which is what lets the Bard answer from it later, and what keeps every archive entry connected to the words that changed it.

  6. Back to the table

    Published where you asked

    The recap is posted to the Discord channel you nominated, emailed to the addresses you set, and waiting in the web app next to the transcript and the session's audio.

Nine things it keeps, and keeps updating.

Not a wiki somebody has to maintain. Every entry below is written from sessions you actually played, and grows as you play more of them.

Characters
The party: race, class, alignment, and a portrait when you want one.
NPCs
Their role, whether they are still alive, their alignment, and where they stand with the party.
Locations
Region and place, from the province down to the room you are standing in.
Factions
Status, alignment, and the reputation the party has earned with them.
Quests
Open, in progress, completed or failed, moved by what happened, not by someone remembering to tick a box.
Inventory
What the party is carrying, and who is carrying it.
Artifacts
The named items that matter, each with its own history of what it has been through.
Bestiary
What you fought, and what fighting it cost.
Timeline
In-world dates, counted from a year zero you define yourself.

What you write stays yours. Entries you create or edit by hand are marked as manual, and regenerating the campaign never overwrites them.

Portraits on request. A card can draw its own portrait, and it keeps your prompt so you can run it again or change one word and try once more.

It says where it got it. Every entry is tied to the session that produced it, so you can go back and read the moment itself.

Ask the Bard, and get an answer with a footnote.

Ask in Discord or in the web app: what did we promise the harbourmaster, who was carrying the seal, where did we first see that sigil. The answer is retrieved from your campaign's own recorded sessions and comes back with the sessions it was drawn from, so you can go and read them yourself.

It answers from what the table actually said. If the campaign never said it, the Bard does not say it either.

Half of it is not Discord.

The bot lives in the voice channel; the campaign is read on the web. Sign in with the same Discord account and you get the session archive with each chronicle set as a book you turn, the transcript beside it, the session's audio, the party, the scenes, the nine archives above, and the chat with the Bard.

Server and campaign settings live there too: your keys, the models you picked, and what each session has actually cost, to the token.

You bring the keys. You bring the bucket. This project takes nothing.

No subscription, no credits, and no account with us beyond the Discord one you already have. The costs are real, but they are between you and whoever you chose to pay.

The default

The AI keys

One key, set per Discord server, covers the whole pipeline, transcription included. Every stage ships pointed at Google Gemini; OpenAI works too.

  • Every action that spends money shows its estimate before you run it, and the real token cost after.
  • A four-hour session usually lands around a couple of euros, billed by your provider straight to you.
  • If you have negotiated your own rates, you can enter them and the estimates will use yours.

or

Experimental

Your own machine

A PC your table owns can do the work instead, and then the money part disappears entirely.

  • Whisper transcribes there, reached over your own Tailscale network and woken on demand.
  • Ollama runs the models, so no request leaves the house.
  • A session then costs your time and your electricity, and nothing else.

The app labels this experimental and so does this page. It needs a companion app installed and running on that computer. The machine being switched on is not enough, and a session pointed at a machine that does not answer is a session that does not get transcribed. Start on a key; move here once you want to.

Needed either way

The storage

Recordings and generated pictures go to an S3 bucket on your own account, whichever of the two routes above you take.

  • Backblaze B2 is a free ten-gigabyte account and asks for no card. About five minutes of setup. Cloudflare R2, Scaleway, Oracle and AWS work too, as does MinIO on a machine at home.
  • There is no fallback to anyone else's bucket. Without one connected the bot declines to record.
  • How long audio is kept is your decision, up to switching the cleanup off entirely, recorded with who decided it and when.

And what is still on our side

A page like this should say so plainly. On the shared bot, the campaign database and the reports you send with the flag button sit on the maintainer's infrastructure, and recap emails leave through its mail provider. The privacy policy names all of it.

Your recordings and your generated pictures are not on that list. Those are on your bucket, and there is no code path that puts them anywhere else. There is no analytics or tracking script anywhere in this project, and nothing is ever sold.

The table always knows when the bard is listening.

Recording is something the DM does on purpose, with a command, and it is visible for as long as it lasts: the bot is sitting in the voice channel where everyone can see it. Server administrators remain the ones responsible for telling participants and obtaining whatever consent their table and their jurisdiction require.

Before you invite the bard.

The five questions that actually get asked, answered without the marketing tense.

What does a session cost me?

Nothing to this project, which takes no money from anyone. The AI runs on your key, so OpenAI or Google bills you directly: a four-hour session usually lands around a couple of euros, and the estimate is on screen before you start. There is an experimental route that runs on a PC you own, where a session costs electricity instead. But the default, and the one that simply works, is the key.

Where do the recordings live?

On the S3 bucket your server connected, on your account, not here. There is no fallback to anyone else's storage: with no bucket connected the bot refuses to record rather than quietly writing your table's voices onto somebody else's. You set how long the audio is kept, and you can switch the automatic cleanup off entirely.

What language does it work in?

The bot, the web app and this site are in English, Italian, Spanish, French, German and Brazilian Portuguese. The language your table speaks is set separately from the language the bot answers in, because the two are not always the same.

Can I self-host it?

Yes, and it is the intended route if you want capacity that does not depend on anyone's goodwill. The whole stack is public under AGPL-3.0 and runs with Docker. On your own server nothing leaves the machine except the calls to whichever AI provider you configured — and with Ollama, not even those.

Who profits from this?

Nobody. There is no company, no revenue and no investor: it is one person's project given to the tabletop community, and the licence is what keeps it that way for whoever comes next. Sponsorship is welcome and buys nothing at all — no feature, no priority, no place in a queue.

The bot is not public yet.

There is no public invite link and no sign-up form. Write to me, and I will send one for your server. It is one person answering email, so say hello.

  1. Ask for an invite

    Tell me about your table: which Discord server, roughly how many of you, and the language you play in. I reply with an invite link for the bot.

  2. Finish the setup on the web

    Sign in with the same Discord account and complete the server's setup: a Gemini or OpenAI key for the models, and an S3 bucket for the recordings. The wizard tells you what is still missing, and /setup says the same thing from inside Discord.

  3. Set the world

    Create a campaign and say where and when it is: the in-world year, where the party is standing, the party's name. Everyone in the voice channel says which character they play — that is what makes a transcript attributable to a person rather than to a microphone.

  4. Play, then read it back

    /listen when you start, /stop when you finish. The recap arrives in the channel you nominated, and the archive is waiting on the web.