# nodepad: a spatial canvas where the model works quietly in the background

> A browser-only Next.js app that classifies notes into 14 types, infers connections between them and occasionally surfaces a synthesis. No account, no server, no database, and your API key never leaves the tab.

**mskayyali/nodepad** — A spatial research tool that explores using AI to augment thinking, not replace it.

- Repository: https://github.com/mskayyali/nodepad
- Website: http://nodepad.space
- Stars: 1,074 · Forks: 164
- Language: TypeScript
- License: MIT
- Published: 2026-10-07 · Updated: 2026-10-07 · Language: en
- Canonical page: https://hysenlabs.com/projects/mskayyali-nodepad

## A different premise about where the model belongs

The README opens by naming a pattern almost every AI tool shares: a chat interface where you ask, it answers, and you ask again. That interaction is sequential and conversational, and it is optimised for producing output. nodepad is built on the opposing claim, that thinking is spatial and associative, and that a model is most useful when it works quietly in the background rather than at the centre of the screen.

The loop that follows is easy to state. You add notes, and the model classifies them, finds connections between them, surfaces what you have not said yet, and occasionally synthesises an emergent insight from the whole canvas. The phrasing about earning its place by being useful rather than prominent is the design thesis, and it is testable: if the classification is right and the connections are real, the tool disappears into your work. If they are wrong, you notice immediately, because you know what your own notes say.

The author describes the project as a design experiment, and that framing matters for judging it. There is no feature list defending a business model here, just an argument that sequential conversation is the wrong container for associative work, implemented well enough to try.

## Fourteen note types and an annotation that adds something

Every note you type into the input bar is placed on a spatial canvas and automatically classified into one of 14 kinds: claim, question, idea, task, entity, quote, reference, definition, opinion, reflection, narrative, comparison, thesis and general. That list is longer than it has any right to be for a heuristic, which tells you the classification is a language model call rather than keyword matching.

Each note is also enriched with a short annotation that the README describes as adding something the note does not already say. That phrasing is doing real work and is worth reading twice. An annotation that paraphrases the note is wasted effort, because you already wrote it. An annotation that supplies the counterargument you had not considered, or names the assumption the note is quietly making, is a genuine contribution. Whether the implementation delivers on that depends entirely on the model, which is why the provider list below matters more than usual.

Manual correction is expected rather than exceptional. Double-clicking a note opens it for editing, and clicking a note's type label reclassifies it by hand. In a tool that infers structure for you, the ability to overrule the inference is the difference between assistance and paternalism.

## Connections, synthesis, and three views of the same canvas

Connections between notes are inferred from content, and the interaction attached to them is the detail I would point at first. Hovering a connection indicator dims the unrelated notes, so instead of a graph with 40 equally bright nodes you get a focused read of one relationship. That is a small piece of visual design doing a large amount of work, and it is the sort of thing that is obvious in the demo video and hard to arrive at through planning.

When enough notes accumulate, a synthesis emerges: a single sentence bridging the tensions across the canvas. It is presented as a proposal rather than an answer, and you can solidify it into a thesis note or dismiss it. The design choice is that the synthesis is a first-class object on the canvas rather than a chat message you scroll back to find, which means a claim the model produced can be argued with, reclassified and kept or thrown away like anything you wrote.

Three views render the same data. Tiling is a spatial BSP grid, kanban groups by note type, and graph is force-directed with a centrality-radial layout. The graph view is the one that makes the emergent structure visible; tiling is the one you will use to actually write. Keyboard handling is sensible: Enter adds a note, ⌘K opens a command palette covering views, navigation and export, ⌘Z undoes, and Escape clears the current selection or closes a panel.

## Running it and paying for it

Setup is a clone and a dev server. The requirement list is short: a desktop browser and an API key from one of the supported providers.

```bash
git clone https://github.com/mskayyali/nodepad.git
cd nodepad
npm install
npm run dev
```

Your key is entered through the menu icon, then Settings, then a provider picker, and it is stored in the browser's localStorage and sent directly to the AI provider. The README states it never passes through any server, which follows from the architecture rather than from a policy promise: there is no server component holding credentials. Worth verifying the claim holds in the version you run rather than assuming, since a single accidentally added API route would change it.

OpenRouter is the default and the cheapest place to start. Its free tier covers two Nvidia-hosted Nemotron models with no credits required at roughly 200 requests a day and no web grounding, which is enough to evaluate the classification quality at some length. Paid options are listed with a note each, GPT-4o as default for annotation quality, Claude Sonnet for complex research, Gemini 2.5 Pro for long context. Direct OpenAI, Z.ai's GLM models, and a custom base URL for Ollama, LM Studio or vLLM are also supported.

Web grounding is an optional toggle and works on OpenRouter `:online` models and OpenAI search-preview models, so citations on claims and references are available only on specific model choices rather than everywhere.

## Where the data lives and what the tree leaves out

The data story is unusually clean: everything lives in the browser, with no account, no server and no database. Notes persist to localStorage under `nodepad-projects`, and a silent rolling backup is written on every change to `nodepad-backup`. Export is available as Markdown or as a versioned `.nodepad` JSON file through the command palette, and import of `.nodepad` files comes back through the sidebar.

That design has an obvious upside and an obvious limit. There is nothing to sign up for and nothing for a server operator to hold, but your entire canvas lives in one browser profile on one machine. The rolling backup is the mitigation, and it is a good one, though it is still localStorage rather than a sync service. For a research tool used daily, that is a real constraint to hold in mind before you accumulate three months of notes.

The file tree is small and tells you the state of the project honestly: `app/`, `components/`, `lib/`, `public/`, config files, and a `proxy.ts` at the root. That last name is a signal, since Next.js 16 renamed the middleware convention to proxy, so the app is tracking current Next rather than an older template. What is absent is as informative as what is present. There are no releases, no changelog and no test directory, and the package manifest sits at version 0.1.0 marked private, with scripts for dev, build, start and lint and nothing else. The dependency list is long and modern: Next 16, React 19, Tailwind v4, the Vercel AI SDK, Radix primitives, D3, Framer Motion, cmdk for the command palette and Lucide for icons. The README credits Saleh Kayyali and the repository shows 1,074 stars and 162 forks, which is a lot of attention for a 0.1.0 experiment and explains why the contribution note says pull requests are welcome and reviewed regularly.

## Conclusion

nodepad is best read as what its author calls it, a design experiment, and judged that way it is a more interesting document than most shipping AI apps. The bet is a specific one: that a chat box is the wrong shape for thinking, and that the model's job is classification and connection rather than answering. Some of that bet clearly lands, since classification into 14 types with an annotation that adds something is genuinely more useful than asking a chatbot to summarise your notes, and the connection dimming on hover is a small mechanic with a real effect on how you read a canvas. What does not land yet is the parts that need engineering rather than design: no tests, no releases, a package still at 0.1.0, and a Vercel AI SDK dependency list that will age badly. Clone it, put in a free-tier key, and judge the classification quality on 30 notes you already know the answers to. That tells you more than any feature list will.

## FAQ

### What is nodepad?

nodepad is a browser-based spatial canvas for thinking, published under github.com/mskayyali/nodepad and MIT licensed. You add notes, and a language model classifies each one into one of 14 types, infers connections between notes, and eventually surfaces a synthesis you can keep as a thesis note or dismiss. It has no account, no server and no database, and it runs against an API key you supply for OpenRouter, OpenAI, Z.ai or any OpenAI-compatible endpoint.

### Does nodepad send my notes or API key to a server?

No, according to the README. Your key is stored in browser localStorage and requests go directly to the AI provider, and notes persist locally under nodepad-projects with a rolling backup under nodepad-backup. That also means your notes live in one browser profile on one machine, so export to Markdown or to a versioned .nodepad JSON file before you depend on it.

### Can I use nodepad without paying for an API key?

You need a key from one of the supported providers, but it need not be a paid one. OpenRouter is the default and its free tier includes two Nvidia-hosted Nemotron models requiring no credits, at roughly 200 requests a day and without web grounding. Web grounding, which adds real citations for claims, questions and references, is limited to OpenRouter :online models and OpenAI search-preview models.

### Is nodepad ready to use in production?

Not yet, on the evidence in the repository. The package is at 0.1.0 and marked private, there are no published releases or changelog, and no tests are configured. The README describes the project as a design experiment, the stack is current, with Next 16, React 19 and Tailwind v4, and the repository has 1,074 stars and 162 forks, so it is worth cloning and evaluating rather than depending on.

## Sources

- [Issues](https://github.com/mskayyali/nodepad/issues)
- [License: MIT](https://github.com/mskayyali/nodepad/blob/main/LICENSE)
- [mskayyali/nodepad on GitHub](https://github.com/mskayyali/nodepad)
- [Project website](http://nodepad.space)
- [README](https://github.com/mskayyali/nodepad/blob/main/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/mskayyali-nodepad
