Back to portfolio

March 29, 2026

Granite

A local-first thinking system - markdown notes, wikilink navigation, and a calm editorial UI that evolves from linked notes into a durable knowledge graph.

Local-First
Desktop App
Open Source
View project

Granite is a local-first thinking system - a native desktop app where ideas start messy, connections become explicit, and your knowledge stays as files on disk that you own.

The Problem

Note-taking tools ask you to choose between two compromises. Trust a cloud platform with your thinking and get sync, or keep files local and lose everything else. Notion stores your knowledge in someone else's database. Obsidian keeps files local but ships on Electron, dragging a full browser engine onto your desktop for what should be a lightweight editor. Neither is designed around how thought actually works - fragments, clusters, jumps, and partial structures that only become clear over time.

The deeper problem is that linked notes are necessary but not sufficient. A plain wikilink says one note points to another. It doesn't say what kind of relationship that is, whether the idea is provisional or settled, or whether one concept evolved from another. Most tools stop at links. Granite starts there and builds toward something more useful.

The Architecture

Granite is a native desktop app built on Tauri with a Rust core and a Next.js interface. The three layers have a single job each.

The Core

A Rust library that handles everything behind the scenes - opening your workspace, searching notes, resolving wikilinks, indexing backlinks, building the graph view, and rewriting links when you rename things. It works directly with the files on disk and has no opinion about how those files are displayed.

The Shell

A thin native layer that connects the core to the interface. It holds your workspace path and exposes the core's capabilities as commands. It owns no logic of its own.

The Interface

A React-based editor with a calm, editorial feel. It talks through a transport abstraction - meaning the same interface runs in a browser during development with no native tooling required. The same abstraction creates a natural seam for a future sync layer without touching any existing code.

Key Design Decisions

Your files, your folder

Notes are plain markdown in a regular directory. Open it in any editor, commit it to Git, back it up however you like. Granite never converts, locks, or intermediates your data. The folder is the source of truth - the app is just a lens.

Wikilinks as navigation

Link between notes with [[wikilinks]]. Granite resolves them intelligently - matching by path, filename, or title. Rename a note or move a folder and every inbound link rewrites automatically. Backlinks, outgoing links, and the graph view all derive from the same engine.

Sync as replication, not dependency

When sync arrives, it will connect to your own storage account - Dropbox, OneDrive, or Google Drive - not a Granite-hosted service. Remote storage replicates your local dataset so another device can pull it and continue from the same state. The local workspace stays canonical. The network is an optimisation, not a requirement. The full design rationale is documented in the storage sync decision.

From linked notes to a thinking system

The current version handles notes, links, backlinks, and a graph view. The product direction goes further - adding knowledge state to notes (idea, formulation, solidified, reopened), lightweight relationship types between them, and eventually spatial views for non-linear reasoning. Markdown stays the durable container. The UI adds the semantics that plain text can't carry on its own.

The stack is deliberately simple. Tauri gives native performance without Electron's overhead. The Rust core compiles to a standalone library that could back a CLI, a server, or a mobile companion. And the transport pattern means the interface never knows or cares where the data lives - it just works.