Skip to content

Tine v0.5.0

Choose a tag to compare

@github-actions github-actions released this 09 Jul 21:40

Added

  • Sheets: grids, databases, and boards over plain bullets. Blocks can now
    render as recursive grids, field tables, or boards with spreadsheet navigation,
    typed tine.fields:: schemas, editable task/property cells, tag boards with
    write-back, aggregates, markdown pipe-table conversion, and CSV/TSV file-drop
    import — all stored as ordinary Logseq markdown/org outlines plus tine.*
    properties. Phase 7 adds typed tine.formula.<name>:: computed columns and
    formula group-by axes, tine.filter:: table/board filters that fail open with a
    visible chip, and a right-click formula/filter editor.

  • Sheets: grids grow from their edges, and boards have a group-by picker. A
    grid is never a dead end — an empty grid shows a clickable placeholder cell
    instead of inert "empty grid" text, and hovering a top-level grid reveals +
    affordances on its right and bottom edges that add a column or row (one undo,
    cursor lands in the new cell). Boards now expose their grouping: a Group by
    dropdown above the columns and a matching Group by → submenu in the board
    right-click menu let you regroup by State, Priority, Tags, or any field —
    previously the axis was fixed to state at creation and only changeable by
    hand-editing tine.group-by::.

  • Sheets: paste nests or splats depending on mode. Pasting a copied grid
    region while cells are selected now splats it into the surrounding grid
    (anchored at the selection's top-left, growing/padding/overwriting the footprint
    in one undo, with a toast to undo if it replaced non-empty cells) instead of
    burying it as a nested grid. Pasting while editing a cell still nests the
    copy as a subgrid at the caret. This fixes the accidental double-nested grid and
    needs no modifier — the paste mode is the signal (ADR 0037).

  • Turn an outline into a grid/table from its bullet. Right-clicking a plain
    outline bullet that has children now offers Show children as → Outline / Grid /
    Table
    — the convert-in-place gesture the Guide describes, which previously existed
    only inside a sheet's own row menu. (Shared with that menu so both stay in sync.)

  • Add formula… from a column header. Right-clicking a table column header now
    offers Add formula… (it previously lived only on the table's ⋮/body menu, so
    the Guide's "right-click a column header" instruction pointed at a command that
    wasn't there). Works whether the header is a plain field or an existing formula
    column.

  • In-app Guide. Help → Guide and the Open Guide command now open bundled,
    read-only how-to pages for Sheets, quick capture, PDF annotation, tips, and the
    feature showcase. Guide pages live only in memory under Tine-guide/ until you
    explicitly use Copy the guide into your graph, which creates the complete
    editable tine-guide/... namespace, rewrites inter-guide links to the copied
    pages, includes referenced guide assets, and skips existing copied pages without
    overwriting user edits. A from-zero Features/Formulas page covers what a
    formula column is, right-click a column → Add/Edit formula, the IF/THEN/ELSE and
    value-picker faces, the </> raw toggle, and honest limits (single-level if,
    nested arithmetic needs raw); the Sheets guide's "Create one yourself" sections
    teach /Grid, /Table, /Board, Show children as → conversion, edge-grow,
    ghost Add-row/column buttons, and the board Group by picker rather than
    telling you to hand-type tine.header:: / tine.fields::.

  • Split view. Panes now have their own tabs and history, TreeSheets-style
    pane/seam keyboard navigation with type-at-a-seam-to-split, Ctrl+click opens
    links in another pane, tabs can be dragged to another pane or seam, and the
    layout persists across launches. Pane-select mode (Esc from block-select, or
    the palette) shows a hint pill and tints its target; arrows step strictly
    directionally across panes, seams, per-pane edge segments (split just that
    pane) and whole-window edges (split everything); selecting a pane focuses it,
    Delete closes it, and Ctrl+K opens a page right there.

Changed

  • New parser (lsdoc v2). Tine's block and inline parser was rebuilt from scratch
    as a two-phase, linear-time parser transcribed directly from Logseq's mldoc,
    replacing the previous optimistic scanner. It is more faithful to Logseq on
    real-world graphs and parses in guaranteed linear time; on any construct it has not
    yet transcribed it is designed to fail safely rather than silently mis-parse.

  • Richer link hover previews. Hovering a [[page]], #tag, or block reference
    now shows the target's real, read-only block tree — bullets, nesting, task markers,
    priority, full multi-line bodies, and inline formatting — in a floating popup you can
    move into and scroll, matching Logseq's page preview. (Previously it showed only the
    first line of each block as plain text.) Block-reference previews now open after the
    same short hover delay as page previews instead of instantly. Hovering never modifies
    the graph.

  • App identifier is now page.tine.app (was dev.tine.app). This lets Tine
    prove domain ownership (tine.page) for Flathub. On desktop the change is
    invisible: on first launch Tine moves your existing settings, backups, open-tab
    session and your last-opened graph from the old location to the new one, then
    shows a one-time note that a few app-level preferences (e.g. window size) may need
    setting again. (Android sideloads are a fresh app at the OS level and re-pick the
    graph folder once.)

Fixed

  • Backups now include nested pages. Graph backup and restore copied only the
    top level of journals/ and pages/, so pages inside sub-namespace folders were
    silently omitted — and the backup still reported success. Both now recurse the
    whole tree (skipping hidden and symlinked directories), and the completeness
    check counts every Markdown/Org file.

  • PDF highlight migration can no longer clobber another PDF's data. When two
    PDFs had asset filenames differing only by case or space-vs-underscore, migrating
    one PDF's highlights to the new storage key could read and then delete the other
    live PDF's .edn and highlight files. Migration now skips the legacy key whenever
    it belongs to a different PDF still in the graph.

  • ## headings render on every line of a multi-line block. In a block spanning
    several lines, only the first line's heading was styled; ##/### on later lines
    rendered as plain text. Each heading line now renders at its level.

  • Typing in a very long block no longer jumps the caret to the bottom. In a
    block taller than the window, each keystroke scrolled the view so the caret sat at
    the bottom edge. The editor now holds the scroll position steady as the block
    resizes.

  • Sheets: removing a just-added table column takes effect immediately. A column
    added via Add column lived only in an in-memory signal, so removing it from the
    schema left it on screen until an app restart. It's now cleared on removal, and an
    added-but-undeclared column gets its own Remove column in the header menu.

  • Sheets: long cell text wraps instead of stretching the whole table. Sheet
    columns are capped with fit-content() and cells wrap, so one long note grows its
    row taller rather than blowing the table out horizontally. The in-cell value editor
    no longer overflows a narrow column (e.g. a numeric cell) past its right edge.

  • An empty day (or page) shows a bullet to type into again. Deleting the last
    block via Delete block / a multi-block selection (which bypass the Backspace
    last-block guard) left the page with nothing to click. It now re-seeds the same
    phantom empty bullet a brand-new day gets — present to type into, but only written
    to disk once you actually type.

  • A conflicted page can be deleted again. When a page's on-disk copy changes
    underneath an open edit (e.g. a Syncthing-delivered update), its save is refused
    until the conflict is resolved — but deleting it also flushed-first and aborted on
    that impossible save, so the page could be neither saved nor deleted. Delete is
    itself a resolution now: the on-disk version still moves to .tine-trash
    (recoverable) and the page is removed.

  • Query builder: a way back from "advanced". The visual query builder's
    "⚙ advanced" switch to raw Datalog was one-way — advanced query blocks now show a
    ← Simple control that returns to the visual builder. Within a session it
    restores the exact pre-conversion query (including the sort/aggregate/group-by
    clauses the Datalog form drops); for a query authored directly as raw Datalog it
    reverse-parses the recognized clause set, disabling the toggle with an explanation
    when the query can't be represented visually.

  • The identifier migration now actually runs. The first cut migrated too late —
    after WebKitGTK had already created the new (empty) data directory — so it backed
    off and left you on the Welcome screen with your graph "forgotten". Migration now
    runs before the webview starts, backfills over an empty new directory, and also
    recognises the older dev.logseqclaude.app layout.

  • Android: external links now open. Links on the About page (Changelog, Report
    an issue, Website, Ko-fi, …) and the Help/Releases links did nothing on Android —
    they tried to spawn a desktop opener that doesn't exist there. They now open via
    the platform (an ACTION_VIEW intent). (GH #49)


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 arch — unzip and run the exe (needs the WebView2 runtime, preinstalled on Windows 10/11). macOS/Windows builds are currently unsigned (right-click → Open on macOS; More info → Run anyway on Windows). On macOS, if Tine keeps asking to access your Documents folder on launch, see the workaround.