Repository navigation
Releases: DigitalArchon/SealedLore
Release list
SealedLore 1.0.0b7
New
- The window opens to fit your screen: maximised on a laptop, most of a larger screen otherwise. As it changes size it shares its width between the Stories list, the story and the Inspector, so maximising it widens all three rather than only the story. Drag the line beside a dock and the widths are yours from then on. The window's size, whether it was maximised and any widths you set are kept for the next launch.
- When NanoGPT retires an end-to-end encrypted model, SealedLore says so before anything is sent: the model button reads "no longer offered" and a dialog says where to choose another (Settings → Private for scenes, the model button for a chat). Test attestation reports it too. A private scene already under way on the retired model can move to another model NanoGPT still offers, just as private, and carry on there; if you were ending the scene, the new model writes its summary. Settings → Private is left as it was.
Fixed
- The Stories list opened too narrow to read, and stayed that way when the window was maximised: every title was cut after a word or two. A long title now wraps to a second line, with the message count smaller and dimmer under it.
- Controls ran into each other and into the window's edges. The story column now has room on both sides; in the composer, each caption sits with its own control and the groups stand apart; and the buttons beside the turn box, the Inspector's page buttons and the status bar's buttons have room between them. The story-time button in the status bar now matches the model button beside it.
- A retired encrypted model still passed its attestation (it checks Tinfoil's router, whatever the model), and its first message came back as a bare "HTTP 4xx".
- A private scene reopened from disk was attested and checked against the model in Settings → Private at the time, not the scene's own.
- Installing from source could pick up a newer, untried version of the encryption library (tinfoil-ehbp 0.4.0, which frames requests differently). It and its HPKE library are now pinned to the versions the AppImage ships.
- Installing from source broke on PySide6 6.12.0 (released the day 1.0.0b6 came out): it crashed on Python 3.11 and at exit on 3.12. It is kept below 6.12 until those are fixed upstream. The AppImage was not affected.
Checking the download
9d97734b75bd807e17a7ed300f0a95f7055fdb9adf449768317c94e56ac9e68c SealedLore-1.0.0b7-x86_64.AppImage
Built by GitHub Actions from 453b3d5f065a7d54d2bb8747a0a7952d1424b430, and attested. With the GitHub CLI:
gh attestation verify SealedLore-1.0.0b7-x86_64.AppImage --repo DigitalArchon/SealedLore
Or rebuild it: check out v1.0.0b7, run packaging/appimage/build.sh,
and compare the checksum. The build is reproducible.
SealedLore 1.0.0b6
New
- API keys are kept in the system keychain (GNOME Keyring or KWallet on Linux, Credential Manager on Windows) instead of in plain text in
config.json. Every key moves: chat, pictures, video, embeddings and private. Keys from an earlier version move once the window is up, and the status bar says so. A computer without a keychain keeps them inconfig.jsonas before, and Settings → Endpoint → Keep API keys in can choose that (in the CLI,configure --key-storage file). A note under every key field says where that key goes. A key the keychain refuses stays in the file for that save, so nothing is lost. - Rebuild runs in the background. The chapters you flagged by editing are rewritten while you play, and each flag clears when its new chapter is in. It still starts only when you ask.
- Keep as written (Story so far): a chapter merging into a part leaves this one as it is, and merging goes around it.
- A Question about something long merged brings back the chapters it was merged from, ranked by meaning and by the words they share (with no embeddings endpoint, by the words alone). They stay in the storyteller's prompt for your next three turns on that branch (Settings → Context). In testing, Questions about merged chapters were answered noticeably better.
- A plot story's chapters are headed with the days they cover. In testing, the passages written from them made fewer mistakes about time.
- An event you write yourself counts. When a Direction or Narration turn tells an event the plot has waiting, the plot takes it as happened, instead of bringing it about again later. It counts only when the sentence is found in your turn.
- The storyteller's host can be changed beside its model, mid-story or mid-chat: a route button sits next to the model button wherever a route applies (NanoGPT, a model with more than one host, not a TEE or encrypted model, not in a private scene).
- Models that reason by default are asked for less from the first request. NanoGPT's listing says which models think unasked, so As low as possible now asks them for their lowest level from the start, rather than only after a slow reply had caught them (Kimi K3 took 115 seconds to its first word). Models that list nothing are still caught as before.
- The Prompt tab can go back to the whole request: it is the first row of the list, and the section you chose stays chosen when the prompt is rebuilt.
- A click dismisses a status-bar notice, so a reminder no longer covers the model and route buttons for seconds.
Fixed
- Editing or rebuilding a chapter inside a merged part never reached the storyteller. The part is now taken apart until the next merge.
- A rebuild could continue from another branch's chapter.
- A stale or hand-edited chapter near the start of a story stopped merging for good.
- Chapters written in the background for a branch you left were thrown away and paid for again.
- The chapter summariser matched names by substring ("Ann" in "announcer") and missed people named by part of their name.
- The scene card's time stayed fixed while days went by. It is now sent only at the start of a story without a plot.
- Large embedding requests were refused by the endpoint. They are now sent in batches.
- The plot's clock read numbers wrongly: "fifty-one days" and "twenty-one days" counted as one day, "thirty days", "a hundred days" and "a few more days" were missed, and a count ("fifty-one days into a new life") could set the story to that day. Only a day named as a day ("day 31", "the thirty-first morning") now sets it, and a day your Direction or Narration turn names counts.
- A time skip in a Direction turn ("Three weeks pass") was written before the plot knew of it, so the next turn crammed the skipped events into weeks already told without them. The plot's clock now moves before the passage is written.
- An event waiting on another that ran late was missed, and could take the rest of a plot with it. It now waits for that event, and its window runs on to the day it happens.
- An event the plot began that no passage showed was never brought up again. After six passages it goes back to waiting.
- The storyteller was told the plot's day and hour every turn, and worked days and times out from them wrongly. It now gets the events your character knows of, undated.
- The plot's clock is read after each passage on the scene model, beside the scene read, where it costs no wait. The plot's director still uses the plot model.
Checking the download
2f179b2903ccf41a8372103b191ebceeb62e83655357000052234bd3101fb716 SealedLore-1.0.0b6-x86_64.AppImage
Built by GitHub Actions from 023f0338b7d786902a034cd15a8495fe20241de5, and attested. With the GitHub CLI:
gh attestation verify SealedLore-1.0.0b6-x86_64.AppImage --repo DigitalArchon/SealedLore
Or rebuild it: check out v1.0.0b6, run packaging/appimage/build.sh,
and compare the checksum. The build is reproducible.
SealedLore 1.0.0b5
New
- Replies start sooner. Models are now asked to reason as little as they allow. A model that thinks only when asked (Claude, DeepSeek) is asked for nothing. One that thinks anyway is asked for its lowest level once it has been caught thinking at length, and a note under that passage says so, since that reply was slow to start (Kimi K3 took 115 seconds to its first word at its own default, and about 6 at its lowest). The check is repeated a week later, in case the model has changed. TEE and end-to-end encrypted models start at their lowest level, for turns as well as summaries.
- Generation settings are for every story (Settings → Generation), and can be set with no story open. There are two reasoning settings: one for the story model's passages and questions, one for every other call (the scene and plot reads, chapters, the review, drafts, the picture prompt writer). Both start at As low as possible; Low, Medium, High and Max ask for that much, mapped to the nearest level the model offers, and a note says what the story model will be sent. A story's own generation settings from an earlier version are no longer used.
- Help → Model trouble has two checks for when a model starts to misbehave. NanoGPT runs most open models on several hosts, and they don't all behave alike: in testing, one host had GLM 5.3 think four to five times as long as the model maker's own host whatever it was asked, and another ignored the reasoning level on Kimi K3 entirely.
- The model takes too long before it writes… sends the same prompt (a built-in one, or your story's last prompt) to your current route and a few other hosts, three times each, and says whether your host thinks far longer than the others, is simply slow, or whether every host is the same (the model, or your prompt).
- The model's writing has got worse… sends your story's last prompt once to a few hosts and shows the replies side by side, the hosts hidden until you pick the one you like.
- Hosts that keep nothing are chosen by default whenever there are any. The lists sort by any column, with the ticked hosts first.
- Use this host makes it that model's route. Mark as bad… keeps a host from being offered when you choose one by hand: the route dialog shows it greyed with your reason, and Allow again takes the mark off.
- The cost is shown before anything is sent: a host picked there is billed pay-as-you-go, even for a model your subscription includes. Your story's prompt only goes out after a warning saying how much of it there is and which hosts keep prompts (stronger for a memory-only chat). A private scene's prompt, or a TEE or encrypted model's, never goes to another host: those are offered their equally private alternatives instead.
- Settings review: changes to generation settings are now suggestions you make yourself in Settings → Generation, with no box to tick, since those settings are for every story.
- Test speed… now sends each model the reasoning level it gets in play, so its numbers match what you wait for.
Fixed
- With reasoning "off", a story sent no reasoning setting at all, so every model reasoned at its host's default: a story showed "low" in Settings while sending nothing.
- An explicit "reasoning off" is never sent: some models refuse it (GLM 5.3 with an error, Opus 5.5 with what looked like an outage).
- Older stories kept the reply limit they were created with, 1,500 tokens in some, which a model that reasons could use up before the passage ended. Every story now uses the limit in Settings → Generation (4,000 by default).
Checking the download
ed22e852fd14009e9fa8ae33912d9db92e1366493a23f769f52040d2dac51140 SealedLore-1.0.0b5-x86_64.AppImage
Built by GitHub Actions from 02bc46ea6528e3e1d18e0231d36f2d05a2da2b36, and attested. With the GitHub CLI:
gh attestation verify SealedLore-1.0.0b5-x86_64.AppImage --repo DigitalArchon/SealedLore
Or rebuild it: check out v1.0.0b5, run packaging/appimage/build.sh,
and compare the checksum. The build is reproducible.
SealedLore 1.0.0b4
This follows 1.0.0b2: 1.0.0b3 was never published, and everything in it is here.
New
- Video. Story → Generate video…, Video… in the Media tab, or Video of this passage… in a passage's ⋯ menu makes a few seconds of video of the story (Seedance 2.5 at 480p for 5 seconds by default). The prompt is written for video: one continuous shot of the chosen length, what moves, what the camera does and what is heard. A video can start or end on any picture of the story, including the last frame of an earlier video. The prompt is sent exactly as you leave it. The video is made in the background and plays in place in the story; its menu opens it in your own player, saves it, or makes the next one from its last frame.
- Video costs far more than pictures, so it is off until it has an API key of its own (Settings → Video). Set a daily spending limit on that key at the service. The dialog shows the price first, in dollars and in pictures' worth, and nothing is sent until you tick that you accept it; a price it can't work out has to be accepted as unknown. Your chat key can be used for video only if you type it in there, and then every video warns you first. A video is charged when it is sent, so it is never lost: after Stop waiting, or with the app closed, it is fetched when the story is next opened. Hidden data is blanked from videos as from pictures, and a story backup asks whether to leave its videos out.
- Pictures and video can each use their own service and key, apart from chat: NanoGPT, OpenRouter, WaveSpeed, or anything OpenAI-compatible (Settings → Images, Settings → Video). OpenRouter and WaveSpeed support is new and hasn't had much use yet: reports welcome.
- Routes: Settings → Models → Route… chooses which of NanoGPT's hosts serves a model: the fastest first word, fastest overall, cheapest, or a host you pick, FP8 or better by default. Each role has its own, so the storyteller can stay on the subscription while the scene read runs on a fast host. The status bar says when a route isn't being followed.
- The Images tab is now Media: every picture and video the story has made, newest first; Save all… saves both.
- A line above the transcript always says how the open story or chat is set up: on disk or in memory only, its model and how private that is, the endpoint and the route.
- File → Close story (Ctrl+W); right-click a story → Open folder.
- Any simple chat can be kept in memory only, with its pictures, and exported as a backup that can be opened in memory again.
- Lore: Hold back until I mention it keeps an entry from every model until one of your own turns names it, so what hasn't happened yet doesn't happen early. Lore keywords now match your turn rather than the story's recent prose, reaching back an exchange at a time when your turn names nothing.
Faster and lighter
- The AppImage starts in about half the time: all of its Python is compiled when it is built, where before only SealedLore's own was.
packaging/appimage/verify_bytecode.shchecks that what runs is what the source says (docs/building.md). - A long story's cost readout no longer keeps its whole API log in memory, and pictures in the transcript are held at the size they are shown: much less memory on a long story with pictures.
Fixed
- A log record holding certain Unicode line separators was cut in pieces and dropped when the log was read.
- With no story open, the bar above the transcript still named the closed story's branch, and the composer who was played in it.
- A memory-only chat offered to keep its private parts on disk.
- Changing a memory-only chat's model also made it the endpoint's default, written to the settings.
- A request that makes something (a picture, a video) is no longer sent again after a server error, which may have been accepted: only after a rate limit. A spending limit reached is said, not waited out.
The AppImage now carries Qt Multimedia and the FFmpeg it plays video with (LGPL; see the third-party notices). Playing video needs the PulseAudio client library (libpulse0), which nearly every desktop has.
Checking the download
b03a308aec1a6b3cccb165971c52f04d490c31b991b9adc2093c01c58d35ca1d SealedLore-1.0.0b4-x86_64.AppImage
Built by GitHub Actions from cc247f8ec69ab63a910bc23b216e6b9d5dc95f03, and attested. With the GitHub CLI:
gh attestation verify SealedLore-1.0.0b4-x86_64.AppImage --repo DigitalArchon/SealedLore
Or rebuild it: check out v1.0.0b4, run packaging/appimage/build.sh,
and compare the checksum. The build is reproducible.
SealedLore 1.0.0b2
Some minor changes and improvements based on feedback.
New
- Private parts in simple chats: hold part of a chat in private, as you
can a scene of a story. Only a summary you approve goes back to the chat's
own model. A chat on a TEE model is private throughout, so it has no button. - Test speed… (Settings → Models): one short request to each model you
have chosen, all at once. It shows the wait before the first word, how fast
the answer is then written, and the whole request's time. A model used for
several things is tested once. - Use recommended models (Settings → Models): scene, plot and lore models
that measured well for the small calls made on every turn, instead of running
them all on the story model. A new setup on NanoGPT starts with them; a saved
setup changes only if you press the button. - Pictures from disk in any story: the image dialog can add a reference
picture from disk in every story, not only in a chat. - Pictures in plot files: characters, places and lore entries can have
reference pictures (- picture: pictures/name.png | caption). They are kept
in a folder beside the file and put on the cards when it is imported. The
plot file editor has a Pictures strip for them.
Fixed
- The summarisation model could only be set with a story open. It now has a
setting for every story, and a story's own choice takes precedence. - Plot file editor: closing with Discard kept the discarded changes, and
showed them when the editor was opened again. - Scene read: someone who arrived after being called over a channel was left
off the roster. - Picture prompts: a reference picture that belongs to no card was described
to the prompt writer as a character.
A model's reasoning is shown with its passage and never sent back in any
request; tests now hold that for every kind of request.
Installing
- Linux: download the AppImage below,
chmod +xit and run it
(x86_64, glibc 2.34 or newer). - Windows: runs from source; see the
README.
Stories and settings from 1.0.0b1 carry over. The defaults assume NanoGPT;
any OpenAI-compatible endpoint works.
This is a beta: expect bugs, and please report them in
Issues.
Checking the download
0501b3fdcf108e37ece518e9b36bc058af7c26b38a46089be3ba5675a211130b SealedLore-1.0.0b2-x86_64.AppImage
Built by GitHub Actions from a4c52bcc5c6a3a1d74edc4048489cc48618c2296, and attested. With the GitHub CLI:
gh attestation verify SealedLore-1.0.0b2-x86_64.AppImage --repo DigitalArchon/SealedLore
Or rebuild it: check out v1.0.0b2, run packaging/appimage/build.sh,
and compare the checksum. The build is reproducible.
SealedLore 1.0.0b1
The first public beta of SealedLore: a desktop app for AI-driven roleplay,
written from inside the story.
- Private scenes: switch mid-story to an end-to-end encrypted or attested
model; only a summary you approve goes back to your usual model. - Author-written plots: facts, places and events hidden from the player,
brought about by a director on a story clock. - Scene consistency: nobody simply appears in or overhears a scene, and
the model never writes your character. - Every prompt visible and editable, and a settings review that proposes
fixes for what isn't working.
Installing
- Linux: download the AppImage below,
chmod +xit and run it
(x86_64, glibc 2.34 or newer). - Windows: runs from source; see the
README.
Start with File → New story from a sample → Doomsville. The defaults assume
NanoGPT; any OpenAI-compatible endpoint works.
This is a beta: expect bugs, and please report them in
Issues.
Checking the download
c05b272a6ca2fab9c5ed2e678ac060456656fb0d30ef71ca8c5ec58d399962ff SealedLore-1.0.0b1-x86_64.AppImage
Built by GitHub Actions from 234c2bc456149240ead5669f4ef0648426d58fe5, and attested. With the GitHub CLI:
gh attestation verify SealedLore-1.0.0b1-x86_64.AppImage --repo DigitalArchon/SealedLore
Or rebuild it: check out v1.0.0b1, run packaging/appimage/build.sh,
and compare the checksum. The build is reproducible.