Sébastien Wallachia19 downloadsWrite a world in a few lines of a code block: get its description, its stability and a living window onto it. Keep your Ages on the shelf of a floating-island refuge.
Français · English
An Obsidian plugin for writing worlds. You write an Age (a world) in an age block, one page per line, and the plugin works out the rest: description, stability, a painted and animated linking window, a flippable book with its cover, a map of linked worlds, and a refuge (the Relto) where your Ages are shelved. Everything is local: no network, no AI at runtime, every sound is synthesized and every picture is procedural.
The founding idea: you don't create a world, you link to a world that already exists. What you write describes it; what you leave open is drawn by lot, always the same way for the same note. And if you rewrite a world you've already explored, you damage it.
This product contains trademarks and/or copyrighted works of Cyan. All rights reserved by Cyan. This product is not official and is not endorsed by Cyan.
Fan project made under Cyan's Fan-Made Content Policy. Not affiliated with or endorsed by Cyan Worlds. No Myst asset (font, image, sound) is included. Free and non-commercial.
Inspired by the Myst series (and the Mystcraft idea of linking to a world rather than creating one). A tribute: the names borrowed from the Myst universe (Age, Relto, D'ni, linking book, Descriptive Book…) are an homage and a source of inspiration, not a reproduction. The code, the pictures, the sounds and the texts are original. Licence: MIT.
Age Writer is built to be diegetic: almost everything it shows is something that happens in the world, not a feature of an app. You are not filling in a form; you are a Writer at a desk, and your vault is a library of Descriptive Books.
age block is a phrase of the Art. The text under the block is what the book says back once written: "The sun burns white, leaving no corner kind." Nothing in it is a label or a field name.age: 3.5).Two places step outside the fiction on purpose: the Details tab (stability per axis, causes, numbers: read it as a Guild surveyor's notes on your book) and the Settings. Everything else tries to stay in the world.
Version 1.17.0. The engine (derived from 1.3.0) is available as readable sources in src/engine/. manifest.json announces 1.17.0. Highlights of the latest releases (full history in docs/NOTES-historique.md):
cat_sleep: auto | always | never. Fix: a stray shelf plank lay on the cabin floor.age: 3.5) that one click writes into the block. Easy mode (default) never changes stability; strict makes what does not hold cost, with a severity slider. New blocks, never drawn: black_sun (a brown dwarf: warmth without light, grey day, black plants), close_orbit, distant_orbit, young_world, ancient_world, heavy_world, light_world, molten_core, dead_core, geysers, rifts, thick_air, thin_air, subsurface_ocean. Value lines: mass:, age:, orbit:, insolation:, core:, atmosphere:… Existing Ages keep their pages and stability in easy mode.desert_world + rain, frozen_world + heat… used to cost nothing because of a misnamed axis), and every sky ↔ matter clash counts, not just one per world type. Drawn pages don't change; only stability does (about 1 Age in 9, often a few points).Manual, for now:
main.js, styles.css, manifest.json (build them, see §16)..obsidian/plugins/age-writer/ folder inside your vault.The extension's settings live in the plugin's settings tab, under the "Extensions" heading. The interface language follows Obsidian's (English or French). The engine's content (block names, generated descriptions) is in English.
age block in a note:```age
single_sun
water
return: [[Hub]]
link: [[Sunder Reach]]
```
relto block in a note: your refuge, with your Ages on the shelf.An age code block, one page per line (a block identifier), plus special lines.
| Line | Effect |
|---|---|
link: [[Sunder Reach]] |
linking book to another Age (several allowed) |
return: [[Hub]] |
return book |
panel: [[lagoon.png]] |
your own window image |
seed: 42 |
changes the draw (same note + same seed = same world) |
cover: sober |
cover sobriety: ornate, classic, sober, plain, or 0 to 1 |
window_style: generative |
window rendering (generative or classic) |
window_size: xl / window_width: 520 |
window size |
fx: tv |
window effect: classic, static, ripple, sweep, tv, random, off |
day_length: 40, year_length: 12 |
day length (real minutes) and year length (days), generative rendering |
moons: 3 |
number of moons in the generative window (0 to 5; companion_moon gives one) |
many: ruins / few: rain / normal: water |
quantities |
mechanism: orrery |
the Age's mechanism |
trap book |
trap book (neither return nor crack) |
damaged_pages = 2, removed_pages = 1 |
damaged linking book |
Special lines are ignored by the engine: they don't count as pages. The complete list of blocks (107 you can write, by axis) and all aliases is in the full reference built into the plugin.
So as not to show everything at once, the panel below the block has three tabs (setting Tabs in the Age block):
Command Open this Age as a book. It opens in a main tab (or a window, or the side panel: setting Open the book in), always on the Cover.
Clicking the pane or "open ↗" links you to the target Age (sometimes uncertainly if the book is damaged).
Your refuge: an island with a cabin, a shelf of books (your Ages, clickable and coloured by stability), linking pillars, and pages that add elements and moods. A relto block in a note displays it.
A thin row of discreet icons above the picture:
| Tab | Content |
|---|---|
| View (eye) | the picture; below it, the time and D'ni time in large type. Clicking the time hides it; it fades by itself after a few seconds unless the mouse is over the view. The D'ni name is shown small, at the top, in the black band |
| Pages | active, available and locked pages; books shown on the shelf |
| Settings | sky time, ambience, level, volume |
| Enlarge | opens the Relto view in a main tab (also: command Open the Relto view (large)) |
In the Relto view, a fullscreen icon puts the picture on the whole screen; the icon bar and time float above it and fade. Esc to leave. Relto sound keeps playing when you switch tabs.
Since 1.13 a navigation bar sits in the band above the picture: island (opening view), global view, cabin, linking pillars, grove, pond, pond ++ and cat. You can also click things directly in the island view (the cabin, the pillars, the pond, the cat…). Which buttons are available depends on the active pages.
The page Imager (page_imager) adds a machine to the Relto, inspired by the imagers of the Myst series: a cold stone chamber (nav button, or the small brass device glowing on the cabin table). Put an Age's book on the lectern (‹ › to change book) and tune the machine to that Age until it appears, alive, on the screen (a little crystal projects it there). It is a machine, not a panel with tabs: every control has its own place. Below the screen, a workbench with three stations, each with its lamp (lit when that setting is right); click a station to come closer, the arrow at the bottom to step back (the screen stays in view up close):
The lock. On the right, a big lever under a lamp: red, amber when the image is clear enough, green once it holds. Pull it on a clear image and the machine follows the Age by itself (the drifting phase, the jumps of an erratic cycle); the controls are then held, and the book wears a small brass tag on the cabin shelf. Pull it again to let go.
The periscope. Once locked, the crank left of the screen turns the view (four directions, each with its own landscape under the same sky; the rose shows where you look) and the lever right of it tilts it: up to the zenith (the whole sky, its stars, moons, aurorae, the canopy if there are trees), back to the horizon, or under the water when the Age has some (light rays, kelp, coral, fish, sunken ruins, acid pits, lava vents, pearls, and the glow of an underwater fissure: the way home; under the ice when it is frozen). The view slides as you turn.
Values are shown in D'ni numerals. The Details tab's surveyor's note is set by Surveyor's notes (Imager): full, words only (default) or off. The pale frame around clickable zones is off by default (Frame around clickable zones). The clarity gauge reads the three settings together, and the drone's beats slow down as the atmosphere comes in tune; a crystalline fifth sounds when the whole image holds; glass, rails, crank and lock each have their sound. Clues stay in the fiction: each Age's Details tab carries a surveyor's note (how its sky hums, what its star's light looks like, and the fixed values in D'ni numerals); the phase is never written down, and the crystals are the pages of the book itself. Your tuning, the lock and the periscope are kept per Age.
At the foot of the shelf (in the cabin since 1.12), two books look different from the Ages (also in the Pages tab, and by commands):
age-library) or Relto pages (relto-library). The plugin opens the existing library note, or creates it with a commented example (Age Library.md, Relto Library.md, in the library folder if set). Command: Open a library note.A Relto page's syntax accepts page lagoon: Lagoon | vegetation 0.5 palm or page_lagoon: Lagoon | vegetation 0.5 palm.
A small button (globe) at the top left toggles between the island view (opening view) and the global view: the Relto seen from afar, the island at the centre in the sea of mist, rock pinnacles emerging. Pages add their elements there: islets (page Islets), the rope bridge joining them, the calendar pinnacle (page Calendar pinnacle, which carries the D'ni day), the sky (moon, rain, storm, birds, aurora, snow). A click on the island ("Your Relto") returns to the island view.
| Page | What it adds |
|---|---|
| Rain, Storm | rain; storm with spaced lightning and a darkened sky (rain, storm, density 0 to 1) |
| Birds, Butterflies | birds crossing the sky (mostly by day); butterflies fluttering around the island |
| Moon & sun | a large moon and its small companion, visible by day too |
| Dock | a dock in the mist, right of the island, with a boat and a lantern at night (becomes a rope bridge to the pinnacle when the Calendar pinnacle page is active) |
| Bench | a wooden bench |
| Islets | floating islets behind the island (density = number) |
| Calendar pinnacle | a standing stone on an islet that shows the D'ni day |
| Blue flowers | low flowers along the ground (asset: blue, red, yellow, white, pink) |
| Grass | tall grass along the ground |
| Ponderosa pines, Maples, Crystal tree | background trees (vegetation with asset ponderosa, maple, crystal) |
| Stalk tree | a single stalk tree (page_stalk_tree) |
| Flying lanterns | lanterns floating up into the sky |
Each page is a preset ("New page"), and all these effects can also be written in a relto-library block, for example page rain: Rain | rain 0.9, birds 0.4 | audio=soft_rain.
koi_rare in the page note's properties is ogon (gold), platinum or ghost. With no value, the variety is drawn from the Relto seed. koi_name names the rare koi (default "Ogon", "Platinum" or "Ghost"). A click on the koi (or the cat) shows its name for a moment.cat_name gives its name (shown on hover) and cat_color its coat: black, white, orange, grey, cream, tabby, calico, tuxedo, siamese, or a #rrggbb code.cat_sleep in the page note (or sleep= in a library line): auto (default), always (always by the fire) or never (always outside).relto-library block: page cat: Cat | cat color=black name="Little Wolf" sleep=auto and page pond: Pond | koi 0.8 rare=platinum (koi density sets the number of carp).Trees (pines, birches, palms) are tall and drawn in the background, behind the cabin, shelf, cat and pond, and they avoid the exact spot of the cat, the pond and the two special books: nothing hides them.
Pines, birches, palms, ferns, waterfall, fireflies, lanterns, snow, aurora, fireworks, mountain, menhirs, chimney, mist, and under the island: gems, gold, silver (veins and crystals in the rock, glittering). The mountain is bigger and carries the source of a stream that runs down to the pond and falls off the island. "New page" creates a page; you can also write them by hand (one note per page) or in a relto-library block:
```relto-library
page lagoon: Lagoon | vegetation 0.5 palm, gold 0.6 | audio=river | unlock=[[Glass Marsh]]:60
```
The shelf's books are chosen with the checkboxes in the Pages tab, or with the block's folders:, exclude:, books: options.
Everything is synthesized (Web Audio). Three gestures, three sounds, each adjustable separately:
| Gesture | Sound | Setting |
|---|---|---|
| Handling the book (the book view opens) | thud, leather, pages; then 2 to 5 clasp clicks | Book sound, Clasp clicks |
| Moving into the Age (the note opens) or touching a window | linking sound, eleven variants drawn at random | Linking sound |
| Turning a linking-book page | paper rustle | Turned pages |
When the book is already open, clicking a window only replays the linking sound. Ambiences (Relto, Age) start with the ♪ button; levels minimal / zen / full.
Close-up views have their own sounds (setting Close-up view sounds): a very light trickle at the pond, a purr and meow at the cat (click the cat to make it meow), a crackling fire in the cabin when the chimney page is active. They can come from real recordings in your vault: Settings > Sound > Relto, "Pond / Purr / Meow / Fireplace sound file" (ogg, mp3 or wav; empty = synthesized). A file with several meows is split at the silences. Files are not provided with the plugin.
alteration axis. The Age takes the stability of its weakest axis: ≥ 75% stable, 40–74% unstable, < 40% dying.classic (the engine's painted window) or generative (landscape drawn from the seed: sky, relief, vegetation, weather, reflections, foreground (picked from the Age: branch, vines, reeds, leaves, column, icicles, rocks, arch or none), one inhabited detail). When an Age has water and land (sand, stone or ruins, plants, lava, ice), the window shows a shoreline: a beach, rocks, a grassy bank with reeds, a black lava coast that steams where it meets the water, or an ice shelf with floes; the shore runs down one side, lies far off under the horizon, or is where you stand. Shape and framing come from the seed. ocean_world keeps the open sea, desert_world and lava_world stay dry, frozen_world stays ice. With the physics layer on (easy or strict), the window also shows the world that was computed: the sun takes the colour of its star's temperature (a red dwarf glows orange-red, a hot star blue-white) and its size from the star's radius and distance; thin air darkens the sky (stars by day when there is almost none, no clouds); thick air turns it milky and hazy; a light world has tall, sharp mountains, a heavy one low, broad hills; a tidally locked world keeps its sun still, at a height that depends on where you stand; little visible light makes a dull day. A sun colour you wrote yourself always wins. Three more blocks, never drawn: kelp (a kelp forest swaying under the water), coral (a bright reef in warm shallows), acid (bubbling pools; it eats stone into hollowed ground, iron into rust, water into bitter water, coral into salt). Each Age has its own night: two to four constellations drawn from the seed (some faintly joined), sometimes a nebula or a band of stars, and its moons (companion_moon, or moons: 3 for up to five, each with its own size, tint, phase and pace).prefers-reduced-motion is respected.damaged_pages (shifted zones, colour separation, frozen, ink stains), removed_pages (burnt holes), fractures as instability rises. Drawn from the book's seed.trap book. It looks normal.age-journal block written as you go through linked notes; voices inspired by various characters from the games.age-library blocks define your own blocks, products, reactions and variants.In the plugin's settings tab: a Guide card (Guide and Reference buttons) then seven sections, each with an icon, a description and its current value.
| Section | Content |
|---|---|
| Books & covers | leather, cover tab, where the book opens, open on cover, cover sobriety, 3-page book |
| Sounds | sounds (general), volume, book sound, clasp clicks, turned pages, linking sound, Relto ambience and volume, close-up view sounds and optional recordings |
| Linking window | Age block tabs, rendering, size, effect, intensity, uncertain links |
| D'ni & numerals | language, numerals, font, numbers, D'ni names, D'ni time, Relto in tabs |
| Ages & mechanisms | law of change, ink, healing, mechanisms, solitude, physics of the Ages (easy / strict / off) and its severity |
| Folders | journals, refuge |
| Draw & library | engine settings: automatic properties, drawn window, open-slot draw, fold strength, library folder, default panel image |
Notable defaults: leather and cover on; book in a main tab, opened on the cover; cover "auto"; large window; ink 15 min; healing 0.05 per day; Relto ambience zen; volume 0.35; Relto in tabs on.
Two levels, in a window with sections (and exportable as notes):
| Command | Role |
|---|---|
| Open this Age as a book | book view |
| Open the Relto · Open the Relto view (large) | refuge in a note · dedicated view |
| Create a Relto page | creates a refuge page |
| Generate a random Age | a coherent, stable random world as a new note in the refuge folder |
| Open the Age Writer guide · full reference | short guide · full reference |
| Save this Age's book cover (SVG) | cover as SVG |
| Create the exploration journal for this Age | journal |
| Save this Age's window as a GIF | window export |
| Generate the Age map (canvas) | map of linked Ages (blue = round trip, orange = one way) |
| Update Age data in this note / in every note | writes age_verdict, age_stability, age_axes, age_return, age_links, age_discovered, age_drawn, age_home |
| Create / Reload an Age library · Copy the built-in content | personal library |
| Open the book of glyphs · Open a library note | the Relto's special books |
| Stop the soundscape | stops the ambience |
AudioContext, Chromium renders, integration against the real main.js) plus hands-on use in Obsidian, on desktop with the light theme first. The dark theme and other themes get less testing, so tell me if something looks off.age blocks in one note: each block draws its own world.This is sandbox mode: you write worlds, explore them, tune the Imager and furnish your refuge at your own pace, with nothing to win or lose. A game mode is coming soon (goals, discoveries, consequences), and more to come! Ideas and bug reports are welcome in the repository's Issues.
Since 1.7.0, all the code is readable: the original engine (1.3.0, whose TypeScript sources were lost) was de-minified, renamed and split into modules in src/engine/ (registry, rules, draw, resolve, prose, glyphs, analysis, book-view, settings-tab, plugin…). The old regex patches on minified code are gone: the touch points with the extension are real calls to src/engine/hooks.js. The original 1.3.0 main.js is kept as is in legacy/ (provenance).
The build produces two versions of the same code:
dist/: readable (unminified), for reading, debugging, tracing an error;release/: minified, the one you install or publish.npm install # once (jsdom, eslint, esbuild: development only)
npm run build # src/ → dist/ (readable) + release/ (minified)
npm test # all tests, on the readable build then on the minified one
npm run lint
npm run equiv -- legacy/main-1.3.0.min.js # non-regression: 600 random Ages, old build vs new
node test/visual/make.js # render pages in test/visual/out/
npm run zip # release/age-writer-1.17.6.zip (plugin) + -src.zip (sources); version = package.json
In src/: main.js (entry point: assembles engine + extension), engine/ (the engine), then the extension layer: entry.js (book and block patches), ui-extras.js (panel and tabs), ui-relto.js (Relto, dedicated view, navigation), relto-render.js (canvas), relto-rooms.js (cabin, pillars, pond, pond ++, cat, grove), relto-model.js (pages, island layout), relto-scenery.js, relto-global.js, relto-books.js, cover.js (covers), sound.js (sounds, room sounds), linkfx.js and genscene.js (window), law.js (law of change), mech.js (special lines), physics/ (physics of the Ages: laws, block requirements, constrained draw, sheet; design in docs/DESIGN-physique.md), geophys.js (geophysics blocks), settings-ui.js (settings), guide.js (guide), i18n.js. Details: docs/DEV.md (in French).
NOTICE; the licence texts are in LICENSES/.tracery-grammar declared ISC, original repository Apache 2.0): the grammar used for the prose, bundled in the engine.