Skip to content

chore(main): release 1.0.0 - #7

Merged
HackTuah merged 2 commits into
mainfrom
release-please--branches--main
Oct 8, 2026
Merged

HackTuah merged 2 commits into
mainfrom
release-please--branches--main

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

🤖 I have created a release beep boop

1.0.0 (2026-10-08)

⚠ BREAKING CHANGES

  • server: the words table is rebuilt; downgrading needs the automatic backup.
  • the data folder, service name, environment variables (KOTIKO_DATA_DIR, KOTIKO_LOG_SQL) and pairing prefix are renamed; see the README's 'Updating from Slovo'.
  • server: /health returns JSON instead of "ok" (still 200 when healthy, 503 when the database fails), and run.sh runs in prod unless MIX_ENV is set.
  • server: deny by default so encoded paths can't skip the token

Features

  • a sturdier AI client that protects your free quota (b5a2d56)
  • a sturdier AI client that protects your free quota (slice 10) (a23108c)
  • accessibility baseline, audited with axe and kept by CI (slice 27) (4acaade)
  • accessibility baseline, audited with axe and kept by CI (slice 27) (59af37e)
  • brand: Mira logo, a black kitten head on purple (5d4e8d6)
  • brand: new kitten logo and placeholder illustrations (b379c90)
  • brand: use the maintainer's kitten logo everywhere (4325812)
  • canonical language tags, shared word spec and the real prompt (35d0685)
  • extension: back up, restore, export and delete everything (slice 12) (b25a852)
  • extension: back up, restore, export and delete everything (slice 12) (c5144de)
  • extension: bulk add, paste a list or drop a file (slice 13) (e404a18)
  • extension: choose the languages you read in (slice 50) (d7314d9)
  • extension: choose the languages you read in (slice 50) (4f1361c)
  • extension: Connect OpenRouter, store screenshots over a real page, privacy policy v2 (ffc185a)
  • extension: design system and redesigned popup (0393dec)
  • extension: design system and redesigned popup (slices 06 and 20) (7570d7e)
  • extension: every add is a safe background job; results, Undo, choosing (slice 24 §§1-5) (d38c2fd)
  • extension: language controls for adds; popup loads only its first view (slice 24 §§6-9) (4e7517a)
  • extension: leave names, acronyms and code alone (slice 16 §§1-3) (6d562c7)
  • extension: local-first mode, no server needed (59ac833)
  • extension: local-first mode, no server needed (slice 11) (6639c87)
  • extension: one language per word per page; Focus, weights, order, mix (slice 18) (92e7a07)
  • extension: privacy policy, store forms and secrets bound to their address (slice 28) (3f7a426)
  • extension: privacy policy, store forms, and requests only to addresses you chose (slice 28) (79d0809)
  • extension: read the OpenRouter sign-in code on kotiko.org/connect/ (ebab977)
  • extension: sensitive sites, button and menu setting, never-swap list (slice 16 §§4-5) (04ea3da)
  • extension: show Connect OpenRouter on the welcome tab and in settings (3f56738)
  • extension: swap words without taking the page's text away (slice 15) (0e984b2)
  • extension: swap words without taking the page's text away (slice 15) (3a7800c)
  • extension: swapped words in their own language's capitals (slice 17) (61fdc53)
  • extension: the dashboard, a live view of every word (87e3c79)
  • extension: the dashboard, a live view of every word (slice 21) (b867a92)
  • extension: the server proves it holds the token before it gets it (cc15012)
  • extension: the welcome flow, your first word celebrated (slice 22) (72547e2)
  • extension: the welcome flow, your first word, celebrated (8d871a2)
  • extension: warn when a lookup service's address sends the key in clear (eb72445)
  • extension: word popover with pronunciation and audio (8263611)
  • extension: word popover with pronunciation and audio (slices 19, 34) (ab5b4d0)
  • extension: words found in any language you read (slices 14, 16, 50) (4c8a46b)
  • extension: words found in any language you read (slices 14, 16, 50) (429579d)
  • language tags, shared word spec and the real prompt (slices 08, 09) (605162f)
  • plain-language errors from one catalog (slice 25) (d60ac55)
  • plain-language errors from one catalog (slice 25) (85940b5)
  • pronunciations from Wiktionary, written by rule (slice 49 §4b) (19551c5)
  • pronunciations from Wiktionary, written by rule (slice 49 §4b) (c6829bc)
  • server: harden API auth and add the server test suite (07d5ec9)
  • server: secrets from files, XDG folders and an uninstall (83ce39a)
  • server: secrets from files, XDG folders and an uninstall (4afdf6b)
  • server: the Telegram bot speaks the learner's language (622d156)
  • server: the Telegram bot speaks the learner's language (slice 41 §9) (5e7832a)
  • server: validated config, safe boot, redacted logs and JSON health (265ebb6)
  • server: word model v2 with stable ids, safe merges and undo (102ca7e)
  • site: the docs site for kotiko.org and a public-ready README (slice 44) (320c948)
  • site: the docs site for kotiko.org, and a README that points to it (97e2943)
  • site: the OpenSSF Best Practices badge in the footer (5d3bbcd)
  • site: the OpenSSF Best Practices badge in the footer (3f04e66)

Bug fixes

  • auth: sign the server's boot id, so a restart can't let a request replay (f5e08bc)
  • boot-bound request signatures, per-client limits behind a proxy, and a stricter gate (review E-01, E-02, E-03, E-06, E-07) (1eb692a)
  • content: don't swap text a filter, clip-path or mask hides (a660336)
  • content: open the word card only on a word the learner sees (fbd2704)
  • content: the word card opens only for the learner; filter, clip-path and mask count as hidden (review E-04, E-05) (2304bd6)
  • extension: a browser update after an update from 0.2 no longer drops the learner's words (608a549)
  • extension: a content type that isn't a string, and a test that depended on the date (8a08928)
  • extension: a page can't spoil a Connect OpenRouter sign-in (aead17d)
  • extension: a store born from Delete everything takes nothing planted (645df43)
  • extension: an add refused for a rewritten address retries by itself (b1c3470)
  • extension: benchmark uses casing.js; make casing about 10 times faster (287f70e)
  • extension: bind where requests go, not only the secrets (slice 28) (b855ac3)
  • extension: content scripts can't change settings or queue adds (SCR-448) (471ee18)
  • extension: content scripts can't change settings or queue adds (SCR-448) (a164d23)
  • extension: engine slices stay bounded on big pages; steadier tests (2bde8c8)
  • extension: every lookup asks for at most the spec's number of tokens (f026ee3)
  • extension: fixing a word's language no longer deletes it when the answer is the same word (54b280c)
  • extension: localhost addresses are used as 127.0.0.1 (5fbaa00)
  • extension: never send the server's token; sign each request (D-01) (f2e87d8)
  • extension: never show a page's own lang text in the popup (2eceb7c)
  • extension: never swap inside controls or numeral-like capitals (3b3fee4)
  • extension: never swap inside controls or numeral-like capitals (c40fc88)
  • extension: only Kotiko's pages may skip the wait between syncs (e5aa393)
  • extension: open the languages you read in at #settings/languages (95d1a6d)
  • extension: open the word card only for the learner's own input (1fffd51)
  • extension: security review fixes for the background and settings (cf42809)
  • extension: security review fixes for what web pages can see (7045c01)
  • extension: show pages nothing of Kotiko where it doesn't swap (4b17f9f)
  • extension: swap only text the learner sees, at most 500 words a page (a29ef3e)
  • extension: sync that never shows stale results or errors (5293305)
  • extension: the browser's languages stay on the device (abcd363)
  • extension: the content scripts' live-copy name passes the build's test-hook guard (5f4a05c)
  • extension: the pages' base languages never go back to an older list (7ca742b)
  • fixing a word's language no longer deletes it; docs say typed words reach Wiktionary (launch checks F1, F5) (719f26c)
  • keep a function-word meaning when the learner typed the word (6aae1f0)
  • keep a function-word meaning when the learner typed the word (ea7603f)
  • merge: the same gloss on a re-add is not a new form (519b8f6)
  • output cap on the server, HTTP warning case, and a stricter store gate (review D-03, D-04, D-05) (3f966df)
  • release: open the store gate only on the lead's exact closing line (582fcd5)
  • release: read the security gate's lines as a reader sees them (a9e5db9)
  • release: refuse a signed tag pushed under another tag's name (0876dbe)
  • release: security review fixes for the release pipeline and CI (cf02268)
  • release: send Firefox Add-ons the release's own zip (1f064cd)
  • release: store screenshots show the popup over a real article (6fb7cf9)
  • release: the gate check strips tags until none is left (d7896c3)
  • release: the security gate reads lines as a reader sees them (34177fc)
  • release: the store zips leave out the tests' hook (c0c4c02)
  • scripts: read the live entry from a fixed id, not one taken from the document (1d21b42)
  • scripts: the badge page lists only what differs from the live entry (6a708c9)
  • server: a repeated query parameter is a 400, not a 500 (eba1343)
  • server: count clients behind a proxy apart, and know more proxy headers (74d4fbf)
  • server: deny by default so encoded paths can't skip the token (2693809)
  • server: every lookup request carries the output cap (11139a8)
  • server: fall back across free models and stop losing words (eec998d)
  • server: keep a key in LLM_URL's query out of the log (c67ea02)
  • server: keep refused words out of the debug log without LOG_LOOKUPS (c6a1317)
  • server: keep the word list private from other accounts (137cc8f)
  • server: keep the word list private from other accounts (6688f25)
  • server: limit what a reverse proxy on this computer forwards (D-02) (3300a87)
  • server: listen on both loopback addresses by default (269a648)
  • server: make the old copy of the words private, and delete it with the data (713cb45)
  • server: no local program or web page can lock the extension out (D-02) (0048fe8)
  • server: open routes answer only their exact spelling (7d175d3)
  • server: read the lookup cache without executable terms (0288dd8)
  • server: refuse a data folder someone else could have planted files in (b1b75a1)
  • server: refuse a password inside LLM_URL, TRANSCRIBE_URL or PUBLIC_URL (5e49cfe)
  • server: say when LLM_API_KEY is missing or needs a restart (161bcaf)
  • server: security review fixes for the self-hosted server (5308e05)
  • server: skip script names the bundled PCRE doesn't know (d94561e)
  • server: stop calling KOTIKO_WIKTIONARY an unknown setting (c772a01)
  • server: stop refused host names flooding the log (e223a21)
  • server: throttle wrong tokens and add a token proof route (eda0e3e)
  • server: warn about an API token that is easy to guess (a2fb973)
  • server: warn about plain HTTP however the address is written (2e8bc14)
  • server: warn when a provider key goes over plain HTTP (0a1806e)
  • server: words with Å or Ņ no longer break a lookup (0f4bb9c)
  • show words already in the list instead of 'couldn't find a word' (5fced3a)
  • sign every request instead of sending the server token; no local lockout (review D-01, D-02) (a981bc2)
  • site: build once for the site's tests instead of once per file (f6b9a20)
  • site: build once for the site's tests instead of once per file (273e45b)
  • store: declare the learner's own key as authentication info on Firefox (573d33a)
  • tests never reach Wiktionary; KOTIKO_WIKTIONARY turns it off (19bd8e1)

Refactoring


This PR was generated with Release Please. See documentation.


Release checklist (docs/stores.md)

  • CI is green on this PR (it was closed and reopened so CI runs).
  • CHANGELOG: the notes under "Unreleased" moved into 1.0.0's section, highlights first, written for learners (b2370b4).
  • Security section complete: found before release by the pre-release review, so no advisory or CVE applies.
  • Upgrade notes cover every breaking change: the rename, signed requests, the default address, the rebuilt words table, the data-folder checks, URLs with credentials, the reverse proxy, and /health.
  • The English strings are complete (the i18n test passes 17/17; all 543 keys are present), and the English store listings match this release (store/).
  • README, docs/ and the docs site describe this release. Spot-checked on rc.4; the Wiktionary wording was fixed in fix: fixing a word's language no longer deletes it; docs say typed words reach Wiktionary (launch checks F1, F5) #42.
  • Best-practices answers still true (node scripts/bestpractices-links.mjs --check: 209 valid).

First public release:

Launch checks on rc.4's release zips (SCR-428): main flows 20/20 in Firefox and Chromium; a server over http:// from Firefox; CSV and Anki exports; web-ext lint 0 errors and 0 warnings.

@github-actions
github-actions Bot requested a review from a team as a code owner October 6, 2026 16:54
@github-actions
github-actions Bot force-pushed the release-please--branches--main branch 2 times, most recently from da73cd7 to 10ab089 Compare October 6, 2026 20:18
@github-actions
github-actions Bot force-pushed the release-please--branches--main branch 15 times, most recently from 557369c to 01312d2 Compare October 7, 2026 22:14
@github-actions
github-actions Bot force-pushed the release-please--branches--main branch from 01312d2 to 6b882ef Compare October 8, 2026 01:05
The notes under Unreleased move into the 1.0.0 section, for learners
first: an introduction, upgrade notes for anyone coming from Slovo 0.2 or
running a server, the security review and its fixes, the server's
changes, then everything else. release-please's commit list stays below.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ayla Croft <dev@scriptkittyos.com>
@HackTuah HackTuah closed this Oct 8, 2026
@HackTuah HackTuah reopened this Oct 8, 2026
@HackTuah
HackTuah merged commit ddf0e9c into main Oct 8, 2026
18 of 27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant