Commit 81f47453f4

81f47453f4ec750103eb702ef9b7827d01ccd244

parent: 1f8076c655

Verified · cmc ci/build: success ci/test: success ci/vuln: success

cmc <hello@cleberg.net> · 2026-09-04 14:32 UTC

CHANGELOG: v1.11.0

Layout: unified · split

CHANGELOG.org +68
@@ -4,6 +4,74 @@ Versioning follows semver from v0.1.0. Database migrations run
44automatically on daemon start; upgrade notes appear per release when
55anything beyond "replace the binary and restart" is needed.
66
7* v1.11.0 — 2026-09-04
8
9The web catches up with the rest of the forge: search across the
10instance, a notification inbox, a compare view, linkable diff lines,
11and a pass over contrast, heading structure and the stylesheet.
12
13- Notifications are no longer mail or nothing. An =inbox= table holds a
14 row per recipient whether or not the instance has SMTP;
15 =notifications list= reads it, unread by default, and =notifications
16 read <id>... | --all= clears it. =repo watch= adds you to a
17 repository's notifications and =repo unwatch= mutes it, with a mute
18 beating every other reason to be told, including owning the
19 repository or having written the thread. The unread count rides on
20 =dashboard= and in the web rail. #113
21- =search= matches repository paths, descriptions and topics, and issue
22 and merge request titles, across everything the caller can read;
23 =/search= renders it with a field in the rail on every page, and an
24 anonymous visitor gets the public rows from the same query. Titles
25 only — body search is #114. #118
26- =/{owner}/{repo}/compare/{a}...{b}= shows what one ref adds on top of
27 another. Diff rows, files and review threads carry ids, so a line can
28 be linked to. The issue and merge request lists page at fifty with
29 the cursors the commands already emit. #118
30- CODEOWNERS gating is a setting rather than a file that happens to
31 exist: =repo settings require-codeowners <owner/name> on|off=, off by
32 default, still independent of =require-approvals=. A repository can
33 carry the file as documentation of who to ask without it gating
34 merges. #142
35- A failed form action's reason rides a one-shot cookie instead of
36 =?e=<message>=, so it no longer survives a reload or lands in
37 history. #119
38- A diff cut at 4 MiB cuts on a line boundary and says so, the
39 diffstat says its counts are partial, and a merge request's commit
40 list says "first 100 of N". #117
41- Page templates parse once with the layout at start-up, so a template
42 that does not parse fails the process rather than the first visit to
43 its page. #116
44- Markdown headings carry ids, matching org pages, and the stylesheet
45 serves a hash ETag with a day's lifetime and answers a matching
46 =If-None-Match= with 304. #132
47- Dark-mode buttons carry a visible edge (a 1 px border was 1.3:1
48 against the 3:1 non-text contrast floor), and a stored label colour
49 is held between 0.12 and 0.28 relative luminance so it clears 3:1 on
50 both grounds while keeping its hue. #120
51- Accessibility: the pin star is decoration and the word carries the
52 meaning, the refs and release asset tables have scoped column
53 headers, state filters carry =aria-current= rather than marking the
54 active one by colour alone, and a rendered README or wiki page's
55 headings move down one level so they sit under the page's own. #133
56- The stylesheet drops rules no template reaches, folds two off-scale
57 values onto the type scale, and resolves the classes templates asked
58 for and it never defined. #131
59- On a phone the tab bar wraps to a second row instead of scrolling
60 sideways with its scrollbar hidden, and the landing page says in
61 three sections what a reader, a writer and a reviewer can do. #134
62
63Migration 0034 adds =inbox= and =repo_watchers=; it runs on daemon
64start. Reinstall the CLI for =search=, =notifications= and =repo
65watch/unwatch=.
66
67Two upgrade notes beyond replacing the binary. A repository that
68relied on a CODEOWNERS file gating merges by its presence alone loses
69that gate until =require-codeowners= is set: nothing back-fills it,
70since the database cannot say which branches carry the file. And
71=search= and =notifications= are now reserved top-level routes, so a
72user or organization already holding either name keeps it but its
73profile page is shadowed by the route.
74
775* v1.10.0 — 2026-09-04
876
977Every command parses its arguments the same way, the web answers by