github martinkoutecky/tine v0.2.2
Tine v0.2.2

latest releases: beta, v0.6.987, v0.6.986...
3 months ago

Added

  • Scroll position restored on back/forward. Navigating away from a long page
    and pressing back (Alt+←) now returns you to where you were scrolled, like a
    browser — and switching tabs restores each tab's scroll too. A new page still
    opens at the top.
  • First-run onboarding + "create a new graph". Starting Tine with no graph
    configured now shows a Welcome screen instead of a blank window: open an
    existing Logseq graph
    , or create a new graph scaffolded with a small narrated
    demo — a "Welcome to Tine" tour plus Features/… and Project/… pages that
    exercise block references, embeds, namespaces and tasks, and walk a newcomer
    through quick-capture (with how to bind the hotkey), slash commands, the command
    palette, the sidebar, PDF annotation and tabs. The new graph is ordinary Logseq
    Markdown (triple-lowbar namespace filenames) — it opens in Logseq too.
  • Block-reference parity round 2. Right-click an inline ((block ref)) for a
    context menu (open in sidebar / go to block / copy ref / copy embed). The
    per-block references panel now shows each referrer's ancestor breadcrumb (like
    OG). In the editor, Mod+C with no text selected copies a reference to the
    current block. Copying blocks now also puts a text/html flavor on the
    clipboard (best-effort) so a paste into a rich editor keeps the outline nesting. A
    block embedded via {{embed ((self))}} no longer shows its own ref-count badge,
    and a ((non-uuid)) in prose is no longer counted as a reference (both match OG).
    New option (Settings → Journals & tasks): click a block reference to zoom in
    (Logseq) vs scroll-to-it-in-place (Tine default).
  • More OG macros. {{twitter}} (alias of {{tweet}}), {{vimeo}} and
    {{bilibili}} (iframe embeds, accept a bare id or a URL), {{img url [w h] [left|right|center]}} (sized/aligned image), and user-defined :macros from
    config.edn — {{name a, b}} substitutes the comma-separated args into the
    template's $1..$N placeholders and renders the result as markdown (so a macro can
    expand to [[links]], bold, other macros…). {{youtube-timestamp}},
    {{cloze}} (degrades to click-to-reveal) and {{zotero-*}} render in a degraded
    form and say so (no on-page-player seek / SRS engine / Zotero connector).
  • Video drag-resize + audio "⇔ Widen" toggle. Video now has the same corner
    resize grip as images (persisted as a {:width N%} brace). Audio — which has no
    fullscreen — gets a toggle that stretches the seek bar to the full column for
    precise scrubbing.
  • Image lightbox closes on Esc (previously click-away only).
  • Linked/Unlinked references in the right sidebar. Opening a page in the sidebar
    now shows its Linked & Unlinked References sections too, like OG (not just the page
    body).
  • Configurable copy behavior (Settings → Journals & tasks), with a new
    "Differs from Logseq" row style — an amber badge + a one-line "Logseq behavior"
    note + a "↩ Match Logseq" button — for options whose Tine default intentionally
    diverges from Logseq:
    • Copy a parent block's sub-blocks — default OFF (Tine copies only the
      blocks you actually selected; selecting just a parent no longer drags its whole
      tree into the clipboard). Turn ON for Logseq's "always copy the sub-tree".
    • Strip collapsed:: when copying — default ON (Tine drops this view-state
      property from copied text; id:: is always stripped too). Turn OFF to match
      Logseq, which keeps collapsed::.

Changed

  • Asset filenames are now yyyymmdd-hhmmss-name (timestamp first, human-readable),
    so a plain name-sort in assets/ is also chronological. (Was name_yyyymmddhhmmss.)
  • Inline block refs are link-styled, not a grey chip. They keep the full-strength
    text colour with a thin accent-coloured underline and a link-coloured hover (OG's
    .block-ref), instead of the previous grey-text-on-grey-fill that was easy to miss.

Fixed

  • Copy/cut no longer leaks id:: into pasted text. A referenced block carries an
    id:: property; OG strips it when copying to the clipboard and now Tine does too.
    (The id:: stays in the file — opening a block in the sidebar/new tab/zoom still
    stamps one so those spots survive a restart — it's just removed from the clipboard
    copy, exactly like Logseq.) Quick-capture keeps id:: (it writes to a file).

  • Left sidebar "All pages" works on large graphs. The page-count and the
    expandable list keyed off a one-shot fetch that raced a slow-loading graph and never
    retried; it now refetches when the graph finishes loading.

  • Namespace pages match OG. The {{namespace}} macro now renders the bold
    "Namespace" label + root link header (then the bulleted descendant tree), and
    every non-journal page that's part of a namespace gets OG's automatic
    "Hierarchy" section below its blocks — a bulleted list with one breadcrumb
    row per namespace level
    ([[Formula1]] / [[2026]] / …), each segment a link to
    its cumulative path. Intermediate levels are synthesized, so a namespace with no
    file of its own (e.g. Formula1/2025 when only Formula1/2025/… exists) still
    gets its own row — like OG's recursive listing. Replaces the earlier non-OG
    "Namespace (direct children)" list.

  • Page icon:: is hidden from the property list (it's shown as the title icon),
    matching OG.

  • Per-block reference count + referrers panel. A block that's referenced
    elsewhere now shows a small count badge to its right (matching Logseq): click it
    to expand the list of blocks that reference it (grouped by page, same-page
    referrers included), or shift-click to open the block in the right sidebar. The
    count covers bare ((id)), labeled [text](((id))), and {{embed ((id))}}
    references. (Like the page-level linked references, it refreshes when the graph
    changes, not on every keystroke.)

Fixed

  • “Copy image” from the image viewer works now. Click an image to open it,
    then right-click → Copy image (or the Copy button) to put it on the OS
    clipboard. WebKitGTK's native right-click "Copy Image" doesn't actually
    populate the clipboard (paste yielded nothing); Tine now encodes the image and
    writes it through the Rust clipboard path instead.

  • The pinned-tab pin is back (the red 📌). Bundling a color-emoji font made
    WebKitGTK paint the 📌 as a blank glyph (an empty gap on pinned tabs); emoji
    now render as Twemoji SVG images, so the red pushpin shows everywhere again.

  • Labeled block references resolve. The [label](((block-id))) form — a link
    whose target is a block — now renders as a clickable block reference showing
    label (and navigates to the block, with a hover preview), instead of a dead
    link that tried to open ((id)) as a URL. The bare ((id)) form already
    worked; this is the labeled variant Logseq writes for "copy as link".

  • Clicking a block reference jumps to the block. A block ref now scrolls to
    and briefly highlights the referenced block (even when it's on the same page,
    where it previously appeared to do nothing) instead of only opening the page.
    Shift-click opens the referenced block in the right sidebar.

  • Block references export correctly. The static HTML export now resolves
    ((block ref))s (bare and [label](((id)))) to a link to the target block's
    anchor on its exported page, with the block's text/label — instead of the old
    broken publish/((5cfb… link with a stray )). Unresolved refs render as plain
    text, never a broken link. (The export parser is now paren-balanced too.)

  • Inline link/image targets are paren-balanced. The [..](..) / ![..](..)
    parser now counts parentheses when reading the target, so a URL that itself
    contains parentheses is captured whole — fixing not just block-ref links but
    any link/image whose URL has a (, e.g. …/wiki/Foo_(bar) or img_(1).png.

  • Math renders in the HTML export. Exported pages now load KaTeX (and mhchem
    for \ce{…}) and wrap $…$ / $$…$$ as \(…\) / \[…\], so equations
    typeset client-side instead of showing raw TeX. (Typesetting fetches KaTeX from
    a CDN, so it needs a network connection when the page is viewed.)

Added

  • {{namespace X}} macro. Renders the full nested descendant tree of a
    namespace (like Logseq), each page showing its icon::. Previously it was
    printed as literal text.
  • Page icons. A page's icon:: property now renders as an icon next to the
    page title and beside each page in the {{namespace}} tree, matching Logseq.
  • Emoji render everywhere (Twemoji SVGs). Emoji — page icon::s, emoji in
    notes — now render as bundled Twemoji SVG images instead of relying on an
    emoji font. WebKitGTK paints a color-emoji webfont as a blank glyph (page
    icons showed as empty gaps), but an <img> renders in every engine. The SVGs
    are bundled locally, so it works offline.

Fixed

  • Dark theme: native form controls follow the theme (color-scheme), so the
    number-input spinners (e.g. Carry last N days, the agenda window) are dark in
    dark mode instead of white.
  • “Open in external player” works for video, not just audio. Tine launched
    the OS player inheriting the environment it sets for its own WebKitGTK
    rendering (LD_PRELOAD, WEBKIT_DISABLE_*, GDK_BACKEND); under those a
    player’s video output could fail — e.g. VLC opened and closed immediately —
    while audio (no video output) was unaffected. The external opener now runs
    with those variables scrubbed.

Added

  • Configurable [[/# autocomplete default. Settings → Journals & tasks →
    Link autocomplete default: ON makes Enter link the first match; OFF
    (default, matching Logseq) makes Enter create a new page/tag unless an exact
    match exists. The other options stay one arrow-key away either way.

Download an installer for your platform below. macOS/Windows builds are currently unsigned (right-click → Open on macOS; More info → Run anyway on Windows).

Don't miss a new tine release

NewReleases is sending notifications on new releases.