Local-first · open source · works on your Logseq graph

The same graph.
A faster outliner.

Tine is a fast, local, Logseq-compatible outliner. It reads and writes the same Markdown files Logseq does — so you can switch between the two whenever you like, with no import, no export, and no lock-in.

Free & open source (AGPL-3.0). Linux is the primary, best-tested platform today; macOS & Windows builds are newer. Not yet 1.0.

Tine showing a multi-day journal feed
Alpha · new in 0.4

Tine is now on Android

A native Android app that opens and edits your real Logseq graph on your phone — the same Markdown files, over your own sync, right alongside the Logseq mobile app.

Tine running on Android — a journal feed with tasks and nested blocks on a phone

Early and experimental. For now it's a sideloaded APK from GitHub (arm64 phones) — your phone will warn that it's from outside the Play Store, which is expected for a self-signed app. Play Store & F-Droid are planned.

Built to sit beside Logseq — not replace it

We're long-time Logseq users and we have a lot of respect for what that project pioneered. Tine isn't a fork and it isn't a clone trying to pull you away. It's an independent reimplementation that deliberately targets Logseq's on-disk format, so your notes stay exactly where they are — plain Markdown files you fully own.

Logseq
Tine
  • Point Tine at the journals/, pages/, assets/ and logseq/config.edn you already use.
  • Edit in either app — one at a time — on the very same files.
  • Saves are byte-compatible Markdown that preserve your formatting, so they don't create sync churn.
  • In the default Direct files mode, keeps working alongside the Logseq mobile app (or fastlog) over your own Syncthing/Dropbox sync.
  • Testing only: a separate, explicit managed-sync opt-in can keep Markdown/Org as an editable projection while Tine records operation history inside the same graph. It is experimental and never enables itself; ordinary file-based graphs and external sync stay unchanged unless you choose it in Settings.
  • Not affiliated with or endorsed by Logseq — just compatible with it, on purpose.

And it keeps the good Logseq features you already rely on — live /calc blocks, callouts, queries, PDF annotation, namespaces, page properties, org-mode and more — reading and writing them in the very same format. Browse the Logseq docs for what's possible, try it in Tine, and if something you use doesn't work yet, open an issue — we may well just add it.

A live /calc block evaluating arithmetic with a variable
Live /calc blocks — a Logseq feature, preserved
Colored note, warning, and tip callouts
Callouts — same syntax as Logseq

What Tine adds on top

These started as "I wish Logseq did this." They're the reasons Tine exists beyond raw speed — and you get them without giving up a single feature of your file format.

Native speed

A pure-Rust core and fine-grained SolidJS reactivity in a tiny Tauri/WebKit runtime — no Electron, no virtual-DOM churn. Typing stays in the frontend; whole-graph reads hit an in-memory index. It stays quick on large graphs.

Sheets

Turn any bullet and its children into a spreadsheet-style grid, a typed field table, or a Kanban board — with formula columns, filters, aggregates, group-by, and CSV/TSV import. It's all still plain Logseq Markdown; the views are harmless tine.* properties Logseq quietly ignores.

🪟

Split view

Split the window into panes, each with its own tabs and history. Ctrl+click opens a link beside what you're reading, drag a tab to another pane, and TreeSheets-style keyboard navigation splits at a seam by typing. The layout survives a restart.

🧩

Capability-limited plugins

Install small WebAssembly extensions and inert token themes from a signed catalogue. Packages start disabled, declare narrow capabilities, and never receive unrestricted access to Tine, your files, or the browser runtime.

🗂️

Built-in tabs

Middle-click any bullet, page, or search hit to open it in a background tab. Pin, drag-reorder, Mod+W to close, and use the overview when titles no longer fit. Pins survive a restart.

🔎

Search that becomes a query

Open every Ctrl+K result in a persistent tab, refine it with friendly filters or the visual query builder, and view the same matches as search, list, table, or board. Name it only when it deserves to become a real query page.

🎯

Focus mode & dim

Hide the chrome and fade everything but the block you're working on, with layered Esc. A calmer way to write a long note.

Global quick-capture

Bind a desktop hotkey and a small always-on-top box pops from any app — with the full editor — and files a bullet to today's journal. Even when Tine isn't focused.

🔁

Carry tasks forward

Roll unfinished tasks into today (last 7 / 30 / 365 days or a custom window), optionally keeping their ancestor context.

🛟

A real data-safety story

Conflict detection instead of silent overwrites, launch snapshots with one-click restore, delete-to-trash, and transactional renames. Built to live safely on a graph you also edit from your phone.

A Tine page showing a grid, a typed field table, and a task board over plain bullets
Sheets — grid, field table, and board
Three panes — a tall sheet on the left, two stacked panes on the right — with the top-right pane highlighted in pane-select mode
Split view — pane-select highlights the target pane
Built-in tabs across the top of the window
Built-in tabs
Focus mode with inactive blocks dimmed
Focus & dim
The global quick-capture window before typing, showing the optional page-title hint Quick-capture with a page title filled in, capturing to a new page
Global quick-capture — empty, then captured to a new page
Carry unfinished tasks forward to today
Carry tasks forward
Query results and the visual query builder
Queries & visual builder
PDF text and area highlighting with a notes page
PDF annotation
Audio waveform overlay player with skip and speed controls
Audio waveform player

Light or dark — it follows your system

Tine ships a polished dark theme and switches with your OS, or you can toggle it yourself. Your custom Logseq CSS and themes apply just the same.

Tine's journals feed in dark mode

Better defaults — always one click back to Logseq

Where we think a default can be improved, we change it — but we never take the choice away. Anything Tine does differently from Logseq is clearly badged Differs from Logseq in Settings, with a one-click ↩ Match Logseq button. Your muscle memory is safe.

  • Copy only the selected blocks — selecting just a parent no longer copies its whole subtree. (Logseq copies the subtree — one click to restore.)
  • Strip collapsed:: on copy so a paste into a text editor is clean. (Toggle off to match Logseq.)
  • Click a block reference to scroll to it in place, or switch back to Logseq's zoom-in behavior.
  • Link-autocomplete default — create a new page (like Logseq) or link the first match.
  • Fully remappable keyboard shortcuts — in Settings or via config.edn :shortcuts.
  • Journal date format, file-format, and watcher mode — all read from your config.edn and adjustable in-app.
Settings panel showing remappable shortcuts and revertable options

What Tine doesn't do — for now

Tine is a faster outliner, not a wholesale replacement for Logseq. A few things are deliberately out of scope. For those, just keep using Logseq on the same graph — running both is the whole idea.

Whiteboards

The spatial canvas isn't part of Tine.

Flashcards / spaced repetition

No SRS review. Your #card blocks are preserved in the files, just not drilled.

Logseq / Obsidian plugin compatibility

Tine has its own capability-limited plugin system, not an @logseq/libs or Obsidian API runtime. Existing plugins need a deliberate port.

Built-in git / sync

Bring your own — Syncthing, Dropbox, git. Tine just reads and writes the files.

iPhone / iPad

There's a native Android app, but no iOS build yet. On iPhone, use the Logseq mobile app — or fastlog — on the same synced graph.

On the radar, not yet shipped: a graph view and broader coverage of advanced (Datalog) queries.

Built by AI, in the open

Tine is vibe-coded — built by Claude Code, with help from Codex, under human direction and review. We're not hiding that, and we're not making a thing of it either; it's simply how Tine is made.

AI-built software makes some people wary — fair enough. So Tine is made to be checked, not taken on faith:

  • Open source (AGPL-3.0) — every line is on GitHub to read or audit.
  • Your files, your graph — it only ever touches plain Markdown you already own.
  • Deliberately careful with your data — it detects outside changes and flags conflicts instead of overwriting, keeps launch snapshots, and deletes to a recoverable trash.
  • No lock-in — it round-trips byte-for-byte with Logseq, so you can walk away at any time and lose nothing.

Point it at a copy of your graph and judge it by how it behaves.

And here's the other side of that: AI writes the code — the human writes the reflections. For each release I post a short note in my own words about what changed and why, along with the conversations it started — Claude summarizes them faithfully and generously, fully linked, skeptics included. Read “The Human's Blog” →

Support Tine

Tine is free, open source, and built in the cracks of a busy life. If it's made your notes a little faster or your day a little smoother, and you'd like to say thanks with a coffee — that genuinely makes me happy, and I'm grateful. Anything donated goes first toward Tine's running costs — the domain, and things like app-store registration fees down the line.

One honest thing, so there are no crossed wires: donating won't move Tine up my list, and it won't buy a feature. I work on Tine when I can and on what I find worth doing — a tip changes none of that. Think of it as a thank-you for what already exists, not a down payment on what's next. No expectations, no obligations, either way. 🌱

Community

Questions, ideas, screenshots, bug reports — come say hello on the subreddit. It's the best place to follow what's shipping and shape what's next.

Try it on a copy of your graph

Because Tine works on standard Logseq files, the safest way to try it is to point it at a copy of your graph and see how it feels. Nothing to import, nothing to migrate.