Repository navigation
Release 1.1.50 (versionCode 53) - #142
Merged
Merged
Conversation
…sted #141 trusts the user certificate store app-wide so a self-hosted server behind a private CA connects (#140). That store also holds any CA a device manager pushes or a user is talked into installing, and with the base policy alone such a CA could vouch for zennotes.org as well. On an emulator with a throwaway CA in the user store and a proxy presenting a zennotes.org certificate signed by it, the #141 build completed the handshake and handed its Cloud API request to the proxy. Cloud's hosts (zennotes.org and the legacy zennotes.laravel.cloud, subdomains included) now get a domain-config that trusts the system store alone and refuses plain HTTP: the trust Cloud had before #141. Every other host keeps the PR's policy, system and user CAs with plain HTTP allowed for LAN servers. The same interception now fails the handshake ("Trust anchor for certification path not found"), while a self-hosted server behind the private CA still connects and syncs, in a debug build and in a release-signed build. The debug-only manifest that pointed at the old debug resource is gone too: the main manifest declares the one policy for every build type. It does not cover the object-storage hosts of presigned uploads and downloads. The service names them at run time, and they never receive the account token (DirectUploadPlugin refuses an Authorization header on a signed upload). network-security-config.test.ts checks the policy against the Cloud URLs in mobile-cloud-auth.ts, so a future host move (2.28 made one) cannot leave Cloud on user trust unnoticed.
…ne's Local Network setting The message a self-hosted connection failure shows was carried over from the iPhone app and told Android users to check Settings, Privacy & Security, Local Network, a setting Android does not have. It now names the one thing that does stop an Android connection a browser on the same phone makes: an https server whose certificate comes from the user's own certificate authority, which the app trusts since #141 once that authority is installed under Settings, Security, Encryption & credentials. An http server gets no hint. The code comment also lost a long dash.
The test that came with the connect-error message fix was written for vitest, which this repo does not use: `npm test` is `node --test`, so the file failed to load and `npm run typecheck` stopped on the missing vitest module. It now uses node:test and node:assert, and loads remote-client.ts through tooling/load-mobile-module.ts with CapacitorHttp stubbed, the way the other bridge tests load theirs. The two cases are unchanged: neither an http nor an https URL names the iPhone's Local Network setting, and only the https one says where to install a certificate authority.
… for the status bar Core core-2.79.0-core.h04cf920466765284, built by CI from ZenNotes/zennotes 584487ff (the v2.79.0 release commit); core:adopt checked SHA-256, SHA-512, packed versions and clean-source provenance. Core 2.79.0 lets a host open notes to read: a pick in one of core's searches, or a palette command that only goes to a note, lands with every line rendered and the soft keyboard down, and a palette toggle or a palette closed without a pick leaves the focus where it was. The editor host asks openNotesToRead, so this shell answers isPhoneViewport: the phone layout reads, a tablet in the desktop layout keeps core's focus. The read-open guard keeps covering Home, the lists and zennotes:// links as before. The same core brings the Status bar switch (Settings, Appearance, Chrome, and Toggle Status Bar), which on a phone hides the ZenNotes Cloud strip until Cloud needs you; a cover's frontmatter folding to one line in Edit mode; a blank Quick Note prefix that gives a bare timestamp title and a Tasks filter that finds a task note by a tag in its body (#1008). Bridge contract: six optional Unsplash methods this shell leaves out (no Unsplash tab on Android), an optional AppUpdateState.detail, the portable keys commandKeymaps, showStatusBar and timelineRange, and vault.json's sharesLocation, which normalizeVaultSettings already passes through and seeds from DEFAULT_VAULT_SETTINGS. Its Settings row is macOS-only in core. Desktop vault.ts only adds that field and a config listener for the macOS share sheet. The package lock marks 57 build-tool entries (esbuild, rolldown, lightningcss, jiti, @types/node and their platform binaries) dev-only; none of them ships in the app.
…nsplash rows Core 2.79.0 adds four palette commands. Each was checked on a phone: - Toggle Timeline: the Timeline is a right panel, so the phone layout draws it as a full-screen sheet with Done, like Outline or Comments. Its ticks and ranges work there, but a tap on a task, the panel's way to a task, opens the note behind the sheet with the editor focused, so the keyboard comes up under a sheet that stays until Done. It joins the phone-only list; a tablet in the desktop layout, where the panel sits beside the note, keeps it. - Add Cover from Unsplash and Set Unsplash Access Key: core shows them only to a host with the Unsplash bridge methods, which this shell leaves out, so neither reached the palette. They are named in the device-wide list anyway, as the 2.68.0 rows are, in case a later core gates them differently. - Toggle Status Bar stays. On Android it hides the ZenNotes Cloud strip under a note until Cloud needs you, and the keyboard stays down. Nothing else needs hiding: the palette's "Alt+Enter set key" hint sits in the footer the phone already hides, Settings, Keymap (with its new Commands group) is already hidden and settings search finds none of it, and the Default shares location row is macOS-only in core.
A note, database or file opened from the Browse drawer (pinned notes among them) went through a bare openNote, outside the read-open guard that Home, core's lists, links and search picks take. On Android the WebView happened not to hand the editor the focus after a drawer open, so the release build kept the keyboard down and the first line rendered (a focus logger across a drawer open saw only the row button's own focus), but nothing held it there. The iPhone, whose WebView shows the keyboard for any focus, opened the same rows with the keyboard up and the caret before the raw "# Title". drawer-open.ts closes the drawer and opens the row inside openToRead, so the hold is armed at the tap, before the drawer closes and the note opens 30 ms later, and settles after the open, failed or not. The rows that create a note keep the drawer's plain go and still focus. Same helper as the iPhone shell. Tests: the order (arm, close, wait, open, settle, with the hold on the whole way), the settle after a failed open, and a check that the note, database and file rows call read and that no drawer row opens a note through go(() => openNote(...)).
The shell hides desktop-only palette commands by setting their rows to display: none, but core's highlight is an index into every result, hidden rows included, and its arrows and Return go by that index. On the 1.1.50 release build, typing "timeline" over a note left the highlight on the hidden Toggle Timeline (no row looked highlighted), and the soft keyboard's Return opened the Timeline as a sheet. The same held for every hidden command, so it predates this release. The iPhone walk turned it up first. palette-hidden-rows.ts, the same file as the iPhone shell's, keeps core's highlight on a visible row: when the results change and the highlighted row is hidden, the first visible row takes it, through the same mousemove core uses for a pointer. A capture-phase keydown guard makes the arrows (and Ctrl+N/P, Ctrl+J/K) skip hidden rows, and lets Return run only a visible row; with no visible row, Return does nothing and the palette stays open. It lives in the shell because core does not know the shell's hide list, and it does nothing while no row is hidden. Taps only ever reach visible rows. Tests: where a hidden highlight settles, arrow steps over hidden rows both ways and at the ends, and what Return runs with a visible, a hidden or no visible highlight.
…d the system Back The header's Back chevron and Android's system Back both run nav.back through core's command registry, outside the palette, when there is history behind the note. On the 1.1.50 release build the note it went back to came up with the keyboard down anyway (a focus logger saw only the chevron's own focus), but nothing held it there; on the iPhone the same chevron raised the keyboard with the caret before the raw "# Title", which the iPhone shell fixed the same way. The palette's Go Back already reads (core 2.79 marks it opensToRead). goBackToRead runs nav.back through openToRead, so the read-open hold refuses any focus core follows it with; a tap into the text raises the keyboard as before. With no history, Back still goes to Home, and the reference sheet's chevron still closes the sheet. Test: both callers go through goBackToRead and nothing runs nav.back around it.
…lash key line Core core-2.79.0-core.h434377c05a50e117, built by CI from ZenNotes/zennotes 44954fab, replaces core-2.79.0-core.h04cf920466765284 (584487ff), which is superseded; core:adopt checked SHA-256, SHA-512, packed versions and clean-source provenance. The one change since 584487ff is Settings, Typography, Covers: its description promised "the Unsplash key the cover picker searches with", but a host without the Unsplash bridge (this shell) shows no key row under it. It now reads "How a note's cover shows." there; hosts with a key row keep the longer line. Bridge contract and shared domain are the same source; their archive hashes change only with the source commit. Version stays 1.1.50, versionCode 53.
…h is cleared The phone layout hides the MCP, CLI and Keymap rows of the Settings section list, but it hid them once, when the panel mounted. Core rebuilds the list whenever the Settings search empties, so on the 1.1.50 release build typing "key" and clearing it brought all three back, and a tap opened those desktop pages. The iPhone walk found it first. settings-sections.ts (the same helper as the iPhone shell's) hides the rows by label, and cleanSettingsContent calls it at phone width with the search-result hiding it already did, on every change to the panel, so the rows stay hidden across searches, clears and section switches. The one-time hide in mobilizeSettingsPanel is gone. Tests: the rows are hidden, hidden again after a rebuild, and the repeat is harmless; a source check that the cleanup on every change does the hiding. The test declares its row label as a plain field: node --test strips types only and refuses constructor parameter properties.
…rd down Core heals the editor's focus when the window regains focus or the page becomes visible again, whenever its store says the editor was the last surface (App.tsx, desktop #350). A note opened to read sets that flag too, since only its DOM focus is refused, so on the 1.1.50 release build the heal raised the keyboard over the note: after the reload a Settings Layout switch does (logged on device: editor-focus's retries, then the Editor's focusedPanel effect, timing-dependent), and on every return to the app (read a note, Home, reopen: keyboard up three times of three). A cold launch restoring a note kept it down. focus-heal.ts notes, as the app is left (the window's blur, pagehide, the page going hidden), whether the editor held the focus. Coming back to a note that was being read arms the read-open hold and lets it settle, so the heal's tries are refused the way an open's are, and a touch releases it. Someone who was typing gets the keyboard back from the heal, as before. A fresh page (a cold launch, the Layout reload) left nothing and counts as reading. The listeners run in the capture phase, ahead of core's; a tablet in the desktop layout is left to core. Tests: which events leave and come back (an element's focus passing the window does not), reading versus typing across blur then hidden and visible then focus, a fresh page, a focused editor and a tablet, the heal's burst refused then a later focus let through, and a source check that all four listeners are capture-phase.
Settings search lists the matching settings of every section and sub-tab, the hidden ones too, and marks each result only with its section. "key" offered Exit insert mode with, Leader key hints and Keep the input method out of normal mode (the Vim sub-tab) and Quick capture hotkey (the Quick capture sub-tab); a tap opened a page without them. settings-sections.ts now carries the results to hide by section and title: the settings of the Search, Quick capture and Workflows sub-tabs and the rows mobile.css hides everywhere (Updates, Use theme for PDF export), and on phones the Vim and Folders sub-tabs and the rows hidden there (Primary notes location, View settings, Default drawings location, Dark sidebar, Sidebar arrows, Title bar). cleanSettingsContent hides them, with the MCP, CLI and Keymap results it already hid, on every change. Titles are the only key: the result carries no sub-tab or setting marker, so the list is copied from core's subTabs searchIds, and a test checks each title is still in the installed core so a rename fails at the next adoption. A data-settings-result-tab marker in core would let the list go. Tests: hidden sub-tab, section and row results, visible ones kept, the section needed with the title, a tablet given back Vim and Folders, the filter on fake rows, every title and section present in the installed @zennotes/app-core, and a source check that the cleanup applies it.
…yboard down The keyboard after a Settings Layout switch was not core's focus heal, as the previous commit's message says; that commit fixes the return to the app. Logged on the release build with the heal fix in place, going from the desktop layout back to Automatic raised the keyboard four times of four with no window focus or visibility event at all: the restore landing (usePhoneLayoutBoot) closes the sidebar for the phone layout, and core hands the focus to the editor when a sidebar that held it closes (App.tsx, #353). In the desktop layout the sidebar was open and focused, since that is where its Settings button is, so the reload came back with the caret before the restored note's raw "# Title". The landing now runs inside openToRead, so the hold is armed while the sidebar closes and the restored note or view appears, and core's hand-off is refused like an open's; a touch releases it as always. A cold launch lands the same way. The focus-heal comment no longer claims the Layout reload. Test: a source check that the landing runs under openToRead and that the sidebar is closed inside it.
…page After about eleven rapid Settings Layout reloads in one process, the release build came back to a blank page: only bootstrap's script had loaded, main.tsx never did, and a reload stayed blank until the app was killed. Boot had stopped inside bootstrap's restore of the preferences mirrored in native storage, on a Preferences call that never answered. Boot now bounds every native wait it can do without (boot-wait.ts, the same helper as the iPhone shell's): the preferences restore, the app version, the Cloud sign-in links and the shared captures. Each wait ends after two seconds, logs one warning and boot goes on with what it has; the vault itself stays unbounded. Measured on the emulator's release build, the restore took 13 to 28 ms on a cold launch, 165 ms on the first launch after install and 5 to 6 ms on a reload, so two seconds never cuts a normal one short. boot-preferences.ts splits the restore into reads, which write nothing, and one synchronous apply that runs only when every read answered in time. A late answer is dropped whole: by then the app has run on what localStorage had and may have changed it, and applying even part of the answer could put an older value over a newer one. The native copy catches up through the mirror, installed either way. The reads also run together now instead of one after another. Tests: a restore that never answers lets boot go on with localStorage untouched; a fast one applies native values, the theme first, and copies a localStorage-only value to native; a late answer after the app changed a value leaves it alone; reads come before any write; the wait helper's own cases; and source checks that bootstrap, main.tsx and the bridge use the bounded waits.
Core shows "No settings match your search." only when nothing matched at
all. With the phone's hidden results filtered out, a search whose every
match is hidden ("keymap", "mcp", "quick capture" on a phone) showed an
empty list with nothing to say why.
syncNoMatchesState (the same code as the iPhone shell's) adds core's own
empty state, copied from its markup, to the results list when every
result is hidden, and takes it away as soon as a visible result is back;
cleanSettingsContent runs it after the hide on every change.
Tests: the state appears for an all-hidden list, once however often the
panel changes, goes away when a visible result returns, and stays out of
a list with visible results or none at all (core's own state); the copy
still matches core's markup in the installed core; the cleanup runs it
after the hide.
Settings, Appearance on Android has two rows about a status bar: the shell's System bars row, whose middle choice read "No status bar" and means Android's bar along the top, and core's Status bar switch under Chrome, which is ZenNotes' own bar along the bottom with the Cloud strip. Side by side the two read as one setting twice. The System bars choice now reads "No top bar", and its description says it hides Android's status bar along the top (the clock and icons). Core's Status bar row is unchanged. Settings search finds core's row as before; the System bars row is the shell's own and was never in core's search. Test: no System bars choice is labeled a status bar, and the description names the top bar.
… on screen The landing after a reload or a cold launch ran under openToRead, whose hold lets go a set time after it is armed: 700 ms after the landing's synchronous work, 5 s at most for an open. But the landing returns as soon as it has closed the sidebar and chosen Home or the note, while the restored note's text may still be loading; when its editor mounts, core focuses it, because closing the sidebar had already handed the focus to the editor. On a slow vault that came after the hold had let go. holdLanding (read-open.ts) arms the hold before the landing runs and keeps it armed, re-arming every 2.5 s, until landingOnScreen says the landing has nothing left to load: Home or a view at once, a note once its editor is on screen. landing-hold.ts caps it at 15 s, so a note that never appears cannot hold the keyboard forever, and a touch ends it at once as it ends every hold. Tests: a slow restore stays held past five seconds and settles when the note appears; the cap lets go and stops re-arming; a touch stops it without re-arming; a fast landing settles at once; source checks that the landing runs under holdLanding and the hold is armed before it.
…sk lands after its checkbox Core core-2.79.0-core.h747103b57a975077, built by CI from ZenNotes/zennotes cefd86d9, replaces core-2.79.0-core.h434377c05a50e117 (44954fab), which is superseded; core:adopt checked SHA-256, SHA-512, packed versions and clean-source provenance. The one app-core change is a134a595 (#1012): indenting an empty task (`- [ ] `), with Vim's `o` then Tab or Ctrl-T or with Enter then Tab, left Chromium's caret in a text node CodeMirror had reused, so the next letters landed before the marker. They now land after it, which matters on the Android WebView as much as on the desktop. cefd86d9 itself is a macOS certificate fix for the desktop app (#1009). Bridge contract and shared domain are the same source, repacked with the new commit. Version stays 1.1.50, versionCode 53.
…s own does
The iPhone walk of a search whose every match is hidden ("ripgrep",
"hotkey") showed the shell's "No settings match your search." box 4px
lower than the same box core shows for a search with no results at all.
Core's results list spaces its children with space-y-1, and the hidden
results before the shell's box still count as siblings there, so the box
took a top margin core's own never gets. Android uses the same helper,
so it had the same offset.
mobile.css now takes that margin off the shell's box only, with the same
rule and test as the iPhone shell (zennotesios 0479123); the test checks
core still spaces that list the same way.
…se columns, callouts and code languages Core core-2.79.0-core.h7896a01910a2ea0f, built by CI from ZenNotes/zennotes 47d26827, the core 2.79.0 ships with; it replaces h747103b57a975077 (cefd86d9). core:adopt checked SHA-256, SHA-512, packed versions and clean-source provenance. What it brings the phone: a folder opens as a Gallery of its notes by cover (Open Folder Gallery, :gallery); a database table view keeps its own Columns and picked rows, and the + makes table views and copies; Set Callout Type… and Remove Callout in the palette (#1016); a code block's label picks its language and an unlabeled block shows a guess (#1014); long menus get a find field, where j and k are letters with Vim off. Two fixes from the phone walks: picking a theme in the palette leaves the keyboard down (64abae7e), and typing in a new note goes under its title, from the name field's Return and from New Note in the palette (34dcfe6e). Bridge contract: no new method; the portable keys detectCodeLanguages, gallerySort and galleryIncludeSubfolders, and a database view's optional pickedRowIds and hidden columns. Version stays 1.1.50, versionCode 53.
…o longer covers the cards Walking core 2.79.0's folder Gallery at phone width turned up two shell gaps. A tap on a card opened its note with the editor focused and the keyboard over it, because the read-open guard listed core's other note lists (Home, Tasks, Quick Notes, Tags, Archive, Trash) but not the new cards. And the Gallery's header, which wraps its Sort, Include subfolders and filter controls under the title and grows from core's min-h-12, was held to the phone's fixed pane-header height, so its second line drew over the first row of cards. read-open.ts adds [data-gallery-card] to the rows that open to read, and mobile.css lets a wrapping pane header (flex-wrap) take its own height; the note, database and other single-line headers keep 2.75rem. Tests: the Gallery card marker is in the read-open rows and is still core's own; core's Gallery header still wraps and the phone rule lets it grow. On the release build: two columns, the header's controls above the cards, and a card opens its note with the keyboard down.
…own on a phone Two core 2.79.0 behaviors that a desktop wants raised the soft keyboard on the phone layout. The database Columns menu focuses its find field as it opens (DatabaseColumnsMenu.tsx, so typing filters at once), which on a phone put the keyboard over the menu each time Columns or New table view opened it. And picking a type in the Callout type menu ends with view.focus() (EditorPane.tsx, the caret back where it was), which raised the keyboard over the new callout; Remove callout in the editor menu does the same. read-open.ts refuses a programmatic focus on that find field at phone width unless the last touch went down on the field itself, so a tap into it still raises the keyboard; and a tap on a Callout type row or on Remove callout arms the read-open hold, as a note row does, so the editor focus that follows is refused. Core is unchanged: on a desktop both focuses are what people want. Tests: core still focuses the field and the editor in those places (a change there fails at the next adoption), and the shell's guards are in place.
…ays on one line
A palette list opened from a command (Themes..., a workflow, a vault)
draws a row above its input with "Back" and a caption, and the phone's
Cancel sits over the top-right corner of the palette, which on these lists
is that row: picking a theme showed "Theme preview" running under Cancel,
and once the caption wrapped, "‹ Back" was squeezed onto two lines. The
row now ends before Cancel and its caption wraps beside a Back that keeps
its width. Matched on the row's Back button ("Back to commands"), which a
test checks is still core's.
The same two rules as zennotesios 0e7a938 and af1199c, identical in text.
Selecting rows in a database table shows a bar with the count, "Show only these in this view", Delete and Clear, laid out as one desktop line. That line is wider than a phone: on an iPhone Clear ran off the right edge, and on a 412 dp Android screen it fit with a few pixels to spare, so a two-digit count or a 360 dp phone lost it too. On a phone the bar wraps, and its first span (the count) takes a line of its own, so the actions sit together on the line under it and wrap again only on a phone narrower still. The picks editor's bar (Editing picks, Update picks, Cancel) carries the same data-db-selection-bar attribute and gets the same two lines. Core is unchanged; a test checks both of its bars still open with the count's span and that Clear is there.
renovate Bot
added a commit
to scottames/copr
that referenced
this pull request
Oct 30, 2026
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ZenNotes/zennotes](https://redirect.github.com/ZenNotes/zennotes) | minor | `2.78.0` → `2.79.0` | --- ### Release Notes <details> <summary>ZenNotes/zennotes</summary> ### [`v2.79.0`](https://redirect.github.com/ZenNotes/zennotes/releases/tag/v2.79.0): ZenNotes v2.79.0 [Compare Source](https://redirect.github.com/ZenNotes/zennotes/compare/v2.78.0...v2.79.0) ZenNotes 2.79.0 puts your tasks on a timeline and every command on a key. The new Timeline panel lays every open task with a date down one line, with overdue work and milestones marked. Every command in the palette can now take a key of its own, from Move Note to Trash to a leader sequence in Vim mode. On macOS, Share to ZenNotes saves a page or a selection from Safari and any other app. Unsplash covers arrive with a key of your own, and the keyboard works fully with Vim mode off, in the sidebar and in every side panel. Released from [`47d2682`](https://redirect.github.com/ZenNotes/zennotes/commit/47d26827) through [#​1010](https://redirect.github.com/ZenNotes/zennotes/issues/1010), [#​1011](https://redirect.github.com/ZenNotes/zennotes/issues/1011), [#​1013](https://redirect.github.com/ZenNotes/zennotes/issues/1013) and [#​1017](https://redirect.github.com/ZenNotes/zennotes/issues/1017) on 2026-10-29. #### Features - **The Timeline panel** ([#​1007](https://redirect.github.com/ZenNotes/zennotes/issues/1007), asked for by williamcheuk03). A fifth right-hand panel, beside Outline, Connections, Comments and Calendar, that lays every open task in the vault with a date down one line. Overdue tasks sit on top in red with how many days late each one is, Today follows, then one node for each later day that has work; a run of empty days folds into one "N quiet days" line. A task's date is its `due:` date, or for a task in a daily note, that note's date. Tag a task `#milestone` and its day draws as a diamond, saying how many open tasks are due before it. A switch reaches 2 weeks ahead (the default), a month or everything (`timeline_range` under `[view]` in config.toml), and the filter takes the Tasks filter syntax. Open it with `Mod+7`, `Space n` in Vim mode, `:timeline`, Toggle Timeline in the command palette, or its button in the note header; `j`/`k` move, `x` ticks, `m` opens the task menu, Enter opens the note at the task's line. - **Every command can take a key** ([#​971](https://redirect.github.com/ZenNotes/zennotes/issues/971), thanks to Asterythm). All 197 commands in the command palette can now be given a key, all unbound to start. Highlight one in the palette and press `Alt+Enter` (`Option+Enter` on macOS) to record a key without leaving the palette, or use the new Commands group in Settings, Keymap. A key is a chord, a function key, or with Vim mode on a leader sequence such as `Space x a`, which shows in the leader hints. Your key wins over every default, the editor's own keys included; the recorder warns when it takes over a default and refuses one another of your bindings holds. When a command cannot run where you are, its key says why ("Restore from Trash only works on a note in the Trash"). In config.toml the keys live under `[keymaps.commands]`, and from the ex line `:bind <C-BS> note.trash` binds and `:unbind command note.trash` takes the key away. - **Share to ZenNotes on macOS** (asked for by charles b.). Choose Share, ZenNotes in Safari or any app with a Share menu to save the page you are on, the text you selected, or both, as a note, with an optional line of your own. A page becomes a note named after it, with your selection quoted and a link back; text alone is named from its first line. Each vault chooses where shares land under Settings, Vault, Notes, Default shares location: Quick Notes (the default), your primary notes location, or a folder such as `Clippings`, and the sheet's heading says where a share will go. With ZenNotes closed, a share waits and is filed the next time you open it; a share for a server vault is filed once you are connected to it. - **Unsplash covers with your own key** (asked for by charles b.). The cover picker has an Unsplash tab: paste your Unsplash Access Key once under Settings, Typography, Covers, and search millions of photos for a note's cover. Searches go straight from your computer (or your browser, in the web app) to Unsplash with your key; zennotes.org takes no part. The key is kept in your system's secure storage, the photo is credited to its photographer on the cover, and without a key the tab shows how to get one. - **A cover's frontmatter folds to one line.** In Edit and Split, a cover's `banner`, `banner_y` and credit lines fold into one muted line, such as `cover · Unsplash photo by Kalen Emsley` or `cover · lisbon.jpg`, since the cover above already shows the picture. Move the cursor onto it (arrows, or `j`/`k`) or click it to edit the raw lines; it folds again when you leave. - **A switch for the status bar** (asked for by Piotr). Settings, Appearance, Chrome, Status bar hides the bar along the bottom of the window; it comes back on its own only while ZenNotes Cloud needs you. Also Toggle Status Bar in the command palette and `:set nostatusbar` (`show_status_bar` under `[appearance]` in config.toml). - **Trash from the sidebar by key** ([#​972](https://redirect.github.com/ZenNotes/zennotes/issues/972), thanks to Asterythm). `x` in Vim mode, or `Mod+Backspace` in either mode, moves the note under the sidebar cursor to the Trash after a confirm, or the whole selection with one confirm; the cursor stays on the row that took its place. With the sidebar focused, Move Note to Trash and Move Note to Archive act on that row too. - **A folder as a Gallery** (asked for by charles b.). Open as Gallery on a folder in the sidebar shows its notes as cards by their covers: a vault image, an Unsplash photo or a gradient, and the title's first letter for a note without one. Sort by updated, created or title, switch on Include subfolders, and filter by title. Open it with Open Folder Gallery in the command palette, `:gallery` (with an optional folder, `:gallery Projects`), or `Space G` in Vim mode; in the grid h, j, k and l move, Enter or `o` opens, and `/` filters (with Vim mode off, the arrows, Enter and Escape). Covers are read only for the cards on screen, so a folder of a thousand notes opens at once. The sort and the subfolder switch travel in config.toml (`gallery_sort`, `gallery_include_subfolders` under `[view]`). - **Database views that keep their own columns** (asked for by charles b.). A table view's Columns button, beside Filter, opens a checklist of its columns with a find field, Show all and Hide all, and reads "Columns 5 of 44" once some are hidden; each saved view keeps its own, so one wide CSV can carry several narrow views. The + beside the view tabs makes a New table view, a New board view, or a copy of the current one (Duplicate this view). To keep certain rows in a view, select them and choose Show only these in this view: the view says "Showing N picked rows", with Edit picks and Show all rows, a row you add there joins its picks, and a board shows its picks too. Press `c` in the grid in Vim mode for Columns; five palette commands (Choose Database Columns, New Table View, Duplicate View, Show Only Selected Rows, Show All Rows) can each take a key. - **Right-click to make or change a callout** ([#​1016](https://redirect.github.com/ZenNotes/zennotes/issues/1016), asked for by williamcheuk03). Right-click selected lines, or a paragraph, and choose Turn into callout…: a Callout type menu lists every type with its icon (Note, Info, Tip, Success, Warning, Danger (Error), Quote and the rest), and your lines become a `> [!type]` callout in one undoable change. Right-click a callout, written out or drawn as a card in Live Preview, for Change callout type… (its title and fold marker stay) and Remove callout, which turns it back into plain lines. From the keyboard: Set Callout Type… and Remove Callout in the command palette, each bindable, and `Space l a` in Vim mode. - **Code blocks pick their language, and guess one they lack** ([#​1014](https://redirect.github.com/ZenNotes/zennotes/issues/1014), asked for by williamcheuk03). The language label at a code block's top right now opens a Code block language picker: type to find any of the languages the editor highlights (your own TextMate grammars too) and pick one, and only the fence's language word changes, as one undoable edit; Text (plain) removes it. Copy moved to its own icon beside the label. A block with no language gets a guess, highlighted the same way and labeled `python · detected`, but nothing is written to the file until you choose Python (detected) at the top of the picker; tiny or ambiguous blocks stay plain text. From the keyboard: Set Code Block Language… in the command palette, or `Space l l` in Vim mode. Settings, Editor, Writing, Detect code block languages turns guessing off in the editor and the reading view alike (`detect_code_languages` under `[editor]` in config.toml). #### Fixes - **Update checks while a release is uploading** ([#​1003](https://redirect.github.com/ZenNotes/zennotes/issues/1003), thanks to THEMaeker). A check for updates in the first minutes of a release could find the new version before its update file was uploaded and showed a dialog full of HTTP headers that called a 404 a "temporary server error". It now says "ZenNotes 2.79.0 is still being published. Try again in a few minutes.", every other update error gets one plain sentence, and the raw text sits under Details in Settings, About. From this release on, a new version only becomes the latest release once all five update files are on it, so that window is gone. - **Select all leaves the note's title alone** ([#​1006](https://redirect.github.com/ZenNotes/zennotes/issues/1006), thanks to williamcheuk03). With the cursor in a note's text, the first Ctrl+A (Cmd+A on macOS) selects from the first line under the `# Title` heading to the end, so typing over it no longer replaces the title; a second press selects the whole note. Vim's Ctrl+A increment keeps working. - **A blank Quick Note prefix gives a bare timestamp** ([#​1008](https://redirect.github.com/ZenNotes/zennotes/issues/1008), thanks to davi-jorge-art). Clearing the prefix in Settings still named new quick notes "Quick Note ...": the empty field was saved, but the title builder put the default back. It now gives a title that is just the timestamp or date, the empty field reads "No prefix", and the field keeps the spaces you type. - **The Tasks filter finds a task note by a tag in its body** ([#​1008](https://redirect.github.com/ZenNotes/zennotes/issues/1008)). A task made with New task (a note of its own) now matches a tag written anywhere in its note, in the list, the calendar and the board, as the Tags view already did. - **Menus with Vim mode off take j and k as letters.** In a right-click menu, `j` and `k` moved the highlight even with Vim mode off; with it off they now go into the menu's filter like any letter, and the arrows move. - **Typing in a new note goes under its title.** Make a note, name it and press Enter (or run New Note from the palette), then type: the text went in front of the `# Title` heading, as `Body# My note`, on desktop and on the phones. It now goes on the empty line under the heading. - **Typing in a new sub-task lands after its checkbox** ([#​1012](https://redirect.github.com/ZenNotes/zennotes/issues/1012), thanks to JulianBnder). Vim `o` on a task line and then Tab (or Enter, then Tab, with Vim mode off) showed the cursor after the new sub-task's `- [ ] `, but what you typed went in before it. Since 2.71.0, an empty task that you indented did this; text now goes where the cursor shows. - **Self-hosted servers behind your own certificate authority connect on macOS** ([#​1009](https://redirect.github.com/ZenNotes/zennotes/issues/1009), thanks to lewxdev). With a certificate from a private authority that your Mac trusts (step-ca, a company root), connecting failed with "fetch failed" unless ZenNotes was launched with `NODE_USE_SYSTEM_CA=1`. The app and its MCP server now also trust the certificates in the system's store, as the window always did. - **Cloud sync after an assistant edits a note** ([#​1004](https://redirect.github.com/ZenNotes/zennotes/issues/1004), thanks to tdtmusic2). Once an assistant (through the MCP server) had edited a note, Cloud sync failed on every run with "This path is not eligible for vault sync." The fix is on the Cloud server and is already live, so every version syncs again with no update. - **The keyboard with Vim mode off.** The sidebar walks like a tree: → opens or expands, ← collapses, Page Up and Page Down move a screenful, and Shift+F10 opens a row's menu. The note list, Connections, Outline and Comments panels gained the same keys (→ opens, ← goes back, Page Up/Down, the menu key in the note list), and Focus Sidebar from the command palette keeps the keyboard instead of handing it back to the editor. Letter keys stay off with Vim mode off. - **The palette names no Vim key with Vim mode off.** Seventeen palette rows showed keys that only work in Vim mode (leader chords like `Space d`, ex commands like `:w`, `z c`, `Ctrl+O`, `Ctrl+W h`). They now show only with Vim mode on, and Go Back and Go Forward show `Alt+←` and `Alt+→` instead. - **Ctrl, Alt and Cmd keys work for list-view actions.** A modifier key bound to a list view action (such as `"nav.delete" = "Mod+Backspace"`) was silently stored without its `Mod` and never fired. It now keeps its modifier and fires in the sidebar and every list view, and Settings marks a binding that a global shortcut holds as "Never fires". - **Deleting a comment from the keyboard asks first.** `d`, Backspace and Delete in the Comments panel deleted a comment for good with no confirm; they now ask, and the cursor moves to the next comment instead of jumping back to the first. The card's own Delete button is unchanged. - **An image in the note list opens as an image.** Enter or `l` on an image file in the note list loaded the picture into the editor as text; it now opens in its own tab, as a click does. - **The cursor shows on a selected sidebar row.** A row that was part of a multi-selection never drew the Vim cursor; it now shows as a ring over the selection. - **Phones open notes to read** (in the phone releases built on this core: iPhone 1.34.0 and Android 1.1.50). A note opened from Home, the drawer, a list, a link, a search pick, the Back button or a palette command opens with its first line rendered and the keyboard down; tap the text to type. Backing out of the palette, running a toggle from it, or picking a theme leaves the keyboard down too, Return in the palette no longer runs a command the phone hides, and Settings no longer mentions an Unsplash key the phones do not have. On Android, a self-hosted server whose certificate comes from your own certificate authority now connects once that authority is installed (thanks to lewxdev, [ZenNotes/zennotesandroid#141](https://redirect.github.com/ZenNotes/zennotesandroid/issues/141)). #### For contributors - Timeline (`ecb35368`): `lib/timeline-rail.ts` builds the rail from the Tasks view's own Today and Upcoming groups and `filterTasks` (no new date or overdue rule, no parser copy touched); `TimelinePanel.tsx` joins the right-panel family (`RightPanelId`, `side-panel-fit`, the tuck rail) and handles its keys in its own `onKeyDown` after VimNav. New portable pref `timelineRange`. - Command keys (`28f7ed99`, `de773eda`): `commandKeymaps` sits beside `keymapOverrides`, with a generated `shared-domain/commands-catalog.ts` that a test rebuilds from `buildCommands()`. `lib/command-keymap-dispatch.ts` is a capture-phase listener that stands down for every overlay; leader sequences run in VimNav after the built-in leader keys, which always win. `[keymaps.commands]` in config.toml, with a courtesy read of bare command ids under `[keymaps]` (`nav.back` is both an action and a command, so it stays the action). `KeymapRecorder.tsx` is shared by Settings and the palette. - Keymap chords in list views (`865c14d0`): `normalizeSequenceToken` keeps `Mod` and resolves it at match time; `lib/list-view-keys.ts` replaces the per-view `metaKey || ctrlKey || altKey` bail. Sidebar trash (`4cb73ecf`): `lib/sidebar-note-actions.ts`, new action `nav.sidebarTrash` (`Mod+Backspace`), and `note.trash` / `note.archive` follow the sidebar cursor when it has focus. - Vim off (`9b070afe`, `701988d2`): VimNav installs one more listener that routes the focused sidebar and panels to their existing Vim handlers with Vim off, typed keys gated; App's `handlePanelKeyWithoutVim` is gone. `CommandPalette.runCommand` records the panel a command moved the keyboard to before the palette closes, which is what made Focus Sidebar stick. Palette hints (`4b7deaff`): `vimOnly` in `commands.ts`. - Share to ZenNotes (`fab6f182`, `27c30cdc`, `605b023b`, `9e35242d`): `apps/share-extension` is a Swift share extension built and signed into the app in `after-pack.js` like Quick Look; it writes JSON into `~/Library/Application Support/ZenNotes/Share Inbox/Captures`, which `share-inbox.ts` drains through `createNote`. `vault.json` gains `sharesLocation`; server vaults need znserver 2.79 (`supportsSharesLocation`). - Unsplash (`15cee9f2`, `1063a4f4`): the key lives in `safeStorage` (refused without OS encryption) and the main process calls api.unsplash.com directly; the web client keeps it in browser storage. Covers stay hotlinked with `banner_credit` / `banner_credit_url` and the download ping, per Unsplash's terms. The cover fold (`0df65fce`) is `lib/cm-cover-fold.ts`, reading cover lines through `readNoteCoverLines` in `shared-domain/note-cover.ts`; `cm-vim-display-line.ts` and `cm-math-nav.ts` step into it like a math block. - Updates (`63594b19`, `7edddae8`): `describeUpdateError` reads an HTTP status only from structured fields (a bare `5\d\d` had matched an HSTS header), and `ErrorDetails.tsx` is shared with the Cloud errors. `release.yml` creates the release with `--latest=false`; a `promote-latest` job marks it latest once all five feeds are up and never over a newer release. - Phones (`d10fdd76`, `c329a9a5`, `ea958af8`, `00cf1621`): the editor host's `openNotesToRead()` decides read or edit; `lib/command-landing.ts` sorts palette commands into read, edit and stay, defaulting to stay. Status bar (`cfd3b103`): portable pref `showStatusBar`, `:set statusbar`. - Smaller fixes: `5d0d78e6` (`resolveQuickNoteTitle` takes `string | null`), `2db21e79` (`filterTasks` takes a note-tags map), `57f9e8b3` (`selectNoteText`, with `leadingTitleHeading` in shared-domain), `39ac61b0` (`sidebarSelectedRowClass`), `aeaa41d4` (comment cursor). #### Demos Clips and screenshots of this release on the release build, attached to this release: **The Timeline**: `Mod+7` opens it beside a project note, with two overdue tasks, today, the quiet days folded and a `#milestone` diamond; `Space n`, `j`/`k` and `x` tick a task off the rail, and Month reaches further ahead. [Watch the clip](https://redirect.github.com/ZenNotes/zennotes/releases/download/v2.79.0/timeline.mp4) (33 seconds, captioned).  **A key for any command**: `Alt+Enter` on Toggle Word Wrap in the palette records F8, and F8 then wraps the note; in Settings, Keymap, Commands, Move Note to Archive takes `Space x a`. [Watch the clip](https://redirect.github.com/ZenNotes/zennotes/releases/download/v2.79.0/command-keys.mp4) (39 seconds, captioned). **Unsplash covers and the cover fold**: the frontmatter folds to `cover · Unsplash photo by ...`, `k` opens it, and the Unsplash tab sets a new photo (recorded against a local stand-in for Unsplash, with real photos and their photographers). [Watch the clip](https://redirect.github.com/ZenNotes/zennotes/releases/download/v2.79.0/cover-fold.mp4) (26 seconds, captioned).  **Share to ZenNotes** from Safari, and the note it files:  **The sidebar with Vim mode off**: `Alt+H`, the arrows walk the tree, and `Mod+Backspace` trashes one note, then three at once with one confirm. [Watch the clip](https://redirect.github.com/ZenNotes/zennotes/releases/download/v2.79.0/sidebar-trash.mp4) (28 seconds, captioned). **The status bar** hides from the palette and comes back with `:set statusbar`: [watch the clip](https://redirect.github.com/ZenNotes/zennotes/releases/download/v2.79.0/status-bar.mp4) (13 seconds). **A folder as a Gallery**: a Recipes folder with image, Unsplash and gradient covers, the letter cards for notes without one, and the cursor ring.  **Database views**: a Pipeline view showing five of a database's 44 columns and three picked rows.  **The callout menu**: Turn into callout… opens the Callout type list for two selected lines.  **Code block languages**: a block without a language, detected as Python, with Python (detected) at the top of the picker.  #### 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`. Turn Vim mode on in Settings for steps 1 to 4. 1. **Timeline.** Write a few tasks with `due:` dates (one in the past, one today, one next week) and one tagged `#milestone`. Press `Mod+7`: overdue tasks sit on top in red, today has an accent ring, the milestone is a diamond. Press `Space n`, then `j` and `x`: the task leaves the rail and the note reads `- [x]`. 2. **Command keys.** Open the command palette, type "word wrap", press `Alt+Enter`, then F8, then Enter. Press F8 in a note: word wrap toggles. Run `:bind <C-BS> note.trash` and press Ctrl+Backspace on a note: it asks to move it to the Trash. 3. **Sidebar trash.** Focus the sidebar (`Ctrl+W h`), move to a note with `j`, press `x`: confirm, and the note is in the Trash with the cursor on the next row. 4. **Select all.** In a note made with New note, click into its text and press Cmd+A (Ctrl+A on Windows and Linux): the title is not selected. Press it again: everything is. 5. **Quick Note prefix.** Settings, Notes, clear Quick Note prefix, then make a quick note: its title is just the timestamp. 6. **Vim off.** Turn Vim mode off, press Alt+H: the arrows walk the sidebar, → expands a folder, ← collapses it, Shift+F10 opens the menu, and `j` does nothing. Open the command palette: no row shows `Space`, `:` or `z` keys. 7. **Unsplash.** Under Settings, Typography, Covers, paste an Unsplash Access Key (make one at unsplash.com/developers) and press Save. Run Add Cover, press Tab, type "fog" and pick a photo: the cover shows with "Photo by ... on Unsplash", and the frontmatter folds to one `cover · Unsplash photo by ...` line. 8. **Share to ZenNotes (macOS).** With ZenNotes running, in Safari choose Share, ZenNotes, then Save: the page is a new note in Quick Notes. 9. **Status bar.** Run Toggle Status Bar: the bar along the bottom goes away. 10. **New sub-task.** With Vim mode on, in a note with `- [ ] parent`, press `o`, then Tab, then type `abc`: the line reads ` - [ ] abc` (it was ` abc- [ ]`). With Vim mode off, Enter then Tab does the same. 11. **Private certificate authority (macOS).** With a server whose certificate comes from an authority in your keychain, launch ZenNotes from the Dock and connect: it connects without `NODE_USE_SYSTEM_CA`. 12. **Gallery.** Put a few notes with covers in a folder, right-click the folder in the sidebar and choose Open as Gallery: the notes show as cards by cover. Press `l` and `j` (or the arrows with Vim mode off) to move, Enter to open. 13. **Database views.** Open a database with many columns, press Columns, Hide all, then tick four. Press +, New table view, and switch back: each view keeps its own columns. Select three rows and choose Show only these in this view: the view reads "Showing 3 picked rows". 14. **New note.** Make a new note, type its name, press Enter (in Vim mode, then `i`) and type `Body`: it lands on the line under `# <name>`. 15. **Callouts.** Select two lines, right-click, choose Turn into callout…, then Warning: the lines become a `> [!warning]` callout. Right-click inside it, Change callout type…, Tip: it reads `[!tip]`. Right-click again, Remove callout: the plain lines are back. 16. **Code languages.** Write a fenced block of Python without a language: its label reads `python · detected` and it is highlighted, while the file still has a bare ` ``` `. Click the label and choose Python (detected): the fence reads ` ```python `. Click the label of another block, type `type`, pick TypeScript, then Undo: the fence is back as it was. #### Distribution channels - **GitHub release:** installers for macOS (Apple silicon and Intel DMG and zip), Windows (x64 and ARM64 installer) and Linux (x64 and arm64 AppImage, deb, rpm, pacman, tar.gz), with five update manifests; the clips and screenshots in Demos are attached too. This is the first release made "latest" by the release workflow itself, only once all five update manifests were uploaded: - **AUR:** `zennotes-bin` 2.79.0-1 (AUR clone `6f48c67`, repo `f47e888d`), pinned to `ZenNotes-2.79.0-linux-x64.tar.gz` SHA-256 `d8120c35…b172`, after the tarball check confirmed the bundled CLI folder is world-readable. - **Nix:** `packaging/nix/release-data.json` lifted from the update workflow ([run 40946961282](https://redirect.github.com/ZenNotes/zennotes/actions/runs/40946961282), bot PR [#​1018](https://redirect.github.com/ZenNotes/zennotes/issues/1018) closed) as `257da0e9`, and [nix-build on main](https://redirect.github.com/ZenNotes/zennotes/actions/runs/40947531769) passed. - **nixpkgs:** [NixOS/nixpkgs#579420](https://redirect.github.com/NixOS/nixpkgs/pull/579420) now proposes 2.74.0 -> 2.79.0, changing only the version and two hashes; the source hash comes from the tag tarball, and the same command reproduces master's 2.74.0 hash. - **Homebrew:** `zennotes` 2.79.0 in the tap (`a778600`), mirrored in `2eab66f2`; both DMGs' SHA-256 match the cask and GitHub's digests; `brew style` clean. - **zn CLI:** the bundled zn is 0.12.2, the latest ZenNotes/tui release. - **Website:** [ZenNotes/website#97](https://redirect.github.com/ZenNotes/website/pull/97) merged with the 2.79.0 entry and five captioned clips, the docs for everything in this release, the server 2.79.0 and Android 1.1.50 entries on their tabs, and the 2.79.0 share viewer (the 2.78.0 viewer kept for pages already open). [ZenNotes/website#98](https://redirect.github.com/ZenNotes/website/pull/98), the [#​1004](https://redirect.github.com/ZenNotes/zennotes/issues/1004) Cloud fix, shipped earlier the same day. GitHub Actions cannot start jobs on the website repository while its billing is blocked, so both ran their full test suite on a Linux machine instead and were deployed to Laravel Cloud by hand (`3c0b57c9`, then `f3b4a1c8`); the live check passed: /releases leads with 2.79.0, the timeline clip matches the merged file byte for byte, seeking works, /docs has the new sections, and both viewers are served. - **Server and Docker:** [ZenNotes/znserver v2.79.0](https://redirect.github.com/ZenNotes/znserver/releases/tag/v2.79.0) pins the browser app `web-2.79.0-web.h3e205408b9525e19` (`0c094f6`, [ZenNotes/znserver#51](https://redirect.github.com/ZenNotes/znserver/issues/51)); all five binaries match `SHA256SUMS`, and the `manifest.json` asset matches the pin byte for byte. `adibhanna/zennotes:2.79.0`, `2.79` and `latest` are published from the tag. The README's install commands name 2.79.0 ([ZenNotes/znserver#52](https://redirect.github.com/ZenNotes/znserver/issues/52)). - **Boundary packages:** `core-2.79.0-core.h7896a01910a2ea0f`, `web-2.79.0-web.h3e205408b9525e19` and `viewer-2.79.0-viewer.h0711b886c5c63e6c`, built by CI from `47d26827` and published as pre-releases (core once both phones were submitted on it). "Latest" names v2.79.0. - **Phones:** iPhone 1.34.0 (build 53, [ZenNotes/zennotesios#83](https://redirect.github.com/ZenNotes/zennotesios/pull/83), on the final core) is Waiting for Review in App Store Connect, set to release automatically; it replaces build 52, which was withdrawn before review. Android 1.1.50 (versionCode 53, [ZenNotes/zennotesandroid#142](https://redirect.github.com/ZenNotes/zennotesandroid/pull/142), which includes lewxdev's [ZenNotes/zennotesandroid#141](https://redirect.github.com/ZenNotes/zennotesandroid/issues/141)) is in Google Play review at 100% rollout with no devices lost, and [on GitHub](https://redirect.github.com/ZenNotes/zennotesandroid/releases/tag/v1.1.50) with Play's signed universal APK. #### Release validation Every CI failure since 2.78.0 was read before this release, and the gates ran in a worktree with its own node_modules on each of the release's tips; on the final commit `47d26827`: typecheck 8/8 with no turbo cache, test:run (shared-domain 2,208, app-core 4,401, desktop 1,255, quicklook 18), a fresh build, a Developer ID signed pack, and the packaged launch check (page target and drawn app in 1.5 seconds, version 2.79.0). The vim-editor, sidebar-vim and editor-improvements smoke suites passed on the first run. Release PR [#​1017](https://redirect.github.com/ZenNotes/zennotes/issues/1017): all ten checks passed; CI on `main` for `47d26827` ([run 40931288961](https://redirect.github.com/ZenNotes/zennotes/actions/runs/40931288961)): all six jobs green before the tag. Release [run 40944582753](https://redirect.github.com/ZenNotes/zennotes/actions/runs/40944582753): all jobs green; `verify-installers.py` ALL GOOD on the five manifests; the app in both DMGs is `Notarized Developer ID` with a valid stapled ticket. `npm run verify:channels -- 2.79.0`: every channel serves v2.79.0 (Homebrew, AUR, Nix and the website's eight download buttons). The new rule that a release becomes "latest" only when all five update manifests are on it held on its first run: publishing the notes left v2.78.0 as latest, and the release workflow's "Mark the release latest" step ran at 20:48:03 UTC, nine seconds after the last manifest (`latest-arm64.yml`) was uploaded. Nobody checking for updates during the upload was offered 2.79.0 before its files existed, the case behind [#​1003](https://redirect.github.com/ZenNotes/zennotes/issues/1003). Late changes were gated again each time: the three fixes found on release morning ([#​1004](https://redirect.github.com/ZenNotes/zennotes/issues/1004) on the server, [#​1009](https://redirect.github.com/ZenNotes/zennotes/issues/1009) and [#​1012](https://redirect.github.com/ZenNotes/zennotes/issues/1012) in the app), then charles b.'s database views and Gallery, [#​1016](https://redirect.github.com/ZenNotes/zennotes/issues/1016) and [#​1014](https://redirect.github.com/ZenNotes/zennotes/issues/1014), and two fixes found by the phone walks (a theme pick raising a phone's keyboard, and typing in a new note going in front of its title, a bug older than this release, also on desktop). Each feature was checked in the built app over CDP with isolated stores before it merged (the Gallery also against a self-hosted server and in the web app), and both phones were walked end to end on their release builds of the final core, with clips. Things that went wrong, told plainly: the vim-editor smoke check "3j follows logical relative line numbers" failed once on a busy machine and then passed five times, beside load and without; its detail was lost, its cause is not named yet, and it is being chased for 2.80.0. One app-core test waited a fixed 80 ms for rows that took longer when every package's tests ran at once; it now waits for the rows (`b996b58b`, no product change). The production dependency audit failed once on `main` because npm's registry refused the request; the same audit passes locally with no high advisories, and its re-run passed. Code signing on the release Mac could not reach Apple's timestamp server over IPv6, so the local pack was signed through its IPv4 address (CI is unaffected). The core, web and viewer packages were rebuilt four times as fixes and features joined the release; only the final ones were published. </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:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODguMiIsInVwZGF0ZWRJblZlciI6IjQ0LjE4OC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ZenNotes for Android 1.1.50 (versionCode 53), on core 2.79.0 (
core-2.79.0-core.h434377c05a50e117, from ZenNotes/zennotes44954fab: the v2.79.0 release commit plus the Covers description fix).d312d77, fix: trust user-installed CAs #141 by @lewxdev): a self-hosted server whose HTTPS certificate comes from your own CA connects once that CA is installed under Settings, Security, Encryption & credentials. Thanks, @lewxdev.5881249): the Cloud hosts trust only the system store and never allow cleartext, so a user-installed CA cannot intercept Cloud traffic; the debug manifest override is gone.3720c84, test9d4d0e6): a server that cannot be reached no longer points Android at the iPhone's Local Network setting; an https server's message says where to install a certificate authority.c4705ac): notes open to read on the phone layout (a search pick or a palette command that goes to a note lands rendered with the keyboard down; a palette toggle or a palette closed without a pick leaves the keyboard alone), viaopenNotesToRead: isPhoneViewportin the editor host. Also the Status bar switch, the cover fold in Edit mode, a blank Quick Note prefix giving a bare timestamp title and the Tasks filter finding a task note by a tag in its body (#1008).4d75483): Toggle Timeline is hidden in the phone layout (its full-screen sheet opens a tapped task's note behind it with the keyboard up); Add Cover from Unsplash and Set Unsplash Access Key are named in the device-wide list (core already gates them on bridge methods this shell leaves out). Toggle Status Bar stays: it hides the Cloud strip on Android.eb832d5): 1.1.50, versionCode 53.caeef0b): the drawer's note, database and file rows open through the read-open hold (drawer-open.ts, same helper as the iPhone shell). Android kept the keyboard down before too (no editor focus after a drawer open), so this is parity with the iPhone fix.66880a8): core's highlight could sit on a row the shell hides, and Return ran it ("timeline" + Return opened the Timeline sheet; reproduced on the release build).palette-hidden-rows.ts(byte-identical to the iPhone's) keeps the highlight on a visible row, makes the arrows skip hidden rows, and lets Return run only a visible row.c75ccd9): the header chevron and the system Back runnav.backthroughopenToRead, for parity with the iPhone (Android did not raise the keyboard here either).main(875604e):a322253(fix: trust user-installed CAs #141 merged onmain), no content change.5b21a31):core-2.79.0-core.h434377c05a50e117from44954fabreplaces the supersededh04cf920466765284; the only change is Settings, Typography, Covers reading "How a note's cover shows." on a host without the Unsplash key row.4cc775b): MCP, CLI and Keymap came back in the Settings section list after a search was typed and cleared (core rebuilds the list);settings-sections.ts(same helper as the iPhone's) hides them on every change. Found on the re-walk.9d3f3b1): core's focus heal raised the keyboard over a note being read on every return to the app;focus-heal.tsnotes whether the editor was focused when the app was left and holds the keyboard down on return only for reading.e827b23): results for sub-tabs and rows the phone hides (Vim, Quick capture, Search, Workflows, Folders and others) are hidden by section and title; a test checks the titles against the installed core.3277415): the Layout switch's reload closed the restored, focused sidebar, and core handed the focus to the editor; the landing now runs under the read-open hold.Validation:
npm run upstream, 406 tests, build and sync; GradletestDebugUnitTest,lintDebugandassembleDebug. The release build was walked twice (on 875604e, then fully again on the refreshed core at 5b21a31, with Settings and the palette re-walked on 4cc775b) on an API 37 emulator (WebView 145) with clips of every phone-facing change; the walk found the hidden-row Return, fixed above and re-walked.#141 shows as merged once this lands on main (its commit is in this branch).