Obsidian at the desk · Basalt in your pocket

The 1% don’t take better notes.
They just never lose them.

Basalt puts the Obsidian vault you keep in a GitHub repo on your phone — fully offline, and writable. Capture the thought on the bus, and it lands in your repo as a real commit when the signal comes back. One vault, plain markdown, yours forever.

Free and MIT-licensed · No account with us, ever · Try the bundled sample vault with no repo at all

Six screens, all of them offline.

Real captures, not renders — taken on the bundled sample vault with the network off, which is exactly what you get before connecting a repo.

Browsing a vault: folders, favourites and recent notes
Browse. Folders, favourites and recents, straight off the disk.
A note rendered with a callout and wikilinks
Read. Callouts, wikilinks and frontmatter, rendered natively.
Full-text search results with matches highlighted
Search. Full-text across every note, with the match highlighted.
The note connection graph with a minimap
Graph. Every wikilink is an edge. Filters, search and a minimap.
The tag index, showing nested tags and counts
Tags. Nested tags with counts, indexed at sync time.
A Mermaid diagram rendered inside a note
Diagrams. Mermaid renders from the bundled library — offline too.

It is four habits, not a personality type.

Nobody keeps their notes for a decade because they found a cleverer app. They keep them because of what the notes are made of, and where they live.

01

The files stay yours

Plain markdown in a repo you own. No proprietary store, no account with us, no export step to dread later — Basalt keeps no server and no copy of your vault anywhere but your device.

02

One vault, not five apps

The same folder on the desk and in your pocket. Obsidian writes it, Basalt writes it, and the repo underneath keeps them honest — so there is never a second place your notes half-live.

03

Capture where the thought happens

Which is almost never at the desk. Basalt edits offline on the phone and queues the commit; it lands the moment you have a connection again. No connection, no lost thought.

04

Nothing is ever quietly lost

Every save is a real commit to your repo. The whole history is one git log away, on something you can clone onto any machine you will ever own.

“The 1%” is a standard, not a statistic. We have not counted anyone — those four lines are the whole of it, and the first two are just Obsidian and git doing their job. Basalt exists because the last two are the ones that break on a phone.

Basalt is the pocket half. Obsidian keeps the desk.

This is not a replacement for Obsidian and it is not trying to be. It is the missing third of a loop you probably already run — the part that works when you are nowhere near a laptop.

Obsidian

The long sessions. Plugins, canvases, the heavy restructuring you only do sitting down.

Your GitHub repo

The spine. Plain markdown, full history, one clone away from any machine — and no third party in it.

Basalt

The other twenty-three hours. Read, search, link and write from the phone, online or not.

Obsidian has no git. Basalt Causeway is the arrow.

Basalt already owns the right-hand side of that diagram — it watches HEAD and pulls when the SHA moves. The missing piece was a desktop publisher, because Obsidian cannot push a vault to a repo by itself. Basalt Causeway is our plugin for exactly that, and nothing else.

One commit per sync, not one per note

It writes through GitHub’s Trees API rather than shelling out to git, so a session that touched thirty notes lands as a single new HEAD — which is exactly one pull on the phone.

The loop closes both ways

Notes you write in Obsidian reach the phone; the commits Basalt pushed from your pocket come back down into the vault. Sync manually, or let it publish after a five-second settle.

Attachments too — and never your config

Every file in the vault ships, because images are half of what makes a note render right on a phone. .obsidian/, .trash/ and .git/ are excluded before anything reaches the tree builder.

Dataview queries arrive as answers

A dataview block holds a query, not a result, so it would reach the phone empty. The plugin bakes the rendered table into the published copy and leaves the live query in your note.

Divergence is reported, never guessed at. There is no merge machinery: if both sides edited the same note, your local file is left untouched and the remote copy lands beside it as a .conflict-<sha>.md sidecar for you to settle. Your token stays on your machine and goes nowhere but GitHub — no server of ours sits in this loop either.

Desktop and Obsidian mobile · Install via BRAT from kpndevroot/obsidian-basalt-causeway · Needs a fine-grained token with Contents: read and write

A repo in. Commits back out.

Every sync is the same round trip — and note bodies never leave your disk. Only what Basalt needs to find things lives in the database.

Pull

Basalt fetches your repo as a zipball pinned to an exact commit SHA — the whole vault in one request.

Index

The snapshot is swapped in atomically, then files, an FTS5 full-text index, the link graph and tags go into SQLite.

Read and write

Note bodies stay on disk and render natively. Edit any of them with the network off — the queue holds your changes.

Push

Queued edits go up as real commits to your branch. Review them first, and resolve it yourself if the remote moved on.

Everything the desk version taught you to expect.

Rendered natively, indexed on-device, and none of it waiting on a network round trip.

Offline-first, not offline-tolerant

After the first sync the network is optional. Browsing, search, wikilinks, tags and the graph all work on a plane, on the tube, or on no signal at all.

Edit offline — commits when you are back

A full markdown editor with an insertion toolbar for the symbols that hurt to type on a phone. Edits queue locally and push as real commits later.

Review before you push

A pending-changes screen shows exactly what will be committed. If GitHub moved on first, resolve it your way — overwrite, discard, or keep both copies.

Search that answers instantly

SQLite FTS5 indexes every note at sync time, ranked with the matching snippet highlighted — plus a fuzzy quick switcher for jumping straight by name.

Backlinks and linked mentions

[[wikilinks]] resolve on-device the way you expect, the reverse edges are indexed, and every note ends with a list of what points back at it.

The connection graph

The whole vault as a graph, with filters, search and a minimap — or scoped to the neighbourhood of the single note you are reading.

Real Obsidian markdown

Callouts, transclusion, footnotes, ==highlights==, frontmatter, tags, tables, fenced code and Mermaid diagrams — rendered, not printed as raw syntax.

Tick a box without opening the editor

Task lists are tappable straight from the page, and a dated checklist draws itself as a month calendar — which is all a habit tracker ever needed to be.

Highlights that survive a re-sync

Mark a passage, export the set, and find your marks still on the right words after the note has been edited somewhere else and pulled back down.

Expo SDK 57React Native 0.86React 19SQLite · FTS5expo-routerTypeScript strictMIT licensed

Your notes are just a repo. Keep them that way.

Point Basalt at the vault you already have, sync once, and carry all of it — readable, searchable and writable — with the network off.

Android arm64, signed and attached to every release. iOS builds from source.