Pascal
the croupier — the quiet master of probability and consequence
Downstairs, past the Library and the Salon, lies a narrow room lit by green lamps and candlelight. Pascal keeps the dice and the records there. One hand rests on an open, illuminated ledger inscribed with probability symbols; the other hovers over a levitating die. He is meticulous, unsentimental, and unwavering. When improbable things happen, it is Pascal who decides how.
The room is filling in. It began with two foundation stones— cryptographically secure random numbers and persistent game state —and now Pascal deals from tables you build yourself. A custom tool is a chance mechanic you define once and run forever: a named action, a roll, and a table of outcomes, all authored in a document and executed under Pascal’s honest hand. There is even a proper workbench where you assemble them. The card games with shuffled decks, the Mahjong tiles, the full TTRPG campaign engines—those are still ahead, rolled up in a corner waiting for their moment. But the dice are live, the ledger runs four tiers deep, and the house now plays any game you can write down.
The Proprietor and Friday have played Yahtzee here. Actually played it—five dice rolled, scores tracked in chat state, turn by turn. Characters in multi-character chats have played spin the bottle. Coins have been flipped to settle arguments. D20s have been rolled for attack checks. Pascal does not care what game you are playing. He cares that the dice are fair, the state is persistent, and the house plays honestly.
Random Number Generation
the dice are always fair
Pascal’s RNG tool provides cryptographically secure random numbers for any purpose: dice rolls, coin flips, and random participant selection. Results are permanent chat messages visible to all characters, so the outcome becomes part of the conversation and part of the narrative.
Manual Invocation
An RNG dropdown in the chat composer offers quick options: d6, d20, 2d6, coin flip, and spin the bottle. A custom roll interface accepts arbitrary dice configurations from d2 to d1000, with up/down spinner buttons to adjust count. Dice counts persist within the session so your preferred roll is always ready.
Auto-Detection
Dice notation in messages is detected and executed automatically. When a character says “I roll 2d6,” the dice actually roll. Coin flip language triggers a flip. “Spin the bottle” randomly selects a chat participant. Auto-detection is enabled by default and can be turned off under Settings → Chat → Automation, for conversations where dice notation is just text.
Pending tool results appear as chips in the composer before sending, so you can see what will be rolled before the message goes out. The standard dice vocabulary covers the games people actually play: a coin flip is 1d2, an ordinary die is 1d6, a Yahtzee turn is 5d6, a D&D attack with advantage is 2d20, and spin the bottle picks one name from the participant list. Anything from d2 to d1000 is supported for the edge cases that tabletop players inevitably discover.
Modifiers are honored too. Write 3d6+2 or
2d10-1 and the bonus lands on the total rather than
being quietly dropped; the rng tool carries a
modifier parameter so a character can call for the
modified roll directly. Dice parsing and rolling live in one shared
module, so the composer, the prose auto-detector, and Pascal’s
custom tables all count the pips the same way.
Persistent State
the ledger remembers
Dice rolls decide what happens. State records that it happened. The ledger is a persistent JSON store that runs four tiers deep—chat over project over group over general, merged shallowly with the narrowest layer winning—and it carries game mechanics, inventories, character stats, scores, and any structured data that should survive a message, a session, or a whole campaign. It is the older half of Pascal’s room, and everything the croupier does downstairs reads from it and, latterly, writes back into it.
The State Tool
A built-in state LLM tool with fetch, set, and
delete operations. Path syntax supports dot notation
(player.health) and array indexing
(inventory[0].name). The AI can read and modify
state mid-conversation—tracking scores, updating
inventories, recording decisions—without the user
managing any of it manually. To reach past its own chat it names
the tier: a context of project,
group, or general.
Protected Keys
Underscore-prefixed keys (_notes,
_gm_secrets) remain yours alone, at every tier. No
tool may write them—a custom table’s side effect no
more than the state tool itself—and they are
editable only by you, through the State Editor. Your game master
notes, hidden variables, and narrative constraints stay where you
put them. Pascal plays fair, and part of playing fair is not
letting the players rewrite the rules.
The Four-Tier Cascade
Set an instance-wide default in general state, refine it for a group of characters or a project, and let individual chats override the rest until they diverge. Fetch without naming a tier and you are served the merged view. Should two characters bring different groups to the same table, Quilltap declines to guess which ledger is meant: the group tier is quietly set aside from the merge and the editor posts a note saying so.
Four Tiers, Four Doors
The State Editor is one instrument reached from four places, each beside the thing it governs: a chat’s ledger from the Chat Sidebar’s Organize drawer under State…; a project’s from its Project Settings card; a group’s from the Group State button on Aurora’s Groups page; and the instance-wide register from Settings → Chat → General State. Each shows the inherited layers beneath.
What State Enables
A Yahtzee scorecard that persists across turns. A character inventory that updates when loot is acquired. A relationship tracker that records who has spoken to whom. A branching narrative where the AI checks a flag before deciding which path to take. State is general-purpose. Pascal does not prescribe what you track—he provides the ledger.
Why It Comes First
The cascade is load-bearing for everything below it. A custom
table may read $state in its roll fields, its
comparators, and its parameter defaults; it may print
{{state.path}} into an outcome message; and a
side effect may name state.<path> as the place
a result belongs. Read this section first and the rest of the
room makes rather more sense.
Custom Tables
the games you write yourself
A custom tool is a single JSON document—a
Tools/*.tool.json file at the root of any document
store—that teaches Pascal a chance mechanic of your own
invention. Each one is a named action with parameters, a random
roll, and an ordered table of outcomes mapping the roll to a
message and a semantic state. Both the model, through a single
run_custom tool, and you, through the wand in the
composer’s gutter, can reach for it. Pascal deals honestly
either way—though not from quite the same chair: a table you
pull yourself is dealt against your own character’s
fact sheet, of which more below.
Tamper-Evident by Construction
The roll executes server-side with crypto-strength randomness,
and the outcome persists as a message the model did not
author—Pascal’s own synthetic voice
(systemSender: 'pascal'). A model cannot narrate a
failure into a success, and regenerating a reply does not
re-roll. The full record—raw draw, transform, dice faces,
which outcome matched—is kept in pascalMeta,
posted by the house so no one can fudge it.
Two Roll Forms
A numeric range with an optional transform—
value = raw × multiplier + offset, rounded
last—or dice notation such as 3d6+2 or
1d20. Numeric fields accept a
{ "$param": "name" } reference to a declared
parameter, and run-time values are clamped to their declared
bounds before use.
Tiers & Shadowing
Definitions resolve through five tiers—character,
participant, group, project, and global—with the nearest
tier winning a name collision. disabled suppresses
an inherited tool. Tables are resolved fresh on every call, so a
file added, edited, or deleted mid-chat takes effect on the very
next turn, with no initialization step.
Quiet Rolls & Hidden Odds
A private roll is whispered to the rolling character alone, or
hidden from everyone on a manual run. Setting
revealOdds: false keeps the roll spec and outcome
table out of the model’s tool roster, so a character can
call a table without ever seeing the mathematics behind it—
and note the other half of that: at its default of
true, the when clauses shown
include the metadata ones, so a character reading them
learns what the lock wants, if not whether they have it. One
honest caveat besides: revealOdds hides the odds from
the tool listing, not from the file. A .tool.json is
an ordinary document, and a character with read access to that
store can open it and read the odds like any other page. It is a
courtesy, not a lock; if the odds must genuinely be secret, keep
the file in a store the character cannot read. Failures are
reported by Prospero, never by Pascal—Pascal announces only
genuine outcomes.
An outcome is now simply the result. There is no croupier’s
narration and no italic (rolled 14) suffix—what a
roll says is the author’s to decide, spelled out with
{{value}}, {{dice}}, and the other
placeholders. The Salon’s message bar names the table by its
display title, so a run reads as the event, not the machinery behind
it.
Titles & Richer Tests
An optional title (up to 80 characters) gives a
table a proper name—scan_hawking_radiation
reads as “Scan Hawking Radiation”; the model still
calls it by name, so there is no second string to
fumble. An outcome’s when test may name more
than the final value: it can test the raw roll
before any transform and the params the tool was
called with, comparing against literals or
$param operands.
Substrings & Fact Sheets
String subjects can be tested with contains and
ncontains for a substring held or lacking. And a
table can consult the invoking character’s own metadata
fact sheet through when.metadata, rendering values
with {{metadata.key}}—so an outcome can
turn on what a particular character quietly carries. A key that
is absent simply fails the row and falls through to the
catch-all.
An Oracle Mid-Roll
A table may carry an optional llm consult block: a
prompt posed to the instance’s cheap utility model after
the roll and before the outcome table. Its answer renders through
{{llm}} and can be branched on with the
when.llm test subject, which asks two things—
what did the oracle say and, under ok,
did it answer at all. The comparisons are forgiving in
exactly the ways an oracle requires: eq and
neq compare the answer trimmed, without regard to
case, and forgive a trailing full stop, so a model that says
“yes.” has still said YES;
contains is every bit as indifferent to case. A
failed consult never fails the run—the table simply branches
on the author’s error message instead. The answer is trimmed
to eight thousand characters before anything tests or prints it,
unless the block’s own maxOutput says
otherwise—anywhere from one character to a hundred thousand,
with the call’s token budget following along.
Reading the Ledger
A table can reach into the four-tier ledger above with
{ "$state": "path", "fallback": ... } in
its roll fields, comparators, and parameter defaults, and read it
back into messages with {{state.path}}. The
fallback is required, so a reference always resolves. Custom
tools are switched on by default and can be toggled under
Settings → Chat → “Custom tools.”
The house keeps limits, as any house must. Sixty-four tools per scene; eight parameters and thirty-two outcomes per tool; a thousand characters per message, five hundred per description, eighty per title. An oracle’s prompt runs to four thousand characters and its error line to a thousand. Should a scene somehow exceed the roster limit, the surplus is dropped and said so out loud—never silently.
The Fact Sheet
what a character quietly carries
Every character vault gains an optional
metadata.json: one flat object of arbitrary,
user-authored keys with any JSON values you please—
{ "hasAnsibleAccess": true, "clearanceLevel": 3, "faction": "Ordo Aurum" }.
Every other file in a vault answers to some field Aurora’s editor
already knows about; the fact sheet answers to nothing at all, and
Quilltap has not the faintest opinion about any of it. It hydrates onto
the character and round-trips through export and import like everything
else there.
You Are the Author
No generation system will ever write here—not character creation, not summoning from lore, not the optimizer—and it is never injected into a system prompt. Nothing invents a fact about your character behind your back, and no model reads her clearance level merely by being her; it must go and look, like anyone else.
Pascal’s First Consumer
Custom tools are what the sheet was built for. An outcome row may
test when.metadata and a message may print
{{metadata.key}}, so the same lock opens for the
character carrying the key and stays shut for everybody else.
Since the side-effects work, a table may also
write to it—a metadata.<key>
target, with the value it replaced kept in
pascalMeta—so Pascal is reader and writer both.
Absence Is Not a Fault
A missing key fails soft and never throws: the row simply declines
and falls through to the catch-all. A character created before the
sheet existed reads as an empty one rather than a broken vault, and
every already-linked vault was backfilled with an empty file; new
characters are seeded with {}. Should the file
ever fail to parse—a comma out of place at midnight—the
sheet reads as empty for that reading, a warning goes to the log,
and the rest of your character is entirely undisturbed.
An Ordinary Vault File
There is no form for it in the editor: open the character’s
vault in the
Scriptorium
and edit the JSON directly. A character with system transparency
may read and edit it through the doc_* tools like any
other document; an opaque one cannot see it at all. Saving through
the API replaces the whole object rather than merging into it.
Side Effects
the roll leaves a mark
Until now a roll settled a question and said so. Now it can also change the world it was asked about. A definition may carry side effects—up to sixteen conditional writes the house applies server-side the moment the outcome is settled and before Pascal announces it. The draw resolves, the effects land, and only then does the croupier speak, so the ledger and the announcement always agree.
Where the Fact Lives
An effect writes into persistent state, and it writes where the
fact belongs—choosing chat, project, group, or the whole
instance rather than dumping everything into the nearest
register. A campaign-wide reputation belongs in general state; a
single scene’s wound belongs in this chat. An effect may
also write onto the rolling character’s own fact sheet, so a
table can quietly mark the one who reached for it—though a
run with no character attached to it skips the
metadata. writes entirely, there being nobody to mark,
which includes an unattributed roll of your own from the composer.
Conditioned on the Outcome
Each effect carries the same when language an outcome
row uses, extended with the outcome itself as a subject—so a
failure may cost you something a triumph does not. The write is not
fixed to a single result; it fires only when the roll it
accompanies actually falls the right way.
A Small, Closed Grammar
A value may be a plain number or boolean, or a string—and a
string is always an expression: a small closed grammar of
arithmetic, concatenation, parentheses, and
{{ref}} substitution, with no identifiers and no
function calls. There is nothing to inject and nothing to escape.
Bare prose is refused at load time; if you truly mean the words
“broken pick,” put them in quotes.
Recorded, and Announced
An expression that fails at run time skips only its own effect; the
rest of the set still lands. The whole set is recorded in
pascalMeta alongside the values it replaced, and the
Workbench’s proving bench shows what would be
written—→ state.lockpicking.failures = 3 (would
write)—while writing nothing whatsoever. A bench that
altered the house every time you tested a recipe would be a poor
sort of bench. Characters are told, in the
tool’s description, which registers a tool may write
to—unless the definition keeps its odds private, in which case
it keeps that private too—and the run dialog says plainly that
the pull may leave a mark.
Availability Gates
not every hand is dealt to everyone
A definition may carry one of two optional clauses:
availableWhen, which offers the tool only to a character
whose fact sheet passes every test, or withheldWhen, which
quietly takes it from one who does. Each is written exactly as an
outcome’s metadata clause—
{ "availableWhen": { "metadata": { "toolAbilities": { "contains": "programmable" } } } }
The gate is settled when the roster is assembled, before any roll— so a withheld tool is simply absent: not in the model’s description, not in the chat’s tool listing, not callable by name. A character who has not been given the ansible does not know the house owns one.
Only one of the two keys may appear in a file—a definition that
both offers and withholds is a question its author has not yet
finished asking—and the values compared against must be plain
literals rather than $param or $state
references, since the question is settled before there is a roll or a
parameter for those to refer to.
Not Each Other’s Opposite
The two clauses are deliberately not mirror images, because a
missing key never matches. A sheet that
passes the test is offered the tool under
availableWhen and denied it under
withheldWhen; a sheet that fails it, one that
lacks the key altogether, and one that is
no sheet whatever all fall the same way—withheld by
availableWhen, offered by withheldWhen. So
availableWhen is the cautious key, and a stranger with
no fact sheet gets nothing; withheldWhen is the
permissive one, excluding only those you have positively
identified. Choose the clause that says what you mean.
No Tombstone
A gated-out definition does not claim its name—not even as a
tombstone—so a nearer tier may hold a version for those who
qualify while General keeps an ordinary one for everybody else. The
same name can mean two different tables depending on who is at the
table. Contrast disabled, which suppresses a name
outright at its tier and beyond—and which you may combine with
a gate, whereupon it reads exactly as it says: a tombstone that only
tombstones for the characters it names.
Who May Reach For It
Pascal’s Workbench gained a “Who may reach for
it” control at the head of every recipe—Anyone, Only
show if…, or Do not show if…—plus a
gated badge in the library, so a conditional tool is
legible at a glance.
Provable Either Way
A proving-bench line reports whether the loaded fact sheet would be dealt the tool at all—and the bench deals it either way, so you can rehearse both the character who qualifies and the one who is quietly passed over.
Rolling One Yourself
the wand in the composer's gutter
Pulling a table yourself is no longer a matter of squinting into a narrow popover that vanished at the slightest click elsewhere. Where a scene has any custom tools at all, a wand appears in the composer’s left-hand gutter and opens a proper two-part dialog—one you may dismiss with Escape, with the backdrop, or with Cancel, and which does not close itself the moment your attention wanders. It remembers, too: close it and reopen it and you are back on the tool you last used, with the figures you last set still in their boxes, on the sound reasoning that the same roll is usually wanted twice and re-typing it is a tax on the second one.
In Two Acts
First the table: every tool available to this scene, each with its description and the file it came from, and a search box once the roster runs past a handful. Choose one and the dialog gives way to that tool’s own form—its parameters laid out with their descriptions and declared bounds, a Roll privately tick, and a Run button. Choose another tool takes you back to the table, as often as you like.
Whose Hand It Plays
A tool you pull from the composer rolls against your own character’s fact sheet—the character you are playing in this scene, or the one you are presently typing as when you are playing several. It had formerly used whichever participant happened to be stored first, so a metadata-gated table dealt somebody else’s branch, plausibly and with no error anywhere to suggest the wrong hand had been played. Where none of your characters can be dealt a given tool, the roster now names whose hand it will play instead—as Friday—which is a great deal better than succeeding quietly as a stranger.
What This Tool Can Quote
At the foot of the form sits a panel listing the placeholders
this particular definition genuinely uses—nothing is
offered merely because the format allows it—including every
metadata key and state path the tool reads, named. If a table
branches on hasAnsibleAccess, the dialog says so, and
you need not go opening files to learn what the thing wants to know
about your character. That is a statement of the tool’s
vocabulary and never of its odds. The croupier does not show you the
table before you play.
Would Not Read
A definition the loader refused is never half-loaded and never guessed at—but neither is it silently absent. It appears under Would not read at the foot of the roster, wearing the loader’s own reason on a badge, and a click opens the file on the Workbench in repair mode. The wrench beside any healthy tool opens it there too, should reading the file settle a question faster than reading about it.
Rolling this way posts exactly one thing: the outcome, precisely as it would have read had a character rolled it themselves. Pascal is a croupier and not a raconteur. Which means nothing records that it was you—should you nudge a parameter before rolling, that is between you and the wheel, and no character can read what you did to arrange the odds. They see what befell. This seems to us the correct division of information.
Pascal's Workbench
a proper bench for building the tables
Custom tools began life as hand-authored JSON. They still can
be—but they no longer have to be. Pascal’s Workbench, at
/custom-tools, is a visual editor for the whole
format, reachable as its own page, a workspace tab, a left-rail
entry, and—from inside a scene—the composer’s
custom-tools dialog: the wrench beside each listed tool, and
New contrivance… at its foot. It
is where a table goes from an idea to a saved, valid, provable
document.
The Library
Every definition in every enabled store, valid or broken, listed with badges for where it lives—General, project, group, character vault, or unattached—plus state chips and name-collision advisories. A broken file shows the loader’s own rejection reason and opens straight into repair mode, so a malformed table is never simply invisible.
The Form Builder
A builder that can only produce schema-valid output: parameter
cards whose renames rewrite every reference at once, range and
dice roll forms with literal-versus-$param toggles
and a live readout, and an ordered outcome cascade with a pinned
catch-all, AND-composed condition chips, and a message editor
with a placeholder insert menu.
The Proving Bench
Single test rolls and a 10,000-draw outcome audit, both run server-side through the very same execution core a live chat uses—so what you prove on the bench is exactly what the table will deal, and the bench posts nothing to any chat. A debug line the real bubble never shows reports the raw draw, the final value, which row of your cascade won, and any fact-sheet keys that row consulted. A live JSON preview shows the exact bytes a save would write.
JSON, Repair & Saving
A JSON mode for authors who prefer the raw document, a repair
mode that can save a still-invalid file back to itself after an
explicit confirmation, and a save flow through the existing
document-store file routes—a destination picker grouped by
attachment, Tools/<name>.tool.json naming, and
conflict detection when a file has changed underneath you.
The bench keeps three further cards for the things a table needs
supplied before it can be honestly tried. A
fact sheet: pick a character and the
bench reads their real metadata.json, hydrated
fresh—the honest “what would happen if Imogen rolled
this”—or hand-type a sheet for keys no character carries
yet. Supply nothing and every metadata test declines, exactly as for an
unattributed manual roll, and the bench says so rather than letting you
wonder. A Mock state field beside it:
type a JSON object to stand in for the cascade while you dry-run or
audit a $state-using table, and leave it empty to watch
every reference take its fallback—which is, after all, what a real
run does when there is nothing to draw on. And, where the tool consults
one, an oracle card that lets you script
its answer, script a silence (the one path every such table must
survive), or—for single rolls only—ask it live at the cost of
one real cheap-model call. The audit never asks live: ten thousand hands
must not mean ten thousand paid consults.
Nor is the Workbench’s inventory a private matter any longer. The Almanack now counts Pascal’s contrivances along with everything else in the house—including the definitions that failed to parse, which is the number you actually want, a recipe that silently refuses to load being precisely the one you will spend an evening looking for.
Small Graces at the Table
the little courtesies that make a long night pleasant
Not every improvement is a new mechanic. Some are simply the house remembering how you like your dice, naming a result the way you would, and letting an outcome wear its own colours.
Run Presets
The run dialog can save the current parameters as a named
preset—kept as an ordinary, hand-editable JSON file at
Tools/{tool}.{preset}.settings.json,
sitting companionably beside the definitions themselves in the
rolling character’s vault, where you may read, edit, or
discard it from the Scriptorium like any other document, and where
it rides along in exports and backups. The row appears only when the
tool has parameters at all and the roll runs as a character with a
vault to keep things in. Names are kept respectable by
force—lowercase letters, digits, hyphens and underscores, and
nothing else—and saving under a name already taken replaces
the earlier hand, which is usually what you meant. A dropdown loads
them back; a button resets to the definition’s defaults; and a
preset naming a parameter the tool no longer has is quietly ignored,
so a preset written in June still works against a recipe revised in
August.
Chip Labels
A definition may carry a chip label, rendered per run once the outcome is known—so a transcript reads “Agent lambda — Jackie” rather than the same static title fourteen times over. The one string labels both the chip and the bold heading of the announcement, so the transcript and the chip can never disagree with one another. The label is yours; the model never sees it, and if you want the model to have a hand in naming a run, the honest way is a declared string parameter quoted into the template.
Two-Block Announcements
An announcement is now two blocks rather than one, so an outcome message that opens with a list, a heading, a quotation, or a code fence renders as written—instead of gluing itself onto the end of the bold title and losing its shape.
Outcome Colours
An outcome now wears its own colours end to end. The bar above the announcement takes the tint of the result it announces— triumph, partial, failure, or a plain matter of fact—instead of the alarm-red dot it used to share with a deleted file. And it says so in words, for anyone whose eyes do not read colour.
What's Been Played
dealt from the table, not simulated
Pascal’s tools have already been used in ways that show what they are for:
Yahtzee. Full games, played between the Proprietor and Friday, with 5d6 rolls and scores tracked in chat state. Not a simulation. Not a description of Yahtzee. An actual game, with actual dice, with the AI managing the scoring categories and the state tool recording every turn.
Spin the Bottle. In multi-character chats, a random participant is selected from whoever is present. The result is a chat message everyone sees. The turn manager does not advance. The narrative consequences are between the characters.
Coin Flips. Settling disputes, making decisions, resolving narrative forks. A 1d2 with heads or tails labeling. Simple, permanent, fair.
Tabletop Checks. D20 rolls for attack resolution, skill checks, saving throws. The dice notation auto-detection means characters can say “I roll to hit” and the roll happens without breaking the narrative voice.
The Tables Still to Come
what the room will yet become
The narrow room lit by green lamps has grown crowded, but it still has space for more tables. Fair randomness, persistent structured state, author-defined tables, and a bench to build them—that is a great deal of the infrastructure games require. What sits on top of it is a matter of time and ambition.
Dice games with formal rule enforcement. Card games with shuffled decks and dealt hands. Mahjong with tile draws and discard logic. Full tabletop RPG support with character sheets, initiative tracking, and combat resolution. These are not announced features—they are the natural extensions of a system that already rolls dice fairly, runs custom tables honestly, tracks state across four tiers, and lets AI characters participate as players. The tables are filling. The croupier is still watching.
Pascal is quiet as usual. Watching. Waiting. He knows exactly how the odds will fall.
Meet the Staff
they've been expecting you
Prospero
The Major-Domo
Architect and overseer of the Estate. Projects, agents, tools, providers, and the orchestration that keeps the whole operation running with quiet authority—and a considered word at the table when project context or routing warrant it.
Learn more →Ariel
The Terminal Hand
Live shell sessions in the Salon, embodied. Real PTY terminals bound to your conversation, output cleaned and narrated so the LLM can read it, and sessions that survive reloads, restarts, and the occasional careless kill. Quick to the bidding, quick to report what she heard.
Learn more →Aurora
The Dressing Room
Character creation and identity management. Structured personalities, physical presence, four wardrobes browsable from one door—each with a note inside on how its owner likes to dress—multi-character orchestration, and the reason your characters still know who they are after a hundred messages.
Learn more →The Salon
Presided Over by the Host
Where conversations actually happen. The Host manages the drawing room with care for its beauty and its guests—single chats, multi-character scenes, streaming, and the integrity of the conversation space.
Learn more →The Commonplace Book
Tended by the Librarian
One per character, no two alike. Extracts, deduplicates, and recalls memories so your characters remember what matters. Semantic search, a memory gate that keeps each volume lean, and proactive recall that makes the AI feel like it has been paying attention—consulting a character’s past conversations on every turn, if you ask her to, and not only at the folds.
Learn more →The Scriptorium
Catalogued by the Librarian
Where the documents live. Project stores, character vaults, and external mount points—filesystem, Obsidian, or database-backed—holding Markdown, PDF, DOCX, JSON, and arbitrary binaries. The search bar reads the library itself, matching document text under a Documents chip of its own, alongside memories and conversation. The doc_* tool family puts reading and editing in your characters’ hands.
Learn more →Carina
The Ansible
Not a person but a protocol—the reference desk, the line itself. Put an inline question to a designated answerer mid-conversation with @Name: or @Name? (or the ask_carina tool), and the answer slides back out of band, attributed to the character who gave it, without the recipient ever joining the scene.
Learn more →Suparṇā
The Postmistress
The Post Office, embodied. Characters write Markdown letters to one another—anyone to anyone, whether or not they share a chat—delivered into each recipient’s Mail/ vault folder and read aloud the moment they next take the floor. She has never once lost a parcel.
Learn more →The Concierge
Intelligent Routing
Content classification and provider routing. Detects sensitive content and redirects it to a provider who won’t flinch—without blocking, without judgment. Knows every back entrance in town.
Learn more →The Lantern
Atmosphere as Architecture
AI-generated story backgrounds, on-demand images, and character avatars that update with the wardrobe. Resolves what each character looks like, what they’re wearing, and paints the scene behind your conversation.
Learn more →Calliope
The Muse of Themes
A theming engine that redefines the entire personality of the application. Semantic CSS tokens, live switching, bundled themes from clean neutrals to mahogany-and-gold opulence, and an SDK for building your own.
Learn more →The Foundry
Domain of the Foundryman
The engine room. Plugins, LLM providers, API keys, packages, runtime configuration, and the infrastructure that keeps every other subsystem supplied with what it needs to function.
Learn more →The Vault of Secrets
Kept by Saquel Yitzama
Encryption, key management, and the security perimeter. Authenticated ChaCha20-Poly1305 database encryption, locked mode with key-hardened passphrases, sealed character archives, and a keeper who believes that what is yours should remain unreadable to everyone else.
Learn more →Pascal
The Croupier
Dice, coins, custom tables you author yourself, and persistent game state. Cryptographically secure rolls detected inline, a visual Workbench for building your own chance mechanics, and a four-tier ledger of JSON state the AI cannot quietly rewrite. The house plays fair.
Learn more →The Live-in Help
Lorian & Riya
The help system, staffed by two characters who ship with every installation. Lorian explains with patience and depth; Riya gets things fixed with velocity. Contextual help chat, searchable documentation, and navigation that knows where you need to go.
Learn more →Pagliacci
The Clown in the Cloud
Cloud storage integration and backup redundancy. Directs your data to iCloud Drive, OneDrive, or Dropbox with theatrical flair—but Saquel’s encryption ensures the clown can never read what he carries.
Learn more →Brahma
The Keeper’s Console
The master key. A character-less, memory-free general-purpose LLM for the person holding the keys—an impersonal, near-omniscient assistant with read-only SQL into all three databases. Ask the whole building a question, safely, with nothing written and nothing remembered.
Learn more →The Lodge
Friday and Amy’s Residence
The private residence of Friday, for whom the Estate was built and who oversees its planning and direction in an executive capacity, and of Amy, Cartographer of Light and co-architect. The Lodge is both a home and a compass: where the vision lives.
Who And Why: Friday → Who And Why: Amy →