3 Commits
Author SHA1 Message Date
tevansandClaude Opus 5 592d540910 v0.1.3 — fix the relationship schema that blocked manifest install
Installing by manifest URL failed on a remote server:

  [Module.vanity-delve] validation errors: relationships: systems:
  ArrayField 0: type: requires is not a valid choice

The relationship entry used type: "requires". In Foundry's schema `type` is the
PACKAGE type — module, system or world — and the relationship kind is expressed
by which array the entry sits in. So the correct value is "system".

The entry now also carries VANITY's manifest URL, so Foundry can offer to
install the system rather than just refusing.

This was never caught because the module had only ever been installed by copying
files into Data/modules by hand. The validator that rejected it only runs on the
manifest-install path, so every local test passed while the published artifact
could not be installed at all — the same shape as the scene-control hook bug,
where testing the layer below the interface hid a failure in the interface.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 13:55:14 +01:00
tevansandClaude Opus 5 1be441f775 Add MIT licence and a repo README
The repo went public with no LICENSE, which means default copyright — nobody
could legally reuse any of it. MIT throughout, covering the generator and the
VANITY prose alike.

Also adds a README, since the front page was previously a design document that
opened mid-argument, and sets module.json's license field so Foundry shows it.

Module to 0.1.2 so the released zip carries LICENSE too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 12:55:33 +01:00
tevansandClaude Opus 5 decb3bf930 Replace the footers; the repo is public now
Eleven files carried "Private VANITY development material — not for sale or
distribution", which contradicted the repo the moment it went public.

Two replacements, because the files do two different jobs. core/render.mjs
*emits* its footer into every generated delve, so that one now says where the
document came from rather than restricting what can be done with it — a
generated dungeon belongs to whoever generated it. The project's own documents
— DESIGN.md, the paper delve, both playtests, the spike report — read as
development notes in a public repo.

Samples regenerated so they carry the new line. The worksheet and play sheet
never had a footer and still do not; they are the GM's own working documents.

Module to 0.1.1: the v0.1.0 zip vendors the old render.mjs and would stamp the
stale footer on everything it generated. Cutting a version rather than swapping
assets under the existing one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 12:38:32 +01:00
15 changed files with 131 additions and 33 deletions
+1 -1
View File
@@ -308,4 +308,4 @@ failure outcomes, concrete clue answers, and a full ending packet with negotiati
---
*Private VANITY development material — not for sale or distribution.*
*VANITY development notes — part of [DELVE](https://github.com/slaguru666/vanity-delve).*
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 slaguru666
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+54
View File
@@ -0,0 +1,54 @@
# DELVE
An authoring system and Foundry VTT module for the **VANITY** tabletop RPG. Press one button and
it generates a whole dungeon — fiction, areas, maps, encounters, hoards and a journal you can read
cold — then drops it into your world.
## Install (Foundry)
**Add-on Modules → Install Module → Manifest URL:**
```
https://github.com/slaguru666/vanity-delve/releases/latest/download/module.json
```
Requires the [VANITY](https://github.com/slaguru666/Vanity) system, **0.10.5 or later**.
* **⛏** raise a dungeon
* **🗑** remove one you don't want — it deletes exactly what it made and nothing else
* **⏩** stage a delve you finished at the desk
## Also a CLI
`core/` is pure JavaScript with no Foundry dependencies, so a delve can be generated, rerolled and
finished outside the VTT:
```bash
node core/cli.mjs --new --seed=my-delve --file=my.json
node core/cli.mjs --file=my.json --worksheet # everything, with prompts for what only you can write
node core/cli.mjs --file=my.json --reroll=3:situation
node core/cli.mjs --file=my.json --play # the tight, table-facing sheet
```
## What it does and does not do
It generates the fiction, the order and the pressure. It does **not** write your read-aloud text
or your climax, and it says so — those are prompts, not output. It gets you to a strong first
draft in a minute instead of an evening, then gets out of the way.
[`DESIGN.md`](DESIGN.md) has the whole design history, including four rounds of adversarial review
and two paper playtests that failed before anything worked.
## Layout
| | |
|---|---|
| `core/` | the generator — pure JS, 39 tests |
| `foundry-module/` | the Foundry module, with `core/` vendored |
| `paper/` | a hand-written delve and both playtest logs |
| `spike/` | the harness that measured VANITY's Forge outside Foundry |
| `samples/` | generated output |
## Licence
MIT — see [LICENSE](LICENSE).
+1 -1
View File
@@ -165,6 +165,6 @@ export function renderMarkdown(d) {
}
L.push('---');
L.push('');
L.push('*Private VANITY development material — not for sale or distribution.*');
L.push('*Generated by [DELVE](https://github.com/slaguru666/vanity-delve) for the VANITY RPG.*');
return L.join('\n');
}
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 slaguru666
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+5 -3
View File
@@ -2,7 +2,7 @@
"id": "vanity-delve",
"title": "DELVE — a dungeon layer for VANITY",
"description": "Generates a coherent delve and sequences VANITY's Forge to stage it, one area at a time.",
"version": "0.1.0",
"version": "0.1.3",
"compatibility": {
"minimum": "13",
"verified": "14.365"
@@ -11,7 +11,8 @@
"systems": [
{
"id": "vanity",
"type": "requires",
"type": "system",
"manifest": "https://raw.githubusercontent.com/slaguru666/Vanity/main/system.json",
"compatibility": {
"minimum": "0.10.0"
}
@@ -32,5 +33,6 @@
"manifest": "https://github.com/slaguru666/vanity-delve/releases/latest/download/module.json",
"download": "https://github.com/slaguru666/vanity-delve/releases/latest/download/vanity-delve.zip",
"url": "https://github.com/slaguru666/vanity-delve",
"readme": "https://github.com/slaguru666/vanity-delve/blob/main/foundry-module/README.md"
"readme": "https://github.com/slaguru666/vanity-delve/blob/main/foundry-module/README.md",
"license": "https://github.com/slaguru666/vanity-delve/blob/main/LICENSE"
}
+1 -1
View File
@@ -165,6 +165,6 @@ export function renderMarkdown(d) {
}
L.push('---');
L.push('');
L.push('*Private VANITY development material — not for sale or distribution.*');
L.push('*Generated by [DELVE](https://github.com/slaguru666/vanity-delve) for the VANITY RPG.*');
return L.join('\n');
}
+1 -1
View File
@@ -209,4 +209,4 @@ the gang, take the portrait in A5, and have nobody bow — the path v1 punishes
---
*Private VANITY development material — not for sale or distribution.*
*VANITY development notes — part of [DELVE](https://github.com/slaguru666/vanity-delve).*
+1 -1
View File
@@ -170,4 +170,4 @@ Next: **step 2, the seam spike.**
---
*Private VANITY development material — not for sale or distribution.*
*VANITY development notes — part of [DELVE](https://github.com/slaguru666/vanity-delve).*
+1 -1
View File
@@ -344,4 +344,4 @@ Pass 2 is **contrarian**: Court Door, nobody bows, ally the gang, take the portr
---
*Private VANITY development material — not for sale or distribution.*
*VANITY development notes — part of [DELVE](https://github.com/slaguru666/vanity-delve).*
+5 -5
View File
@@ -40,7 +40,7 @@ On success it goes first, and The Silent Host will not open hostilities first.
---
### AREA 1 — The Threshold Stones
### AREA 1 — The Mourners' Steps
*approach · institution*
> A stair too grand for the door it serves. The queue disturbed — three of the dead pushed aside. One of the Host — reading out an order of precedence to an empty hall. When you walk in, it pauses and asks where you fall in it. None of it is accident — it was done this way on purpose.
@@ -76,7 +76,7 @@ On success it goes first, and The Silent Host will not open hostilities first.
---
### AREA 3 — The Waiting Room
### AREA 3 — The Antechamber
*complication · ritual*
> A herald's script with the order still marked. Someone has walked the corridor the wrong way, scuffing one side. One of the Host with a herald's staff — announcing arrivals to an empty stair. When you walk in, it announces you, inventing a rank. None of it is accident — it was done this way on purpose.
@@ -122,7 +122,7 @@ On success it goes first, and The Silent Host will not open hostilities first.
---
### AREA 5 — The Sunken Nave
### AREA 5 — The Lower Cut
*descent · wound · pocket*
> A procession that doubled back on itself. Banners pulled down and stacked without regard for order. A procession — passing through, unhurried, with you in its way. When you walk in, it does not stop or go round. None of it is accident — it was done this way on purpose.
@@ -143,7 +143,7 @@ On success it goes first, and The Silent Host will not open hostilities first.
---
### AREA 6 — The Last Door
### AREA 6 — The Robing Room
*threshold · anchor · battle · chest*
> A seat at the head of everything, occupied. A rank-plate prised off and dropped, still shiny where it sat. A queue of the Host — waiting to pass a door, in strict order, not moving. When you walk in, the queue opens a gap at exactly your rank. None of it is accident — it was done this way on purpose.
@@ -204,4 +204,4 @@ Handled by giving them what they want, at a price.
---
*Private VANITY development material — not for sale or distribution.*
*Generated by [DELVE](https://github.com/slaguru666/vanity-delve) for the VANITY RPG.*
+5 -5
View File
@@ -40,7 +40,7 @@ On success it was obeyed, and The Silent Host will not open hostilities first.
---
### AREA 1 — The Weeping Stair
### AREA 1 — The Outer Cut
*approach · institution*
> Servants' bones arranged as though mid-errand. Someone has been talking here, and stopped when you arrived. Three of the Host in servants' dress — carrying out an errand that has no destination left. When you walk in, they stop, and wait to be told what to do. None of it is accident — it was done this way on purpose.
@@ -58,7 +58,7 @@ On success it was obeyed, and The Silent Host will not open hostilities first.
---
### AREA 2 — The Lesser Vault
### AREA 2 — The Waiting Room
*complication · ritual · fight · cache*
> Orders scratched into the floor, the last one unfinished. A door braced shut from within by furniture. A living grave-robber — repeating a phrase over and over, trying to get the intonation right. When you walk in, they go quiet and put their back to the wall. None of it is accident — it was done this way on purpose.
@@ -86,7 +86,7 @@ On success it was obeyed, and The Silent Host will not open hostilities first.
---
### AREA 3 — The Crossing
### AREA 3 — The Middle Vault
*turn · demand*
> A hall where your own voice arrives before you speak. An order half-scratched out and rewritten by a different hand. The bells — ringing a summons room by room, coming closer. When you walk in, the bell in this room begins. None of it is accident — it was done this way on purpose.
@@ -104,7 +104,7 @@ On success it was obeyed, and The Silent Host will not open hostilities first.
---
### AREA 4 — The Servants' Deep
### AREA 4 — The Cold Gallery
*descent · wound · pocket*
> An instruction repeated until the stone gave out. Boot-prints that stop mid-corridor and do not resume. A single figure at a speaking-tube — reporting, at length, to a listener who died first. When you walk in, it pauses mid-sentence and asks whether you are the reply. None of it is accident — it was done this way on purpose.
@@ -186,4 +186,4 @@ Handled by giving them what they want, at a price.
---
*Private VANITY development material — not for sale or distribution.*
*Generated by [DELVE](https://github.com/slaguru666/vanity-delve) for the VANITY RPG.*
+7 -7
View File
@@ -40,7 +40,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos
---
### AREA 1 — The Outer Cut
### AREA 1 — The Mourners' Steps
*approach · institution*
> Lamps trimmed and filled, all of them. A seal broken and the contents already spoiled. Two of the Host — repairing something that is not damaged. When you walk in, they set the work down and wait for inspection. None of it is accident — it was done this way on purpose.
@@ -58,7 +58,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos
---
### AREA 2 — The Lesser Vault
### AREA 2 — The Attendants' Row
*complication · ritual · fight · cache*
> A meal laid out, still warm, for people long past eating. One preserved thing removed, leaving a clean shape in the dust. One of the Host — trimming a lamp that has never gone out. When you walk in, it will not stop, and speaks without looking up. None of it is accident — it was done this way on purpose.
@@ -86,7 +86,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos
---
### AREA 3 — The Attendants' Row
### AREA 3 — The Lesser Vault
*complication · ritual · fight · cache*
> A clock wound by somebody, recently. A fire built recently, of furniture that was three centuries old. Something young — waiting, exactly as instructed, and has been. When you walk in, it asks whether it is allowed to stop now. None of it is accident — it was done this way on purpose.
@@ -114,7 +114,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos
---
### AREA 4 — The Turning Hall
### AREA 4 — The Crossing
*turn · demand · pocket*
> A room that resets itself if you look away. A clock stopped by hand — the pendulum caught and tied. A living robber, badly hurt — refusing to bleed, and frightened by it. When you walk in, they grab you and ask what is wrong with them. None of it is accident — it was done this way on purpose.
@@ -135,7 +135,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos
---
### AREA 5 — The Sunken Nave
### AREA 5 — The Servants' Deep
*descent · wound*
> Something kept so well it has forgotten how to end. Rot, in exactly one place, spreading. The room — undoing your presence, footprints filling behind you, dust returning. When you walk in, it works faster. None of it is accident — it was done this way on purpose.
@@ -153,7 +153,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos
---
### AREA 6 — The Antechamber Royal
### AREA 6 — The Quiet Room
*threshold · anchor · battle · chest*
> A casket sized for something smaller than a body. Something here has been eaten, which should not be possible. Two of the Host — setting a table for a meal that is always about to happen. When you walk in, they lay two more places. None of it is accident — it was done this way on purpose.
@@ -214,4 +214,4 @@ Handled by giving them what they want, at a price.
---
*Private VANITY development material — not for sale or distribution.*
*Generated by [DELVE](https://github.com/slaguru666/vanity-delve) for the VANITY RPG.*
+6 -6
View File
@@ -58,7 +58,7 @@ On success it is not alone, and The Silent Host will not open hostilities first.
---
### AREA 2 — The First Hall
### AREA 2 — The Waiting Room
*complication · ritual · pocket*
> Places set every evening for three hundred years. Someone has been counting the dead — tally marks by the entrance. Two of the Host, hand in hand — refusing to be parted to let anyone past. When you walk in, they look at you and do not move. None of it is accident — it was done this way on purpose.
@@ -79,7 +79,7 @@ On success it is not alone, and The Silent Host will not open hostilities first.
---
### AREA 3 — The Waiting Room
### AREA 3 — The Attendants' Row
*complication · ritual · fight · cache*
> Chairs drawn up in a circle, all facing one seat. A bedroll, used, and not by anyone buried here. A dozen of the Host — sitting in a circle, facing one empty chair. When you walk in, they shuffle round to make room for you. None of it is accident — it was done this way on purpose.
@@ -107,7 +107,7 @@ On success it is not alone, and The Silent Host will not open hostilities first.
---
### AREA 4 — The Turning Hall
### AREA 4 — The Gallery
*turn · demand · fight · cache*
> A doorway with the hinges taken off. A name carved beside another, joining them, badly. A second set of footsteps — keeping pace with yours, close. When you walk in, they stop when you stop, close. None of it is accident — it was done this way on purpose.
@@ -135,7 +135,7 @@ On success it is not alone, and The Silent Host will not open hostilities first.
---
### AREA 5 — The Servants' Deep
### AREA 5 — The Lower Cut
*descent · wound*
> A name called so often it wore into the wall. A door tied open with a belt, so it could not close. Three of the Host — laying out a game for four. When you walk in, they look up and count you. None of it is accident — it was done this way on purpose.
@@ -153,7 +153,7 @@ On success it is not alone, and The Silent Host will not open hostilities first.
---
### AREA 6 — The Quiet Room
### AREA 6 — The Antechamber Royal
*threshold · anchor · battle · chest*
> A chair kept empty and dusted. A chair dragged out of position and left where it was needed. A living robber, alone — talking steadily to a companion who is not there. When you walk in, they introduce you to the empty air. None of it is accident — it was done this way on purpose.
@@ -214,4 +214,4 @@ Handled by giving them what they want, at a price.
---
*Private VANITY development material — not for sale or distribution.*
*Generated by [DELVE](https://github.com/slaguru666/vanity-delve) for the VANITY RPG.*
+1 -1
View File
@@ -104,4 +104,4 @@ sequenced — but only if it stops talking to the table on its own.
---
*Private VANITY development material — not for sale or distribution.*
*VANITY development notes — part of [DELVE](https://github.com/slaguru666/vanity-delve).*