Skip to content

Release 1.36.0 (build 55) - #86

Merged
adibhanna merged 14 commits into
mainfrom
release/1.36.0
Nov 2, 2026
Merged

adibhanna merged 14 commits into
mainfrom
release/1.36.0

Conversation

@adibhanna

@adibhanna adibhanna commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

ZenNotes for iPhone 1.36.0 (build 55) on core 2.81.0. Archive from the version commit 83215fa, which main fast-forwards to.

  • Core 2.81.0 (c241b9e, refreshed to the shipping build in 97c4790): core-2.81.0-core.h4e6a38a3361b4748 from ZenNotes/zennotes bfab9fdc (the v2.81.0 tag), provenance checked by core:adopt. From core: recurring tasks (Repeat…, Skip this time) and Remind… (the desktop app delivers reminders, so Settings shows no reminder section on a phone), New Kanban, Kanban column colors, folder fields that list the vault's folders, tight list Enter that ends a list with a blank line, Back from a task's note returning to Tasks, no keyboard cursor, key hints or lit menu rows on a phone, hover styles only where a pointer can hover, and a database that cannot open saying so once.
  • Shell, from the 2.81.0 walks:
    • 54528c6 New Kanban in the New sheet; b87509d New Kanban in a folder's sheet in Browse (core's createBrowseKanban).
    • 6258d0e a database Board card opens its menu on a long-press (the iPhone web view never starts an HTML drag, so cards move through Move to…).
    • 5699a7a Return on an empty bullet ends the list (iOS sends Shift+Return at the start of a sentence).
    • fe2f286 the Tasks board's Move to… sheet names columns as their headers do, once each (a port of zennotesandroid 3696d7c).
    • 7c45d21 the calendar's arrows step a week in Week mode.
    • 036feb6 a Settings field low on the screen rises above the keyboard; the editor's own reveal is untouched (#891).
    • d6bd259 a long-pressed menu opens without a blue focus ring.
    • 19a41dc a database deleted outside the app closes its tab instead of stacking toasts (a port of zennotesandroid e0f09d5).
    • 6f0721c the database Table keeps long names clear of the hover Open and its select column at 40 px.
    • 31a90d6 a record page opened from the Table's page glyph opens to read, keyboard down (read-open.ts, byte-identical with the Android shell's).
  • Already on main: 15f9506 the iOS 27 top edge and views to the bottom edge ([UI/Dark Mode] Whitish overlay at the top and unnecessary blank space at the bottom zennotes#1035).
  • Version (83215fa): 1.36.0, build 55 in all six configurations.

Validation: npm ci, npm run upstream (boundaries, typecheck), 464 tests. Release simulator builds (iOS 27.2, iPhone 17 Pro, dark mode, generic data) were walked end to end on the candidate cores and again on the shipping core, recording ten clips (docs/releases/v1.36.0/media/iphone-*.mp4, local): recurring tasks, a task reminder, New Kanban from the New sheet and a folder, column colors, the folder picker above the keyboard, list Enter, the Week arrows, Back to Tasks, and the iOS 27 top edge. The final check on the shipping core: lists end with a blank line and the next sentence is its own paragraph in Read mode; no tint stays under a finger; hover-only controls show; menus open with no row lit; a deleted database closes its tab without toasts; the Table keeps long titles and its select boxes clear.

…colors and the folder picker

Core 2.81.0 (core-2.81.0-core.h0aaaccaf974a3d72, from ZenNotes/zennotes
bcce61e1) brings recurring tasks (@repeat, Repeat… and Skip this time),
New Kanban, Kanban column colors, folder fields that list the vault's
folders, tight list Enter, Back from a task's note returning to Tasks, and
no keyboard cursor, key hints or reminder settings on a phone. Reminders
fire from the desktop app; a phone writes @remind and shows the bell.
Core 2.81 gives a folder a Kanban board of its own
(ZenNotes/zennotes#1038): a database, Untitled Kanban.base, with a Status
of To do, Doing and Done, that opens on its Board. Desktop reaches it from
a folder's right-click menu, the palette, Space k and :kanban. A phone has
the palette, which few people open, and no right-click.

The New sheet now carries New Kanban right after New database. It runs
core's database.new.kanban command, so the board lands where new databases
go (Settings, Vault): a phone has no sidebar cursor for core to read a
folder from, and core exports no folder-scoped create, so the drawer's
folder sheet does not offer desktop's per-folder New Kanban.

create-sheet.test.ts holds core to the command id and the sheet to the
row's place, so a rename upstream fails at the next adoption instead of
leaving a dead row. It reads core 2.81's commands.js, so it lands with
that adoption.

Verified on an iOS 27.2 simulator against the candidate core
2.80.1-core.h8b304dc7b8ce413e (desktop 6f978958): the row writes
inbox/Untitled Kanban.base and opens its Board, Add card works.
Walking core 2.81's New Kanban on the iPhone: cards could be added from
Add card, but none could leave To do. A database Board moves a card by
HTML drag and drop, and a WKWebView on an iPhone never starts one; a
long-press on a card did nothing, and dragging it only scrolled the board.

Core 2.81 gives a Board card a menu (Open page, Move to each other column,
Delete card…), opened by a right-click or `m`. The phone has neither, and
the card was not one of the surfaces whose long-press the shell turns into
a contextmenu event. [data-db-board-card] is one now, so a long-press opens
that menu and Move to Doing moves the card, written to data.csv like a
desktop drop. A tap still selects the card, and its arrow still opens the
card's page.

This does not add a drag gesture to the database Board as the Tasks board
has; the menu is the one way a card changes column on the phone.

Tests: the long-press surface, and the core markup it relies on (the
card's drag and right-click handlers, the Move to rows).

Verified on an iOS 27.2 simulator with the candidate core
2.80.1-core.h8b304dc7b8ce413e: long-press Buy seeds, Move to Doing, and
data.csv reads Doing; the card is not left dimmed afterwards (no dragstart
fires on the iPhone, so the shell needs no drag suppression there).
Walking core 2.81's list Enter fix on the iPhone: Return on an empty
bullet left the bullet and opened a line under it, where desktop ends the
list. It was never the list command. Return reached the editor as
Shift+Return.

iOS sets shiftKey on a soft-keyboard key while the keyboard is shifted for
a capital, and with the editor's autocapitalize="sentences" that is every
sentence start: an empty bullet, a fresh line. CodeMirror drops the shift
from Return itself, but only while the visual viewport is under 85% of the
page. A phone runs KeyboardResize.Native, which shrinks the web view, so
page and viewport shrink together and CodeMirror takes the keyboard for
closed. No binding takes Shift+Enter, so the Return landed as a bare line
break: no list end on an empty bullet, and no list, task or quote
continued from a Return typed at a sentence start. Logged on the
simulator: the Return keydown on an empty bullet carried shiftKey true,
and so did the key CodeMirror replays from it.

soft-return.ts applies CodeMirror's own rule with the shell's answer to
whether the soft keyboard is up (html.zn-kb-open and its height, which
main.tsx already publishes): a trusted, shifted Return in the editor,
with autocapitalize on and a keyboard of 150 px or more, is handed to
CodeMirror again without the shift, and the real keydown goes on to type
the line break CodeMirror reads back as that Enter. Phones only, where
Native resize hides the keyboard from CodeMirror. A hardware keyboard
leaves only its bar on screen, under the height test, so a real
Shift+Return keeps its shift.

Tests: the rule's cases, and the two facts that make it needed (CodeMirror's
viewport test, the phone's Native resize).

Verified on an iOS 27.2 simulator with the candidate core
2.80.1-core.h8b304dc7b8ce413e, pressing the keyboard's own keys: "- One",
Return, Return now leaves "- One" and a plain line (before: "- One",
"- ", and a new line). A blank line between the first two bullets, then
Return after "Two" and "Three", puts each new bullet right below. Return
after a sentence and after "- [ ] Task" behaves as before.
Walking the Tasks board on core 2.81: a card's move handle opened a Move
to… sheet listing "undated" and "in-progress" between Today and Waiting.
The sheet named columns from its own map of status ids, which knew Today,
Upcoming, Waiting and Done but not the No due date and In progress
columns core has since added, so those fell through to their raw ids. A
column the user renamed showed its old name, and with lanes on every
column was listed once per lane as well as for its header (25 rows for
five columns and four priority lanes), since all of them carry the
column's id.

The sheet now takes each column's title from the column header core draws
(its label, a rename included) and keeps the id map only for a header
that shows no title, mid-rename. Each column is offered once. A port of
the Android shell's fix from the same walk.

Tests: the sheet prefers the header's title, lists a column id once, and
the core markup it reads (the header marker, its title, the lane cells).

Verified on an iOS 27.2 simulator with the candidate core
2.80.1-core.h8b304dc7b8ce413e: the sheet reads Today, No due date, In
progress, Waiting, Done, once each with lanes by priority on; renaming
Waiting to Blocked shows Blocked; In progress moves Call the plumber to
`- [/]`.
Walking the Tasks calendar on core 2.81: in Week mode the arrows beside
Today jumped a month, from Nov 1 to Dec 1, and showed the week of the
first of the next month. The Week scope is the shell's own: it hides every
row of core's month grid but the selected day's. The arrows are core's
month steps, which keep the day of the month and move the month.

In Week mode a tap on an arrow now becomes core's own tap on the day a week
away, which selects that day and follows it into its month; the week shown
is built around the selected day, so it moves by one. A day the month's six
weeks do not hold (a week back from the first row, a week on from the last)
is picked once core's arrow has turned the month. Month mode keeps the
month step, and VoiceOver reads the arrows as Previous week and Next week
in Week mode. Nothing here needs a core export: core has no public setter
for the calendar's date, and the day cells it draws do the work.

Tests: the week math across month and year ends, the anchor, a step in and
out of the grid, the shell's wiring, and the core markup it relies on (the
arrows' month step, a day's tap following it into its month).

Verified on an iOS 27.2 simulator with the candidate core
2.80.1-core.h8b304dc7b8ce413e (weeks start on Monday): from Today, Sunday
Nov 1, Next shows Nov 2 to 8, then 9 to 15, 16 to 22, 23 to 29, and Nov 30
to Dec 6 under December's header. Previous from Nov 1 shows Oct 19 to 25
under October's. Next from Monday Nov 30 shows Dec 7 to 13. Month mode
still steps November to December.
Walking core 2.81's Settings on the iPhone: a tap on a folder field low on
the screen (Task folders, the folder board's root) left it under the
keyboard, and its folder list opened above it and ran under the keyboard
too. The field came into view only on the first keystroke.

A phone runs KeyboardResize.Native, which shrinks the web view itself, so
WebKit never learns that a keyboard covers anything and leaves a focused
field where it was; a keystroke reveals the caret, which is why typing
fixed it. editor-keyboard-scroll.ts does that work for the caret in a note.
Nothing did it for any other field.

field-keyboard-reveal.ts does, outside the editor. Once the keyboard is up
it scrolls the field's own containers until the field sits 12 px above the
keyboard, and core re-places the folder list on that scroll, in full on
whichever side of the field has room. It runs when something can have
covered the field (the keyboard landing, the web view getting shorter,
another field taking the focus with the keyboard up), and a finger on the
screen drops the steps still pending, so a page dragged with the keyboard
up stays where it was put. A field inside .cm-editor is never touched: the
note and its search panel keep the editor's own reveal, as
ZenNotes/zennotes#891 left it. Phones only, beside the Return fix, where
Native resize applies.

Tests: the reveal over a scripted page (lifted once the web view shrinks,
settled when no resize follows, the editor never moved, nothing with the
keyboard down or under a finger, the next field focused with the keyboard
up), which fields count, how far it scrolls, and where it is installed.

Verified on an iOS 27.2 simulator with the candidate core
2.80.1-core.h8b304dc7b8ce413e and a 301 pt keyboard whose top is at 573:
the folder board's root, tapped at 573 to 607, now sits at 527 to 561 with
its list above it (321 to 523); Task folders, tapped at 691 to 725, the
same with its list at 225 to 523. A page dragged with the keyboard up stays
where it was dragged. In a 150-line note, a tap on a line the keyboard
covers lifts the caret to 463 to 483, above the toolbar at 496, and swipes
with the keyboard up scroll on without snapping back, the same numbers as
before the change.
Core 2.81 gives a folder a Kanban board of its own (ZenNotes/zennotes
#1038), and on desktop that lives on the folder's right-click menu: the
board lands in that folder. The phone had only the New sheet's New Kanban,
which puts a board where new databases go (Settings, Vault), so a board
for Projects meant making one and moving it.

A long-press on a folder in the drawer now offers New Kanban, after Open as
Gallery. It runs core's new createBrowseKanban with that folder, on the
workspace the sheet was opened in, so "Untitled Kanban.base" is written in
the folder and opens on its Board with To do, Doing and Done. The row
carries the New sheet's glyph and wording, and shows for folders only, not
for a database's own sheet. Core refuses a folder inside a database, which
the drawer never lists. The New sheet's note, which said core had no
folder-scoped create, now points a board for one folder here. The same
change as the Android shell's.

Tests: the row sits between Open as Gallery and Rename for folders, with
the New sheet's glyph; it creates through createBrowseKanban on the sheet's
host and folder; the adopted core exports that create, placing the board in
the folder it is given and refusing one inside a database; and the New
sheet's note no longer says otherwise.

Verified on an iOS 27.2 simulator with the candidate core
2.81.0-core.h95b33cd70590f8d3 (desktop 507f117d): a long-press on Projects
lists Pin, Open as Gallery, New Kanban, Rename, Move to…, Delete; New
Kanban writes inbox/Projects/Untitled Kanban.base (data.csv with id, Name,
Status, and schema.json) and opens its Board on To do, Doing and Done.
Walking the 1.36.0 Release build on an iOS 27.2 simulator: the first
long-press after launch opened the task menu inside a blue ring, and so did
a long-press right after typing in a field. A long-press after any tap
showed none.

Core's context menu focuses itself as it mounts, so its keys work at once.
WebKit rings a scripted focus that no tap came before (the menu matched
:focus-visible, outline auto 3px), and a long-press is no tap: the shell
opens the menu with a synthesized contextmenu event and swallows the
finger's click. So the ring came with any menu that was the first thing
touched, or the first after the keyboard.

The menu itself now wears no ring on a phone or tablet. Its rows still show
where the finger is, and keys still move through them. Core's desktop menu
keeps its ring for keyboard use.

Tests: the rule, and the two facts that make it needed (the shell's
synthesized contextmenu, core's focusable menu that focuses itself).

Verified on the Release build with the core 2.81.0 adoption: relaunch, then
long-press Pay rent in Tasks. Before, the menu matched :focus-visible with
outline auto 3px and a ring in the screenshot; after, it still matches
:focus-visible but its outline is none, and no ring shows.
… toast storm

The Android release walk of 1.1.52 (ported from ZenNotes/zennotesandroid e0f09d5;
the iPhone shell passes the same call through): a Kanban board open in a tab, its folder then
deleted outside the app (a file manager, sync from another device, another
app on the vault), and the app relaunched. 1,089 "Database not found"
toasts stacked over the screen, and the dead tab came back on every launch.

The bridge contract answers null for a database that is not there, as
desktop's main process does, and core then forgets the database and closes
its tab. The shell passed the shared database ops' openDatabase straight
through, and that throws "Database not found: <path>" instead. Core showed
the error as a toast, and its grid, still without a database, asked again
on its next render, so every pass added another toast.

openDatabase now answers null for exactly that error (database-open.ts).
Every other failure, a file that cannot be read or a schema that cannot be
parsed, still throws and still reaches the toast, as it should.

Verified on the release build: relaunching with the dead tab active shows
no toast and lands on the next tab; a board deleted while the app was in
the background is gone on return, with no toast.

Tests: a missing database answers null, a found one passes through and any
other error still throws; the bridge hands core the wrapped call; and the
contract on both sides (the shared ops' throw, core forgetting on null and
toasting a throw, the bridge type allowing null).
…uch screens lose the sticky tint

Core core-2.81.0-core.h4e6a38a3361b4748, built from ZenNotes/zennotes
bfab9fdc, the v2.81.0 tag. Since the candidate this branch adopted first:
ending a list leaves a blank line, so the next text is a paragraph of its
own; a database that cannot open says so once with Try again instead of
asking again on every render; menus open with no row lit; and hover styles
apply only where a pointer can hover, so a tap no longer leaves a tint,
while the controls that appear on hover show all the time on a phone.

The database-open contract test reads core's new failure path: the error
still toasts once, and core now records it (databasesLoadError).
…oxes clear

Core 2.81.0 shows hover-only controls on a screen that cannot hover. Two of
them crowded the database Table on a phone (both phones' final checks of
the 2.81.0 tag): the row's Open, a hover shortcut laid over the end of the
name cell, hid the end of every long name, and the select column, its box
now always shown, shrank to 18 px against the screen's edge once a long
title widened the Table.

The phone drops that Open (the page glyph left of the name opens the page)
and keeps the select column at 40 px. Core takes the same Open away on its
own in the next release; this holds the phones until then.
…board down

The database Table's page glyph, left of a row's name, is the phone's way
into a record page (the hover Open is hidden on phones). The page opened
with the caret in its frontmatter, so the keyboard came up and its first
Back only lowered it: leaving took two (the Android check of 2.81.0). A
tap on that glyph now opens to read, as a note from a Kanban card does.
read-open.ts stays byte-identical across the two shells.
@adibhanna
adibhanna merged commit 83215fa into main Nov 2, 2026
1 check passed
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