Wenlan
Wenlan is a source-backed AI knowledge base and LLM wiki for AI work: organize documents and decisions into pages you can find, inspect, and review.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
dnd WEbpage
翻訳待ち
Loading the full README. The saved excerpt is shown below.
A private codex and campaign manager for the world of Asetheria — built to add,
edit, search, and cross-reference everything in the setting, from a phone at the
table or a laptop while prepping.
Asetheria lived in Notion for years, and Notion was fine for writing it. It was
miserable for running it.Read the full README ↗A private codex and campaign manager for the world of Asetheria — built to add, edit, search, and cross-reference everything in the setting, from a phone at the table or a laptop while prepping.
Asetheria lived in Notion for years, and Notion was fine for writing it. It was miserable for running it.
Mid-session, someone asks which god the temple in Delphara is dedicated to. I know I wrote it down. I do not know whether it is on the Delphara page, in the Hellenorian pantheon table, or in a database row three folders deep — and the party is waiting while I scroll. Notion search returns forty results and none of them are the one. Half the pages are database roll-ups that exist twice. Nothing tells me that eleven organizations are dedicated to the same deity unless I maintain that list myself, by hand, forever.
Fifteen hundred years of continental history, 186 gods, three empires built on Rome, Greece, and Achaemenid Persia — and the thing I actually needed at the table was to type six letters and get the right page in under a second.
So this is that. The whole world in one Postgres database, full-text search with
a fuzzy fallback, and [[wiki links]] that build the cross-reference graph for
me. Opening a god shows every organization sworn to them, because the links go
both ways and I never had to write that list.
Two other things mattered enough to build around:
My players can read it too. There is a player account that sees the world minus anything I have marked secret, and separately a DM notes field on every entry that a player never receives under any circumstances — that is where "the innkeeper is a doppelganger" goes. The filtering happens in SQL, in the data layer, not in the UI, so a mistake in a component cannot leak the ending.
Nothing is ever deleted. I have lost campaign notes before. Archive is a timestamp, every edit keeps a full snapshot of what came before, and the one code path that truly removes a row refuses to run on anything that has content.
The original Notion export lives in data/notion-export/
and is never modified. It is the permanent fallback copy of the world.
The Notion import is the core of the world, and the Bestiary has grown well beyond it — 836 live entries and 1,084 cross-references:
| Section | Count | Section | Count | |
|---|---|---|---|---|
| Bestiary | 346 | Systems | 8 | |
| Deities | 186 | Empires | 6 | |
| Organizations | 110 | House Rules | 6 | |
| Locations | 87 | Pantheons | 6 | |
| Flora & Fauna | 19 | Factions | 4 | |
| Ores & Materials | 16 | Items | 2 | |
| Families | 14 | Session Logs | 1 | |
| Lore | 12 | NPCs | 1 | |
| Quests | 8 | Notes | 4 |
Locations are not one list. The Notion database already classified every settlement through its tags — "Invictian City", "Hellenorian Town", "Island Village" — so each tier gets its own section:
| Tier | Count | Tier | Count | |
|---|---|---|---|---|
| Capitals | 3 | City Districts | 8 | |
| Major Cities | 16 | Sites | 14 | |
| Towns | 17 | The Wilds | 21 | |
| Villages | 9 |
25 further entries are archived rather than deleted — empty Notion index pages
and duplicate roll-up rows. They are all restorable from /archive.
Nothing else was thrown away. The Godatabase is a Notion roll-up that re-exports every god already present in its pantheon folder, so those were merged rather than imported twice. The importer ends with an integrity check that fails the run if any source page containing prose is missing from the output.
346 of those entries are not from Notion, and they're two different layers.
334 are the full monster list from the D&D 5th Edition System Reference Document (SRD 5.1) — the specific subset of official content Wizards of the Coast releases under a Creative Commons license for exactly this kind of reuse. It's mechanics, not flavour: full stat blocks, no narrative text, and none of the named creatures WotC holds as brand-specific Product Identity (beholders, mind flayers, displacer beasts). Every one of these links to the System Reference Document (SRD 5.1) note in the codex, which carries the full attribution and license text.
The other 12 are named and unique to Asetheria — the Simurgh of Vael'Tharan, Talos of Duneforged, Charybdis of the Reach, and others — written from real, ancient, public-domain mythology (Persian, Greek, Roman) rather than from any modern book. A specific creator's homebrew is still that creator's copyrighted work no matter how freely it's shared for reading, so none of it — official sourcebook or fan homebrew alike — was used as source material here. Only these carry real narrative bodies; the SRD layer is deliberately mechanics-only.
Everything else added past the original Notion import — the fauna, the extra flora, the extra ores, and the imperial-institution entries under Systems and Organizations — follows the same rule: original, grounded in real history or mythology, never copied from another book.
Later passes added player accounts with per-player access control (see
"Two kinds of account" below), a backlink graph at /graph, table views on
codex sections, semantic search, and 68 new entries from the metals/flora
reference material, the Foundry VTT world, and three scanned GM Binder pages
— bringing the total to 587. See PLAN.md and IMPLEMENTATION_TRACKER.md
for exactly what changed, why, and what's still pending a production deploy.
npm run import:homebrew # metals, planar metals, flora, one roll table
npm run import:foundry # the custom asetheira-compendium (5 characters)
npm run embeddings:generate # required once for semantic search to return anything
In your Vercel dashboard: Storage → Create Database → Neon. Vercel injects
DATABASE_URL into the project automatically.
This is the beginning of the README. Read the rest at the original. Read the full README ↗