CafeG Labs CAFE G®

Dev Update — May 2026: Walls, Multi-Edition, and the Rules Builder

Battle map walls with proper line-of-sight on image maps, six rulesets joining 5e in the compendium, a Crashlytics privacy toggle, and the foundation for a DM-authored Rules Builder.

nat20 dev update

May was a big month for the kind of features that make Nat20 feel finished rather than just functional. Four things shipped, and one major feature broke ground.

Walls and Line-of-Sight for Image-Backed Maps

Until now, vision blocking on a battle map only worked if you built the map with our tile system. If you uploaded an image — a hand-drawn dungeon, a Dyson Logos map, a satellite-style overworld — your characters could see through every wall on it, because the map was just pixels to the engine.

Walls fix that. The DM draws line-of-sight blockers right on top of any map, snapped to the grid, two taps per segment. Doors that open and close. See-through walls for force fields and magical glass. The raycast engine honors all of it, fog clears where your tokens can actually see, and stays where they can’t. Players never see the walls themselves — only their effect.

Six More Rulesets in the Compendium

The compendium grew from 5e-only to a full multi-edition library this month. Imported and tagged: D&D 5e 2024 (SRD 5.2), 3.5e SRD, Pathfinder 1e SRD, Pathfinder 2e items and ancestries, Old-School Essentials, and Basic Fantasy RPG. Each ruleset’s content is properly licensed (Creative Commons, OGL 1.0a, ORC, CC-BY-SA) with verbatim license text in the legal tab.

Every character now carries its own ruleSet, so when you’re building a 3.5e wizard the picker only shows you 3.5e content — no accidental cross-edition contamination. The compendium browser got an edition filter so you can scope the whole library to whichever system your table runs.

Full edition-accurate combat math is a longer arc — that’s Phase 7.4. Today’s shipped scope is data + filtering.

Privacy Toggle for Crash Reports

We shipped Firebase Crashlytics earlier this year because we want to know when the app crashes mid-combat. This month we added the toggle that should have launched with it: Settings → Privacy → “Help us fix crashes”.

Beta builds default to on (crashes are the whole point of beta), but you can flip it off any time. When Nat20 launches publicly, the default flips to off — opt-in only. Crash reports never include your characters, rolls, notes, or campaign data — only the stack trace, device model, and breadcrumbs of which screens you visited. The full breakdown is on the data privacy page.

Rules Builder — Foundation Laid

The Rules Builder is the next major DM feature: a way to author your own rules pack (variant toggles plus free-form house rule cards), nestle it under Homebrew, and share it automatically with every player who joins your campaign. This month we landed the data layer — the type system, SQLite schema, and CRUD store. The editor UI is next.

Pre-Launch Hygiene

Less glamorous but load-bearing: ORC license text shipped verbatim, Privacy Manifest wired through an Expo config plugin, iOS deployment target bumped past App Store warnings, and Crashlytics migrated to the v22 modular Firebase API to silence deprecation noise. Character cards got a real layout pass — race and class on stacked rows, level chip in the info column, source-code prefixes stripped from displayed IDs.

What’s Next

The Rules Builder editing UI, an /release-notes Discord bot upgrade so we can post these updates from inside the server, and the Web DM Companion (Phase 8.1) when we get back to it.

Forward-looking note: anything we describe here as “coming,” “in the works,” or “on the roadmap” is what we currently intend to build, not a promise that we will. Roadmaps shift. Decide whether Nat20 is worth supporting based on what’s already in the app today — anything that lands later is a bonus. See Terms of Service for the full version.

TestFlight is rolling. If you’re playing along, thank you. If you’re not yet — soon.

What's Inside Nat20 Right Now

A tour through everything we've shipped in Nat20 — the compendium, the dice, the maps, the DM tools, the polish — and a peek at what comes next.

nat20 feature tour

Nat20 has grown a lot since we last took stock. Here’s a tour of what’s actually in the app today, and a hint at what’s coming next.

One Compendium, Seven Systems

5e 2014, 5e 2024, 3.5e, Pathfinder 1e and 2e, Old-School Essentials, and Basic Fantasy RPG — all offline, all searchable, all filterable so your 3.5e wizard never accidentally sees a 2024 cantrip. Twelve thousand-plus cataloged entries across spells, monsters, items, classes, races, feats, backgrounds, subclasses, and conditions. Everything ships under the appropriate license: Creative Commons SRD, OGL 1.0a, ORC, or CC-BY-SA, with verbatim license text in the legal tab.

Honest Dice

Every roll is generated from cryptographically secure randomness. No Math.random(), no pseudo-uniform distribution, no thumb on the scale. A built-in fairness graph lets you audit your own luck across sessions.

The 3D engine handles physics, momentum, and realistic materials. Hammered Copper uses a procedural Voronoi normal map for genuine surface dents. Firstforge Iron has emissive maps that glow through the molten cracks. Pride Rainbow, Slava Ukraini, and Free Palestine ship free for everyone. The true d100 Zocchihedron is in the tray — no more percentile pair unless you want one.

Characters That Grow

Build with a guided wizard. Level up with class-aware prompts that walk you through every choice. Multiclass without spreadsheets — hit dice and slot tables stay correct under the hood. Track encumbrance with strict, variant, or off modes; your speed drops automatically when you’re carrying too much weight.

Each character carries its own ruleSet, so when you’re building a 3.5e wizard the compendium only shows you 3.5e content. Avatar frames, sheet skins, and reputation ring borders let your portrait reflect who your character has become. When it’s time to retire, the whole sheet exports to PDF.

Battle Maps with Vision

Square and hex grids, both first-class. Skia-accelerated rendering with day/night atmosphere effects. Three fog-of-war modes — full, explored, and vision-based — with a quick toggle and paintable darkness zones for caves, fog banks, and magical obscurement.

Light sources cast bright and dim radii through your token’s eyes. Dynamic vision honors line-of-sight in real time. And freshly shipped: a full wall system. Draw line-of-sight blockers, doors that open and close, and see-through walls like force fields and glass — all snapped to the grid, all overlaid on your existing image-backed maps. Your players never see the walls themselves, only their effect: the fog clears where they can see, and stays where they can’t.

DM Tools That Get Out of the Way

A real-time campaign relay built on Cloudflare Durable Objects keeps your party in sync the moment something changes. Shared and private DM notes, organized by category and session. Encounter and monster pickers with CR balancing. An initiative tracker that survives mid-combat reinforcements and lets you re-add a removed PC without losing state.

Whispered Lore opens a silent channel between players and the DM — the things characters don’t say out loud at the table, but want the DM to know. The DM can whisper back, or promote a player’s submission to the Story So Far with attribution choice. Loot crates, ping markers, an audit log, and a combat modifier system that lets condition effects, racial features, feats, and class abilities stack the right way without anyone having to do arithmetic.

Everything Wears Your Theme

Eleven-plus sheet skins, each one a complete theme token system that recolors the entire app. Avatar frames. Dice skins as IAP. No more hardcoded colors anywhere — every screen, every button, every alert reads from your active skin.

Built for Beta

Firebase Crashlytics on both platforms via the v22 modular API. RevenueCat wrapping StoreKit 2 and Play Billing. Apple Sign In and Google Sign In. Privacy manifest shipped via Expo config plugin. A bug-report form in-app, and a Bug Hunt easter egg for the people who go looking. Credits screen for our beta testers, theme engineers, and the open source projects that made this possible.

What’s Coming Next

The Rules Builder is taking shape — DMs will be able to author their own custom rule packs (variant toggles plus free-form house rule cards), share them automatically with the whole party on join, and run a campaign that actually reflects their table’s rulings. The data layer just landed; the editing UI is next.

The Web DM Companion brings the DM cockpit to a browser tab for cross-device sessions. Internal campaign chat with NPC voicing is on the way — Tupper-style proxies, pre-loaded NPC rosters with avatars, no Discord required. And the long arc continues: edition-accurate combat math for 3.5e and Pathfinder so non-5e campaigns get more than just edition-filtered content — they get edition-faithful mechanics.

Forward-looking note: anything in this section is our current development plan, not a promise. Features may shift, be delayed, or be replaced entirely. Decide whether Nat20 is worth supporting based on what’s already in the app — anything that ships later is a bonus. See Terms of Service for the full version.

We’re in TestFlight now. If you’re playing along, thank you. If you’re not yet, we’ll see you soon.

Dev Update — April 2026: Approaching Beta

Nat20 is wrapping up alpha and moving into beta. Here's what shipped in April — Vision & Lighting, 3D Dice Skins, the Reputation system, and Campaign Export.

nat20 dev update

Nat20 is wrapping up its alpha phase and moving into beta testing over the next few weeks. The core feature set is complete across six development phases — characters, campaigns, combat, battle maps, 3D dice, and the vision & lighting system are all in and being polished. The focus now is stability, performance, and getting the details right before we open the doors wider.

What’s New This Month

  • Vision & Lighting — Battle maps now auto-reveal fog based on character darkvision and placed light sources. Darkness zones, day/night toggle, and atmospheric effects (flickering torchlight, water shimmer, fog wisps) bring your maps to life.
  • 3D Dice Skins — GPU-rendered dice with PBR materials. Eight launch skins including Hammered Copper with procedural normal maps, Ruby Red, Sapphire Blue, Obsidian Black, and more. Plus a custom dice creator for Premium players.
  • Reputation System — A bidirectional moral compass that tracks your character’s standing through combat, quests, and DM awards. Your reputation tier and visual ring carry across campaigns.
  • Campaign Export — One-tap ZIP archive with character PDFs, session journals, encounter logs, and battle map images. Export your entire campaign history in one bundle.

We also added three Solidarity dice skins — Pride Rainbow, Slava Ukraini, and Free Palestine — free for all players. Here’s why we gave them away instead of selling them.

Next month: walls, multi-edition expansion, and the data layer for an upcoming Rules Builder. Beta is closer than it’s ever been.

Why Our Solidarity Dice Skins Are Free

We added Pride, Ukraine, and Palestine dice skins to Nat20. We considered selling them for charity. Here's why we decided to give them away instead.

nat20 dice values

We recently added three new dice skins to Nat20: Pride Rainbow, Slava Ukraini, and Free Palestine. They’re available to every player, for free, no purchase required.

We almost did it differently.

The Pitch That Almost Was

The original plan was straightforward: sell the skins, donate 100% of the proceeds to NGOs supporting each cause. It’s a playbook a lot of companies use — “buy this product and we’ll donate on your behalf.” It sounds generous. It feels good. And on the surface, everyone wins.

But when we looked closer, the math told a different story.

The Tax Write-Off Problem

When you buy a product from a business — even one where the company promises to donate the proceeds — that transaction is a purchase. You paid for goods or services. You get a receipt for a product, not a charitable donation. You cannot claim a tax deduction for it.

The business, on the other hand, aggregates all those individual purchases into a lump-sum donation, writes the full amount off as a charitable contribution, and claims the tax benefit at their corporate rate. They also get the PR value of announcing a large donation — funded entirely by their customers’ money.

This is legal. It’s common. And it’s a quiet reallocation of tax benefits from individuals who can use them to corporations that often don’t need them. The person whose money actually funded the donation walks away with nothing but a digital dice skin. The company walks away with a deduction, a press release, and goodwill they didn’t pay for.

What We’re Doing Instead

The skins are free. All three of them. No premium tier, no unlock, no purchase.

If rolling Pride Rainbow dice or seeing Slava Ukraini on your d20 inspires you to support those causes, we’d encourage you to donate directly to the organizations doing the work. When you give directly, your donation is your donation — and the tax deduction that comes with it is yours too.

Here are a few places to start:

Your money. Your donation. Your write-off.

Why It Matters at the Table

D&D tables are some of the most inclusive spaces in gaming. People bring their whole selves to the table — their identities, their values, their stories. A dice skin is a small thing, but it’s a way to carry what you care about into the game. We wanted that to be available to everyone, not gated behind a purchase.

Roll with pride. Roll with solidarity. And if you’re moved to give, give where it counts.

Your Data Is Yours (Yes, Even Your Goblin's Backstory)

We only collect the data app stores require. No ads, no tracking, no selling your character sheets to Big Tavern. Here's exactly what we do — and don't do — with your data.

privacy transparency

Let’s talk about data privacy. Specifically, let’s talk about why a D&D companion app doesn’t need your contacts, your location, your browsing history, or your firstborn child.

Somewhere along the way, the tech industry decided that every app should harvest as much data as possible, just in case it might be useful later. Your flashlight app wants microphone access. Your weather app is tracking your location 24/7. Your calculator has a privacy policy longer than War and Peace.

We think that’s absurd. So we don’t do it.

Our Philosophy: Collect Nothing, Sleep Well

At CafeG Labs, our data collection policy is simple: we only collect what Apple and Google require us to collect. That’s it. That’s the whole policy.

No ad networks. No tracking pixels. No analytics SDKs watching your every tap. No “anonymized” data that’s somehow still tied to your device fingerprint. No third-party data brokers. No “partners” who want to show you targeted ads for longswords. We don’t sell, share, or serve your data to advertisers — period. There is no advertiser. We don’t have one. We’re never going to have one.

(One small honest exception: we ship Firebase Crashlytics for crash reports. It’s off by default in production — we only see anything if you opt in. We talk about that below.)

Your character sheet lives on your device. Your spell slots are your business. We don’t want them, and frankly, we don’t have time to look at them — we’re too busy squashing bugs.

What We Actually Collect

Let’s break this down product by product, because transparency shouldn’t require a law degree.

Nat20 (D&D Companion)

  • Your characters, dice rolls, campaign data, and compendium searches stay on your device in a local SQLite database.
  • If you sign in (Apple or Google), we store the minimum authentication token needed to connect you to campaign sessions. We don’t store your email, your name, or your profile photo.
  • If you join a campaign, your data syncs through our relay in real-time (more on that below). We don’t keep copies.
  • In-app purchases are handled entirely by Apple/Google. We never see your payment information.

QPad (QA Checklist Manager)

  • 100% local. Your checklists, test results, and reports live on your iPad and nowhere else.
  • GitHub integration is optional and authenticated directly with GitHub — we never touch your token.

Switch Family Controls (Browser Extension)

  • Open source. You can read every line of code yourself at github.com/cafeglabs/nswitch-pcons-chrome.
  • All parental control data is stored locally in your browser with encrypted storage. Nothing leaves your machine.

”Why Does a Dice App Need My Camera?”

Fair question. Here’s every device permission Nat20 requests, why we need it, and what we do with it (spoiler: nothing shady).

Camera — Snap a photo for your character portrait or scan a campaign QR code. We only look through the lens when you tell us to — no Scrying allowed.

Face ID / Biometrics — Use Face ID to protect your account. Not even mimics can copy your face. Good thing too, because — yeesh.

Microphone — Dictate campaign notes hands-free. What happens at the table stays at the table — we don’t record or store audio.

Motion Sensors — On iOS, the motion sensor is tethered to Health Data (thanks, Apple). We access the motion sensor so you can shake your device to roll dice — because sometimes you just need to feel the chaos. No motion data leaves your device. We’re not peeping your health info, although you probably should go for a walk soon.

Photo Library — Choose portraits for your characters, upload textures for custom dice skins, or set battlemap backgrounds. Your photos stay on your device — we’re adventurers, not data hoarders.

Every one of these permissions is opt-in. Deny any of them and the app works fine — you just won’t be able to use that specific feature.

How Campaign Relay Works (The Nerdy Bit)

When you join a Nat20 campaign, your device connects to our relay server via WebSocket. Initiative updates, token movements, fog of war changes, and dice rolls flow through the relay to other connected players in real-time.

Here’s the important part: data flows through, nothing sticks. Our relay is ephemeral by design. It’s a pipe, not a bucket. When your session ends, the data is gone. We don’t log your rolls, we don’t archive your maps, and we definitely don’t save the message where your Bard tried to seduce the dragon.

Campaign state lives on the DM’s device. The relay just makes sure everyone sees the same thing at the same time.

What About Crash Reports?

Real talk: when an app crashes mid-combat, we want to know about it. So we ship Firebase Crashlytics for crash reports. We’re not going to hide that or pretend it doesn’t exist — that wouldn’t be very on-brand.

In production, Crashlytics is off by default. The SDK ships with the app, but it doesn’t send anything until you flip a switch. The vast majority of users will never share a crash report with us. That’s the deal.

If you want to help us fix bugs, you can opt in:

Settings → Privacy → “Help us fix crashes” → flip the switch

Once it’s on, here’s what Crashlytics sees, and only when the app actually crashes:

  • The stack trace — which line of our code blew up
  • Device model (iPhone 15, Pixel 8, etc.) and OS version
  • App version so we know if it’s already fixed
  • Free RAM and disk at the time of the crash
  • Breadcrumbs — generic events like “opened character screen” leading up to the crash, never your actual data

Here’s what Crashlytics never sees, opt-in or not:

  • Your name, email, account, or any personal info
  • Your characters, dice rolls, notes, maps, or campaign data
  • Your behavior when the app isn’t crashing
  • Anything advertising-related — that data does not, will not, and can not flow to advertisers because we don’t have any

Beta testers, heads up: during the beta program, Crashlytics is on by default for your build because crash data is the whole point of beta. The toggle still works — flip it off any time. When the app launches publicly, it ships off-by-default for everyone.

We considered going without crash reporting entirely. The honest tradeoff: we’d ship a buggier app and the people most affected (you, mid-session, when something goes wrong) would have no way to tell us. Crash reports are how we find the bugs you can’t reach us through Discord about. So we kept it — but it’s opt-in for production, you get the switch, and we’re up front about all of it.

Why This Matters

You’re trusting us with your characters — the ones you’ve spent hours building, the ones with the perfect backstory about being orphaned by a rogue gelatinous cube. You’re trusting us with your campaign notes, your encounter plans, your secret BBEG plot twist that would absolutely devastate your party.

That trust matters to us. A lot.

We’re a small, independent studio. We don’t have investors demanding “engagement metrics” or a growth team trying to figure out how to monetize your scroll behavior. We make apps. You use them. That’s the deal.

Our Commitment

If we ever change our data practices — and we have no plans to — we’ll tell you first. Clearly, in plain language, with enough time to make an informed decision.

But honestly? We built these apps for ourselves first. We’re the players and DMs who use them every week. And we wouldn’t want our own data harvested either.

Your data is yours. Full stop. Now go roll for initiative.

Welcome to CafeG Labs

Introducing CafeG Labs — a small, independent studio building thoughtful software for developers, gamers, and families.

announcement

We’re excited to launch the CafeG Labs website. Here you’ll find all our products, release notes, and company updates.

What We’re Working On

  • Nat20 — The ultimate D&D companion for players and DMs, nearing launch with a multi-edition compendium (5e, 3.5e, Pathfinder, OSE, and more), 3D dice roller, campaign management, and interactive battle maps.
  • QPad — Our QA checklist management app for iPad is available now, with GitHub integration and professional reporting.
  • QPilot — An AI-powered automated test runner for macOS, currently in development.
  • Switch Family Controls — A free, open-source browser extension for managing Nintendo Switch screen time.

Stay tuned for more updates as we continue building.