Skip to content

Settings, Vault shows your vaults and Manage… again - #123

Merged
adibhanna merged 1 commit into
mainfrom
fix/settings-vault-island
Oct 20, 2026
Merged

adibhanna merged 1 commit into
mainfrom
fix/settings-vault-island

Conversation

@adibhanna

@adibhanna adibhanna commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Since core 2.58.0, phone Settings > Vault > Location showed only the core "Change…" row: no vault list, no New Vault…, no Manage…, so Settings had no path to Add Remote Vault…, although onboarding says a self-hosted server can be connected later in Settings. Reported on Discord by a user adding a Raspberry Pi server (the circle > More > Vaults path still worked).

  • 5befee9 fix(mobile): the vault island mounted before the row's first button with insertBefore, but core 2.58.0 ([Bug] Settings → Vault: Location buttons overlap the remote workspace label zennotes#871) wrapped those buttons in a group, so the reference was a grandchild and insertBefore threw NotFoundError in the MutationObserver. The shared placeVaultSettingsIsland (same file as iPhone) anchors on the row's direct child that is or holds a button: the phone island goes before it, the tablet Manage… joins it (it had been wrapping onto its own line). The CSS that hides the row's own buttons now matches the wrapped group too. New tests on a stand-in DOM fail on the old placement with that NotFoundError.

Reproduced first on an API 36 emulator over WebView CDP with a build of main, then this build installed over it: the card shows the vault list, New Vault… and Manage…; Manage… opens the Vaults sheet and Add Remote Vault… opens Connect to Remote Vault; in the tablet layout (800 CSS px) Change… and Manage… sit side by side. 301 tests, typecheck and boundary check pass.

How to test locally:

npm run build && npx cap sync android && (cd android && ./gradlew assembleDebug)
adb install -r android/app/build/outputs/apk/debug/app-debug.apk

Launch, Get started, Start writing, then the circle > More > Settings > Vault. Before: only "Change…". After: New Vault… and Manage… (plus the vault list once you have two vaults); Manage… lists Add Remote Vault….

iPhone counterpart: ZenNotes/zennotesios#68.

Since core 2.58.0 the phone Settings, Vault, Location card showed only
the core "Change…" row. The vault list, New Vault… and Manage… were
gone, so Settings had no way to reach Add Remote Vault…, even though
onboarding says a self-hosted server can be connected later in
Settings. A user adding a Raspberry Pi server hit exactly that on
Discord; the circle, More, Vaults still worked.

The card is a React island that useVaultSettingsRows mounts into core's
Vault Location row, before the row's first button. Core 2.58.0
(ZenNotes/zennotes#871) moved those buttons into one wrapping group, so
the first button became a grandchild of the row, insertBefore threw
NotFoundError inside the MutationObserver callback, and the island never
attached. The CSS that hid the row's own buttons in the island's favor
matched bare buttons only. In the tablet layout the Manage… button still
mounted, but as a flex item of its own, so it wrapped onto its own line
instead of sitting beside Change….

placeVaultSettingsIsland (vault-settings-access.ts, the same file as on
iPhone) now anchors on the row's direct child that is or holds a button,
which covers both shapes: the phone island goes before that group, and
the tablet Manage… joins it. The observer's already-mounted check is
host.contains, because the tablet button no longer sits directly in the
row and re-placing it would fire the observer again. mobile.css hides
whatever follows the island and is or holds a button, so the row's own
Change… stays hidden on the phone, as it was before 2.58.0. The new
tests run on a small stand-in DOM whose insertBefore throws for a
reference that is not a direct child; the old placement fails four of
them, two with that NotFoundError.

Reproduced first on an API 36 emulator over WebView CDP with a build of
main: only Change…, and the NotFoundError in the console. This build
installed over it: the vault list with the current vault checked, New
Vault… and Manage…; Manage… opens the Vaults sheet, and Add Remote
Vault… opens Connect to Remote Vault. In the tablet layout (800 CSS px
wide) Change… and Manage… sit side by side and Manage… opens the sheet.
301 tests, typecheck and boundary check pass.
@adibhanna
adibhanna merged commit 3e420fc into main Oct 20, 2026
2 checks passed
renovate Bot added a commit to scottames/copr that referenced this pull request Oct 20, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ZenNotes/zennotes](https://redirect.github.com/ZenNotes/zennotes) |
minor | `2.72.0` → `2.73.0` |

---

### Release Notes

<details>
<summary>ZenNotes/zennotes</summary>

###
[`v2.73.0`](https://redirect.github.com/ZenNotes/zennotes/releases/tag/v2.73.0):
ZenNotes v2.73.0

[Compare
Source](https://redirect.github.com/ZenNotes/zennotes/compare/v2.72.0...v2.73.0)

ZenNotes 2.73.0 lets you move the window by its tab strip when the title
bar is turned off, and gives the browser app the same switch. Settings
fits a narrow window or a tablet, Vim's `o` and `O` keep a quote or
callout going, and the bundled zn is 0.9.1.

Released from
[`10597fe9`](https://redirect.github.com/ZenNotes/zennotes/commit/10597fe969164d851d83d62dbb3b858ded9b2793)
through
[#&#8203;968](https://redirect.github.com/ZenNotes/zennotes/pull/968) on
2026-10-20. All installers are verified.

#### Fixes

- **With the title bar off, the tab strip moves the window.** Turning
off Settings → Appearance → Chrome → Window title bar left one place to
grab the window by: blank space in the sidebar header. With the sidebar
closed there was none, so on a Mac the window could not be moved at all
(reported on Discord by SLP, with a video next to Obsidian, which moves
by its tab bar). Now blank space in the tab strip works the way a title
bar does, as it does in Obsidian: drag it to move the window, and the
tabs, the back and forward buttons and every other button still take a
click. The sidebar header (including the strip above it) and the note
list header work the same way. Only the tab strips along the top of the
window do this, so the lower half of a stacked split is not a title bar.
Onboarding and the no-vault screen keep a strip at the top for the same
purpose. The same applies on Windows and Linux, where the window has no
frame with the title bar off.
- **The browser app can hide its title bar.** The self-hosted browser
app had no way to remove the bar with the note's title. Settings →
Appearance → Chrome now has a **Title bar** switch there too; turned
off, the workspace starts at the top of the page, and the choice is kept
for that browser.
- **Settings fits a narrow window or a tablet.** In a narrow desktop
window, and on an iPad or an Android tablet, many Settings rows squeezed
their label into a column of single words while the control ran past the
card: every text field (Vault name, the template pickers), the location,
font and slider rows, and all of Keymap, whose rows put a key and three
buttons on one line. These rows now move the control under the label
when there is no room beside it, and Keymap's filter field fits the
card.
- **Vim's `o` and `O` keep a quote or callout going**
([#&#8203;961](https://redirect.github.com/ZenNotes/zennotes/issues/961)).
With Vim mode on, `o` or `O` on a line inside a quote or callout opened
a bare line below it, outside the quote. They now open the line with
what Enter would start it with: `> ` in a quote, `> - ` on a quoted list
item, the next number on a quoted numbered item, and the quote marker
plus indentation on a code line inside a quoted fence. Outside quotes
nothing changes.
- **Callouts and code fences redraw when a slow parse finishes.** On a
slow machine or in a long note, the editor's parse can run out of its
time budget and finish a moment later. When it did, a callout could stay
drawn as raw `>` lines with its code fences showing until the next
keystroke or cursor move. It now redraws as soon as the parse completes.
Found by CI on the release PR.
- **The bundled zn is 0.9.1.** On macOS and Linux, the `zn` that
ZenNotes installs is now 0.9.1: in the TUI's preview, a wikilink of more
than one word, such as `[[double brackets]]`, no longer widens its row
past the pane and scrolls the whole screen
([ZenNotes/tui#11](https://redirect.github.com/ZenNotes/tui/issues/11),
thanks to
[@&#8203;Nebula-Arcanum](https://redirect.github.com/Nebula-Arcanum)).

#### For contributors

- Title bar and window drag (`4df2a6bc`):
`packages/app-core/src/lib/window-chrome.ts` holds the two rules.
`chromeCarriesWindowDrag(showWindowTitleBar, runtime)` is true only for
a desktop window with the title bar off; a page never gets drag regions.
`isPaneOnTopEdge(paneLayout, paneId)` walks the pane tree: a `row` split
keeps every child on the window's top edge, a `column` split only its
first. EditorPane gives the tab strip header `drag-region` when both
hold and marks each tab `no-drag` (a tab is dragged by HTML5 drag and
drop and right-clicked); a pane with tabs off uses its header, and an
empty pane with neither gets a 32-pixel strip. The sidebar header's
region takes `-mt-3 pt-3` to reach the aside's top padding, the note
list header joins, and `TitleBar standalone` (onboarding and the
no-vault screen) renders a strip where the bar was. App adds
`zn-app-dragging` to the root from `dragstart` to `dragend`/`drop`, and
`.zn-app-dragging .drag-region` turns the regions off, because a drag
region belongs to the window and may not take a drop. The web runtime
now honors `showWindowTitleBar` and shows the switch as Title bar;
`TitleBar.test.ts` and `SettingsModal.test.ts` pin the new browser
behavior.
- Narrow Settings rows (`56937694`, `c634af68`, `49fb604a`):
`TextInputRow`, `TemplateSelectRow`, `SegmentedRow`, `FontRow`,
`SliderRow` and the Keymap rows use the Vault Location pattern from
[#&#8203;871](https://redirect.github.com/ZenNotes/zennotes/issues/871):
the row wraps, the label keeps at least 14rem before the control moves
under it, and the control may not exceed the row.
- Vim open-line (`890ef3c8`): `registerOpenLineContinuation` in
`lib/cm-vim-open-line.ts` now owns the `o`/`O` action that was in
Editor.tsx. On a quoted line, `quotedOpenLinePrefix` reads the prefix
off Enter's own commands (the quoted-fence command, then lang-markdown's
markup continuation) run on a scratch state, so `o` and Enter cannot
disagree; an empty item or a second blank `>` line is read with
placeholder content, because there Enter ends the markup and `o` still
continues it. `insertNewlineContinueFencedCodeIndent` became a
`StateCommand` for that; Enter's behavior is unchanged.
- Perf harness (`dc3cef58`): `vendor-markdown` and `vendor-highlight`
leave the deferred normal-flow list (the editor's live preview renders
tables, comments and formulas with them, by design) and get a stricter
check under `ZEN_PERF_ENFORCE=1`: neither may be fetched before App's
first render, timed from each CDP request's `wallTime` against
`renderer.app.mounted`; when that timing is unavailable the enforced run
fails instead of passing quietly.
- Live-preview block redraw (`10597fe9`): `wysiwygBlocksPlugin`
(`cm-wysiwyg-blocks.ts`) now also rebuilds when
`syntaxTree(update.startState) !== syntaxTree(update.state)`, as
`cm-live-preview` already did; a parse cut by its time budget finishes
in an update that changes nothing else. The test harness finishes the
parse after its last change, and a new test swaps the markdown language
in through a compartment (a tree-only update) and expects the callout
card. Nine other plugins read the tree without a tree-change rebuild
(callout and heading folds, code block font and flair, hashtags,
template tokens, highlights, list indent, wikilinks); they are a
follow-up.
- zn pin (`f743c04f`): `apps/desktop/terminal-release.json` is
ZenNotes/tui v0.9.1's signed manifest, copied byte for byte after it
verified against `packaging/release-signing/zn-release-1.pub` (source
commit `c6e98860`, protocol 1). The in-app manual's CLI card says 0.9.1.
- What's New `3180c55e`; version bump `60ddd549`. The in-app manual's
Window title bar entry and the website's docs say where to drag and
cover the browser switch.

#### Demos

Screenshots of this release on the dev build, attached to this release:

**The title bar off, the sidebar closed**: the blank tab strip at the
top now moves the window.

![The workspace with the title bar
off](https://redirect.github.com/ZenNotes/zennotes/releases/download/v2.73.0/post-1-title-bar-off.png)

**Settings → Appearance → Chrome**, with the Window title bar switch off
and where to drag instead.

![The Window title bar
switch](https://redirect.github.com/ZenNotes/zennotes/releases/download/v2.73.0/post-2-settings-title-bar.png)

**Keymap in a 900-pixel window**: the key and its buttons sit under the
label instead of squeezing it.

![Keymap rows in a narrow
window](https://redirect.github.com/ZenNotes/zennotes/releases/download/v2.73.0/post-3-settings-narrow.png)

**Vim `o` in a callout**: on `> - Pack and launch`, `o` opened `> - `
inside the callout.

![A new list item inside a
callout](https://redirect.github.com/ZenNotes/zennotes/releases/download/v2.73.0/post-4-vim-o-callout.png)

#### Verification

How to test locally. Build once with `npm run build --workspace
@zennotes/desktop` and launch with isolated stores:
`ZENNOTES_USER_DATA_PATH=$(mktemp -d) ZENNOTES_CONFIG_DIR=$(mktemp -d)
npx electron apps/desktop/out/main/index.js`.

1. **Move the window without a title bar.** Settings → Appearance →
Chrome, turn off Window title bar. Close the sidebar (`Cmd+1` on macOS,
`Ctrl+1` elsewhere) and open a note. Drag the blank part of the tab
strip, to the right of the tabs: the window follows. Click a tab and the
back button: they still work. Before: nothing at the top of the window
could be dragged with the sidebar closed.
2. **Split panes.** With the title bar still off, right-click the tab
and choose **Split Down**. The top pane's blank tab strip moves the
window; the lower pane's does not.
3. **The browser app.** Run the self-hosted server and open the app in a
browser. Settings → Appearance → Chrome → Title bar, turn it off: the
bar with the note's title goes away, and stays away after a reload.
Before: the switch was not there.
4. **Settings in a narrow window.** Make the window about 900 pixels
wide and open Settings → Keymap: each binding's key and its Change,
Unbind and Reset buttons sit under the label. Open Settings → Vault: the
Vault name label and its description read as sentences. Before: labels
one word per line, with buttons past the card's edge.
5. **Vim `o` in a callout.** With Vim on, write `> [!note] Plan` and `>
- one` on the next line, press `Escape`, then `o`: the new line starts
with `> - ` inside the callout. Press `Escape`, `O` on the same line:
the line above starts with `> - ` too. Before: both opened a bare line
outside the callout.
6. **zn 0.9.1.** In a terminal, `zn --version` reports 0.9.1 after the
managed install updates. Open `zn tui` on a note holding `- jump between
notes with [[double brackets]]` and look at the preview: the line stays
one row and the screen does not scroll.

#### Distribution channels

- **GitHub release:** installers for macOS (Apple silicon and Intel DMG
and zip), Windows (x64 and ARM64 installer and zip) and Linux (x64 and
arm64 AppImage, deb, rpm, pacman, tar.gz), with five update manifests;
the four screenshots in Demos are attached too.
- **AUR:** `zennotes-bin` 2.73.0-1 (AUR clone `3a1e1ee`, repo
`0595d84a`), pinned to `ZenNotes-2.73.0-linux-x64.tar.gz` SHA-256
`dc820eb9…ff97` (GitHub's own digest for the asset), after the tarball
check confirmed the bundled CLI folder is world-readable.
- **Nix:** `packaging/nix/release-data.json` lifted from the update
workflow ([run
39450048272](https://redirect.github.com/ZenNotes/zennotes/actions/runs/39450048272),
bot PR
[#&#8203;969](https://redirect.github.com/ZenNotes/zennotes/issues/969)
closed) as `e27a5cfd`, and [nix-build on
main](https://redirect.github.com/ZenNotes/zennotes/actions/runs/39452079269)
passed.
- **nixpkgs:**
[NixOS/nixpkgs#575797](https://redirect.github.com/NixOS/nixpkgs/pull/575797)
now proposes 2.70.0 -> 2.73.0 (`28c291ff`), rebased on master; the
source hash comes from the tag tarball.
- **Homebrew:** `zennotes` 2.73.0 in the tap (`c8e5264`), mirrored in
`4e742e73`; both DMGs' SHA-256 match the cask and GitHub's digests;
`brew style` clean.
- **Website:**
[ZenNotes/website#87](https://redirect.github.com/ZenNotes/website/pull/87)
merged with the 2.73.0 entry and its four screenshots, the Window title
bar docs (drag the tab strip; the browser's Title bar switch) and the zn
docs at 0.9.1. Laravel Cloud deployed it at `b6db20c0`, and the live
check passed: /releases leads with 2.73.0, all four screenshots match
the local files byte for byte, /docs carries the title bar wording and
/tui/docs names zn 0.9.1.
- **Server and Docker:** [ZenNotes/znserver
v2.73.0](https://redirect.github.com/ZenNotes/znserver/releases/tag/v2.73.0)
pins the browser app `web-2.73.0-web.ha47e875be648958c` (`9bb5a7d`); all
five binaries match `SHA256SUMS`, and the released darwin-arm64 binary
served the 2.73.0 app on a scratch vault. `adibhanna/zennotes:2.73.0`,
`2.73` and `latest` share one digest, `sha256:b875d7a1…` (linux/amd64
and linux/arm64); the README's install commands follow
([ZenNotes/znserver#39](https://redirect.github.com/ZenNotes/znserver/issues/39)).
- **zn CLI:** [ZenNotes/tui
v0.9.1](https://redirect.github.com/ZenNotes/tui/releases/tag/v0.9.1)
(`c6e98860`,
[ZenNotes/tui#11](https://redirect.github.com/ZenNotes/tui/issues/11) by
[@&#8203;Nebula-Arcanum](https://redirect.github.com/Nebula-Arcanum)),
its Homebrew formula (tap `5ea7388`), and the same release bundled in
this one.
- **Boundary packages:** `core-2.73.0-core.he1407f30925bb0c4` and
`web-2.73.0-web.ha47e875be648958c`, built by CI from `10597fe9`; both
published as pre-releases once their consumers were built on them. No
viewer this time: nothing in 2.73.0 changes how a published note
renders. "Latest" still names v2.73.0.
- **Phones:** Android 1.1.43 (versionCode 46, on core 2.73.0, with
[ZenNotes/zennotesandroid#123](https://redirect.github.com/ZenNotes/zennotesandroid/issues/123)'s
Settings, Vault fix) is in Google Play review at 100% rollout; iPhone
1.29.0 (build 45, with
[ZenNotes/zennotesios#68](https://redirect.github.com/ZenNotes/zennotesios/issues/68)'s)
is uploaded to App Store Connect and goes in for review once Apple has
decided on 1.28.0, which is still waiting. On phones the core's new
Title bar switch is hidden, since their title bar always is; tablets
keep it.

#### Release validation

Every CI failure since 2.72.0 was read before this release: `ci-sweep.py
v2.72.0` found none. `hazard-scan.py --since v2.72.0` found no hazards,
before the bump and again after it.

Release-time gates, in a clean checkout with its own `npm ci`: typecheck
8/8 with no turbo cache, test:run with no cache (shared-domain 2,048,
app-core 3,328, desktop 1,183, quicklook 15 and the rest), and a fresh
build:prod. Pack: Developer ID signed (team WYY7PK57DM); packaged launch
check: page target and drawn app in 1.6 s, version 2.73.0. Smoke suites
vim-editor, sidebar-vim and editor-improvements pass on the first run.
The title bar fix was checked in the built app over CDP (with the
sidebar closed, 0 of 80 points along the top of the window were
draggable before and 67 to 72 after; tabs and buttons stay clickable),
with a real mouse drag on the MacBook display (the window moved by
exactly the drag, +150 and +80 points), and in the browser app against a
local server (the Title bar switch hides the bar and stays off after a
reload). A drop onto the blank tab strip could not be proven either way:
the scripted mouse never completed a drop, even in a control run with
the title bar on.

Release PR
[#&#8203;968](https://redirect.github.com/ZenNotes/zennotes/issues/968):
the first run's Build (windows-latest) failed in
`cm-wysiwyg-blocks.test.ts` ("hides a code block's closing fence inside
a callout too": the whole callout rendered raw). It was a real bug, not
a flake: the block plugin did not redraw when only the syntax tree
changed, so a parse cut by its time budget on a slow runner left stale
decorations. Fixed in `10597fe9` with a regression test that fails
without it; pack and the launch check were repeated (1.5 s, 2.73.0), and
all 10 checks then passed, the `windows-11-arm` package and launch check
included. CI on `main` for `10597fe9` ([run
39443191868](https://redirect.github.com/ZenNotes/zennotes/actions/runs/39443191868)):
the macOS job was never picked up ("The job was not acquired by Runner
of type hosted even after multiple attempts", GitHub's macOS arm64
capacity, no step ran); its re-run passed, so all six jobs were green
before the tag. CI on `main` for the packaging commits: the AUR commit's
run was cancelled when the Nix commit superseded it, `e27a5cfd`'s ([run
39452079379](https://redirect.github.com/ZenNotes/zennotes/actions/runs/39452079379))
passed, and so did `4e742e73`'s, the Homebrew commit ([run
39454862147](https://redirect.github.com/ZenNotes/zennotes/actions/runs/39454862147)).
Release [run
39447342438](https://redirect.github.com/ZenNotes/zennotes/actions/runs/39447342438):
all six jobs green; `verify-installers.py` ALL GOOD on the five
manifests by SHA-512 (14 files); the app in both DMGs is `Notarized
Developer ID` with a valid stapled ticket. `npm run verify:channels --
2.73.0`: every channel serves v2.73.0 (Homebrew, AUR, Nix and the
website's eight download buttons).

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/Los_Angeles)

- Branch creation
  - Every minute (`* * * * *`)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/scottames/copr).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNzEuMiIsInVwZGF0ZWRJblZlciI6IjQ0LjE3MS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant