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 otherkey:: valueline 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 underpublished-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.htmlopened 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 astagson an.orgpage put a Markdown
tags:: referenceline 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: referencefile 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 asklíč::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 blockcommand. 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.
likeontask,priority
andpage.namespace(for exampletask like 'DO%'),page.journal != …,
page.name not in (…)andcontent in (…)/not in (…)used to return
nothing.likeon 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 akey::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.