github perber/leafwiki v0.13.0
LeafWiki v0.13.0

2 hours ago

๐Ÿ“ 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-backup and 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-access and 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
    via LEAFWIKI_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_LIMIT for
    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

๐Ÿ”ง 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 725aeba to 2d984a1 (#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)

Don't miss a new leafwiki release

NewReleases is sending notifications on new releases.