The Best Browser Tools Know What to Ignore
Hatched by Nico Kokonas
Aug 07, 2026
10 min read
0 views
87%
What if the fastest way to build a useful browser tool is not to understand the browser more deeply, but to understand less of it?
That sounds backwards. Modern software rewards sophistication: richer APIs, more metadata, more control, more complete models of the systems we automate. Yet two seemingly unrelated observations point in the opposite direction. A small JavaScript bookmarklet can be handed to an AI system and rapidly reshaped into a Chrome extension. At the same time, the browser’s most detailed inspection interface, the DOM domain exposed through the Chrome DevTools Protocol, can become a liability when the task is simply to extract HTML.
Together, these examples reveal a general principle about software creation and automation: the best interface is not the one that exposes the most reality. It is the one that exposes exactly enough reality for the job.
This principle matters more now that AI can translate between layers of software. A rough script can become a packaged tool. A complicated protocol can become a focused workflow. But translation only works well when we distinguish between what a system can represent and what a task actually needs.
The hidden cost of seeing everything
Imagine trying to move a single book from one room to another. One approach is to reconstruct the entire building first. You map every hallway, catalog every object, record the condition of every wall, and model the relationship between every room. You now possess an impressive representation of the building. You have also made moving the book unnecessarily difficult.
That is close to what happens when automation uses a debugging oriented interface for a narrow extraction task. A rich DOM representation is valuable when a developer needs to inspect a page interactively, understand how elements relate to one another, set breakpoints on mutations, or investigate why a page behaves unexpectedly. In those situations, metadata and object identity are not decoration. They are the substance of the work.
But extracting HTML is a different problem. It does not necessarily require a living model of every node, every relationship, and every debugging event. It may only require the page’s serialized markup, or a small portion of it. The machinery that makes inspection powerful can impose memory and computational costs that provide no corresponding benefit.
This is an instance of a broader engineering error: confusing descriptive completeness with operational usefulness.
A map can be too detailed to navigate. A database can preserve so much history that a simple query becomes slow. An organizational process can include so many safeguards that nobody can make a routine decision. A software interface can expose so much internal structure that a straightforward task becomes burdened by the representation itself.
The central question is not, “How much can this system tell me?” It is, “What is the smallest representation that lets me complete this task reliably?”
Every additional layer of representation has a cost. Keep it only when the task can convert that cost into value.
This is not an argument for primitive tools. It is an argument for task aligned richness. Debugging deserves a rich model. Extraction may deserve a thin one. A general purpose system should be capable of both, but a specific workflow should not pay for capabilities it never uses.
AI is becoming a translation layer
The bookmarklet to extension example illustrates a second shift. Historically, turning a small browser script into a usable extension required a person to understand packaging, permissions, manifests, browser APIs, and the differences between code that runs in a page and code that runs in an extension context. The transformation was not conceptually profound, but the surrounding friction was high enough to stop many experiments.
An AI system can reduce that friction by acting as a translation layer. It can take an existing artifact, infer its intent, generate the surrounding structure, and produce something that is easier to install or distribute. The important point is not that the machine writes code. Tools have generated code for decades. The important point is that AI can help move an idea across interface boundaries.
A bookmarklet, a content script, a browser extension, and a protocol command may all express roughly the same user intention: do something to the current page. Yet each lives in a different technical environment. The intention remains stable while the wrapper changes.
This suggests a useful model for AI assisted development:
- Intent: What outcome should occur?
- Primitive: What is the smallest operation that produces that outcome?
- Interface: Where must the operation run?
- Packaging: How can a person invoke it repeatedly and safely?
Many development tasks become easier when these four layers are kept separate. People often begin with packaging. They ask how to build an extension, deploy a service, or design a complete automation framework before clarifying the primitive action. That is like designing a shipping container before deciding what is being shipped.
AI is especially useful at the interface and packaging layers. It can convert a known behavior into a new form. But it can also encourage a dangerous habit: accepting a large generated system simply because the output looks complete. A generated extension may work, yet still include unnecessary permissions, excessive state, or a complicated architecture for a one step action.
The more powerful the translation layer becomes, the more important it is to control the target representation.
If you ask for “a browser tool that understands the page,” you may get a sprawling solution. If you ask for “a button that runs this page script against the active tab, using the minimum permissions,” you have specified a much better design constraint. The first request emphasizes capability. The second emphasizes a bounded operation.
The smallest useful interface
The connection between lightweight browser transformations and efficient protocol usage can be expressed through a concept called the smallest useful interface.
An interface is smaller when it exposes fewer concepts, retains less state, and performs fewer translations between representations. It is useful when it still supports the desired outcome. The goal is not minimality for its own sake. The goal is to remove everything that does not improve the result.
Consider three ways to retrieve content from a page:
- Ask a browser to build a full, richly annotated model of the document, then inspect that model.
- Ask the browser for the relevant serialized HTML and process it directly.
- Run a narrow script that selects the exact elements needed and returns only their text or attributes.
All three can be valid. The correct choice depends on the task. If you are building a visual debugger, the first is appropriate. If you are archiving a document, the second may be sufficient. If you need the price and availability of a product, the third may be best.
The mistake is treating these as merely different implementations of the same action. They are different information contracts. Each one decides what the browser must remember, what it must transmit, and what the consumer must understand.
A narrow contract has several advantages:
- It reduces memory use and computational work.
- It makes failures easier to diagnose because fewer components are involved.
- It limits the amount of sensitive page information that crosses a boundary.
- It gives AI systems a clearer target when generating or modifying code.
- It makes the resulting tool easier for a person to inspect and trust.
This last point is easy to miss. Efficiency and comprehensibility often reinforce each other. A tool that returns only what the task requires is usually easier to explain than one that exposes an entire internal world and asks the user to find the signal inside it.
That is why the best small tools can feel almost magical. They do not overwhelm the user with the system’s full complexity. They hide complexity by selecting the correct boundary.
Capability is not the same as leverage
There is a temptation, especially in the age of AI, to measure tools by the amount of capability they contain. A system that can inspect every node, track every mutation, retain every object, and respond to arbitrary queries appears more powerful than a script that performs one narrow action.
But capability is only potential. Leverage is capability multiplied by fit. A general system may have enormous potential and low leverage for a particular job. A tiny script may have almost no generality and enormous leverage because it removes exactly the obstacle in front of someone.
This distinction helps explain why small AI generated tools can be disproportionately valuable. They do not need to replace a browser automation platform. They only need to eliminate the distance between a user’s intention and a repeatable action.
Suppose a researcher repeatedly copies a certain table from a web page, cleans three columns, and pastes the result into a spreadsheet. A grand automation system might model the page, maintain a session, observe changes, and expose a broad command surface. A focused extension could add one button, extract the table, normalize the columns, and copy the result. The second tool may be less impressive in a demo, but it is more aligned with the workflow.
The same logic applies to AI generated code. A model can produce thousands of lines in seconds, but the value of those lines depends on whether they reduce or increase the user’s cognitive load. More code can mean more functionality. It can also mean more permissions, more hidden assumptions, more failure modes, and more surface area to maintain.
A useful evaluation question is therefore not, “How sophisticated is the generated solution?” Ask instead:
What did this tool remove between the user and the desired outcome, and what new burden did it introduce?
The answer exposes the tool’s real leverage.
Design for translation, not just execution
If AI is increasingly used to transform scripts into extensions, prompts into workflows, and protocols into applications, then software should be designed with translation in mind.
That begins with making intent explicit. A compact script that has a clear input, a clear transformation, and a clear output is easier to move between environments than a script whose behavior depends on hidden global state. Small, composable operations are not only easier to test. They are easier for both humans and machines to repackage.
It also means separating the core action from its context. The code that finds a page element should not be tightly entangled with the code that creates a toolbar button, requests permissions, stores settings, and reports errors. When those concerns are separated, an AI system can replace the wrapper without rewriting the primitive.
Finally, translation should preserve constraints, not just behavior. “Make this work as an extension” is incomplete if the new extension requests broad access to every site, stores data unnecessarily, or depends on a heavyweight representation of the page. A good translation carries forward the original purpose while shrinking the operational footprint.
This leads to a practical architecture for small browser tools:
- A narrow core that performs one transformation.
- A thin adapter that connects the core to the browser environment.
- A minimal permission boundary that grants only what is necessary.
- A visible invocation point so the user knows when the action occurs.
- A small result contract that returns only the useful output.
Such architecture is friendly to AI because each part has a clear job. It is friendly to humans because each part can be audited. It is friendly to performance because the browser is not asked to construct a universe when a handful of facts will do.
Key Takeaways
- Start with the primitive action. Define the smallest operation that produces the desired result before choosing an extension, protocol, or automation framework.
- Match representation richness to the task. Use detailed inspection models for debugging, but prefer direct or narrow extraction for simple automation.
- Treat AI as a translator, not an architect by default. Give it explicit boundaries around permissions, state, inputs, outputs, and runtime context.
- Measure leverage by friction removed. A tiny tool that eliminates a repeated manual step may be more valuable than a comprehensive platform.
- Audit what the tool adds. After automation removes work, inspect its new costs: memory, permissions, dependencies, complexity, and maintenance.
The future of software may not belong exclusively to the systems that know the most. It may belong to the systems that know what they can safely ignore.
A browser contains an enormous amount of structure. An AI model can generate an enormous amount of code. Neither fact guarantees usefulness. The craft lies in choosing the narrow bridge between intention and execution, then refusing to widen it without a reason.
The deepest advantage of AI assisted development is therefore not that it lets us build bigger tools faster. It is that it makes small translations cheap. A bookmarklet can become an extension. A repeated gesture can become a button. A complex browser capability can become a focused result.
But cheap translation creates a new responsibility. When it costs almost nothing to wrap an idea in software, the scarce resource is no longer implementation. It is judgment. The winning question is not, “What can we build around this?” It is, “What is the least system that deserves to exist?”
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣