Tanagram is a set of tools for knowledge workers to capture, search, and automatically surface information from a variety of sources.

It's built around nodes, which mainly represent individual thoughts (rather than monolithic documents and files), and each person's specific connections between their nodes. It presents this information in a variety of ways suited for different use cases, and is powered by a singular, extendible API upon which additional tools and workflows can be built.

Knowledge graph

Browse everything you (used to) know

Tanagram is, in part, a notebook for capturing all your thoughts. But unlike other notebook apps, which make you create distinct "notes" sparsely populated with content, Tanagram is designed to work at the level of individual thoughts.

Tanagram isn't yet-another-notebook-app though. It pulls in everything from your digital life — photos, articles, calendar events, chats and emails, todos, web-browsing history, time tracking results, and more — and creates links between relevant content to help you organize all the data that you come across. For example, meeting notes can be automatically linked to the corresponding calendar event, as well as the relevant articles you Googled during that meeting (if you'd like). Later, you can come back to that specific calendar event to re-discover all the relevant results from that meeting. That's much better than having to go to a different app to find your notes and keeping a dozen tabs open that you'll eventually file away.


In Tanagram, every piece of information is a node. Nodes can represent a range of content, such as a one- or two-sentence thought or annotation on an article, a specific email message, a todo, or a photo or file. Tanagram supports app-native rich text nodes which can be as long or as short as you'd like, as well as native vector graphics and drawing, optimized for tablets. All nodes are versioned, with each change recorded with its timestamp and an optional description of the change. And Tanagram provides various ways to view nodes, including a layout that enables mind-maps. A public URL can be enabled for every node, so you can share a specific article annotation, email message, or thought through a direct link.


Nodes are related to other nodes through links. Any node can link to any other, and nodes are bidirectional. Links can be created to point to a specific version of a node, or float with the most-recent version of its nodes. Links themselves can have sub-content, like a text node describing why a link was added or the context in which the link is relevant. Nodes can be manually linked, but many links will be created automatically — for example, adding a task to a todo list links the task to the list. Adding an annotation to an article links the annotation to the article. Where possible, the article's author and referring site (the site you found the article on) is also linked to the article, and as a result, your annotation has a second-degree link to those attributes as well.


Tags are a built-in type of node. Tags can be created as a global tag, or one that only exists within another tag. This enables tags to model a wide range of content organization strategies. Nodes can be manually tagged; it will also be possible to build integrations on top of the Tanagram API that automatically set tags on nodes upon each change.


Tanagram is not currently designed to be a social product. However, it would be interesting to browse relevant portions of other people's knowledge graphs. Tanagram will have a private following mechanism: you can follow other people, but they won't know about it and you won't know who follows you. For the people you follow, you will be able to see the nodes they've linked from a node you have in common — you can see notes all your work collaborators have linked to a meeting you all attended, or the commentary left on an article by someone you respect. Node links are private by default, but they can be published to your followers.

Smart search

Find what you actually meant

Importing everything into Tanagram allows it to find useful, relevant results when you ask for it — especially if it's content you would've otherwise forgot you had. Tanagram's primary value should be in enabling you to reliably browse and search for the information you're looking for, even when you only have the faintest idea of what to actually search by. Importing content across channels allows Tanagram to un-silo that information. For example, if you're looking for an article that a friend sent to you, you shouldn't have to search your email, texts, and then Slack to find it — you're looking for the article itself, but shouldn't need to be concerned with the channel that it was sent through.


Tanagram's primary UI is built around a timeline. Every event and activity on a node is located in its proper place on the timeline so you can browse temporally — for example, you can see everything you read, wrote, edited, and everyone you conversed with in the past week. In this way, Tanagram is a logbook of all the work you've done.

Tanagram's timeline supports zoomable granularity, allowing you to drill into how you spent time on a particular day (useful for time tracking), or getting a high-level overview of what you worked on over a month, quarter, or even year.

Fuzzy timerange search

Search queries in Tanagram can be parameterized by time ranges, such as "a few days ago" or "last week". In our vernacular, these ranges are fuzzily defined and perhaps inaccurate (e.g. "last week" might turn out to be earlier this week, or in fact two weeks ago). Tanagram will do its best to translate these phrases to specific date ranges, automatically expanding its best guess if needed. The exact parameters used in the search are exposed in the UI so you can manually tune them if you'd like.

Transitive synonyms

(This is a very experimental/vaguely-defined idea) Tanagram search can use the global knowledge graph (conceptually, merging everyone's individual knowledge graphs behind-the-scenes) to identify synonyms and terms related to your search query. This may be useful when you're trying to search by the derivative you've remembered from the original piece of information, but not necessarily its specific content. If you're looking for topic A, and someone else has tagged that same content with topic B, and someone has meaningful links between A and B, then your search for A should return results for B as well if they're relevant. This should also work for additional degrees of transitivity, accounting for relevance — if you're searching for topic A, and there are links between A and C, and between C and B, results for B and C should be considered as well.

Blazing fast

Work at the speed of thought

Tanagram has to be fast in everything it enables. It has to get out of the way as much as possible, taking care not to slow you down so that you can navigate around and get things done as fast as you can think. This is accomplished through fundamental architecture decisions as well as carefully-designed UI. Speed is a feature.

Native apps

Many related apps today are built with web technologies, delivered through the browser or Electron on the desktop. While it may be easier to develop a UI built using web technologies, such an experience comes with tough tradeoffs in responsive performance and interactions that “feel” native. Fully native apps allow Tanagram to deliver an exceptionally fast, fluid user experience where every interaction responds within 100ms. Native apps also enable extensive access to data that might be difficult to ingest otherwise, such as iMessage conversations and browser history. Finally, fully native apps can effectively use client hardware to perform reactive and speculative computation on-device (rather than requiring a round-trip to a server), which further improves the perceived user experience.

Tanagram's client apps will be built offline-first, with all relevant data stored locally; changes are first persisted to local device storage before synced with the server. All changes will be serializable and diffable, and push notifications will be used to update client apps on other devices. These apps will be built in the order that I expect to use them most, starting with an app for macOS, then for iPadOS/iOS and Apple Watch.

Keyboard shortcuts

Keyboard shortcuts should enable almost every interaction in Tanagram. Much of Tanagram's interface will be built from a standard set of components, each with a standard set of supported keyboard shortcuts — for example, every list in Tanagram should support the same keyboard shortcuts for navigating up and down, selecting multiple items, adding and removing items from a selection set, and selecting an item. Similarly, every input field in Tanagram should support the same keyboard shortcuts for moving the cursor around and formatting its content.

There will be a global keyboard shortcut to invoke a command palette, which will provide fuzzy-matching for every command that can be performed within the current context. Similarly, there will be a global keyboard shortcut to show a command history containing a list of the actions you've performed, including those triggered by keyboard shortcuts. This is helpful when you've accidently triggered a keyboard shortcut without knowing what you pressed or what it does; a command history serves as a visual undo.

Effortless input

It is imperative that Tanagram doesn't get in your way when you're trying to record a thought — you shouldn't have to wait for the app to load, wonder which notebook to create a note in, or have to decide how to bring in content in an unwieldy format. Personally, at least, I also don't like seeing the gravitas of a whole blank page just to write down a sentence or two and feel guilty about adding yet another note that will get lost in a massive, unorganized list. At the same time, Tanagram shouldn't require a large amount of administrative upkeep to keep organized. It should perform as much of that work automatically as it can, using contextual clues for reference.

The quickest way to input information is not to have to do it at all. Tanagram will automatically ingest your digital “exhaust” as you use your computer — your web browsing history, git commits, and incoming triggers like emails, chat messages, and custom webhooks. For information that can't be automatically captured, Tanagram supports several direct input methods. You can type it in from a persistent input field, record photos, videos, or audio directly from the app, drag in a file, click on a browser extension button, and more.

Once in, Tanagram will extract as much metadata as it can to help organize your content. It will look at the date, embedded metadata such as geocoordinates on image files, the location of your client app, and content-specific metadata, such as the sender of an email as well as the CC list. That way, you can later use Tanagram to search for that email from your manager that you got while standing it line at your favorite coffee shop.

Built-in objects

Rich primitive types

One of the fundamental ideas behind Tanagram is that an app's data and its interface should be decoupled, and that the same data should be accessible through different interfaces designed for different use cases. For example, a project management app should have a databes storing tickets and their associated organizational concepts, and provide different UIs for project managers, executives, and engineers according to their use case (or enable third-party developers to build those interfaces).

Tanagram's database is designed to support that vision. It is built with a set of meaningful primitive data types, including rich (formatted) text, tasks, tags, conversations, and many others. Data objects are modified through explicitly defined actions that are reified into a version history, allowing users to see the state of any data object at any time in the past and reverting changes, either back to a specific point, or — if supported — reverting specific changes while keeping others. Data objects can also maintain multiple parallel versions of their themselves, similar to “branches” in version control systems.

Webhooks (and eventually “serverless” functions) can be triggered upon each mutation action on each data object.

Graph API

Intuitive interface

Conceptually, Tanagram's database is a graph-style database, supporting traversals to nodes across links and key-value attributes stored on both nodes and links. It exposes an authenticated GraphQL API for querying and modifying content that the API requester has access to. API consumers can define a limited number of pre-computed queries, whose result sets are kept updated and denormalized for rapid response times. API consumers can also register webhooks (and eventually “serverless” functions) that get triggered by specific mutations on specific nodes or links.

Tanagram's database is implemented with recursive performance tracing and costing to support API rate limits and a potential billing model for third-party integrations.


A foundation for integrations

Data model integrations can define additional top-level types, add fields to existing types, and define actions on existing types. These schema additions are recursively merged into the GraphQL schema presented to every API consumer; API consumers should expect different schemas based on the requester and the integrations they may have enabled.

There are open questions around permissions for data access and schema modification. For example, should integrations be allowed to replace existing fields on existing types, or add fields to types added by a different third-party integration? I haven't fully thought through this yet.


Built upon great existing ideas