Two steps forward, one step back


We are in the era of intelligent CRUD apps, and performance design principles are going out the window.

The local-first movement had us sailing toward an exciting new world, where latency of actions reduced from a network round trip down to 4ms. Every time you clicked or typed it felt like you had the product in your hands.

When progress plateaus along the dimension of utility, UX becomes one of the final differentiators. This great plateau (along with more powerful laptops) birthed the legendary Linear and Superhuman. These companies invested a lot of time into building a local sync engine to ensure state updates felt instantaneous.

Now it’s 2026, and clicking buttons in a UI makes me feel like a Neanderthal, no matter if it takes 4ms or 400ms. I don’t care how sexy your UI is, if I have to perform repetitive workflows in your product and you don’t give me MCP access (or API/CLI) I’m going to churn from your product.

Frontier models already have a baseline latency far exceeding that of a 100ms network roundtrip, so local-first principles have gone out the window. No one, not even Linear, is trying to do something better than MCP.

Better than MCP you say? What could you mean?

People joke that MCP is just like an API, and that’s mostly true. But it’s even worse than that if you care about latency. An API at least gives you the surface area to create a sync engine to power local-first apps. Even worse, forcing an agent to use MCP drains one of its superpowers: the ability to patch files and bulk manipulate using bash.

I don’t think Obsidian has all the answers. File-over-app definitely gets us closer to an agent-native experience. Recently I switched from task tracking in Obsidian to Linear because I need something better for collaborative software development, but the latency of agent updates to Linear is far worse than using Obsidian. It’s ironic that I’ve settled on Linear because it has more structured capabilities, but at the cost of more latency and more chances for the model to make mistakes. This is the trade-off most teams are making right now: you gain collaboration and structure, but you lose agent ergonomics.

To test this theory I’m working on an email client which treats both CLI and UI as first-class citizens, both writing to the same local SQLite database. Like Superhuman, it syncs your email locally. If you care about things like keeping your email local, this works well for that use case, but that’s not why I’m building it. Personally, I use the most capable frontier models, because I value their intelligence when dealing with my emails. It’s been a pleasure to use, because the latency of interacting with the CLI is miles better than Gmail’s MCP. Give it a try and let me know what you think.