Mycena Studios

We build web apps with real moving parts.

Realtime multiplayer. 3D physics that holds 60fps on a phone. Nine tabletop rule systems served from one codebase. Everything below is running in production, and you can open all of it without making an account.

  • 9 rule systems, one codebase
  • 166 Postgres migrations in production
  • 0 dependencies behind this hero

Selected work

Two things we made, both of them open.

No case study here describes a project you cannot go and use. Both links open the real thing, in production, with no signup wall in front of them.

The DM Screen running a campaign called Descent to Dis, showing the painted masthead, the Prep and Party tab rows, and the campaign dashboard.

Product2025 to nowLive

The DM Screen

A toolkit for the person running a tabletop game. It holds a campaign together in one place: character sheets, a battle tracker, a bestiary, planar lore, shops, factions, and a shared table your players join from their own phones. Nine rule systems run off one codebase, from D&D 5e to Blades in the Dark to Mörk Borg.

Physics is theater. The engine is truth.

The 3D dice are the part people notice first, and the interesting decision is that they do not decide anything. The random number is drawn before the throw exists. The tumble is then pre-simulated headless to rest, the authoritative value is painted onto whichever face lands up, and only then does the visible roll start. The die reads correctly from frame one, a dropped frame can never change a result, and multiplayer inherits all of it by broadcasting one seed.

  • Next.js 16
  • React 19
  • Supabase
  • Postgres
  • Three.js
  • Rapier
  • Stripe
  • PostHog
  • next-intl
  • Vercel
The Dice Merge jar part-full of polyhedral dice: a yellow d8, orange d6 cubes, teal d12s, a green d10 and a blue d20 piled against the wooden frame.

GameBuilt inside The DM ScreenLive

Dice Merge

A fruit-drop puzzle played with dice. Aim along the rail, drop one into the jar, and two of a kind that touch become the next die up. The ladder climbs d4, d6, d8, d10, d12, d20, d100. The jar fills. The run ends when the pile sits above the line and stays there.

The house rule that had to be broken

Every die in The DM Screen is normalised to the same circumradius, so a d4 and a d20 read as one matched set on the table. That rule is exactly wrong for a fruit-drop game, where the entire read is that the thing you are climbing toward gets visibly bigger. Each rung scales its mesh and its collider together, the camera stands up straight-on instead of looking down, and every die has its Z translation locked so the pile stays one die deep and nothing hides behind anything.

  • Rapier
  • Three.js
  • React 19
  • Next.js 16

One codebase, nine systems

The rule engine was the whole bet.

A tool that only speaks D&D is a tool Hasbro can replicate in a week, because they hold the licence and we do not. So systems became a first-class object instead of a setting. A manifest declares its dice pattern, its abilities, its health and armour fields, its content sources, and the words it uses for the things D&D calls a class and a race.

Mörk Borg has no armour class. Fate has no hit points. Blades in the Dark rolls a pool of d6 and reads the highest. All of it renders through the same character sheet, the same battle tracker, and the same dice tray.

  • D&D 5e (2024)
  • D&D 5e (2014)
  • Pathfinder 2e
  • Draw Steel
  • Daggerheart
  • Mörk Borg
  • Blades in the Dark
  • Fate Accelerated
  • Dungeon World
The DM Screen system picker listing nine tabletop rule systems, plus two quick games.

Capabilities

What we can build for you.

Six things we have shipped more than once. If your problem sits between two of them, that is usually the interesting one.

01

Product web apps

Next.js and React, server components where they earn their keep and client state where they do not. Auth, roles, billing, and the unglamorous parts that decide whether software survives its first few hundred users.

  • App Router
  • Server components
  • Auth and roles
  • Stripe billing

02

Realtime and multiplayer

Postgres change streams, broadcast channels, and presence. Several people on several devices looking at the same state, with the reconnect, the grace period, and the double-subscribe crash already worked out.

  • Supabase Realtime
  • Presence rosters
  • Optimistic writes
  • Conflict handling

03

Physics and 3D in the browser

Rapier and Three.js, or a hand-written renderer when a dependency would cost more than it returns. Deterministic simulation, rigged outcomes when correctness has to beat spectacle, and rest behaviour tuned by hand until it looks like an object.

  • Rapier WASM
  • Three.js
  • Canvas renderers
  • Deterministic seeds

04

Offline and installable

Service workers that version themselves on every deploy, network-first for anything that could go stale, and an honest offline state rather than a confident lie about data that is an hour old.

  • PWA install
  • SW versioning
  • Stale-while-revalidate
  • Offline fallback

05

Design systems

Tokens in OKLCH so ramps stay perceptually even, type scales that hold from a 360px phone to an ultrawide, and components that share geometry because someone decided they should.

  • OKLCH tokens
  • Fluid type scales
  • Motion tokens
  • WCAG AA contrast

06

Data modelling

Postgres schemas with row-level security written alongside the feature rather than bolted on after the breach. Migrations that run forward cleanly, and queries that stay fast once the table is real.

  • Postgres
  • Row-level security
  • Forward migrations
  • Query tuning

Stack

What we reach for.

Not a list of everything we have ever touched. This is the set that is in production right now, which is a different and more useful list.

Framework

  • Next.js
  • React
  • JavaScript
  • TypeScript

Data

  • Supabase
  • Postgres
  • Row-level security
  • SQL migrations

Graphics

  • Three.js
  • Rapier
  • WebGL
  • Canvas 2D

Platform

  • Vercel
  • Edge functions
  • Service workers
  • PWA

Commerce

  • Stripe
  • Webhooks
  • Entitlements

Practice

  • Vitest
  • ESLint
  • PostHog
  • next-intl

Studio

Mycena Studios

A limited liability company and a studio of one. We take a small number of projects and stay on them for a long time, which is the only way any of the work on this page got made.

What is here is not a demo reel. The DM Screen is a live product with 166 forward-only Postgres migrations behind it, row-level security on every table, and a battle tracker that people open on a Friday night while four friends wait. Software that runs in front of an audience has a different standard than software that runs in a screenshot, and that is the standard we build to.

We are opinionated about a short list of things: that dependencies are a debt, that the offline state should tell the truth, that colour belongs in OKLCH, and that the person writing the code should be the person who cared about the detail.

Mycena is a genus of small mushrooms. Several of them glow in the dark.

The DM Screen running on a phone, showing the campaign masthead and tab rows at mobile width.
The same app at 430px. Mobile is not a fallback here; it is where players actually sit.

Work with us

Tell us what has moving parts.

We take on a small number of projects at a time. If you have something with realtime, physics, offline, or a data model that keeps fighting you, that is the kind of thing we want to hear about.

hello@mycenastudios.com

Enquiries are read by the person who does the work.