Kia Skretteberg

UX Focused Software Developer

D&D Campaign App

Premise

In my personal time I DM a custom campaign I have written my own world and lore for and I was struggling to keep track of everything, places, people, events. It was a lot and it was scattered across numerous google drive articles, and in varying stages of being copied to WorldAnvil where I hoped to keep all my lore eventually.

Problem

One day when I was trying to prep, after a relatively long hiatus, I realized I knew I had given my players the name of an NPC but I had no idea what that NPC's name was, or even where to look for it. Having recently started using AI a lot in my world I knew AI could surely search across all this content for me, if only it had access. The problem was, I didn't pay for AI usage in my personal life, and I didn't want to add that cost for something so simple.

At the same time, I was also struggling with my actual prep. I do most of my prep on my laptop so I can take it back and forth between my home and my friend's house where we normally play and the screen isn't as large as I would like. So I struggled to use the WorldAnvil UI in a way that worked for me. Additionally, I found I would often have like 4 different documents open at a time in order to run a session and I knew, again, that if I could just have an app that hooked up to my WorldAnvil data it would make it so much easier, if I could just slap a different UI over it that worked better for my brain.

Solution

So I set out on a mission, to use AI to vibe code a simple app that was only for my personal use that would do the following:

In the end, I ended up with a fairly sophisticated app that does way more than I had originally planned and I love it. It has so many additional baked in features such as:

Constraints

I gave the AI agent some very specific constraints when building the app. I wanted the tech stack to be something I could understand so that if I ever wanted to work on it directly in the future, I'd understand what's under the hood:

Challenges

Along the way I ran into a handful of issues, such as not having access to real APIs, or AI just being outright incorrect. The most interesting exercise was getting the AI powered "spicy Google" working for retrieving my lore content.

Initially AI told me I didn't even need to use AI to search for my content, which was technically true, it posed a solution which could return me WHICH article was MOST LIKELY to contain the result I was looking for pretty easily. But I found in practice it brought back a lot of false positives. When I'm searching for "who is the metal man" and it finds a suit of armor because it's made of metal and mentioned numerous times, rather than a character with the literal nickname "metal man", but is only mentioned once.

After some further exploration, I not only found out I needed AI to synthesize the response for me, turning "this article" into "human-style response to your question", but that I also needed it to break down my initial question. When I'm searching for "Who is Tabys' black market contact" it's important to know "Who is Tabys" and "What is the black market" and "Who does Tabys know" which weren't all things that appeared in the same article, or in a sentence altogether, and the LLM aided in synthesizing the response into a "most likely" answer by piecing together "Tabys has a random name written in a book. Tabys was interacting with the black market. Most likely, that random name is the name of her black market contact."

In the end, I ended up with a solution where a local lightweight LLM will parse my initial question into a set of keywords to search for, then run a set of queries against my lore looking for those keywords, then pass off the highest hits of those results to a more powerful AI agent such as Gemini in order to piece together the disjointed information.

It still needs some more polish as the searching functionality can be quite slow at times, taking over half an hour to return results, but I am decently pleased with the accuracy, as now when I ask it "Who is the metal man" it says "Nightshade".