A blog that turned into a rebuild
A month of work that was supposed to be a week. Asset versioning, a new asset page, a proper editing flow, profiles, a blog with its own API, and a site that finally looks like one thing.
For the past month now I have been working on what started as a blog. Truthfully it was supposed to remain that way, a simple blog, and it was supposed to only take a week. However school started, then I kept finding issue with element after layout after bug discovered. Eventually the whole damn site just needed a full make over and that's what I've spent most of my time doing.
So this is the first post on that blog, and it's mostly a changelog. Around 220 commits went into this release. I'm not going to list all of them, but I am going to go through the big ones, GitHub release style, so you know what actually changed and why.
Asset versioning
This is the one I care about most. Before, editing an asset was editing the asset. Whatever you saved was what everyone got, and the previous state was gone.
Added
Every publication now records an immutable snapshot. When you publish, that exact version is frozen and kept. It does not change again.
Readers can see every recorded version of an asset and what changed between any two of them. Blocks that moved, text that changed, files that were replaced, all grouped so you can actually read it.
Any recorded version can be downloaded. If someone liked v3 better than v7, they can take v3.
Historical versions can be restored. Restoring makes a new version, it doesn't erase the ones in between.
Corrections and withdrawals. A withdrawn version stays in the history so people know it existed, it just isn't the public one anymore.
Replacement uploads are staged for review before they go public. If you upload a new file over an existing asset you get a diff of what changed, and sealed prompts get filled in from the version you're replacing.
Changed
Edits are private until you publish them. Readers keep using the published snapshot while you work. You can leave an asset half edited for a week and nobody sees it.
Stale edits get rejected. If two sessions try to publish over each other, the second one is told the asset moved and has to look at it again instead of silently overwriting.
Uploading a file identical to the current version is refused as an update. Nothing to publish, so nothing gets published.
Replacing a file that would drop prompt protection asks you first. The old behaviour was that it just happened.
Every recorded version's prompts follow the asset's current protection setting, not the setting at the time it was recorded.
The asset page
The old asset page was a viewer with an edit button that took you somewhere else. Now the page is the editor.
Added
Update history opens in a panel on the page as a timeline, with a rail beside it. It's not a separate page anymore.
A contents rail that tracks where you are, shared between the article and the version list.
Long runs of named items (a worldbook with 300 entries, say) open in a searchable browser instead of dumping 300 rows into the page.
Drag to reorder. Images, collection items, and rows are dragged into place instead of pressing "earlier" and "later" until they land.
Escape, and a visible button, stop editing.
Changed
You write on the asset page itself. Each block sits on its own sheet, and readers see every greeting whole instead of truncated.
Editing happens in place, with review beside it in a rail instead of a dialog over it. Prepare, review and publish an update all live in that rail.
Collections can be edited as a list or item by item, and each item gets the full rail.
Unsaved writing survives a reload. If the page refetches its blocks your draft is kept.
The catalog blurb is editable from the asset workspace.
Block excerpts open in place instead of navigating away.
A work with no picture shows its title instead of a blank card.
Fixed
Uploads over 10MB were being silently truncated on the way to the API. They now arrive whole.
An oversized upload is refused with a size a person can read, not a byte count.
The copy button says it copied instead of only drawing a tick.
Wrapped titles no longer overlap their own lines.
CharX
Every image bundled in a CharX gets a home when it's read in, and is written back where the apps that read CharX actually look for it.
You pick the app you're taking the file to, not the format. The format is a detail the site can work out.
Creators choose which gallery images travel with the export, and a reader can change that once before downloading.
The files a CharX carries stay beside the card and come back out with it.
Profiles
Added
Every verified account can have an optional public profile with an uploaded avatar, a public name and a biography. Sharing a profile link shows those.
You can frame a square crop of your profile picture before it uploads instead of hoping the centre is right.
Account settings has a section menu under the profile card, and the account page is two columns.
Changed
The profile editor is three questions, not a form.
The link decision (linking an app to your account) sits above the fold, and what an app declares about itself is behind a disclosure instead of in your face.
Fixed
Two avatar uploads racing each other could both leave a record behind. The account row is locked now.
A failed profile save names the field it rejected instead of a generic error.
Update destinations
If you publish an asset update, you can now tell people about it without doing it by hand.
Creator-owned destinations. Add a webhook endpoint, verify it once, and set per-asset defaults for where updates announce.
Discord. Configure a channel and an update posts there when it goes public.
Deliveries retry on a bounded schedule with a rotating secret, and you can see what arrived and what didn't from the asset's publication workspace.
Destination hosts on non-public addresses are refused.
Announcement retries that couldn't tell whether the first attempt landed were being retried anyway. That's fixed. Discord repairs are now a deliberate action, not a retry loop.
The blog
This is the part that was supposed to take a week.
Added
The blog lives on its own url, https://blog.illarin.xyz.
A structured post document that Illarin owns and validates. Headings, tables, callouts, code blocks, task lists, pictures and galleries. No raw HTML, ever.
An editor with one writing bar and a row for the block under the caret. Posts keep an editorial history, every edition is kept, listed and restorable.
Scheduling. Pick an exact revision and an exact instant and it goes live then. You can replace or cancel it from the editor.
Withdrawal. A post can be taken out of public view without erasing it. The address shows a tombstone, and a deleted post has thirty days to come back. Its address is kept forever.
Archives by page, by category and by app, with further reading at the end of each article.
RSS and JSON feeds for the whole publication and for each category and app. A sitemap.
Link previews. Every post gets a card, and if nobody uploaded one it's composed on the fly.
A Publication API. An approved tool can write, import Markdown, upload pictures, schedule and publish through a versioned API with idempotency keys and stable error codes. Webhooks tell you when things happen. Docs are at https://illarin.xyz/developers/publication and the example requests on the API page use your own tokens and ids.
The site
Changed
The whole shell is rebuilt on one set of shared components and every page is on the same tokens. Light and dark. The violet theme is the theme now.
The landing page is built around the rendered rune cave, and it works with reduced motion and with an empty catalog.
Browse has a new header and filter row, and on a phone the filters open in a bottom drawer that counts how many you have on.
The create page, sign in, sign up, recovery and verification are on the shared system.
Selects are painted by the site instead of left to the browser.
The brand kit is applied across the site and blog.
Every link and list control is a full touch size on a phone. Legal links in the footer too.
Removed
Legacy styling and the old interface prototypes.
Mascot art and gap filling on asset pages. Empty pages show the reading watcher instead of per-kind art.
For platform developers
If you build a frontend, an app, or a tool that could read from or publish to Illarin, I want to hear from you. The Publication API is documented at https://illarin.xyz/developers/publication, and asset export already speaks CharX for the apps that read it. Message me on Discord @iseik or email me at <aaron@illarin.xyz>.
The server isn't free
Illarin runs on a VPS I pay for. It's not a big bill, but it's a bill, and it goes up as the catalog does. If this site is useful to you and you can spare a couple of dollars, Ko-fi is here: https://ko-fi.com/illarin (opens in a new tab) No tiers, no perks, it just keeps the box on.
Thanks for reading the first post.
Subscribe to blog updates.
Subscribe via RSS