The first Tine 0.9 Beta. Git sync on phones and computers, with sign-in and automatic commits; "Changed since you last looked", which marks what other people or tools committed to a page, with buttons to step through each change; pages shared as encrypted links that open in the browser; margin comments with replies; a command line that can write, now also on Windows, for scripts and AI agents; tabs organized in the sidebar; theme fonts; the PDF viewer on pdf.js 5; and the 0.9 storage checks described below. It includes every fix in stable 0.8.2.
Storage checks in 0.9. Tine 0.9 tests its page-saving code against a published storage model. It also checks a list of file-changing code paths and fault-tests selected cases where folders disappear or move, other programs change files, or drafts must be recovered. Directory behaviour is tested against the model, never proven, and full step-by-step model coverage does not extend to every write path. These checks have passed recorded Linux, Windows and macOS runs, each on the platforms the ledger names for it; Beta testers check Android and iOS devices, cloud-synced folders (such as OneDrive or iCloud Drive placeholders) and other network mounts from this release on. For each storage assumption covered here, the ledger names a code check and completed fault tests, and states the remaining race and filesystem limits. The assumptions and limits page records the tested cases and exclusions.
Outside the model: torn reads while another program writes; other programs' in-place writes; correctness of the reference index; Markdown/Org serialization. Named limits:
- If the single-writer lock fails, the graph stays editable and Tine shows a persistent indicator.
- On Android shared storage, a pulled rename that changes only letter case stops git sync ("pull incomplete") until the rename is undone upstream.
- Settings offers to remove an empty git
index.lockthat has not changed for 10 minutes while Tine runs no git operation. Its age cannot prove the program that took it has exited: one that is frozen or suspended, or a clock that is off, looks the same. - On Windows, creating and removing the drafts folder, and the fallback rename, are not proven to survive power loss (Windows has no documented folder flush; Tine flushes the app-data folder on a best-effort basis).
- Desktop checks cover local disks (ext4, NTFS, APFS) and a few Windows network-share (UNC) cases.
- If a file a pull changed is edited back to exactly its old text and Tine then crashes or switches graphs before the pull finishes, the resumed pull writes the pulled version again; the old text stays in git history.
- Developer export and test helpers are not containment-guarded; native check-to-call races and weak file identities remain.
Known issue
- PDF viewing now uses pdf.js 5. When you scroll very fast through a PDF, pages stay blank for noticeably longer before they draw (about a second instead of a quarter of a second in our tests). Opening PDFs and normal-speed scrolling are unaffected. A fix is planned for the next Beta.
Added
- Expand or collapse bullets even in read-only exports, quick-share links and read-only pages. These viewing choices last while browsing; reloading restores the original folds without changing the graph. Static HTML exports keep the original folds too; click a folded block's arrow to open it, which works without JavaScript (UI-VIEW-FOLD, UI-VIEW-FOLD-STATIC).
- Expand or collapse the current page from Commands, or press
t oto toggle all blocks. Bulk folding uses one page edit and Undo step (#785). - Remove the stale lock (git graphs, all platforms; GS-LOCK): when Tine, or another git program, was stopped in the middle of a commit and left an empty
.git/index.lock, every later commit used to wait until you deleted the file yourself, which on a phone takes a file manager or a git app. Once that lock has not changed for 10 minutes and Tine itself is not using git, the git notice and Settings → Graph offer Remove the stale lock. Tine checks the file again when you press it, removes only that file, and commits right away. It never removes a lock by itself, and never a lock on a branch. - Git on Android and iOS (ADR 0078 slice 3): automatic commits, sync with Sign in, the line-ending repair and Changed since you last looked now work on phones as on a computer. Switching to another app saves and commits (at most once per interval, like every automatic commit) and, with Commit and sync automatically, pushes; coming back syncs at once. Tine never starts bringing in changes while in the background. On Android shared storage, a pull that renames a page by capitalization alone stops without changing anything.
- Theme packages can set fonts and line height (GH #760). A theme package written for theme API 0.3 can name its body, monospace and title fonts (fonts already installed on your device; no downloads or CSS) and a block line height (an even number of pixels from 20 to 48). Installed themes get a separate Use typography button next to Use colors and Use style, plus a Typography selector in Settings → Appearance to go back to Tine's own fonts; a missing first font is reported on the theme's row and the fallback fonts are used. Your
custom.cssstill overrides them, andtine-theme.mjs checkenforces the same rules. - Git sync offers Turn off line-ending conversion for this repository when tracked bytes already match their index blobs. It changes only local
core.autocrlf, leaves graph files untouched, and otherwise links to safe commit-and-checkout steps in the Guide. - Package-manager builds turn the updater off (tine#187). A distribution package built with the compile-time variable
TINE_PACKAGED_BY=<name>(for exampleNixpkgs) never checks for updates, shows no update notification and offers no installer; Settings → About says the copy is packaged by that name and to update it there. Unset or empty keeps today's behaviour. See the README section "Packaging Tine for a distribution". - Tine Beta has its own amber icon.
- Changed since you last looked (git graphs, all platforms): a margin bar marks blocks other people or tools committed since you last left a page, a removed block leaves a marker that unfolds its text, and the page header counts the changes. Leaving the page marks it seen; Mark page seen is in the page actions menu and command palette; Mark whole graph seen is in the command palette and Settings → Graph; Forget seen state is in Settings → Graph. Your own commits never count, uncommitted edits are invisible, and the record stays on this device (ADR 0079). The notice stays at the top while you scroll, keeping Mark page seen reachable (UI-SEEN-STICKY). Previous change and Next change in that notice step through the changed blocks and removed-block markers in page order, wrapping at the ends ("3 of 12"); each is highlighted and a folded parent opens on the way, without editing the file or entering edit mode. The same two steps are in the command palette, with no key assigned (UI-SEEN-STEPS, discussion 645).
- Desktop: Open in default app beside the graph and global CSS editors in Settings, with matching command-palette actions. External global CSS edits now apply live across graph windows (GH #778).
- Tags and page references expose Logseq-compatible
data-refnames so custom CSS can style individual tags and links, including static exports (GH #773). - Windows: graph read/write commands and git runs now use a private named pipe to the app or
tine serve, including automatic startup, app handover andserve --stop. Commands wait for a busy pipe, owner locks live in%LOCALAPPDATA%\tine-ownersoutside the install folder, and a stalled reply times out without retrying a write the owner already admitted (REG-CLI-WINDOWS, REG-CLI-WINDOWS-R3, REG-CLI-WINDOWS-R4). - Guide: a new Share pages page covers the Share dialog, folder exports, quick-share links, Re-share, Update all, Delete and Settings → Sharing. The tips page explains margin comments more fully (every way to start one, how replies and authors are stored), and the git autocommit section describes its status lines and the messages for a folder without git or a phone.
- Command line:
page create,page renamewith reference rewriting, and confirmedpage deletethrough the app's page operations;refandembedprint reusable syntax after ensuring a durable block id. Page deletion reports broken references. - Re-export reviews a saved folder export in Replace mode. Update all on the Exports page reviews folder exports and quick shares together before confirmation, then updates them in order and shows each outcome, including skipped definitions and failures.
- All graphs (GH #758): press g Shift+G or run All graphs from the command palette, then use the arrow keys and Enter to switch graphs. Graph actions, including opening a new window on desktop, are available from the keyboard.
- YouTube timestamp shortcut (GH #757): Ctrl/Cmd+Shift+Y inserts the current playback time into the block you are editing. Click the timestamp to jump the video there, just as with the slash command.
- Open another view of a PDF (⋯ menu, desktop) shows two parts of it side by side, each with its own page and zoom. Views of the same PDF now share their highlights: one made, recolored or removed in either view appears in the other at once, including views opened by splitting a pane, a new window or a restored session, which before kept separate copies.
- The Linked/Unlinked References count says what it counts (GH #755): hovering the number shows "N blocks on M pages". The number still counts referencing blocks, as in Logseq, and follows the active filter.
- Automatic git commits (queue cards hBpCy4/hBpb2k, ADR 0078 slice 1): a graph in a git repository can commit its changes automatically (Settings → Graph → Commit changes to git; off by default). Tine commits after a minute without edits, at most once per interval, on quit, and around renames, merges, deletes and backup restores; it pushes and pulls only with a sync option (next entry).
- Git sync (ADR 0078 slice 2): two more options, Commit and sync on demand (a Sync now button) and Commit and sync automatically (after each commit and once per interval), fetch the branch's upstream, bring the graph up to its newer commits without overwriting unsaved or outside edits, and push this device's commits. Tine never merges, rebases or force-pushes. Settings → Graph → Git shows the remote, the last sync and each problem in plain words with a way to fix it (copy the git command, open the folder, sign in again); a problem that persists also shows above the page. When both sides have new commits Tine stops and changes nothing; you merge in git. HTTPS remotes take a username and personal access token, kept in a private file on this device and never in the graph. Android and iOS support the same sync options.
- A note for journal date patterns Tine does not support (internal card g4czVA): when
:journal/file-name-format,:journal/page-title-formator the older:date-formatterinconfig.ednuses pattern parts Tine does not interpret as Logseq does (quoted text such as'w', week numbersww, or other letters such asYYYY,Dora), today's journal shows aconfig.ednnote above the configured queries naming the setting, the pattern, those parts and what Tine does with them (writes them as literal text, reads them as shorter date fields, or keeps the quote marks). Nothing is renamed or rewritten, and supported patterns, including every built-in format, behave exactly as before. See Journals, tasks, and scheduling in the Guide. - Alias groups under the page title (queue card hB9Zjw, D-20261019-AL1/AL2): a page that shares aliases with others now shows its whole alias group, also when it declares no alias itself. Also called lists the group's names that have no page of their own; a link to one opens the page declaring it. Related pages in this alias group lists the other names that have their own page; a link to one opens that page. So many names for one page and several pages under linked names no longer look alike. The rows replace the aka chips, appear in the right sidebar too, and nothing is shown on pages without aliases. A name that is an alias of several pages now opens the same page from every place (links, search, the sidebar): the one whose file path sorts first as plain text. Before, a page in a sub-folder could sort differently in search than in links.
- Theme hook for task toggles (discussion #714): when you press a task's checkbox or marker word, that task's
.block-task-checkboxand.block-markercarry ajust-toggledclass for about 0.7 seconds, so a theme can play a keyframe animation on your own toggle without it replaying on page load, when a row scrolls back into view, or when sync changes the task. Tine ships no animation on it. See Customize Tine's look in the Guide. - Replace with text / Replace with embed on a block reference (D-20261019-QC): right-click (or long-press) an inline
((reference))for Replace with text, which swaps that one reference for the referenced block's text (itsid::,collapsed::, other hidden properties and logbook left out), or Replace with embed, which swaps it for{{embed ((id))}}, as in Logseq. Only the block that holds the reference changes, as one undo step; a menu left open while that block changed refuses and says so. A labelled reference[label](((id)))is replaced whole, label included (Logseq leaves[label](…)around the text, which is no longer a link). - Navigation buttons in the editing toolbar (GH #598): with Settings → Appearance → Navigation buttons at the bottom on, the phone's editing toolbar now shows Sidebar, Search, Back and Forward at its left end while the keyboard is up, so they are reachable exactly when you are typing. They stay in place when the formatting buttons scroll. Tapping one saves the block and leaves the edit, then does what the bottom row's button does. With the setting off nothing changes. Tested in the component and app suites and headless-browser screenshots; not run on an Android device.
- Command line: an agent can keep its writes in the graph's git repository as a run.
tine run beginprints a run id; each write with--run ID(orTINE_RUN) is committed under the agent's name after any uncommitted edits of yours are committed under your own;tine run endsquashes the run when nothing of it is pushed or interleaved, andtine run revertundoes it, keeping blocks you changed since (Tine CLI v0 Spec A7). - Quick-share links and Settings → Sharing: choose Link in the Share dialog and connect GitHub through its device sign-in. Settings lists this device's links with Copy link, Check, Delete and Forget, and Find shares on GitHub finds shares created on another device. The graph records the share on its query or the Exports page without the key. Pending uploads keep their definition across a restart; Check confirms them and Remove marker clears abandoned markers (REG-QS3-SHARE-PENDING-MARKER). Release builds offer links when the compatible generation-1 reader is attested. Encrypted quick-share links open in the generation-1 browser reader on tine.page, with private navigation, readable errors and media loaded only when the reader follows a link. Re-share from a query or the Exports page to update the same link after reviewing added and removed pages; Delete remains available with confirmation (it also removes the definition the share added to the Exports page, and says the link stops working within about 5 minutes), and devices without the key offer a new link.
- Tabs in the sidebar (GH #704): when two or more tabs are open, the left sidebar lists them under Open tabs, at every window width and on every device. The active tab is highlighted; click a row to switch, use its ✕ (always visible on touch screens) or middle-click to close. The top bar's tab strip now shows whenever the window is 640 px wide or more, on any platform; below that the sidebar list is the way to switch tabs.
- Organize tabs in the sidebar (GH #704): drag a row in the sidebar Open tabs list up or down to reorder your tabs (the top strip and the tab overview follow), drag it right, under another tab, to nest it there, and drag it left to move it back out; on a touch screen, hold a row still, then drag. A tab with nested tabs gets a triangle that collapses its group in the sidebar list only, and a nested row's right-click menu has Move out of group. Closing a tab never closes the tabs nested under it: they move up one level. Pinned tabs stay first and never nest. The arrangement is kept with each workspace's tabs and comes back after a restart; it lives in the device-local session (a few bytes per nested tab), never in your graph, and an older Tine reading it simply shows the tabs flat. Nothing nests unless you nest it.
- Reorder Favorites by touch (D-20261019-FT1): on a phone or tablet, hold a row in the sidebar Favorites list still for a moment to pick it up, then drag to reorder or nest it, as in the Tabs list. A finger that moves first scrolls the list, and a tap still opens the favorite. The hold takes the place of the long-press page menu on a favorite row; mouse behaviour is unchanged.
- Blocks that mention an upcoming day: the query text
{{tine-query any(direct_refs, day > today)}}lists every block that links or tags a journal day after today, whether or not that day has a journal file. It combines with other conditions (task = 'TODO' and any(direct_refs, day between today and '+7d')) and reads only each page's reference list, so pages that mention no such day are skipped. This is the condition Tine already used for Logseq's older NEXT query, now also writable as text. - Edit button on query blocks: a pencil beside the details menu opens the inline query editor. It shows on hover and focus, and is always visible, finger-sized, on touch screens. In the editor, Done sits at the bottom right, and the query-text pane ends with Save query text with Cancel (unsaved text) or Done just left of it (GH #619).
- Local static PNG/JPG page icons up to 1 MiB from the graph's
assets/folder: use an image link intine.icon::(Logseq prints anicon::value as raw text, so an image link there looks like markup in Logseq;icon::still works as the fallback when a page has notine.icon::, andtine.icon::wins when both exist); titles, references and lists share the emoji-sized box and follow file replacement, with no downloads or copied/resized files (GH #346). - Toggle code block wrap: a bindable command switches the device-wide code wrapping preference and keeps your reading position in main, split and sidebar panes (GH #453).
- Share dialog: a share icon in the top bar, beside a page title, in a page's menus and on every query block opens Share. Choose This page or a query built with the query builder, review the pages that will be shared (and the ones left out:
public:: falsepages and the Exports page), optionally include the query text, and export to a folder. The export is saved as a definition (a query block withexport:: <folder>) on an Exports page that Tine creates on first use, or on the query block you started from, so it can be repeated. Choose Link for an encrypted quick share through GitHub; This page and its neighbours is shown as coming next. - Export definitions follow page renames: a query block carrying
export::ortine.share::that selects a page with{{tine-query @page and name = 'Project'}}keeps selecting it after the page is renamed (namespace pages included), so a new page with the old name is never exported in its place. The selector also exports a page with no blocks. Other query blocks keep Logseq's rename behaviour (docs/contracts/export-definitions.md). - Queries can follow links between pages (Tine query text only):
any(links, …)andany(linked_by, …)find pages that link to, or are linked from, pages matching a condition, exactly as the Linked References panel counts links;near(name = 'Project', 2)finds a page's neighbourhood within N link steps, forwards ('out'), backwards ('in') or both (the default: N steps forward plus N steps backward, each path keeping its direction, so not every page within N steps in any direction). A fourth argument tonearis reserved and is an error, and no Tine query function accepts SQL modifiers such asFILTER (WHERE …)orOVER (…)(they used to be silently ignored). Logseq's{{query}}is unchanged (D-20261018-T1,docs/contracts/tql-links-near.md). - A query stops early when its graph is switched or its window closes, instead of finishing against a graph nobody shows (
docs/contracts/tql-links-near.md, Cancellation). - The command line can write:
tine add,tine edit,tine prop set|remove,tine moveandtine deletechange blocks through the graph's owner and the same guarded save the app uses, for scripts and AI agents working beside you. Blocks are named by the handle a read prints (Page/2.1~k7f2ab) or byid::; a block that changed since the read is refused asstale, never guessed. Every blocktine addcreates carriesauthor::. With the app open, your typed text is saved first and the window shows the change at once.--jsonreplies and exit codes are indocs/contracts/cli-output.md; the Guide's Command line page explains the commands. - Comment on a passage: select words while editing and press Ctrl/Cmd+R (or Comment on selection in the command palette or the right-click menu of selected text) to add a child comment that quotes them. Comments are ordinary bullets with a
quote::property (plusquote-prefix::/quote-suffix::, a few surrounding words that keep the comment on the right occurrence if the words appear again); they render as a tinted card with the quote above and the passage marked in the block, and a quote whose text was later edited away stays shown, struck through. Bullets with anauthor::property show their author in a chip. Settings > Editor > Your name makes the comments and replies you write carryauthor:: <name>(handy in a graph shared with others; they still read "you" to you, and with no name nothing is written; stored on the device, not in the graph). On a wide window the comments move to a column beside the text, each next to the words it quotes, and are edited there; Enter in a comment adds a reply. Comments and replies draw no bullet: a thin line and a small indent show depth, and the author chip is the handle for dragging and for the block menu. - Actions on one reference or embed: hover an embed for Edit link, Open source and Remove above its top-right corner (with the keyboard, Tab reaches them; on touch screens, they appear while you edit inside the embed); a block reference's preview and its right-click or long-press menu offer Edit link and Remove reference. Edit link opens the block that holds the reference or embed with it selected; Remove deletes only that occurrence from its block, never the referenced block or page, and Undo restores it; if the block changed after the menu or preview opened, nothing is changed and a notice says so. Works in the main pane, the split pane and the right sidebar (GH #417; GH #418).
- Settings → Editor → Search results open in chooses where a plain click or Enter on a Search-tab result opens: New tab (the default, as before) or This tab, which navigates the Search tab itself and leaves Back to return to the results. Shift, Ctrl/Cmd, Alt and middle-click choose the sidebar, a background tab or the other pane either way (#796).
Changed
- The PDF reader uses pdf.js 5.7.284, with image decoders and fonts bundled for offline reading. JPEG 2000 scans use a source-built decoder compatible with WebKit, and large decoded images retain the previous cleanup policy (D-20261028-PDF9 item 7; UI-PDFJS5-JPX, UI-PDFJS5-IMAGE-RETENTION). Building Tine requires Node.js 22.13 or newer and Emscripten 4.0.20.
:feature/enable-journals? falseinlogseq/config.ednshows the configured home page in the sidebar in place of Journals, as in Logseq. Each comma item of a property listed in:property/separated-by-commasis now a page link in page and block properties.- Property keys link to their pages consistently in page headers, references, previews and query property lists, including after editing; Shift-click opens the key's page in the sidebar, and
:property-pages/enabled? falsekeeps keys plain (GH #753). - Hover previews are editable (D-20261023-VQ, follow-up to GH #748): the blocks in a page or block-reference preview are now the page's own blocks, as in Logseq. Click a block's text to edit it in the preview; the change is saved to its page like any other edit. While you edit, the preview stays open when the pointer leaves it or the page scrolls, and the first Esc ends the edit (the next one closes the preview). A plain bullet click still opens that block in a new tab. Queries inside a preview still show as text and embeds stay read-only. Tested in the component suite; the app journey covers opening and folding previews.
- Deleting pages does less disk work (internal, fsync investigation GH3, D-20261021-GQ3): after the first deletion in a session, a deletion syncs only the trash folder instead of it and every folder above it (three fewer directory syncs per deleted or moved page on Linux, macOS, Android and iOS), and on Windows a deletion no longer writes and removes a custody marker file, which protected nothing there (about a third of a deletion's time on hosted Windows runners).
tine serveskips its launch snapshot when the graph's newest backup zip is less than six hours old, so scripted edit/restart loops preserve the backup slots. A future-dated zip does not suppress backups; the app's launch snapshots are unchanged (D-20261020-CF4).- Chinese IME: typing through
】(GH #53): after【【gives[[]], typing】before the]it left steps over that]instead of leaving[[name】]], so【【name】】ends as[[name]]with the caret after it.)steps over a)the same way when Settings → Auto-pair brackets & quotes is on (the ASCII)behaves so too). Both input paths of an IME character are covered. - Touch screens: format selected text without opening the block (GH #375): text you long-press in a block you are not editing stays selected where it is, with the system's own handles and menu, and a formatting row (Bold, Italic, page link, inline code, Strikethrough, Highlight) docked at the bottom of the screen changes it in place, through the normal edit and undo path. The block no longer opens its editor for this, so the handles no longer disappear and the page no longer jumps while the keyboard restarts. Selecting in another block ends the edit in progress (its text is saved). With the keyboard open, the editor is now also scrolled clear of its own formatting row, not just of the keyboard toolbar.
- Settings search: the setting a result jumps to is highlighted for about two seconds, so it is easy to spot on a long tab (GH #706).
- Diagnostics: a launch that tries the launch checkpoint prints one line saying whether it was served or why it was declined (
--debuglog and the diagnostics report), and the report now names the exact launch race (published,deferred,cache_built,page_held,not_loading) instead of oneraced(queue card hB0p3s). - A query's disclosure arrow is the block's fold (GH #619): the arrow in a query's header and the block's bullet now show and change one state, saved as the block's ordinary
collapsed::property, so it means the same in Logseq. Before, the arrow kept a separate flag on this device and could disagree with the bullet. A query written with{:collapsed? true}starts folded on both, and unfolding it is saved ascollapsed:: false. Folds you made with the arrow before this update were remembered only on this device and are not carried over: those queries open unfolded. - Action buttons sit in the same place everywhere: in every dialog and editor the confirming action is at the trailing end, Cancel just left of it, and helper actions (Reload, Clear, Undo) at the leading end; unlike actions are no longer paired side by side. The anchor-switch prompt now reads [Keep anyway][Cancel][Remove them], the unsaved-changes panel [Keep working][Retry saving], and the date picker's Today button is gone (today's cell stays marked; click it to pick today). One shared row component (
DialogActions) now owns the order, and a guard test fails a dialog that rolls its own. - Disk or mine reads the same everywhere: the save-conflict bar, the "always ask" external-change bar and the PDF highlight conflict all offer Keep mine then Use disk version, with neither styled as the default (the old "Keep mine (overwrite)" red button and the blue "Reload from disk" are gone).
- CSS editor: buttons are now [Reload][Save] ... [Cancel][Save & close]. Cancel closes without saving and asks first when there are unsaved edits (and drops the recovery draft); clicking outside the editor closes it only when nothing is unsaved, instead of saving. Esc behaves like Cancel.
- System confirmation prompts name their action instead of Yes/No: closing with unsaved pages asks "Quit without saving N pages?" with Go back and Discard and quit, and every other prompt (trash, uninstall, restore backup, merge pages, open link, ...) labels its button with what it does.
- Layout follows room and input, not the device's name (D-20261018-W1): the tab strip, the bottom navigation option, the mobile editing dock, the selection toolbar, Settings' touch-only options and the single-pane layout now depend on the window's width and on whether the primary pointer is a finger, so a small desktop window, a tablet with a keyboard or a touch laptop gets the layout that fits it. Window frame, native file and shell access, memory caps and OS shortcuts still follow the platform; every such use is listed, with its reason, in
src/PLATFORM_IDENTITY.txtand pinned by a test. - Open in Search keeps the query's view: a List, Table or Board with its display choices, and Pages and blocks (Pages above Blocks) reach the Search tab as they were in the block, and saving from there writes the choice back (GH #619).
- Nested groups in the query builder stand out by a heavier rail and a divider, not deeper indentation, and a query whose top level is Any of shows that connective (GH #619).
- Pages tagged with on a page now also lists pages tagged with any of its aliases, the same names Linked References treat as that page. The alias you wrote stays as written, and
{{query (page-tags …)}}still matches names literally, as in Logseq (GH #715). - Launch backups are now one
.zipper snapshot instead of a folder of about a thousand files, and a launch where nothing changed writes nothing (on a 1,075-page graph: 1 file and 4 syncs instead of 1,076 files and 1,083 syncs). Any archive tool opens a snapshot without Tine; Settings → Backups & recovery marks a damaged snapshot, or one from a newer Tine, and offers no restore for it. Older snapshot folders stay listed and restorable. - A launch that has to build the reference indexes from scratch (no launch checkpoint) is about twice as fast on large graphs, with no extra memory: on a generated 10,000-page graph 2.2 s → 1.0 s, and on a 1-million-block graph 5.2 s → 2.0 s (busy machine). Launching right after many files were written, such as after a sync or a bulk import, no longer does a check whose cost grew with the square of the number of files (GJ5).
- A task priority
[#A]/[#B]/[#C]is a reference to the page A / B / C, as in Logseq: the block appears in that page's Linked References, and queries on[[A]]or[[TODO]]find blocks by their priority or task marker. Only a priority in the block's header counts. Derived reference data rebuilds once on first launch. - Editing an alias, or renaming or deleting an aliased page, no longer re-reads every page: once the alias index exists, it is patched for the pages the edit changed instead of being rebuilt by a walk over the whole graph. On a generated 10,000-page graph the first alias lookup after such an edit examines 1 page instead of 10,000 (D-20261018-M2c).
Fixed
-
Opening a large page no longer sets up one height observer per block; each outline window keeps one, so large pages open faster (development-only regression; REG-BIGLOAD-090B-WINDOW-RAW-FUNNEL).
-
Opening a large page no longer makes the comment margin watch every block to decide whether the page has comments (development-only regression; REG-BIGLOAD-090B-MARGIN-SCAN-UNTRACKED).
-
Settings opens with its full tab list: the Sharing tab no longer appears a moment later and pushes Plugins and the tabs below it down under the pointer, so a quick click no longer opens the tab above the one aimed at (UI-SETTINGS-SHARING-TAB-SHIFT).
-
Picking a block in the
((or{{embed ((block search no longer writes a short temporary id such as((bmvsgco1s-11))when the block had noid::yet: Tine now gives the block a proper UUID, as Logseq does, so the reference keeps working in Logseq and after restarting Tine. A block that already has an id keeps it (GH #798). -
The desktop formatting toolbar displays over the selection, including near the bottom of a long block, and moves below it when there is no room above (UI-SEL-TOOLBAR).
-
Mouse back/forward buttons also navigate on macOS; dragging with a side button does not navigate. macOS also accepts Cmd+[ and Cmd+] for history (#780).
-
Query and Markdown tables: a table in a query box or a sidebar item stays inside its box and scrolls there; long text cells wrap instead of cramming every column to a few letters, and numbers never split; a visible scrollbar strip shows when a table still overflows. Board column counts no longer touch their labels, table and board page links read as links, and the "Grouped by" breakdown above a board is folded behind its summary. Collapse all sits in the Linked/Unlinked References header row, the gap above Linked References is smaller, a stale count shows a small refresh icon instead of a stray "·", and an image in a reference breadcrumb renders at breadcrumb height (UI-LP-QUERY-TABLE-BOX, UI-LP-BOARD-CARDS, UI-LP-REFERENCES-HEADER, UI-LP-BREADCRUMB-IMAGE).
-
Scrolling the Journals feed keeps loading older days while you are editing a journal day. After some graph-wide changes (for example a sync bringing in many files) the feed could stop at its first three days until you clicked outside the journals (UI-JOURNAL-FEED-PAGING-WHILE-EDITING).
-
A first launch with a default journal template no longer sometimes opens Journals as "Couldn't open this page: Journal feed read failed" while today's template page is still being saved; Journals shows as soon as that save ends (GH #671, E2E-BASE-4).
-
The horizontal scrollbar under a long-line code block is easy to grab (GH #787). It is now a 14px strip with a visible thumb in every theme (it was a few-pixel overlay bar hidden in the card's padding), and pressing it scrolls the card instead of opening the block's editor; presses on the code text still edit. Cards that scroll sideways are 14px taller. Touch devices keep their own scrollbar.
-
Every ancestor crumb in a block embed's breadcrumb opens that block, not just the page: click to go there, Shift-click for the sidebar, Ctrl/Cmd-click for a new tab, Alt-click for the other pane (GH #779).
-
On long pages with images, Enter, Backspace, Tab, Shift+Tab, moves and drags no longer remount the blocks around the edit: the touched window keeps its other blocks, windows after it keep their boundaries, an outdent that leaves the list long keeps it windowed, so no image flashes back to its placeholder and the view does not jump (GH #745). An image that finishes loading after the edit no longer leaves the caret off screen.
-
While you scroll a PDF, Tine remembers the reading position once scrolling stops instead of at every page passed; the page indicator still follows live, and zoom, page jumps and closing are remembered at once (D-20261028-PDF9 item 4).
-
Large graph PDFs load requested byte ranges through the read-only asset IPC, so opening one no longer copies the entire file into the webview first (D-20261028-PDF9 item 3).
-
PDF page eviction releases decoded images and drawing data once no split view retains the page, reducing retained memory while reading scanned books (D-20261028-PDF9, item 1).
-
Opening the right sidebar by a remapped shortcut keeps the main editor and caret when the sidebar shows the same block (UI-EDITOR-LATE-MOUNT).
-
Windows: automatic git cleanup no longer fails while flushing completed packs. Failed cleanup preserves loose objects, keeps commits running, and shows a quiet retry status in Settings → Git (REG-AUTOCOMMIT-WINDOWS-REPACK).
-
Clicking another block while journal days load keeps its editor and focus when the earlier Down navigation finishes (UI-EDITOR-C2).
-
Logseq-style query tables now let you toggle columns through View and save the choice as Logseq-compatible
query-properties::(GH #749). -
Date-shaped links open an existing ordinary page when no journal file exists for the day, avoiding an empty duplicate journal (UI-DATE-PAGE-LINK).
-
Backspace and Delete merges drop the absorbed block's hidden heading, flashcard state and clocks; referenced IDs transfer when possible, and merges that would lose a referenced ID leave both blocks in place (REG-F2-MERGE-HIDDEN-ROWS, hDI40A).
-
Links inside query-result ancestor breadcrumbs are clickable again (GH #743).
-
The “Pages tagged with” section stays folded when you return to a tab (GH #739).
-
Shift-click a calendar day, Today, or the calendar button to open that journal in the right sidebar, as in Logseq (GH #740).
-
A page embed's icon aligns with the first line of a title that wraps (GH #770).
-
Backspace removes an empty bullet inside a block embed when its source ancestor is folded (GH #766).
-
Refused renames of pages with duplicate identities now name the conflicting graph-relative files and explain that they must be merged or removed (GH #774).
-
Automatic git commits leave out Syncthing temporary files, add
.syncthing.*to the graph's.gitignoreonce, and say so once in a toast and in Settings → Git. Removing the rule is respected; conflict copies remain committed (REG-AUTOCOMMIT-SYNCTHING-TEMP, D-20261026-GI). -
Two devices syncing one git repository no longer stop at the first deleted page (diverged, or pull-refused when the other device pushed its trash). Automatic git commits leave out Tine's own files for this device (
logseq/.tine-*, such as its trash), addlogseq/.tine-*to the graph's.gitignoreonce with the same toast and Settings → Git line as.syncthing.*(one combined notice when both are added), and remove copies an earlier Tine committed from git, not from disk, in a separate commit; a pull neither writes nor refuses over those paths (REG-SB1-GIT-TINE-OWN-TRASH, D-20261029-GT). -
Automatic git commits and
--runcommits write the repository's index to disk durably before moving the branch, so a crash or power cut can no longer leave the old index under the new commit, where your next plaingit commitwould have undone Tine's (REG-GIT-INDEX-DURABLE-BEFORE-REF). -
macOS: command-line commands that talk to the running app or
tine serve(tine status, page and query reads) no longer fail with "the owner's endpoint failed: Invalid argument" (GH #771). -
Quick share initializes Android's device certificate verifier before connecting to GitHub, and packages its matching Kotlin component (D-20261025-QV).
-
Journal feeds, Upcoming, calendar dots and slash templates now refresh from their relevant changes, avoiding unrelated reads while typing. Queries skip unrelated saves and graph-wide queries wait for a 1.5-second typing pause; collapsed reference sections keep their last count with a stale indicator until opened. Clock queries invalidate when an edit follows an expired instant, and Pages and blocks queries keep the typing pause even when subscription renewal finishes late (GH #746).
-
Sidebar disclosure arrows now use the shared SVG triangle, including nested Favorites, Tabs and namespaces; graph and workspace switchers inherit the app font (GH #761).
-
Cmd+, on macOS and Ctrl+, elsewhere open Settings, including while editing a block; the existing
t sshortcut remains available and both defaults appear in Keyboard shortcuts (GH #762). -
Linux: input methods can show composing text inside the editor. Verified with IBus Hangul; this may fix Fcitx5 input not appearing (GH #575), but Fcitx5/Hyprland remains unverified.
-
Mobile: the help "?" button no longer covers the last buttons of the bottom-docked formatting toolbar while text is selected, with or without the keyboard (internal UI-HELP-FAB-ABOVE-DOCKED-TOOLBAR).
-
Block references keep resolving after a block moves between pages and after reopening the graph; dangling references no longer scan unrelated pages (GH #746, GH #623).
-
The exact block-owner index builds in bulk at cold launch and writes compact checkpoint rows without temporary page copies; it keeps UUID keys in 16 bytes and shares one allocation per tree node, reducing its memory use on large graphs (GH #623).
-
Quick Capture keeps refused text on Escape, so reopening the box files it into the current graph; a claim retired before insertion no longer reports previous-graph uncertainty (GH #254). Deleting a conflicted page now refuses an unanswered input drain after five seconds and restores editable text.
-
Reference and embed rows validate their source page before becoming editable, so a copied block identity cannot expose another page's live block or selection (follow-up to GH #748).
-
Moving a graph preserves access to device-local unsaved edits through Recover into this graph and stops saves when an open folder moves or disconnects. Recovery excludes hosts still saving; open graphs permit drive eject, and recovery/backup notices explain that a graph may be moved or unavailable, including on a disconnected drive (L9-01, L9-02).
-
Windows now holds the same account-wide graph owner lock as Linux and macOS, so concurrent Tine apps cannot host one graph or adopt its live drafts (L9-01, L9-02).
-
An asset stays in place if sync replaces a set-aside duplicate journal while Tine checks whether the asset is unused; the check refuses stale bytes even when the replacement keeps the same length and modification time (GH #623).
-
A page file that a sync tool is replacing while Tine lists the folder is no longer reported as "couldn't be read" (REG-SCAN-VANISHED-ENTRY).
-
Tine no longer warns "Some page files couldn't be read" about a file that was deleted or replaced while the graph was loading (REG-JOURNAL-HARDEN-GONE-BUILD; also affected stable 0.8.1).
Development-only fixes (not shipped in a release):
- Queries and boards in a published export show their results again instead of “Query couldn't be loaded: This is a read-only published export.” (development-only regression; UI-PUBLISHED-QUERY-SUBSCRIPTION).
- Opening and scrolling a large page right after typing is fast again (development only, internal card hDSCuw): the typing-stall diagnostics added for GH #746 ran work on every frame for two seconds after each key, which made a page opened from search or the page switcher, and its first scroll, about a frame slower. They now do no per-frame work.
- Opening a large page no longer asks each of its blocks whether the page is read-only; window sizing asks once per page (development-only regression; REG-BIGLOAD-090-READONLY-PER-PAGE).
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-Beta_0.9.0-beta.1_x64-portable.zip for their architecture. Windows builds are currently unsigned, so Windows may show a warning on first launch. The macOS build is signed and notarized. On macOS, if Tine repeatedly asks to access Documents, see the workaround in the README.