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.

Pascal the Croupier

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 →