github martinkoutecky/tine v0.6.984
Tine v0.6.984

2 hours ago

Added

  • A part of Tine that fails now says so, where it failed, with a Retry — instead
    of leaving the window blank.
    Until now a single unreadable value anywhere in
    the interface tore down the whole render and showed nothing at all, with no
    message and no way back except restarting; at least one report of an "empty
    app" was this, not lost notes. The page, the sidebar, Linked and Unlinked
    References and the conflict panel now each fail on their own: the region that
    broke shows what went wrong and a Retry that re-renders just that region,
    and everything else keeps working. If the failure happened while Tine was
    still waiting on a slow backend operation, the message says how many
    operations are outstanding and how long they have been running, since that is
    usually the real explanation and retrying is usually the fix
    (UI-REGION-FAILURE-BOUNDARY-001, GH #490, GH #332).
  • A background load that fails now costs only the thing it was loading, and a
    panel that cannot fetch its contents says so rather than drawing itself
    empty.
    Every value Tine fetches in the background — syntax highlighting, a
    typeset formula, a page preview, the references to a block, the results of a
    query, the list of pages — used to throw when its fetch failed, which took
    down the region around it. Each of those places already had a written answer
    for "no value yet", and none of those answers could ever run. They run now: a
    code block that could not be highlighted shows as plain text, a formula shows
    its LaTeX, a preview shows nothing in its place, and the page carries on. For
    panels where being empty would instead assert something false — "no references
    to this block" when Tine merely could not look — the panel keeps its heading
    and controls and shows Couldn't load …, with a Retry where refetching
    is possible (UI-RESOURCE-READ-FALLBACK-002, GH #490, GH #332).
  • Any property can be edited from the UI, on a page or on a block. The
    properties form offered five fixed page keys and nothing at all for blocks, so
    every other key:: value line had to be typed by hand. Use Page actions
    beside a page title, or right-click the title, for Page properties… (or
    type /page properties), and right-click a block for Properties…: the
    form lists the properties that are really
    there, Add a property takes any key you like, and any non-preset key can be
    removed outright. A key is accepted exactly when the property reader can match
    it back, so anything that can be added can also be changed and removed —
    including keys that are not plain ASCII. A read-only page offers no property
    editing at all (UI-PROPS-ARBITRARY-EDIT-164, GH #164).
  • Export… on any query publishes the pages its results live on as a
    standalone HTML site under published-queries/<name>/, regardless of
    public::. The dialog reviews the page list first; a block query exports
    whole pages and says so. Links to pages outside the export stay inert,
    nested queries show only in-export results, and referenced images and files
    are copied into the folder so it can be moved anywhere. An export that
    would copy more than the new Query export size limit (Settings → Graph)
    stops and offers the setting; a taken name can be replaced (the previous
    export is kept in recovery) or given a separate folder. published-queries/
    is never read back as pages. Queries inside the exported pages are run the
    way the app runs them (<% current page %> resolves to the page, #+BEGIN_QUERY
    blocks keep their table view).
  • A query export also ships an app version: served over HTTP, the folder
    opens as a read-only copy of Tine over a snapshot baked at export time — the
    query's results on the export's own home page, Ctrl+K page navigation,
    Linked References and block previews, with every answer computed by Tine at
    export time and nothing editable. Queries show the results they had when
    exported, under the view they had; view changes and new queries are refused with a typed
    reason. index.html opened from disk, or with ?static, keeps the plain
    static site.

Changed

  • Settings now has one Help & diagnostics tab containing the flight-recorder
    report, synchronized-graph verification, and the parser comparison. The parser
    comparison no longer offers known intentional lsdoc differences, such as
    dollar math preserved inside Markdown emphasis, as reportable bugs.

  • In Unlinked References, the highlighted mention is now the control. Click a
    highlighted word to open its source page with that exact mention selected. The
    numbered jump circles now appear only when the excerpt cannot show every
    mention — on a short block they repeated what the highlighting already said —
    and Show full block marks every mention instead of dropping the
    highlighting. Every jump, in both reference panels, now lands on the mention
    selected rather than leaving an invisible caret on it, which is what made the
    circles look inert on iPhone and iPad. Unlinked-reference highlighting also now
    uses the same colour as search and the quick switcher; it had been a much
    fainter tint. (GH #200)

  • Managed Storage, the experimental Testing-only sync mode, is removed.
    Direct Files is Tine's only storage mode. A graph that used Managed Storage
    opens as an ordinary Markdown/Org graph, and sync between devices stays with
    your own tool, such as Syncthing or Dropbox. Any future built-in sync will be
    designed afresh.

Fixed

  • Expanding a large outline no longer mounts every off-screen block embed or
    query before visible Linked References can render (GH #408).

  • Renaming a namespaced page now updates an own title:: property that carried
    its old identity, so the renamed page opens at its new route and remains there
    after restart (GH #451).

  • Windows session shutdown now terminates Tine after its bounded durability
    drain instead of leaving the process alive until Windows force-closes it
    (GH #455).

  • Wide query tables and sheets inside a block keep their left edge aligned with
    the owning bullet and scroll internally (GH #473).

  • Linked References on a journal now include references written with another
    accepted spelling of the same date, such as [[2026-09-20]] for
    Sep 20th, 2026 (GH #481).

  • Returning from Android's photo/file picker no longer discards the editor that
    initiated the capture before the saved asset link can be inserted (GH #493).

  • A bare block reference now renders every line after a soft line break instead
    of showing only its first line (GH #506).

  • Cold graph opening no longer runs an independent whole-graph parse for page
    inventory alongside the shared startup parse, reducing first-open contention
    on slower devices (GH #550).

  • Page properties on an Org page are written in Org's own form. Setting a
    page property such as tags on an .org page put a Markdown
    tags:: reference line into the file's header, which Org does not define as a
    property — so neither Tine nor Logseq read it back and the property silently
    did not exist, while the app showed it as saved. Tine now writes a
    #+tags: reference file directive, the same form Logseq writes
    (UI-ORG-PAGE-PROP-BYTES-164).

  • A property whose key is not plain ASCII can be changed and removed again.
    A key such as klíč:: could be created once and then never matched, so
    editing its value added a second line with the same key instead of replacing
    the first, and deleting it did nothing — while the page went on listing the
    property (UI-PROP-KEY-GRAMMAR-164).

  • Search no longer stays on “Indexing — waiting for search to be ready…”, and
    the search index is no longer rebuilt from scratch on every launch. Opening a
    graph threw its saved index away and re-indexed every page, so on a large
    graph (roughly 10,000 pages and up) Ctrl+K and the search tab could stay
    unusable for many minutes and the app kept working the disk while nothing was
    happening. An unchanged graph now reuses the index it already built, and only
    pages that actually changed are re-indexed (GH #543).

  • Each search on a large graph is also roughly twice as fast. Every search
    used to re-fold each block's text while ranking it; it now reads the folded
    text the graph index already stores, which is the same comparison done once at
    indexing time instead of once per block on every keystroke. Results and their
    order are unchanged. Indexing a graph for the first time still takes time
    proportional to its size, and search on a very large graph is still slower
    than it should be. (GH #543)

  • While search waits for the index, a rebuild now says it is rebuilding instead
    of showing the general indexing message, so a long wait is distinguishable
    from a brief catch-up.

  • Undoing a move between pages can no longer lose the moved blocks. Undo and
    redo of a cross-page move (a drag, a journal-day move, or a carry) now write
    the page that regains the blocks first and hold the other page's save until it
    lands, inside the same crash-recovery record the original move used. Before,
    both pages were saved at once, so if the regaining page's save was refused —
    for example because another program had changed that file — the other page's
    removal could still be written and the blocks were left in neither file.

  • Two quick nudges of a selection across a journal-day boundary no longer
    duplicate a block.
    Repeating the move shortcut while the first move was still
    saving could add the same blocks to the target day twice, which then appeared
    twice and was written to the file twice.

  • A move between pages that cannot start because a page has unsaved changes now
    always says so. Keyboard moves across a journal-day boundary failed silently.

  • Typing ``` to start a code block lets you set its language again. The three backticks used to drop the cursor straight inside the block, which hides the line the language goes on, so there was no way to choose one except the /Code block command. The language list now opens on that line; pressing Escape puts the cursor inside the block as before. (GH #507)

  • Typing a workspace name with Chinese or another input method (IME) now works. The name field used to be rebuilt on every keystroke, which cancelled the character being composed. (GH #498)

  • Returning to the browser tab of a published export no longer shows a "couldn't finish checking for external changes" error. The read-only export has nothing to re-check, so it no longer tries. An export also no longer shows a stray “⊞ Table” button on every page, or an error after zooming or scrolling a PDF. (GH #549)

  • Carrying unfinished tasks to today while today's journal had a sync conflict no longer lets a later edit to one of the earlier days delete those tasks from that day's file. Tine now keeps the earlier days unchanged on disk until today is saved, as it already did for other block moves. Moving blocks into the same page twice before it saved also no longer leaves the first move's source page unable to save.

  • Queries answer every comparison they accept. like on task, priority
    and page.namespace (for example task like 'DO%'), page.journal != …,
    page.name not in (…) and content in (…) / not in (…) used to return
    nothing. like on a date or checkbox (scheduled, deadline, page.day,
    page.journal) is now reported as an error instead of silently matching
    nothing.

  • Quitting Tine right after saving no longer throws away the copy of that
    page Tine keeps for merging sync conflicts. Tine now waits up to 0.2 s at
    quit for those updates, so a later conflict on the page still gets
    three-way merge suggestions instead of more lines to review by hand.

  • While the query index is still building, property autocomplete now offers
    an Org page's own properties (its :PROPERTIES: drawer) and no longer
    offers a key:: line that sits inside a code block, the same suggestions
    it shows once the index is ready.


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. 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.

Don't miss a new tine release

NewReleases is sending notifications on new releases.