github martinkoutecky/tine v0.6.98
Tine v0.6.98

latest releases: v0.7.1, v0.7.0, beta...
one month ago

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 as ctrl, while portable mod remains 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 in pages/Work/Notes.md therefore
    waited three times where a page in pages/Notes.md waited 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.

Don't miss a new tine release

NewReleases is sending notifications on new releases.