Loading...
Two features in one release. The Library brings your own assets into the platform. The Workshop lets you share what you build here.
This release shipped two features that are really one idea.
The Library is the in-door. You bring your own assets, the tokens and maps you have collected over years of playing, directly into the platform. Upload once, use everywhere: the Campaign Editor, the Map Editor, the VTT token palette, anywhere an asset can go.
The Workshop is the out-door. Campaigns built in D3Designs can be published, browsed, rated, and cloned by other DMs. Follow creators whose work you like. Find a campaign on Friday, clone it into your library, run it that weekend.
In, and out. Your collection comes with you, and what you make here can travel.
The principle behind both features is the same one: a DM should be able to reuse anything they have ever made for D&D.
You bought tokens from an artist three years ago. They should not live in a folder you re-upload per campaign. You built an NPC for one campaign. She should be able to show up in the next one. You ran a campaign that worked. Another DM should be able to remix it, swap the monsters, keep the maps, and make it theirs.
The Library handles the first case. The Workshop handles the rest. Browse other people's campaigns, copy their NPCs and monsters and characters, check out their maps, clone the whole thing and change what you want. Nothing you or anyone else makes on the platform is a dead end.
One boundary worth naming: the Workshop is for work created in D3Designs. Your own uploaded assets stay yours, in your library, for your use. The Workshop is not a marketplace for redistributing other people's content. The platform is a tool, not a storefront for things it does not own.
Here is the part I actually want to write about. Both features, end to end, were not hard. And the reason they were not hard is the architecture.
The platform runs on a layered structure: schema, then data access, then business logic, then API, then hooks, then components, then pages. Every feature walks the same path. The Library walked it: asset tables, a repository, a quota service, a tRPC router, an upload status hook, the asset grid, the library page. The Workshop walked it the same week: three new tables, a repository, a service, a router with its procedures, React Query hooks, listing cards, the browse page.
When the layers are organized, an end-to-end feature stops being a design problem and becomes an execution problem. You know where everything goes before you write it. The schema decisions take real thought. The rest is laying track. Which means the majority of the work ends up where it should: on polish. Empty states, loading skeletons, optimistic updates, error handling, retry flows. The stuff that makes a feature feel finished instead of merely functional. Most of the tickets in this release are polish tickets, and that is the architecture paying for itself.
This is also why the Library shows up across the app instead of living on its own page. Once assets are first-class entities with a real data layer, wiring them into the VTT token palette is one integration, not a project. Drag from your library onto the map. The feature composes because the layers compose.
The one piece that was a real engineering problem: the clone.
Cloning a campaign is not copying a row. A campaign owns chapters, chapters own encounters, encounters reference monsters and NPCs, everything references assets. Some campaigns are massive. The clone service deep-copies that whole tree, end to end, so the DM who clones a campaign gets a real, independent copy they can tear apart without touching the original.
That was the feature that earned its complexity. Everything else was track-laying and polish.
A library for your own assets, with upload, validation, quota, and a home in every editor that uses assets. A workshop for sharing what you build, with publishing, browsing, search, ratings, creator follows, featured listings, and one-click cloning.
An in-door and an out-door. The platform finally has both.

Written by Jean P.
Solo builder.
Join the D3 Designs Discord to share thoughts and follow along.