What changed in each release of Ilena.
data-tour anchor, the tour chrome is translated into English, French and Spanish, and the editor reads and writes the completed-tours state._ga cookies already on your device, so nothing identifying stays behind.Everything before 19 October 2026, one line per heading. The full entries are in the repository’s history.
| Version | Date | In the product | Under the hood |
|---|---|---|---|
| 1.9.4 | The dictionary service’s memory caps and garbage collection were fitted to its container, preproduction’s worker nodes run on one kind of capacity again, a stale dictionary-backlog alert was corrected, and the 30-day production backup retention was recorded as a decision (five items). | ||
| 1.9.3 | The home page’s laptop screen greets a signed-in reader with an Open Ilena button instead of the carousel, and Ilena Pocket’s privacy policy is published in three languages (two items). | ||
| 1.9.2 | The emotion prompts stop answering with neutrality, the Find Work and About you dialogs get a denser layout, multi-selection greys out the menu items that cannot apply to it, and a work can be exported (PDF, text, Markdown) from its context menu (five items). | ||
| 1.9.1 | Signing out ends only the current session, the sessions screen labels Ilena Pocket sessions, and long works are no longer left partly unchecked by the grammar checker (three items). | The foundation of Ilena Pocket’s device sessions: a session type on the refresh token, a 15-day device session, and two new endpoints for the author’s own branch of the tree and its work versions (five items). | |
| 1.9.0 | Deleting a work or project now moves it to a trash drawer with Undo, restore to the same place, erase for good and Empty trash, multi-select in the tree, and trashed works no longer turn up in Find work (eight items). | The trash is a state stored on the node itself, with its own server-side surface, events for the account journal and an alert on nodes left past 30 days (four items). | |
| 1.8.5 | The browser’s spell checker steps aside while Ilena’s grammar check runs, spoken-register lyrics are no longer flagged, a right-click adds a word to your personal dictionary, and a word three authors add joins the shared corpus (six items). | Personal dictionaries live in the dictionary service, are cleared on account deletion and exported, and the home dashboard shows the grammar engine’s load (two items). | |
| 1.8.4 | An account’s journal in the staff console now shows when a work was created, updated, restored or deleted. | The works service carries its own outbox for work events, and the event queue exists on stage (two items). | |
| 1.8.3 | The poem editor underlines spelling and grammar findings, and a click shows the message with one-click corrections (two items). | A self-hosted grammar-checking engine behind a flag, an endpoint returning findings by line and column, a safe install on stage and preprod, usage metrics and a dashboard, and alerts (five items). | |
| 1.8.2 | Support can seed, preview, retire and buy dictionary words from the console, instead of hand-built JSON calls, and the console groups the dictionary functions apart from the account ones. | Seed files are read a slice at a time and oversized ones are refused with the size to fit; the shared fetcher lets an upload set its own content type, and the README describes the console (five items). | |
| 1.8.1 | /admin/ became a full staff application: delete demo or support accounts, read any account’s journal, add a support account by email, with live password-rule hints, a calmer reset page, a straight route to data export for deleted accounts, and a lockout that finally triggers on the sixth wrong password. | The tool column, status bar and entrance check became shared code, only an operator can delete a demo or support account, and the new console is built, tested and deployed by the pipeline (three items). | |
| 1.8.0 | Support can create or convert a never-billed demo account from the staff console; the person receives an email to choose their own password. | ||
| 1.7.6 | The corpus review retires a token with no vowel instead of buying it, and the editor’s icons ship with the app instead of coming from a third-party service. | ||
| 1.7.5 | A sweep of editor and account fixes: renaming keeps every surface in step, deleted works leave Find work, Esc cancels a suggestion for good, Undo stops at the opened content, ⇧⌘S no longer saves, and several messages were corrected or translated (seventeen items). | A cancelled trial verified end to end, English rhyme stress as a number, one log-level rule across services, a two-second failover when a worker node vanishes, and Spanish corpus bought at the English and French pace (five items). | |
| 1.7.4 | The documentation site is built by our own generator instead of Docusaurus, and every page was rewritten from what the running product does: seventeen pages per language. | ||
| 1.7.3 | An author’s synthesis no longer carries names, and the gutter number of an English verse counts pronounced syllables again instead of metrical feet. | The French and Spanish scansion prompts and the two emotion prompts now spell out their rules step by step (four items). | |
| 1.7.2 | Looking up a missing word records a request and the word joins the corpus only after two different days; the repair alarm waits for a meaningful proportion; security-headers rule and a flaky timeout test fixed (four items). | ||
| 1.7.1 | The rhyme, synonym/antonym and lexical-field dictionary pages answer the word you type, straight from the corpus. | Fifteen retired /solutions/ addresses redirect, robots.txt names every sitemap, and a request to a reclaimed worker node is retried on a surviving replica (three items). | |
| 1.7.0 | Five comparison pages answer “what should I use instead of X” with an honest verdict, and every home page says Ilena assists you and does not write in your place. | The dictionary remembers where a word’s stress falls, non-words are retired from the corpus, and an anonymous lookup never buys from the engine (three items). | |
| 1.6.2 | The 5xx dashboards count requests the ingress refused, batch rhyme lookups come back in submitted order without double-counted usage, and the dictionary dashboards show corpus misses (three items). | ||
| 1.6.1 | Suggestions draw on five random entries from your idea basket, whose “image” kind became “idiom”, and the four questions about you open as four cards with a sentence inviting you to answer them. | Works draws basket entries with an injected random generator, they travel under their own key to the model, and old images became notes (four items). | |
| 1.6.0 | Your author node shows a short synthesis of how you write and lets you revise the four sign-up questions; projects show and edit a description and tags; suggestions draw on them. | Synthesis composition, fingerprint, endpoints and personal-data handling across profiles, works and the shared library, a five-second sign-in wait, and service addresses written once for every environment (nine items). | |
| 1.5.4 | Each of the four writing tools has its own sign-up screen with a real capture, sign-up alternates questions and benefits, Continue is clickable at every screen size, and an abandoned annual trial gets one reminder; dictionary answers with a blank or malformed sense are kept or asked again. | Screen naming, an alarm on a stalled usage queue, a spend dashboard drawing every reading, startup warnings removed, and a rhyme probe that finally tests plurals and inflected forms (six items). | |
| 1.5.3 | “Already verified? Continue” really checks, suggestions use the writing style from the quiz, an existing address offers Sign in, going back no longer creates a second account, and a chosen quiz answer reads as chosen. | ||
| 1.5.2 | Rhyme answers with a missing stress mark and French glide rhymes keep their candidates instead of losing them. | An alert on a review that dies partway, one bad character no longer kills a batch, blog.ilena.app redirects to the canonical address, and no orphaned project after a failed registration (five items). | |
| 1.5.1 | Dropping a file or folder (.txt, .md, .rtf, .pdf, .docx) on a writer or project imports it as finished works, needing an active subscription, never merging into existing ones; the tree fills while it runs and a report names what could not be read. | The usage ledger records why a call was made, a drop is accepted whole and walked by a queued import, allowances count lines, and an alarm and dashboard cover imports (eight items). | |
| 1.5.0 | The payment screen says plainly that leaving the trial costs nothing, and English and Spanish rhyme lists stopped coming back empty. | Sign-up losses became readable screen by screen, the funnel splits by device, browser and locale, and the backlog alert and the blog's figures were corrected (ten items). | |
| 1.4.9 | This page began folding releases older than two weeks into a table. | A dictionary line the review cannot buy stops being bought, the daily briefing separates people from scanner traffic, and the infrastructure files are laid out by environment. | |
| 1.4.8 | One dashboard answers whether Ilena is up, healthy and affordable, the review alert fires only for a word that cannot be repaired, and the zone's security headers are declared in Terraform. | ||
| 1.4.7 | A word whose rhymes or definitions come back empty is asked once more before the answer is believed. | A probe endpoint proves a prompt change against the real model before it ships, and alert rules are checked against sample data. | |
| 1.4.6 | A dictionary entry can no longer be filled with a blank definition. | Review batch lines are counted by kind and language, a failed parse is measured rather than assumed, and the connection budget now includes the dictionary's own pool. | |
| 1.4.5 | Signing up twice reuses your billing record instead of creating a second one, and the dictionary's review retries an unreadable answer instead of paying for it twice. | Review costs are attributed per language, the dictionary dashboard reads its data again, a service that exhausts its heap now alerts, and two other changes. | |
| 1.4.4 | The dictionary's periodic review buys entries again: a full-size batch no longer dies before it reaches the provider. | A failed review pass now says so in a log line and a counter; the corpus is bought over four smaller passes a day instead of one, applied within six hours. | |
| 1.4.3 | Line-level foot counts and emotions stopped resetting each other and survived edits, indentation and reopening a work; French, Spanish and English switched to counting metric or accentual feet instead of spoken syllables. | Line analysis split into two model calls, one metric skill per language and one emotion skill, each carrying its own confidence. | |
| 1.4.2 | The dictionary drawer gained a ninth section, figures of speech, and its corpus was seeded from wordfreq's ten thousand most common words per language; the review's budget became per-language, with Spanish paused. | ||
| 1.4.1 | The dictionary drawer became an accordion, one section open at a time with a result count on each header, and gained two sections: a word's lexical field and its family. | ||
| 1.4.0 | The dictionary began remembering what it looks up, split rhymes into five categories that load independently, added a "Did you mean" suggestion and two new panels — homophones and expressions. | The dictionary gained its own schema and data store, cost tracking learned to record which language a call served and to batch prompts to OpenAI, and an operator could seed, refresh and review the corpus, with new Grafana panels for it. | |
| 1.3.8 | Blog links from the old address, the Resources menu's grouping, a documentation search field covering the menu, and article titles all got cleaned up. | The blog's own infrastructure and its nightly writer were retired; the main site now serves everything a reader asks for. | |
| 1.3.7 | The blog moved to ilena.app/blog with the site's own header, footer and language menu, got lighter pages and a per-language index, and every article gained a questions-and-answers section. | Publishing an article became one automated, checked process, and the blog kept its own audience measurement after the move. | |
| 1.3.6 | A blog article could no longer stay half-published in one language, the blog began tracking what it had already published, and two mobile display bugs — a submenu covering its own entries, unlabelled home-page buttons — were fixed. | A build check stopped asserting a fact of the day it was written and started asserting the rule it protected, and the tooling that refreshes test secrets stopped printing the key it restores. | |
| 1.3.5 | Seven writing guides went live in English, French and Spanish, the dictionary stopped offering words that don't actually rhyme, public pages were rewritten to read like they were written by a person, and the 27 solution pages got clean, language-written addresses. | Search-engine signals were fixed at the site's root, and every page a crawler called too thin was documented rather than padded. | |
| 1.3.4 | A public FAQ page launched with eighteen answers, every page gained its own heading, description and search-friendly title, addresses were cleaned up across the site, and each page now declares its language alternates. | Structured data, sitemap freshness, llms.txt and a registry of pages kept out of search were put in place for search engines and AI assistants. |
|
| 1.3.3 | The home page says what Ilena is for before it says what runs underneath: the mention of the kind of model has left the top of the page, and the section explaining why Ilena exists opens on Ilena rather than on what other tools do badly. | The search-position measurements moved to a new source before the previous subscription ended, under a single project covering the whole domain; and each service identifies itself to the writing engine with its own credential, one per service and per environment. | |
| 1.3.2 | Nine fixes around signing out and returning — a shared eight-hour idle timeout, a fixed account-window sidebar, Settings failing with a message instead of silently, the comparison tables growing to seven competitors, the user guide brought back in step with the product, and shorter French blog titles. | Nighttime alerts stopped firing on empty queues recovering, deliberate probe failures and starting containers; our own visits stopped being counted as traffic; and a timing-flaky test stopped deciding releases. | |
| 1.3.1 | The blog began asking for cookie consent before measuring anything, and moved behind the same shield as the rest of the site, answering on one address instead of two. | Reaching preproduction or production became a sign-in that expires within the hour instead of a long-lived key, on an encrypted workstation. | |
| 1.3.0 | The blog began publishing new articles on its own every day, each one appearing in both English and French. | Articles arrived from a new writing partner, were rebuilt onto Ilena's own pages and passed a set of checks before publishing, with nothing changing when a check failed. | |
| 1.2.3 | Blog articles stopped loading a tracking script from another company: the same page, one fewer request leaving your browser to somewhere that is not us. | The blog moved to Ilena's own storage and delivery network — every article, image and feed is our copy, and nothing on the page reaches the previous provider. | |
| 1.2.2 | The account screens became part of the product rather than a page beside it — the editor's menu bar, footer and tool column, a sessions list that names each device, a questionnaire that keeps its text box in view, and a pricing card whose annual saving is a ribbon. | The two web applications began sharing one copy of what talks to the server, and the build that checks every change lost a minute and forty-eight seconds. | |
| 1.2.1 | Nine corrections around leaving and returning: Quit no longer signs you out, the site stopped offering Sign In to someone already signed in, a chosen language followed the account across browsers, synonyms came back fuller, and the nine Solutions pages answered the questions a reader arrives with. | A change to how the monitoring dashboards read the database began reaching the running service on the deploy that carried it. | |
| 1.2.0 | The Privacy Policy and the GDPR page began saying plainly what reaches Google when you refuse analytics. | What each author's model calls cost became a ledger — per lookup, in the billed currency, surviving the account's deletion — and a reporting dashboard carried the three figures a web analytics tool structurally cannot produce. | |
| 1.1.11 | A lookup became three requests running side by side: definitions, synonyms and antonyms appear as each one finishes, under a single loading animation, and a visitor with JavaScript disabled met the three-language menu instead of being sent into English. | Three quiet defects: documentation anchors a crawler can read, a parse failure that says where it failed, and a log shipper that stopped warning at every start about a setting written under a name it had never had. | |
| 1.1.10 | A dictionary lookup stopped changing shape partway through, and clicking a multi-word synonym stopped failing. | profiles began retrying its call to invoicing instead of falling an author back to the free tier on a single hiccup, and the dictionary and rhyme skills each gained their own reasoning settings. | |
| 1.1.9 | The backend moved to Spring Boot 4.1 on Spring Framework 7 — Jackson 3 throughout — and twelve hand-pinned dependencies were brought up to their latest release. | ||
| 1.1.8 | Five corrections a reader meets: a phone-sized screen is told Ilena needs a computer, a suspended account is told so in its own language, the footer stopped pushing French and Spanish pages wider than the screen, and a misspelling now caches the correction too. | Twenty changes underneath — a memory ceiling for the cache, two caches removed with the feature that justified them, a deletion that reaches all four services, alerting on a rebuilt preproduction node, /api/ closed to crawlers, and six investigations recorded rather than acted on. | |
| 1.1.7 | The site's images, fonts and textures began being kept for a day by your browser instead of re-checked on every page. | Ilena started measuring itself: metrics and timed model calls from the six services, structured logs carrying a correlation id and queryable by field, email alerts on what the cluster can see, traffic measured at the front door, all on a disk that survives a machine being replaced — and machines that boot from a chosen, recorded image. | |
| 1.1.6 | Account management moved into an application of its own at /account/ — password, sessions, subscription and billing — reachable from a single header menu that replaced Sign In once you are signed in, returning you to the page you came from, in your light or dark mode, with a reminder email for an unfinished signup and a monthly-to-yearly switch. | Backend tests began building their schema with Liquibase the way production does, the deleted-role guard moved into the module every service depends on, and seventy orphaned preproduction rows were cleaned up. | |
| 1.1.5 | A foot count can be set by hand, verse lines fully support emoji through editing and version history, and a work exports as plain text or Markdown beside PDF. | ||
| 1.1.4 | The product comparison gained LyricStudio, MasterWriter and Lyrcs, and its grid moved with them. | ||
| 1.1.3 | The Privacy Policy and Your data pages began naming Google Analytics and what it keeps, and a full refund now ends the subscription and freezes the account the way an unpaid invoice does. | The sixteen signup screens, the trial, the payment and the cancellation each became a measurement taken once, from Stripe's own confirmation, with a trial no longer counted as a sale until a card is charged — and staging began billing against Stripe's real test mode. | |
| 1.1.2 | An artist can be given Ilena for free and for good: a demo account writes exactly as a Solo one does, with no subscription behind it. | Where a visitor first came from began being kept at signup — and nothing at all when cookies were declined — measurement learned that a phone and a laptop can be one author, every event gained a written definition, and the account type that decides what an author may reach was written once instead of copied into four services. | |
| 1.1.1 | A word already looked up comes back faster and stays that way for longer. | A machine AWS takes back now leaves the cluster on its own in ninety-one seconds, reaching production takes a sign-in of its own, the monitoring dashboards moved behind a single door, and prices are named by a stable label rather than by their identifier. | |
| 1.1.0 | Updating Ilena stopped interrupting it: every service runs two copies on separate machines, and one keeps answering while the other is replaced. | Preproduction took production's three-machine shape, what every service writes began being kept for fourteen days on storage of its own, and twelve of eighteen libraries were raised. | |
| 1.0.16 | Memory use across every service, in both environments, was recorded — the figures the next sizing decision would be made on. | ||
| 1.0.15 | Five corrections to titles and links: translated pages stopped sharing a title with their category, Solutions pages gained a tab title of their own, every link said where it leads, and the documentation build stopped dirtying the repository. | ||
| 1.0.14 | Three new pages for people searching for a French rhyming dictionary, a Spanish syllable counter or an English rhyming dictionary. | Shared images moved into one source directory, changelog dates began being filled from the release's Git tag, milestone output moved under .tmp/, and a reported redirect problem turned out to be already fixed. | |
| 1.0.13 | Every email was rebuilt on one shared template, an invitation stopped emailing a temporary password, the "invoice paid" email stopped showing the word null where its link belonged, signing in with an unregistered Google account said so, and the dictionary began returning up to ten synonyms. | Connections began requiring TLS 1.2, the servers behind the site started refusing anything not carrying Cloudflare's certificate, preproduction monitoring went from six services to seventeen, and the end-to-end suite halved its running time. | |
| 1.0.12 | The site and the API became reachable only through the content network, the public site stopped answering on the host's own address, the DNS and edge configuration moved into code, and working on preproduction stopped requiring production credentials. | ||
| 1.0.11 | A work's emotions began describing the whole work read in one pass, emptying a line cleared its analysis, and the dictionary settled at ten synonyms and ten antonyms. | Analysing a line stopped paying for two model calls every time. | |
| 1.0.10 | Releases moved to GitHub — a tag deploys preproduction, production is a separate decision — production images began replicating instead of being copied by hand, administrative access moved behind a portal with multi-factor authentication, the dashboards' database credential was proven read-only, and four critical vulnerabilities were patched. | ||
| 1.0.9 | Invoice status began reading in your own language, the Spanish rhyme page stopped describing something it did not offer, the footer's social links gained readable names, and the site began measuring how visitors move through signup and checkout under the cookie choice you make. | A request carrying no credentials began getting the same answer from every service. | |
| 1.0.8 | The syllable-counter and Spanish rhyme pages stopped offering anonymous lookup and led into Ilena instead, the English songwriting page was rewritten, and two French guides were added. | Eleven changes underneath: hreflang made consistent, valid structured data on the three homepages, minified shared chrome, a rotated Stripe test key with the command that printed it now refused, per-service log levels, and two skills recorded. | |
| 1.0.7 | Opening the editor began requiring an active subscription. | A malformed request began getting a plain 404 or 400, and creating several items at once stopped being able to make two share an identifier. | |
| 1.0.6 | The billing address became enterable and correctable, the project tree's icons appeared, re-inviting someone worked again, and an item still being created could no longer be dragged into a broken state. | Six corrections: a mistyped request refused plainly, no unintended default administrator, a deployment that replaces what it claims to, the client address read from the header Cloudflare sets, notification failures no longer swallowed, and a hand-edited generated page failing the build. | |
| 1.0.5 | Billing email began arriving for a failed payment, a paid invoice and a cancellation, a declined card stopped being a dead end, invitations reached their recipient, a frozen account could be unfrozen, and the Solutions pages were split into more specific ones. | Stripe's events were processed again without a queue retry creating a second subscription, configured prices began being checked at startup, the site gained a rehearsal environment before production, and continuous integration started publishing to the registry deployments actually use. | |
| 1.0.4 | Sign in, verify, forgot and reset password became standalone pages, one sign-in page began serving all three applications, signing in and being admitted became two steps, and every device where you are signed in became visible and endable. | The forgot-password page stopped revealing whether an address has an account, dead role checks and an inert quota mechanism were removed, and the end-to-end suite passed in full against the deployed build. | |
| 1.0.3 | The ideas basket began reporting its failures and keeping your draft, four actions on a project or work began checking that it belongs to you, and seven pages took the site's own dark background, menus and header. | Three corrections to the guards and the shared partials. | |
| 1.0.2 | The ideas basket began surviving a reload, login and recovery followed your browser's language, two keyboard-shortcut defects were fixed, the header became dropdown menus, and five pages were added — this Change Log, the product comparison, Solutions, Referral and Partner. | Coverage below 80 % began failing the build, and the end-to-end suite gained the ability to run against a deployed build. | |
| 1.0.1 | Duplicating a work began producing a real independent copy, the suggestion setting became two, AI-assisted suggestions gained a badge, the line-variants picker was removed, and the three legal texts came from a single source. | AI Transparency was recorded as informational rather than consent-bearing, and the frontend suite began running on every push. |