π Changelog for v0.13.0
This is a Settings release. Git backup and public mode can now be configured
from the app instead of only at startup β and each instance still picks one
source of truth: set the flag (--git-backup, --public-access) and that
config wins with the Settings page deferring to it, or leave it unset and the
UI drives it. That keeps a GitOps-style setup clean while giving everyone else
a UI. Alongside it, the Settings area was rebuilt behind one navigation and the
first per-user settings landed: language, date format, and avatar.
π Highlights
Settings β per instance
- Git backup from the UI: a configuration form in Settings (remote URL, SSH
key or HTTP(S) username+password, schedule) with a "Test remote" check,
stored in<data-dir>/git-backup.json. Keep it env-managed with
--git-backupand the form defers to your flags. (#1439) - Public mode at runtime: toggle it from Settings instead of only via a
startup flag. Pin it with--public-accessand the page shows a status-only
view. - One Settings area: every settings page now lives behind a single
navigation and a section registry. (#1448) - Broken Links maintenance page to find unresolved links across the wiki. (#1434)
- Explorer refresh button replaces the old maintenance settings page. (#1460)
Settings β per user
- German and Spanish UI translations, with a per-user language picker in
Account Settings and live switching. (#1457, #1459) - Configurable date & time format, and date/time rendering that follows the
active language. - Self-service avatar upload. (#1461)
- Autosave is now a per-user preference, with a confirmation toast on save.
(#1454, #1458)
Everyone
- Email (SMTP) password reset and user invitations: invite a teammate by
address; they set their own password from the link. SMTP itself is configured
viaLEAFWIKI_SMTP_*flags/env. (#1331) - Editor: Tab inserts a tab at the cursor instead of reindenting the whole
line; inline code stays visible in headings; print page breaks no longer clip
article text. (#1537) - Images: percentage widths, inline-block rendering, and linked images that
follow the link target. (#1483, #1520, #1446) - Auth hardening: minimum length on the initial admin password (#1449),
readable error when password reset rejects a weak password (#1539),
invitation-pending cleared when an admin sets a password (#1540), external
login return URLs preserved. - Observability: Go runtime/process collectors and scrape-time content and
user gauges on the Prometheus endpoint. - Internals: CLI rebuilt on urfave/cli v3;
LEAFWIKI_EDITOR_LIMITfor
Concierge Hosting solo/team plans (#1455).
π Thanks to our sponsors
A heartfelt thank you to everyone supporting LeafWiki via GitHub Sponsors & Ko-fi.
If you'd like to support LeafWiki too: leafwiki.com/support
π Thanks to contributors
@ribbal, @Slydite4, @jochumdev, @richardmilles, @rzaman8677, @DavidMoffatt-web,
@mrchypark, @bferanmi806-sketch, and @ashudhanda β for translations, features,
fixes, and docs in this release. Contributions like these are what make LeafWiki
better than one person could build alone.
β¨ Features
- feat: allow displaying images in percentage (#1483) (@ribbal)
- feat: add broken links maintenance page (#1434) (@ribbal)
- feat: use session storage for sidebar (#1518) (@ribbal)
- feat(i18n): add Spanish translation (@Slydite4)
- feat(i18n): add German translation and dynamic language infrastructure (#1457) (@perber)
- feat(settings): add language picker to Account Settings (#1459) (@perber)
- feat(settings): configurable date & time format in Account Settings (@perber)
- feat(settings): add per-user UserSettings backend (language, autosave) (#1454) (@perber)
- feat(settings): integrate per-user UserSettings into the Settings page (#1458) (@perber)
- feat(settings): unify settings pages behind a section registry (#1448) (@perber)
- feat(settings): add self-service avatar upload (#1461) (@perber)
- feat(settings): confirm preference saves with a success toast (@perber)
- feat(ui): git backup configuration form in settings (@perber)
- feat(backup): support HTTP(S) user+password auth for git backup (#1439) (@jochumdev)
- feat(backup): add ConfigStore, TestRemote and runtime Manager (@perber)
- feat(backup): settings-mode HTTP endpoints + composition-root wiring (@perber)
- feat(ui): Settings toggle for public mode (@perber)
- feat(instancesettings): admin endpoint to toggle public mode at runtime (@perber)
- feat(publicaccess): introduce runtime-capable public-mode provider (@perber)
- feat(explorer): replace maintenance settings page with explorer refresh button (#1460) (@perber)
- feat: SMTP password-reset and user-invite (#1331) (#1445) (@perber)
- feat(viewer): list non-image asset links under TOC sidebar (#1475) (@DavidMoffatt-web)
- feat(metrics): register Go runtime and process collectors (@perber)
- feat(metrics): add scrape-time content and user gauges (@perber)
π Bug Fixes
- fix(editor): insert a tab at the cursor instead of indenting the whole line (@perber)
- fix(preview): keep inline code visible in headings (@perber)
- fix(preview): render Markdown images inline-block (#1520) (@perber)
- fix(preview): let images wrapped in links follow the link target (#1446) (@perber)
- fix(print): keep page breaks from clipping article text (#1537) (@perber)
- fix(auth): enforce minimum length on initial admin password (#1449) (@perber)
- fix(auth): show a readable error when password reset rejects a weak password (#1539) (@perber)
- fix(auth): clear invitation-pending when an admin sets the password (#1540) (@perber)
- fix(auth): preserve external login return URLs (@mrchypark)
- fix(usersettings): accept Spanish (es) as a UI language (#1526) (@perber)
- fix(ui): restore --muted as the muted-text token, add --muted-surface for fills (#1543) (@perber)
- fix(ui): make --muted a subtle surface, not the muted-foreground color (#1541) (@perber)
- fix(settings): return to the previous page when leaving Settings (#1542) (@perber)
- fix(settings): align Public access page layout with other settings pages (#1525) (@perber)
- fix(settings): restore field spacing in account password/TOTP panels (#1452) (@perber)
- fix(settings): restore top padding in settings nav list (#1451) (@perber)
- fix(settings): align settings nav styling with tree/tabs (#1450) (@perber)
- fix(refactor): rewrite links when moving pages via tree drag-and-drop (@perber)
- fix(wikilinks): resolve [[Title]] links whose title contains a slash (@perber)
- fix(wikilinks): harden path-hint fallback destination (Copilot review) (@perber)
- fix(tree): keep the target row highlighted while deleting (@rzaman8677)
- fix(page): show page/section name in delete confirmation dialog (@rzaman8677)
- fix(tree): toggle active section titles (@bferanmi806-sketch)
- fix(sidebar): recover invalid persisted panel state (@mrchypark)
- fix(permalink): clarify that shared links are permanent, not public (#1484) (@perber)
- fix(install): write ENABLE_REVISION into env file (#1532) (@richardmilles)
- fix(install): correct revison typo in max revision prompt (#1533) (@richardmilles)
- fix(build): embed frontend in make build for source binaries (#1442) (@richardmilles)
- fix(frontend): restore vitest compatibility with Node 20 (#1447) (@perber)
- fix(e2e): build the binary in run.sh local mode instead of go run (#1489) (@perber)
- fix(i18n-dates): address code-review findings (@perber)
- fix(i18n-dates): address Copilot review findings (@perber)
- fix(i18n-dates): harden preference write serialiser (Copilot follow-up) (@perber)
π§Ύ Documentation
- docs(install): explain nginx base-path configuration (#1530) (@rzaman8677)
- docs(install): align nginx guide prompts with install.sh (#1536) (@richardmilles)
- docs: remove unused LEAFWIKI_DISABLE_UPDATE_CHECK from .env.example (#1535) (@richardmilles)
- docs: Clarify git backup remote URL usage in README (#1488) (@perber)
- docs: fix typo in README (#1456) (@ashudhanda)
π§ Refactoring
- refactor(cli): build the command line with urfave/cli v3 (@jochumdev)
- refactor(http): route every authed /api group through APIAuthGroup (@perber)
- refactor(http): centralise the public-mode auth wiring (@perber)
- refactor(http): register read routes once behind a runtime public-mode gate (@perber)
- refactor(backup): extract auth builders + shared SecretBox crypto helper (@perber)
- refactor(backup): address code-review + maintainability follow-ups (@perber)
- refactor(settings): route autoSave & language through the same write serialiser (@perber)
- refactor(history): make PageHistoryContent fully hook-reactive for i18n and date format (@perber)
π§ͺ Tests
- test(ui): cover wikiPath editor and history routes (@perber)
- test(ui): cover wikiPath resolution and delete-redirect helpers (@richardmilles)
- test(backup): check BootError return value to satisfy errcheck (@perber)
π§° Chores
- chore: bump the npm-dependencies group across 1 directory with 28 updates (#1511) (@dependabot[bot])
- chore: bump the e2e-dependencies group across 1 directory with 7 updates (#1497) (@dependabot[bot])
- chore: bump golang from 1.26-alpine to 1.27-alpine (#1495) (@dependabot[bot])
- chore: bump node from
725aebato2d984a1(#1496) (@dependabot[bot]) - chore: bump modernc.org/sqlite (@dependabot[bot])
- chore: bump the github-actions group with 3 updates (@dependabot[bot])
- chore(deps): patch npm security advisories in e2e and ui (@perber)
- chore: bump golang.org/x/crypto to v0.56.0 (@perber)