The hand-packed icns was pixel-clean (verified by unpacking and scanning every size), but macOS 26 composites legacy .icns icons into the Liquid Glass system at render time; stacked on Icon Composer's baked PNG-export lighting, that clips the rim highlights into the near-corner specks and abrupt highlight ends (owner report 2026-10-13). The fix is the real layered icon: mac.icon now points at the Icon Composer document (build/icon.icon, copied from ~/Documents/Affinity/lh-logo) and electron-builder compiles it via actool into Assets.car — macOS 26+ renders the true Liquid Glass design (dark/tinted variants included). actool's backwards-compat icns caps at 256px, so scripts/after-pack.cjs swaps in the existing full-res build/icon.icns before signing: pre-Tahoe macOS keeps today's quality, Tahoe gets the layered icon. Windows/Linux get the owner's flat design (rounded squircle with baked transparency): scripts/make-icons.mjs renders build/icon-flat.svg via resvg into build/icon.ico (16→256 PNG entries) + build/icon.png (512), and electron-builder.yml pins win.icon/linux.icon. desktop:dist injects DEVELOPER_DIR (actool needs Xcode; the machine selects CommandLineTools by default, CI's setup-xcode takes precedence via the :- default). The release workflow's mac job selects Xcode 26+ explicitly. Verified locally: mac --dir build (Assets.car + checksummed full-res fallback + CFBundleIconName/IconFile) and the win-unpacked exe carries our ico bytes; NSIS/AppImage assembly is CI's (cross-build tooling can't run on arm64 macOS). Runbook updated. 1610/1610.
LearnHarness
A desktop AI tutor that teaches by questioning — one reasoning step at a time — and keeps everything you learn in a growing knowledge graph.
It runs on your machine, with your own API key. Your data stays in plain files you can open.
The idea
Understanding has a dependency structure: some things require other things first. A lesson that ignores what you already hold is wasted on you; a lesson that outruns what you hold is lost on you. There is exactly one optimal path — the smallest set of steps from what you know to what you want to know — and finding it requires knowing precisely what you know.
So LearnHarness measures first. It questions you to bracket the edge of your understanding, plans the shortest path from that edge to your goal, then teaches it one reasoning step at a time — checking that each step lands before building on it. Every step is small enough to feel obvious on arrival.
And it remembers. Everything taught accumulates into a single persistent structure — propositions and the reasoning chains that connect them — rendered as the graph that is the app's home view. The next session starts from what the last one built: no re-probing what you already hold, questions aimed at the actual boundary of your knowledge, learning that compounds.
Teaching installs understanding; practice makes it available when you need it. Separate practice sessions draw problems from the same graph — retrieval at the edge of your ability, not review — because being taught something and having it come to mind in the right situation are different states.
Yours, locally
A system whose premise is that it can be trusted is built so that it can be checked:
- Your keys. Bring your own (OpenRouter works out of the box). No subscription, no markup — a live cost meter shows what each session actually spent.
- Your machine. Chats, graph, settings — plain files under your home directory. Nothing is sent anywhere except the model calls you configure.
- Inspectable. Every system prompt is visible and tunable. The graph is stored as reasoning chains — the structure of what you were taught, not a pile of text.
Download
- macOS (Apple Silicon): signed and notarized DMG.
- Windows (x64): installer. Currently unsigned; Windows may show an “unknown publisher” / SmartScreen warning.
- Linux (x64): AppImage (recommended) or Debian/Ubuntu
.deb.
All three platforms support in-app updates. AppImage updates need no administrator permission; .deb updates may request it.
Quick start
- Download your platform’s package: drag the macOS app to Applications, run the Windows installer, or make the Linux AppImage executable and open it (alternatively, install the
.deb). - Open Settings, paste your OpenRouter API key, and pick your models.
- Start a session and say what you want to understand.
Development
npm install
npm run dev # http://localhost:3000
npm test # deterministic, no LLM, no network
The architecture spec and full development guide live in docs/ — start with docs/architecture.md and docs/development.md.
Questions or bugs: GitHub Issues.