Share links
The unlisted URL a published story is served at, how to rotate or retire it, how a version gets pinned, and the mature content gate.
A published story lives at one URL: /play/<slug>. The slug is the access
control. There is no gallery, no browse, no sign-in for readers, and no
password on the link. Anyone holding the URL can play; nobody else can find it.
Slugs are 20 random bytes in base58, around 27 characters, minted by the server. They are not guessable and they are not derived from your project name.
Get the link
Open Publish. The moment a version is live, the Share link field holds the URL, and Copy link puts it on your clipboard.
Rotate the link
Rotate link in the publish dialog mints a fresh slug. You are asked to confirm, because the old URL stops working immediately and nothing revives it. The story stays live at the new URL, and the version list is untouched.
Rotate when a link has escaped somewhere you did not intend. Everyone you actually want reading needs the new URL, so send it before you rotate if you can.
Rotating does not clear anyone's saves, but their saves are keyed by slug. A reader who comes back on the new link starts from a blank title screen with their old progress stranded on a URL that no longer resolves.
Take a story offline
Unpublish points the live version at nothing. The link 404s for everyone, including anyone who pinned a version. The slug is kept, so publishing again revives the same URL.
Unpublish when you want the story to stop being readable. Rotate when you want it readable, just not at that address.
Pinning a version
The page URL always serves whatever version is currently live. Versions are pinned one layer down, at the serve endpoint the player fetches from:
GET /api/play/<slug> the live version
GET /api/play/<slug>?v=4 version 4, if it is still retainedOnly versions actually published under that project are served, so the slug
cannot be used to probe version numbers. A v that was pruned, never existed,
or belongs to an unpublished story returns 404.
The player uses ?v by itself. When a reader has a save, it asks for the
version that save was made against, so a republish never corrupts a
playthrough in progress. If that version has been pruned, the fetch falls back
to the live one and the old save shows as "other version" in their save list.
A pinned response is cached as immutable, since a numbered version never changes. The unpinned response is marked must-revalidate, so a Make live reaches readers on their next load.
Reference
| Thing | Value |
|---|---|
| Reader URL | /play/<slug> |
| Bundle endpoint | /api/play/<slug> |
| Version pin | ?v=<number> on the bundle endpoint |
| Unknown slug, unpublished story, or unknown version | 404 |
| Slug format | base58, 20 random bytes, about 27 characters |
| Search engines | noindex unless the story is on the showcase |
Search engines
Play pages are served noindex, nofollow. The only exceptions are the stories
curated on the showcase. Unlisted means unlisted:
a link posted on a public page can still be followed by a human, but Narratomi
does not invite crawlers in.
The mature content gate
Legal adult content is allowed. What is prohibited is short and specific, and it lives in the acceptable use policy linked from the Content tab.
To mark a story: open the right dock, Project tab, Content sub-tab, and tick Mature content (18+). Like everything else in the draft, it takes effect on the next publish.
A published story with the flag set shows an age notice before its title screen, headed "Mature content", with two buttons: "I am 18 or older" and "Leave". Leave sends the visitor back where they came from.
Three things are worth being precise about:
- It is honor system. The notice says so. Narratomi does not verify age.
- It is not access control. The slug still serves the bundle to anyone holding it, gate or no gate.
- The answer is remembered per browser, not per story. A reader who has confirmed once is not asked again for the next mature link.
The keyboard is deliberately dead while the gate is up, and focus lands on the
panel rather than the confirm button, so a reflex press of Space (the
player's advance key) cannot answer for the reader.
Previews inside the editor never show the gate. You already chose to open it.