• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

cros.land

just figuring things out

  • Home
  • Kenji’s Dungeon Master Tools
  • Lost Mines of Phandelver Guide
  • Contact Me
  • Archives

2024 rules support, and the rebuild underneath it

July 30, 2026 by Kenji Leave a Comment

The statblock generator now works in both editions of 5e, and there is a new tool for converting the monsters you already have.

Generate in 2014 or 2024 format. One switch, any challenge rating, and the output uses the right layout and phrasing for its edition. The 2024 cards have the official structure: merged immunities, the MOD and SAVE grid, saving throws written as Failure and Success.

Pick a combat role, or let it read your concept. Brute, defender, skirmisher, artillery, controller, lurker, support, and swarm. The role changes the actual math, so a lurker and a brute at the same CR are meaningfully different creatures.

Flip any saved monster between editions. Tabs on the statblock card switch between printings once both exist. Converting rewrites the wording only. Every number stays exactly where it was.

Convert statblocks you already have. The statblock converter is a new tool: paste a monster in, and it works out which edition it came from and converts it. Conversions count as generations against the daily limit rather than sitting behind a separate gate.

Export in both editions. Homebrewery markdown in the official 2024 frame style, Foundry VTT, and Improved Initiative. The dungeon, NPC, and encounter tools also generate statblocks in whichever edition you prefer.

The library I built by hand

For most of this tool’s life, the monster generator worked from a library I built by hand.

I went through the SRD one monster at a time and had ChatGPT strip each one down to its mechanics. Take a creature, remove everything that makes it that creature, and keep what is left: the armor class, the hit points, the attack routine, the number and shape of its abilities. Do that across the whole book and you end up with a library of generic templates sorted by challenge rating, which I labeled with the only three distinctions I bothered to draw at the time: stronger defense, stronger offense, and balanced.

Generating a monster meant picking a template that matched what you asked for and having the model reskin it. The AI never decided the numbers then either. They came from a template, which came from a creature a professional had already balanced, and that is why the output was mechanically sound.

The limitation was never the numbers. It was that every monster you got was shaped like whatever template came up. Ability slots were inherited along with the math, so if the template underneath happened to come from something with a breath weapon and an aura, you got a breath weapon and an aura, however they were dressed. The model was adapting abilities rather than inventing them. With a finite library and three labels, you eventually start seeing the same creatures wearing different coats.

Adding the 2024 rules is what made this a decision I could not put off. Every template in that library came out of the 2014 SRD. Supporting a second edition properly meant either doing the whole stripping exercise again against a different book, or building something that could produce a template on demand.

So I took the leap I had been avoiding. Instead of drawing a template from a shelf, compute one.

What a chassis is

The core of the new generator is what I ended up calling a chassis. Give it a challenge rating and a combat role, and it computes every number in the statblock before the AI is involved at all, along with a plan for what kinds of abilities the creature should have. Not which abilities. What kinds: a signature attack here, a defensive trait there, one nova effect at this damage ceiling, a reaction if the role wants one. Slots to be filled rather than abilities to be reskinned.

The math comes from the same place a designer’s does. The Dungeon Master’s Guide gives target values by CR for defense and offense, and the chassis derives from those: armor class, hit points, proficiency bonus, attack bonus, save DC, and a total damage budget for the creature’s turn. That budget then gets divided up. If the monster makes three attacks, each one is a third. Area effects get roughly half the single-target number, because an area effect that hits four people is doing four times the work. Creatures with legendary actions get a discount on their basic turn, because they act more often than once a round.

The combat role is where it gets fun. My old three labels became eight roles, and each one shifts the math the way official monsters actually differ from each other:

Brute: more hit points, lower armor class. Easy to hit, hard to drop.
Defender: high armor class, slightly reduced damage.
Lurker: fragile, low sustained damage, and a much larger once-per-fight nova.
Controller: less damage, higher save DC, because its job is conditions.
Swarm, artillery, skirmisher, support: each with their own shape.

This is the part that expanded what the generator can produce. A lurker and a brute at the same CR are genuinely different creatures now, with different survivability and different damage patterns, because the numbers say so before a single word gets written. Nothing is drawn from a shelf, so nothing is constrained to the shape of the creature a template was stripped from. Old monsters saved under the previous labels still map onto the new roles, so regenerating one lands where you would expect.

The AI’s job changed in kind. It used to adapt: here is a creature’s mechanics, make it something else. Now it invents into a container. It receives a filled-in skeleton that says, in effect, “your melee attack is +7 for 14 damage in two dice plus five, your area effect is a 21-point save for half, you have one trait slot and three action slots, one of which should be a once-per-fight nova,” and its entire job is to decide what those things *are*. What the creature is made of, what its abilities do, what they are called. Then assembly stamps the engine’s numbers back over whatever the model wrote, so even a model having a bad day cannot ship a CR 3 monster with CR 12 damage.

A side effect I did not expect: because every number exists before the first API call, the loading state can show you the real armor class and hit points immediately while the rest fills in. The architecture leaked into the interface in a nice way.

The cost

Here is the honest part. The template library gave up variety in exchange for guaranteed sanity. Generating the template gives up some of that sanity in exchange for variety.

A template stripped from a published monster carried more than numbers. It carried a professional’s judgment about which abilities belong on the same creature, even after the flavor was gone. A computed chassis has the numbers and none of that judgment. It is assembled from correct parts, and correct parts can still combine into something odd. The failure mode is not usually broken math, since the engine owns the math. It is coherence. A creature whose abilities do not quite belong to the same animal. A name that describes an attack routine instead of a creature. An elemental that reads like an undead.

Most of the month I’ve been working to close that gap.

Roughly a hundred and fifty checks

Every generated block runs through a linter before it ships. The rules are boring individually and powerful together: an area effect that deals damage cannot also stun without a recharge gate, a grapple must carry an escape DC, a restrained condition needs a way out, Prone never takes a duration because standing up is the exit, a damage rider is extra dice rather than a flat bonus, an entry cannot reference an ability that does not exist in the block.

Where I could, the fix is deterministic. The linter does not just flag a missing escape DC, it stamps the right one in. About half of everything the linter catches gets repaired without another API call. What remains goes back to the model as a short list of specific problems with the exact text to fix.

The discipline that made this work is a rule I set early: no check ships until it has been swept against all 329 monsters in the 2024 SRD without a single false positive. Any rule that fires on an official monster is wrong about D&D, no matter how sensible it sounded when I wrote it.

That killed a lot of my ideas, and the kills were more useful than the survivors. I wanted a rule that no monster should have four different energy damage types. The sweep found exactly one official monster that does, so the threshold moved. I wanted to flag raise-the-dead necromancy on creatures that are not undead. An official dragon casts Create Undead. I wanted to catch monsters that give themselves conditions they are immune to, which is a real defect, and the first version of that rule flagged the Air Elemental, because “pushed away from the elemental and knocked prone” puts the elemental’s name in the wrong grammatical position. Each of those taught me something about how the actual game is written that I would have gotten wrong from memory.

One judgment call

Deterministic rules only catch patterns you can describe. They cannot catch a cloud of spores that no ability ever creates, or a trait named Steam Shroud that produces no steam.

So every generated monster now gets one extra API call: an audit that reads the finished block and looks for problems a Dungeon Master would hit at the table. Can every effect be adjudicated? Does every imposed condition have a way out? Does anything contradict anything else? It also grades the monster’s name and flags a creature type that the content does not support.

The important part is that the audit has to show its work. Every finding must quote the exact text it is complaining about, verbatim. If the quote does not appear in the block, the finding is thrown away before it reaches anything. That one rule makes a nondeterministic judge safe to wire into a pipeline, because a hallucinated complaint costs nothing.

When the audit is right, its findings ride along with the linter’s into the same repair call, so a block with both kinds of problems is fixed in one pass instead of two.

Where I decided to stop

The generator still produces the occasional strange monster. A creature that would have been better classified as a monstrosity than an elemental. An ability with a condition that is technically always true. A name that is fine but not great.

I spent a while treating each of those as a bug, and eventually landed on a better test: would this break a table, or would a Dungeon Master fix it in half a second without noticing they had? Published monsters have oddities that fall in that second category all the time. That is the bar the generator is held to now, and it clears it.

What I got in exchange is worth it. The abilities coming out of the generator are dramatically more interesting than anything the template library produced, because they are being invented for a creature rather than inherited from one. The monster that eats a party member and drags them underground, the construct whose cracked bell forces it to ring, the swarm that shatters and reforms with half its hit points. None of those are variations on an SRD entry. They exist because the math was already handled and the model had nothing left to do except be imaginative about what a monster could be.

Filed Under: Uncategorized

Notes on redesigning my D&D tool suite

July 18, 2026 by Kenji Leave a Comment

For about two years, every tool on this site was built with Cedar, the open-source design system I worked on while I was a software developer at REI. That was a deliberate choice and, for a long time, the right one. Cedar is accessible by default, thoroughly tested, and I knew every component in it. When you are one person shipping a suite of generators, starting from a design system you already know is worth an enormous amount. I got to spend my time on prompts and dungeon layouts instead of arguing with myself about button padding.

Then I started actually using the tools at my own table, and something kept bothering me.

Cedar is excellent. It was the wrong fit.

Cedar was built for outdoor ecommerce. It is bright and clean, and organized around getting someone from a product photo to a checkout button. Every one of those qualities is correct for selling tents. None of them are correct for a page a Dungeon Master reads at the table.

The tools were producing good content. A generated NPC would come back with a real personality, a distinct voice, a set of relationships worth playing. Then it rendered in a crisp sans-serif inside a card that could have been a shipping confirmation. The content said “sourcebook.” The interface said “SaaS dashboard.” Everything worked, and nothing felt like anything.

That gap matters more than it used to. There are a lot of AI tools now, and most of them look the same: the same neutral grays, the same rounded cards, the same interface you have seen a hundred times. When the underlying models are available to everyone, the thing that separates tools is whether they feel like they were made by a person who cared. Generic is a real liability.

Looking at manuscripts instead of websites

So I stopped looking at other apps for reference and decided to choose colors that would mimic a medieval manuscript. When I was doing this research two colors jumped out at me: Lapis Lazuli and Burgundy.

Lapis is the obvious one. Ultramarine was made by grinding lapis lazuli, a stone that came overland from Afghanistan, and it cost more than gold by weight. You did not spend it on ornament. You spent it on the things that mattered most. It carried importance because it was expensive enough to mean something.

Burgundy has an even more useful history for a designer. Red earth pigment was what scribes used for headings, initials, and instructions to the reader. The Latin for red earth is rubrica, which is where we get the word rubric. The red ink in a manuscript is literally the structural markup: this is a heading, this is where a new section begins, this is the part that tells you how to use the rest.

Once I saw that, the palette stopped being an aesthetic preference and became a rule I could actually build on.

Color has to mean something

The parchment system has one load-bearing rule, and everything else follows from it:

  • Burgundy is content. Titles, proper nouns, the names of things, the small-caps labels that structure a card. It is the rubric ink. If it is burgundy, it is part of what you are reading.
  • Lapis is the tool. Buttons, form labels, navigation, anything that belongs to the machinery rather than the document. If it is lapis, it is something you operate.
  • Red is destruction, and nothing else. Delete gets its own register so that a delete button can never be mistaken for a heading.

The practical effect is that you can tell what a thing does before you read it. That sounds small. In a suite where seven tools all produce dense text, it does an enormous amount of quiet work.

Surfaces followed the same logic. Everything you read sits on cream, the color of aged paper, and everything carries a very subtle paper grain: a CSS texture that mottles the cream the way real vellum ages unevenly. It runs at four percent opacity, which is low enough that most people never consciously notice it and high enough that removing it makes the whole page look flat. The chrome around the document stays clean. Texture belongs to the page you read, not the frame you hold it in.

The part that actually matters: readability

Here is the thing I did not expect. The redesign barely changed what the tools do. What it changed was how much work it takes to read them, and that turned out to be most of the value.

Some of what came out of the migration:

Two tiers of emphasis instead of one. My first pass made every emphasized term burgundy and bold. It looked great on an NPC description, where the emphasis lands on a few proper nouns. It fell apart completely on a magic item or an encounter, where a dozen mechanical values all want attention and the page turns into a thicket of bold burgundy. So emphasis split in two: burgundy bold for narrative anchors like names and factions, used two or three times a paragraph at most, and plain ink bold for mechanical values like AC, damage, and distances. Dense pages now read as prose with findable numbers.

Real type instead of faux bold. Everything you read is Source Serif 4 with genuine weight files loaded, so bold text is an actual bold cut rather than the browser smearing a regular one. It is the kind of thing nobody notices and everybody feels.

One card anatomy everywhere. Items, NPCs, settings, monsters, and factions all share a structure now, so learning to scan one teaches you all of them.

Editing where the content lives. Fields turn into inputs in place on the card. No modal, no separate form, no losing your place.

Loading states shaped like the content. Skeletons that match the card that is coming, so the page stops jumping around while a generation finishes.

Sentence case on every button. Small change, much calmer interface.

I also wrote acceptance tests as part of the migration rather than after it, which is not a glamorous detail, but redesigning seven tools at once without a safety net is how you ship a beautiful broken thing.

Writing it down

The last piece was documenting the whole thing. There is a file in the repository called parchment.md that describes the system as it actually exists, including the places where it is still inconsistent and my honest notes about which of those are worth fixing and which are special cases I had a reason for at the time.

That document is why the system holds together. Every time I sit down to build a new surface, the accumulated reasoning is right there instead of locked in my memory of a decision I made in June. When I added the statblock converter last week, it took about twenty minutes to make it look like it belonged, because the answer to every question it raised was already written down.

The tools do the same things they did before. They just finally look like they know what they are for.

Filed Under: Dungeons And Dragons

Your Tools Now Talk to Each Other

March 26, 2026 by Kenji Leave a Comment

When I first built the statblock generator, it was a standalone thing. You’d make a creature, copy the output, and paste it wherever you needed it. The NPC generator was the same — generate a character, copy it out. Each tool lived on its own island.

That’s been changing.

Over the last few months I’ve been quietly rebuilding the plumbing underneath the tools so they actually share data. The statblock you generate isn’t just text anymore — it’s a living object that your NPCs, encounters, and dungeons can all reference. Edit it in one place, and it updates everywhere.

Here’s what’s new.

Shared Statblocks

This is the big architectural change. Previously, if you generated a statblock for an NPC inside the dungeon generator, that statblock was trapped inside the dungeon. You couldn’t see it in the statblock generator. You couldn’t use it in an encounter. It just lived in one place.

Now there’s one canonical statblock store. Generate a statblock anywhere — the statblock generator, the NPC generator, the dungeon generator — and it shows up everywhere. Your dungeon’s boss monster can be pulled into an encounter. Your NPC’s combat stats can be edited in the statblock generator where you have the full editing tools. One source of truth.

If you’ve got existing data, don’t worry. The migration happens automatically the next time you load the tools. Your nested statblocks get extracted into the shared store and replaced with references. Nothing gets lost.

Create NPCs from Statblocks

This is where the connected tools start to feel like a connected system.

Every statblock now has a “Create NPC” button in the footer. Click it, and you land in the NPC generator with that creature pre-selected. The generator knows the creature’s stats — its intelligence, its type, its abilities — and uses that to shape the NPC it creates.

A creature that can think and talk — a dragon, a vampire, even a dim-witted hill giant — gets the full NPC treatment: personality, motivations, relationships, roleplaying tips. A dragon becomes a scheming political figure. A vampire becomes a patron of the arts with a terrible secret.

A mindless creature — a construct following its programming, a beast acting on instinct, an ooze dissolving everything in its path — gets something different. Instead of pretending your animated armor has feelings, the system generates a creature profile about its origin, its local reputation, and the NPCs whose lives it affects. The hunter tracking it. The wizard who lost control of it. The farmer whose livestock it keeps eating. The creature is a narrative force, not a speaking character.

You can also search the entire SRD monster list when generating NPCs. Pick a Goblin, and the generator pulls in creature intelligence data — pack tactics, cowardly when outnumbered, worships powerful creatures — and uses that to create a specific, memorable individual. Not “a goblin” but Skragg the Broker, an information dealer who trades secrets between tribes and is braver than most because he knows where all the exits are.

Check out the new and improved npc generator!

What’s Next

The cross-tool connections are just getting started. Right now statblocks and NPCs talk to each other. Next up is connecting items, encounters, and locations into the same web. The long-term vision is a session workspace where everything you’ve generated across the tools comes together in one view — your encounters, NPCs, locations, and items organized by session, ready for game night.

If you’re a Patreon supporter, you’re funding all of this directly. Every feature, every bug fix, every architecture improvement. If you’ve been using the free tools and want to support the work (and unlock the premium features), the link is below.

As always, if something breaks or feels clunky, I want to know. Hit me up on Discord or drop a comment. This is a one-person operation and your feedback is what decides what gets built next.

— Kenji

Filed Under: Uncategorized

D&D 5e Encounter Generator — Build Encounters Your Players Will Actually Remember

March 7, 2026 by Kenji Leave a Comment

A quiet desert oasis rests beneath a scorching sun, its dark pool reflecting the harsh daylight and a ring of ten camels standing around it. Their bodies are lean and sunbaked, but their eyes hold an empty glaze, distant and unblinking as they sway subtly back and forth. At the pool’s edge, a massive fish-like shape shifts beneath the brackish surface — a hulking, ancient aboleth whose sickly glowing eyes scan without haste. The camels do not graze or drink; instead, they stand unnervingly still, occasionally twitching as if pulled by unseen strings. For a moment, the desert falls silent except for a faint ripple on the water’s surface — and then the gaze of the aboleth seems to reach toward you.

That encounter was generated by throwing an aboleth and ten camels into the generator with no other context. No location, no scene description, just those two creatures. The tool turned the camels into psychic hostages at a desert oasis. The aboleth bargains for servitude, the camels are the reason you can’t just fireball the pool, and the saddlebags link to a merchant house that opens a thread beyond the fight.

What Is This?

Most encounter builders are calculators. You pick monsters, they tell you the CR math, and you’re left to figure out the rest — what the monsters are doing when the party arrives, what happens mid-fight, and what the players find afterward.

This tool generates the actual encounter. You get read-aloud text to narrate to your players, DM notes with tactical positioning and terrain mechanics, a mid-encounter turn that shifts the stakes, and aftermath hooks that connect the fight to the wider campaign.

Pick your monsters, optionally describe a location or situation, and hit generate. That’s it.

How It Works

Every creature in the SRD has enriched data beyond what’s in the stat block. Each one has a tactical identity — how it fights as a whole, what combos it tries to execute. Each one has personality traits that shape the encounter’s tone. Some negotiate. Some flee when wounded. Some fight to the death without a word.

An aboleth negotiates because that’s what aboleths do — they’re ancient psychic manipulators who prefer servitude over destruction. A remorhaz just charges because it’s a mindless predator driven by heat and hunger. The encounters come from the creatures themselves, not from generic templates.

This is what makes the tool different from typing “generate a D&D encounter” into a chatbot. There’s a data layer underneath that knows how 328 SRD creatures behave, retreat, socialize, and what they leave behind when they’re defeated.

Custom Creatures

The tool also works with custom stat blocks. You can build your own creatures in the Statblock Generator and add them to encounters alongside SRD monsters.

When you create a custom creature, the tool automatically enriches it with the same tactical and personality data that the SRD creatures have. It reads the stat block’s abilities, checks the creature’s intelligence, and figures out how it should behave.

I tested this with a custom creature called the Plague Bellringer — a cursed undead with INT 6 that can’t stop ringing a necrotic bell. One of its abilities, Despairing Ring, mechanically forces nearby creatures to move closer in a compulsion to free it. The tool picked up on that flavor text and built the encounter around the party figuring out that the monster is asking for help, not threatening them. The bellringer isn’t a boss to kill — it’s a puzzle to solve.

Try It

The encounter generator is free to use with no account required. Pick some monsters, set the scene if you want, and see what it comes up with.

Try the Encounter Generator →

I’d love to hear what creature combos produce interesting results. The weirder the better — the whole point of the enriched creature data is that it should find a coherent relationship between any set of monsters you throw at it.

Filed Under: Dungeons And Dragons

New Tool: Roll20 Statblock Auto-Fill Extension Now Available!

February 10, 2026 by Kenji Leave a Comment

Quick update — I just released a new Chrome extension that some of you might find useful, especially if you run games on Roll20.

The extension connects directly to the monster statblocks you generate on cros.land and automatically fills out the Roll20 NPC/monster sheet for you. If you’ve ever typed one of those sheets in manually, you know how many fields there are. This speeds up the whole “get a homebrew creature into Roll20” process by a lot.

If you use Roll20, you can check it out here:
https://chromewebstore.google.com/detail/conjure-creature/oepoeaoeoaaedbgobaegpfamofhkbifo

And here’s a quick demo video showing it in action:

If you don’t use Roll20, no worries — this is just one more option in the toolbox. I’m aiming to make the ecosystem of tools as flexible as possible, and this felt like a natural next step.

If there are other platforms, tools, or workflows you think would pair well with what I’ve built, I’d love to hear your ideas. Integrations like this only exist because someone mentioned a pain point, so keep the suggestions coming.

Thanks as always for using the tools — more updates soon!

Filed Under: Dungeons And Dragons

The Tools Are Growing Up: Inline Editing + A Real Home Page

January 25, 2026 by Kenji Leave a Comment

Hey everybody, it’s been a while since I’ve made an update post, and I have a lot to share this time around. Because, while the stat block generator and the item generator had inline editing, I realized that in order for these tools to truly be of use to dungeon masters, they need to be more than generators — they need to be places where a DM can collaborate with the AI, modify outputs, and maintain a single source of truth for their creations: the settings they develop in the setting generator, the NPCs they build in the NPC generator, and the dungeons they construct in the dungeon generator.

So, after having battled some complexity on the back end, I managed to make something reasonably simple where people can click, edit, and essentially change any piece of information the tool produces. If a line of wording is off, or something needs just a bit of personal input or improvement, that can now be done directly in the interface. These changes have been implemented for the Setting Generator, the NPC Generator and the Dungeon Generator.

That shifts these tools from something that’s an interesting novelty — something that helps game masters brainstorm ideas — into something they can actually return to and reference for their campaigns. And that is really the goal moving forward.

I want to make sure each tool is as useful as possible. And while you’re free to maintain your own notes and your own campaign documents, I’m aiming to create a tool suite that’s useful and comprehensive enough that you can simply return to the site and reference what you’ve already created.

As a more personal update, these apps have shifted from being a side project to becoming my main focus. My contract ended in December, and after thinking about the current job market, the potential of these tools, and the amount of runway I have in savings, I’ve been doubling down on building this out. I’m still open to collaborations or job conversations — especially anything involving gaming or where gaming intersects with AI — but for now this project is my center of gravity.

Also, while this might be of less interest to long-time users, I’ve been more actively promoting the business, and part of that has meant creating a proper landing page — something clean, presentable, and easy to share, whether on Reddit, Facebook, or wherever people talk about their campaigns. The goal was to offer a better overview of everything in one place, a page people can send to friends without having to explain how all the pieces fit together.

Filed Under: Uncategorized

  • Go to page 1
  • Go to page 2
  • Go to page 3
  • Interim pages omitted …
  • Go to page 12
  • Go to Next Page »

Primary Sidebar

Hello! My name is Kenji Crosland and welcome to my blog. I recently spent nearly a year traveling the Southern US looking for a new home. I also write about how to run pen and paper RPGs. I also make game master tools. Say hello!

Player Tools

  • D&D 5e Inventory Manager
  • D&D 5e Loot Splitter


Game Master Tools

  • D&D 5e Monster Statblock Generator
  • 2014 to 2024 Statblock Converter
  • Dungeon Generator
  • D&D 5e Magic Item Generator
  • D&D 5e Magic Item Price Calculator
  • D&D 5e Encounter Generator
  • D&D 5e Chase Tracker
  • Worldbuilding Dashboard and Settings Generator
  • Location Description Generator
  • NPC Generator


Game Master Tools For Patrons

  • Bookshelf Generator
  • Lore and Timeline Generator

Recent Posts

2024 rules support, and the rebuild underneath it

July 30, 2026 By Kenji

Notes on redesigning my D&D tool suite

July 18, 2026 By Kenji

Your Tools Now Talk to Each Other

March 26, 2026 By Kenji

D&D 5e Encounter Generator — Build Encounters Your Players Will Actually Remember

March 7, 2026 By Kenji

New Tool: Roll20 Statblock Auto-Fill Extension Now Available!

February 10, 2026 By Kenji

Copyright © 2026 · Genesis Sample on Genesis Framework · WordPress · Log in