Changed
-
Managed-storage projection recovery is prepared for cheaper durable
publication. Every projection-only producer now records one durable,
description-only turn before graph mutation, while foreground saves replay
through the same turn-level executor. Existing projection receipts remain as
redundant recovery evidence, startup drains semantic edits before projection
turns, and a disposable per-page SQLite digest avoids rendering an unchanged
page merely to prove it needs no terminal repair. Durability-barrier budgets
remain 25 for a save and 74 for a cross-page move. -
The shared parser is updated to lsdoc v0.5.6. Raw HTML recognition now
indexes every supported tag in one source pass, static HTML export renders
safe Hiccup vectors as markup, and deeply nested projections serialize
iteratively instead of consuming the native stack. Native and browser-WASM
consumers use the same released parser and serialization contract. -
Startup no longer loads the complete Settings implementation before the
first page appears. Settings and its plugin, theme, backup, and diagnostics
controls now load only when opened; the small journal-conflict row shared with
Concord remains available independently. Native startup is back within the
immutable v0.4.7 performance budget. -
Managed storage's private receipt-store format has been bumped
(development only). Projection records now carry an explicit target-kind
discriminant, so a private store created by an earlier build is refused with a
named notice telling you to re-activate managed storage for that graph. Your
Markdown files are untouched by the refusal — the check runs before anything
can modify the graph. Managed storage has not shipped, so no released build
can have created such a store; this affects development machines only. -
Saving a page performs fewer disk-durability round trips (28 → 25
core-initiated barriers per accepted single-block save; 77 → 74 for a
cross-page move). Three barriers defended no failure Tine's threat model
covers: a re-flush of a file that was already flushed before publication, a
durable queue-state write on an empty cleanup queue, and a flush of a file
about to be moved aside whose exact bytes are already recorded. Edits feel the
difference most on slow, networked, or synced filesystems.
Added
- Keyboard Shortcuts can now be searched in place (GH #380). The existing
Settings search field filters command names, IDs, and bindings while that
section is open, including built-in shortcuts and a clear no-results state.
Fixed
-
Long pages no longer grow and shrink when a block enters or leaves edit
mode (GH #390). Pane-relative end-of-page breathing room is now derived
from whether the page content naturally overflows, rather than from the
transient presence of a textarea, so its scroll geometry stays stable. -
A held mouse click now shows the block caret on mouse-down, matching
Logseq (GH #368). Exact rendered-text caret placement still applies, and a
drag can still select text in the editor or escalate across blocks. -
Android and system-decorated windows keep frequent top-bar actions directly
visible whenever they fit (GH #205). The overflow threshold now accounts
for whether Tine's three custom window controls actually occupy the row, so a
390px phone no longer hides calendar, journals, theme, and right sidebar in
the...menu while leaving usable space. -
Copying the in-app Guide no longer stops after its first page (GH #391).
Guide pages now carry the same completed-write receipt as ordinary Direct
Files edits, so Tine's native watcher recognizes its own multi-page copy
instead of treating page one as an external change that blocks page two. -
Creating pages on Windows no longer lets a filesystem callback interrupt
the very Tine write that caused it (GH #374). The earlier v0.6.97 repair
proved exact file-event echoes, but an ambiguous Windows callback could still
raise the graph-wide external-change frontier before waiting for the active
writer. Callback admission now serializes behind graph-text publication;
genuine ambiguous or external changes still go through the normal debounced
reconciliation before later creations are admitted. -
Rapid scrolling and zooming no longer make PDF pages compete for the UI
thread or flash blank while sharpening. The reader now has one
viewport-prioritized full-page render scheduler, drops obsolete prefetch work,
pauses speculative rendering during fast wheel bursts, and defers selectable
text-layer construction until scrolling settles. A page's previous bitmap
remains visible until its sharper zoom replacement is complete. The longer-term
tile-aware viewer architecture is tracked in GH #393. -
Long PDFs no longer skip pages or overload the viewer during ordinary
scrolling. Evicting an offscreen page's canvas could collapse its flex
wrapper, shrinking the document while it was being scrolled and making many
distant pages appear visible and render at once. Page placeholders now keep
stable geometry, so scrolling stays sequential and rendering remains local to
the viewport. -
F-Droid can rebuild Tine's browser parser from source again (GH #392).
The logbook code shared with the small WASM wrapper had started reaching into
a tine-core-only module, while Tine's own release path kept using the already
generated WASM bundle. The property recognizer is now one dependency-free
source module shared by both crates. Pull requests and full release CI now
rebuild the WASM bundle from clean source. A daily monitor also files or
updates an Inbox issue when F-Droid's public auto-update pipeline reports a
new failure. -
Unlinked References now opens when a matching source page contains 10,000
or more blocks (GH #388). Managed storage was applying the whole-page
editor payload limit before constructing the already-bounded reference
result. Large source pages now take one linear authenticated read while the
panel keeps its existing row and byte limits. -
PDFs no longer flash and disappear when two render triggers reach the same
page together (GH #275). Visibility and navigation could both begin before
the first PDF page lookup finished, causing PDF.js to reject two simultaneous
renders into one canvas. Each page now has one render owner from before its
first asynchronous lookup through completion, zoom, eviction, or teardown. -
The block you are typing in stays above the Android keyboard toolbar
(GH #384). Tine now accounts for its own toolbar when focus moves, the block
grows, or the keyboard viewport changes, instead of letting the active text
remain hidden behind the fixed controls. -
Pressing Back beyond the first Android page now closes Tine instead of
leaving a gray, unusable screen (GH #386). Storage was already stopped
safely, but the final handoff called a Tauri command that does not exist.
Android now uses the installed process-exit API after the same guarded save
and shutdown checks. -
Enter at either side of an in-block line break now creates a clean new
block (GH #361). The first fix handled the caret at the start of line two,
but pressing Enter at the end of line one still copied the newline into the
new block as an empty first line. Both caret positions now consume the same
structural boundary on desktop and mobile while preserving intentional blank
lines. -
Android page links now open their page menu consistently on long-press
(GH #207). Body wiki links, links and page headers in Linked References, and
page results in search now distinguish Tine's deliberate hold from the
browser's native text-selection gesture. Quick taps, scrolling, and desktop
click gestures are unchanged. -
The keyboard-shortcut recorder now captures Control on macOS (GH #378).
Physical Control is recorded asctrl, while portablemodremains Command
on macOS and Control on Windows/Linux. -
Pages no longer become narrow or jump sideways when you start editing or
expand references (GH #382). The pane-relative end-of-page space added in
v0.6.96 accidentally let the centered page column shrink to the width of its
current contents. Standard pages now hold a stable reading width, and Wide
mode fills the pane as intended. Settings → Appearance → Advanced also lets
you tune the standard width or give Wide mode a custom maximum on this device. -
Saving a page in a subfolder no longer costs extra waits for the disk.
Every time Tine wrote or renamed a file in your graph, it asked the operating
system to confirm not just the folder it had actually changed, but every
folder above it up to the graph root. A page inpages/Work/Notes.mdtherefore
waited three times where a page inpages/Notes.mdwaited once, on roughly six
file operations per save. Only the folder that actually changed is confirmed
now; a folder Tine has just created is still confirmed at the moment it is
created, so a crash cannot lose the path your page was written into. On
Managed Storage an ordinary edit now waits on 28 disk flushes instead of 37,
and a cross-page move on 77 instead of 93 -- measured both on a test fixture
and on a 1,045-file copy of a real graph. -
Managed Storage saves wait on fewer disk flushes. Each accepted edit used
to write four small bookkeeping files whose only job was to notice if
something had swapped out a folder inside Tine's own private data directory --
which nothing but a program already running as you could do, and which Tine
does not defend against by design. Each of those files cost two waits for the
disk to confirm, on every page an edit touches. They are gone, and Tine now
simply recreates the folder if it is missing instead of refusing to save the
page forever. An ordinary edit now waits on 37 disk flushes instead of 45, and
a cross-page move on 93 instead of 109. On a slow or network-backed disk that
wait is the bulk of the delay between finishing a keystroke and the file being
safely on disk. -
Opening and scrolling the Journals feed no longer walks the whole graph on
Managed Storage. The feed was assembled by enumerating every page in the
graph and then loading the handful of days it actually shows -- on every
open, and again for each three-day step as you scroll back. The runtime now
keeps the graph's journal days indexed and rebuilds that index only when
something is actually accepted, so a feed page costs a lookup plus its own
page loads. Going back to Journals with nothing changed in between does no
graph-sized work at all, and the whole request is now answered in one
runtime turn instead of one per page. -
Managed Storage saves stop paying a disk round trip per internal file.
Every accepted edit fanned its history out into several separately-flushed
private files, and each flush is a real device round trip: one single-block
save performed 55 of them and a cross-page move 130. On a local SSD that is
tens of milliseconds; on a slow, network, or phone filesystem it is what makes
an edit feel heavy. An accepted edit's history is now written and made durable
as ONE unit -- 45 and 109 -- and three flushes that ran before reading a
file, which could not affect what was read, are gone. Crash safety is
unchanged and is now stated and tested: a save interrupted by a crash or power
loss is either fully recorded or not recorded at all, never half-written, and
the graph still reopens and completes the same edit.
Download an installer for your platform below. Windows and Linux ship both x64 and ARM64 builds (match your CPU). Windows users who prefer no installer can grab the portable Tine_*-portable.zip for their architecture. macOS and Windows builds are currently unsigned, so their operating systems may show a warning on first launch. On macOS, if Tine repeatedly asks to access Documents, see the workaround in the README.