# Roundkeep: A D&D 5e combat table that keeps working without internet

Side project · Live · Jordão Qualho, Senior Software Engineer

> A local combat table for D&D 5e. Initiative, an offline SRD library, Improved Initiative import, and a player view on the same network. No account and no cloud.

Technologies: TypeScript, Socket.IO, IndexedDB, Service Worker, PWA, Python

Live: https://roundkeep.vercel.app · Code: https://github.com/jordaoqualho/roundkeep

## Overview

Roundkeep runs a D&D 5e fight in the browser: initiative, HP, conditions, and a library of SRD creatures and spells. It runs on the Dungeon Master's machine, with no account and no cloud, and players follow the combat from their phones on the same network.

## What it does

- Combat table with turns, rounds, editable initiative, damage, healing, temporary HP and conditions.
- Offline library with 331 SRD 2024 creatures and 319 spells.
- Import from Improved Initiative or Roundkeep backups, with a review step before anything is saved.
- Player view at /p/{id} for phones on the local network.
- Portable JSON backups to move a campaign to another device.
- Keyboard shortcuts for next turn, library search, dice and undo.

## How it's built

- The player view updates live over Socket.IO on the LAN, with a BroadcastChannel fallback inside the same browser.
- Catalogs live in IndexedDB and the encounter saves on every change. After the first load, a service worker makes the production build work offline, with cache versions generated at build time.
- Web Locks allow only one Dungeon Master tab to edit the campaign at a time, so two tabs never overwrite each other. Player windows stay open in parallel.
- The table binds to the LAN, but the bootstrap endpoint that serves private campaign data only answers on loopback. It is not a public cloud room.
- The SRD catalog is converted from Open5e v2 by a reproducible Python script, with credits and licenses shipped inside the app.
- Tests cover encounter rules, catalog data and import.

Creature records come from SRD 5.2 (2024) via Open5e under CC BY 4.0. Spells come from the basic catalog distributed by Improved Initiative.

---

Canonical: https://jordaoqualho.com/projects/roundkeep/ · Full profile: https://jordaoqualho.com/llms-full.txt · Contact: jordaoqualho@gmail.com
