github martinkoutecky/tine v0.6.981
Tine v0.6.981

latest releases: v0.6.986, v0.6.985, v0.6.984...
23 days ago

Added

  • The graph menu now has a right-click menu on every graph row. Opening a
    graph in a second window was reachable only by Shift-clicking a row, which
    nothing announced. Right-clicking a row now offers Open in a new window
    and Open here, plus Show in folder, Copy path, and Remove from
    this list
    . The row for the graph this window already has open keeps both
    open actions visible but inert and says why, so the menu does not change
    shape from row to row; mobile, which has neither peer windows nor a file
    manager, shows the actions that apply to it.

  • PDFs are now ordinary pane tabs instead of a separate global side pane.
    Opening a graph PDF on desktop preserves the source and uses one reusable
    companion pane; the PDF tab can be moved into any existing pane, split, or
    quadrant, and its Notes action opens the hls__ page in the structural
    companion. Workspaces restore the layout and each PDF tab's page/zoom, while
    legacy dedicated-pane sessions migrate without losing their existing panes.
    Android keeps one route surface and Back returns through Notes, PDF, and the
    source page in order.

  • Alt+click opens an internal page or block link in the other pane.
    After the unified click contract moved Ctrl/Cmd+click to background tabs,
    ordinary links had no mouse+modifier route to a pane; Alt+click is that
    route again, matching the long-standing Alt+click / Alt+Enter gesture on
    Search and Quick Switcher results. It splits right when there is only one
    pane, and Shift+click (right sidebar), Ctrl/Cmd+click and middle-click
    (background tab) keep their existing meanings everywhere. (GH #438)

  • Declarative themes can now shape reading presentation without running code.
    Theme API 0.2 adds bounded Tine-owned presets for editorial serif typography,
    journal headers, and a Today task summary, while existing color-only 0.1
    themes remain compatible and logseq/custom.css still wins the cascade.

  • Managed-storage group deletions now have an explicit recovery surface.
    Tier 2 and Tier 3 absence sweeps raise a warning and remain available in a
    Deleted pages dock with their member pages and durable action status. Restore,
    Re-apply, and Keep deletion map directly to the recorded backend actions;
    failed restores retain their cause and can be re-run, while dismissing the
    warning or closing the panel never records a deletion decision.

Changed

  • Settings remembers whether you maximized it. The maximize control added in v0.6.95 reset on every open, so anyone who prefers the wide dialog had to press it again each time. Settings now opens at the size you last left it, on this device, across restarts. If you have never pressed the control, nothing changes (GH #427).

  • PDF rendering now uses PDF.js's maintained page-view lifecycle under one
    window-wide admission and canvas-memory budget.
    Visible/focused pages win
    scheduling, stale work is cancelled, evicted views synchronously release
    their backing stores, and zoom above 300% sharpens only visible clipped tiles
    while retaining an aligned lower-resolution fallback. Area highlights use a
    dedicated clipped capture, and a tab cannot multiply the old per-view
    resource ceilings. (GH #393)

Fixed

  • LaTeX math now renders inside italic and other emphasized Markdown. A
    whole agent response can be italic without turning valid $…$ or $$…$$
    fragments back into literal dollar text. The shared parser now preserves
    top-level-valid math through ordinary italic, bold, strike, and highlight
    containers while leaving invalid math, code spans, Org, and unrelated link
    labels unchanged. (GH #460)

  • Typing a PDF page number and pressing Enter now stays on that page. The
    input could jump the reader and then immediately restore the old page number
    when it lost focus, so the requested position was not retained or restored
    with the PDF tab.

  • Annotating a PDF while its notes page was being saved could freeze Tine
    completely.
    The two writers of an hls__ page took the same two internal
    locks in opposite orders, so each could end up waiting for the other. Because
    one of those locks is shared by the whole graph, the freeze was not confined
    to that page: once it happened, no further edit anywhere in the graph could be
    saved until Tine was restarted. Six write paths took the locks in the wrong
    order — PDF opening and annotation, the three conflict-resolution paths, and
    one projection-recovery path — and all of them now take them in the order the
    ordinary page save has always used. A check that walks the source now fails the
    build if any future write path reintroduces the inversion. Only debug builds
    ever reported this as an error; release builds, which is what everyone runs,
    froze silently, which is why it survived so long.

  • Clicking in the empty space after a block that ends in formatting now puts the caret at the very end. On a block like *some text in italics.*, clicking past the last letter landed the caret between the letter and the closing marker you cannot see, so pressing Enter split the italics instead of starting the next block. The click is now read as "the end of this block" wherever it lands past the final glyph, for emphasis, bold, inline code and their Org equivalents alike; a deliberate click inside formatted text still lands exactly where you aimed (GH #465).

  • Modifier-clicking a bullet now sends the block where the same modifier sends a link. Ctrl/Cmd-click (or middle-click) opens the block zoomed in a background tab, Alt-click opens it in the other pane, and Shift-click still opens it in the right sidebar; before this, only Shift did anything and every other modifier just zoomed in place. Reference bullets in linked references, query results and embeds answer the same four gestures (GH #456).

  • Shortcuts whose only modifier is Alt now work while you are editing a block. A binding such as Alt+S for the next tab fired everywhere in the app except inside a block, where you had to add a second modifier; it now fires there too. Alt combinations you have not bound to anything still reach the text, so accented characters typed with Alt/Option are unaffected (GH #461).

  • Ctrl/Cmd+Enter in search opens the highlighted result in a new tab, matching what Ctrl/Cmd-click on the same result already did, and leaves the search open so you can fan several results out in a row (GH #463).

  • Sidebar: only the page title in a sidebar row is a link now, not the whole width of the row. The blank space to the right of a short name showed the hand cursor and opened the page, which made reordering favourites a coin toss — grab a row to move it, and it navigated instead. That space belongs to the drag now, and favourites show a grab cursor to say so. Right-clicking anywhere on a row still opens that page's menu (GH #464).

  • Block references: the small reference-count badge now sits on a block's first line instead of dropping to the bottom-right corner once the block wraps onto several lines. It is a right-floating chip, and a float rides whichever line the browser is on when it meets it — emitted after the text, that was the last line. It is now emitted before the text, so it looks the same on a long block as on a short one (GH #454).

  • Outline: a block's bullet now sits on the middle of that block's first line of text instead of 2px above it. The bullet's column was sized to the line height but not to the small padding above the text, so every bullet in the graph was slightly high — and twice as high under the editorial-serif typography preset, which makes the line taller. The line's height is now defined in one place and the bullet column follows it, so a typography theme moves both together (GH #459).

  • Settings: choosing Graph, Journals or Backups & recovery no longer makes the whole Settings window flash away and come back. Those three sections fetch something as they open, and that was enough to tear down the dialog around them; the section list, the search box and the window now stay put while a section loads (GH #409).

  • Diagnostics: Tine no longer claims it "did not close cleanly last time" every launch on iOS, iPadOS and Android. A phone or tablet reclaims a backgrounded app as a matter of course, and Tine counted that as a crash because it had no other way to tell that a mobile session had ended; it now treats going to the background as the end of the session and coming back as the start of a new one, so a crash you actually see is still reported (GH #426). The desktop half of the same report, the warning after an ordinary quit on Linux and Windows, is fixed separately in this release (below). One last warning is expected the first time you open this version, from the marker the previous one left behind.

  • Sidebar: the left sidebar's scrollbar can be grabbed with the mouse again. The drag-to-resize strip along the sidebar's edge was drawn on top of it, so on Windows the sidebar could be resized but never scrolled by dragging; the strip now sits beside the scrollbar rather than over it (GH #435).

  • Outline: clicking a block's fold arrow no longer folds the entire subtree. The guide line beside the children (which folds every descendant) was drawn on top of the fold arrow's leftmost pixels, so an aim that landed slightly left of centre hit the wrong control. The guide now stops at the arrow's edge (GH #423).

  • Theme packaging: tine-theme.mjs check no longer certifies a ported theme that Tine then refuses to install. It checked only the upstream source, revision and author list, so an unsupported portedFrom.ecosystem, a missing relationship, name or license, or an unknown provenance field passed the registry check and failed on install. The checker now holds portedFrom to the same vocabulary the app installs against (GH #410).

  • Links to local files and folders now open. A link written the Logseq way
    ([Test](file://D:\test.txt)) or the Obsidian way
    ([Test](<file:///D:\test.txt>)) rendered as a live link but did nothing at
    all when clicked: the backend refused every scheme but http/https/mailto, and
    the renderer discarded the refusal so nothing was reported either. file:
    links now go to the OS default application for that file or folder, matching
    Logseq, and any link that cannot be opened — a bad URL, a path that is no
    longer there — says so instead of failing silently. Every other scheme stays
    refused. (GH #444)

  • Editing-toolbar buttons on mobile no longer depend on a WebView emitting a
    click.
    On iOS 27 the toolbar appeared but nothing responded to taps, while
    the same build worked on iOS 18.5: the buttons acted only on the click a
    browser synthesizes after a pointer press, and that press is deliberately
    cancelled so the editor keeps focus. The tap itself now performs the action,
    with click kept as the keyboard and assistive-technology path. (GH #434)

  • Long-pressing a page link on iOS or Android no longer raises the system
    text-selection bar over Tine's menu.
    The same hold that opens Tine's context
    menu is also the platform's own selection gesture, which no amount of event
    handling on our side can call off — so page links and tags simply decline to
    be selected on touch. Menus themselves are now unselectable everywhere. On
    desktop you can still drag a selection across a link's text. (GH #452)

  • Dragging a block by its bullet no longer paints a blue trail behind it.
    On macOS the drag doubled as a text selection and highlighted every block it
    passed over, which made the landing spot hard to read. The same guard the
    sidebar already used now covers the outline. (GH #424)

  • A wide table no longer drags its "Add row" label across the screen. The
    control spans the whole table, so its centred label sat at the midpoint of the
    full table width — off to one side and travelling as you scrolled sideways.
    The row keeps its full-width click target; only the label is now pinned to the
    visible edge, the way the first column already is. (GH #449)

  • iPad now behaves like a tablet instead of a Mac. The on-screen editing
    toolbar (indent, move, insert) never appeared while editing on iPad, and
    long-press, text selection and window chrome all took their desktop branch.
    iPadOS 13+ serves a desktop-class Macintosh; Intel Mac OS X user agent from
    a stock WebView, and Tine was reading the platform out of that string; it now
    comes from the build itself. Split panes stay available on iPad — they follow
    the size of the screen, not the name of the operating system. (GH #446)

  • A reported switch between Direct Files and Managed Storage now survives a
    crash at the selector boundary.
    App-private storage-mode bindings use the
    same certified durable create/replace/retire primitive as other authority
    names, including Windows write-through retirement and Android parent-entry
    flushing. Once activation reports Managed active, a stale Direct selector can
    no longer reappear after power loss and take precedence at the next startup.

  • Rapid Managed Storage moves no longer reuse a stale source page and then
    flood “missing or foreign root” errors.
    Repeated cross-day commands now
    resolve one at a time against the preceding accepted move, while the actor's
    temporary response-replay files are retired after the committed page pair is
    installed. A native journey drives 120 uninterrupted move commands across
    four journal-day boundaries and compares that pressure with a durable
    20-block cross-page cut/paste.

  • Direct Files saves now use durable write-through name publication on
    Windows.
    Creating, replacing, restoring, and retiring the sole-authority
    Markdown/Org name all cross the certified typed storage boundary, so a power
    loss cannot be acknowledged merely because a non-write-through rename was
    briefly visible.

  • A second device can join a synchronized graph that contains an honest
    duplicate-name backup file.
    A fresh scan may choose the earlier-sorting
    backup even though the shared history already owns the canonical page path.
    Join now accepts that shape only when the provider-owned exact file is still
    present with exactly the shared semantics and both physical files decode to
    the same page identity; the extra file remains untouched. The Android
    app-UID journey now covers activation, share, a distinct-device join and
    reopen, and the real graceful Return-to-Direct-Files composition.

  • Managed Storage has one production actor and enrollment path. Dead
    pre-clean-runtime mutation, provider, cursor-join, and handoff state has been
    removed from the retained actor, and a source guard prevents those fields or
    types from returning to the production prefix of sync_runtime.rs.

  • Managed Storage pages remain editable after heavy use evicts them from the
    in-memory document cache.
    A cold point load now reconstructs the page from
    its accepted history instead of mistaking the cache miss for an untouched
    page. Retained-runtime recovery also reports content-free native sub-stages
    and has a tighter real-corpus performance gate.

  • A remote http:/https: link whose URL ends in .pdf now opens in the
    browser like every other external link, instead of being captured by Tine's
    PDF viewer.
    Only graph/local asset PDF references and their highlight
    pages enter the viewer; an image-syntax remote PDF renders as an ordinary
    external link as well rather than a broken image frame. (GH #442)

  • The PDF reader's Close control is now the terminal toolbar action. It
    stays at the conventional far-right edge with an explicit accessible label,
    instead of reading like another tool in the middle of the control cluster
    (GH #443).

  • Bounded managed block-referrer panels now show the same document-order
    prefix and exact result count as Direct Files.
    The SQLite-backed route
    finishes generation-bound candidate discovery before applying the shared row
    and byte budget, instead of truncating an internal-ID-ordered subset.

  • Diagnostic and graph-verification report exports can no longer be left
    partially written by a crash.
    User-selected JSON destinations now use the
    same temp-file, file-flush, atomic-replace, and directory-flush publication
    family as other small durable outputs.

  • Returning to Direct Files and restoring a backup now fail closed on real
    directory durability errors.
    Graph-local managed state set-aside and
    rollback flush both changed parents in recovery-first order; the separate
    capability-bound backup stack now durably reserves recovery directories,
    retires live names, and publishes restored names before acknowledging them.

  • Managed storage no longer reparses every baseline page when rebuilding its
    disposable SQLite projection.
    New baseline capsules carry a bounded,
    versioned semantic receipt that is verified and reused during a healthy
    rebuild. Existing receiptless baselines, oversized pages, parser upgrades,
    and invalid receipts retain the prior exact-source reparse-and-compare path.
    Foreground one-block saves also reuse exact bounded whole-document outline
    parses, keeping both the first and steady post-drain save within two such
    parser invocations; drains perform none.

  • Managed storage now opens before its search indexes finish building.
    Both Unicode and CJK substring indexes are built in bounded background turns;
    searches remain complete through an explicit slower fallback and show
    “Search index building…” until readiness. Live edits are caught up before the
    marker flips, and later one-block saves update only that block's search rows
    instead of rewriting its whole page.

  • Managed storage no longer forces a durable SQLite cache sync for every
    accepted event or schema statement.
    The disposable WAL projection now uses
    synchronous=NORMAL, creates its schema in one atomic transaction, and keeps
    durability at the existing explicit checkpoint and atomic file-set
    publication boundary. A lost or corrupt cache still rebuilds from the
    immutable baseline and accepted operation history.

  • A crash during managed archive publication can no longer strand an edit
    whose exact bytes are still durable in the local journal.
    Cold open repairs
    only torn object names covered unambiguously by an undrained local record,
    under the workspace's sole-writer lease, and then performs the ordinary full
    archive validation. Uncovered corruption and torn manifests still refuse
    activation. Public archive publishers remain strict; the local drain installs
    recoverable object names before its batch-wide flush, then installs the
    already-durable manifest and only afterward may checkpoint the journal. The
    enforced 10/13 save and cross-page-move barrier totals do not change.

  • Android keeps the right-sidebar control one tap away at ordinary phone
    widths and keeps Tine outside the system bars.
    Lower-priority topbar actions
    still move into ... when space is constrained, while the right-sidebar
    button remains direct until the last-resort tier; native status, navigation,
    and display-cutout insets now bound the WebView itself. Android also treats
    that native viewport as the sole inset owner, so OEM WebViews that expose CSS
    safe-area values do not add a second wasteful band above the topbar (GH #205).

  • Android no longer treats a refused directory durability barrier as success
    for promoted managed-storage projection receipts.
    Only the receipt store's
    pre-enrollment initialization remains reconstructible; bases, intents,
    attempts, mutation authority, completions, cleanup, and forensic records now
    keep strict private-authority barriers on every platform. Each process now
    verifies a promoted parent once before accepting an existing receipt name or
    operational namespace, so a crash cannot erase knowledge of a refused
    barrier; later same-process names and ordinary reads add no barrier. Android
    devices that cannot provide app-private directory durability may initialize
    the reconstructible empty store, but managed operations now refuse rather
    than claiming unsafe success.

  • Images changed by Syncthing, Dropbox, an external editor, or another Tine
    window now refresh in place without reopening the graph.
    Tine observes the
    approved assets/ directory separately from page reconciliation in Direct
    Files and managed storage, including an approved external-assets target.
    Asset bytes remain ordinary filesystem-synchronized files and never enter the
    managed oplog or .tine-sync; open PDF/audio/video sessions are not replaced
    mid-use and see new bytes when reopened.

  • Windows updater failures now leave a privacy-safe stage and cause in
    Diagnostics, with a sanitized detailed chain available in debug mode. A
    32-bit Windows build also links to the manual package instead of offering an
    automatic install that its signed updater manifest does not publish (GH
    #241). The reporter's underlying native network failure remains under
    investigation.

  • Block background colors no longer crowd their bullets. Regular dots and
    numbered-list ordinals now occupy the same 22px control track, while the
    rounded highlight keeps text aligned with an unhighlighted or edited block.

  • Same-structure external Markdown content edits no longer leave a managed
    page stale or raise hot_source_join merely because Tine reached it through
    a page-name route
    (GH #397). Application-page routes now
    agree on current source content while managed reconciliation is still in
    progress. Structural edits such as adding, deleting, or moving bullets still
    wait for the managed watcher to reconcile them safely.

  • Restoring deleted pages from the recovery panel no longer closes the panel
    by itself the moment the restore completes: the disposed sweep stays visible
    as actionless history until you close it.

  • Quitting Tine normally no longer shows a false "Tine did not close cleanly
    last time" warning on the next launch. The clean-shutdown marker was cleared
    in code placed after the app's event loop, which never runs, so every quit
    since the flight recorder shipped was reported as a crash. This is the
    desktop half of GH #426.


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.