Edge Intelligence JavaScript MIT active

anouk

Studying LLM integration patterns for browser extensions. A framework for rapid development of AI-augmented web experiences.

Overview

anouk exists because building the AI half of a browser extension turns out to be mostly plumbing, and every team writes the same plumbing badly. A Manifest V3 extension has a constrained execution model, no server of its own, a user who supplies their own API key, and a background context that can be terminated at any moment. None of that is difficult; all of it is fiddly, and it stands between an idea and a working prototype.

The framework supplies the parts that are not interesting to reinvent. A CLI scaffold produces a working extension skeleton. A per-request response cache avoids paying twice for identical calls, which matters when the user is paying per token from their own account. A per-provider rate-limit queue keeps a burst of page-triggered requests from producing a wall of rejections. A runtime settings panel gives the user somewhere to put a key and choose a model without the developer designing that surface from scratch.

Provider independence is the design constraint rather than a feature. anouk targets any OpenAI-compatible endpoint, which in practice covers OpenAI, Anthropic, Together, Hugging Face and a local Ollama instance. An extension whose users bring their own key cannot assume which key they bring, and building against one vendor's SDK makes exactly that assumption structurally.

The scope boundary is that anouk is a client-side framework and nothing else. It does not proxy, does not hold credentials on a server, and does not protect a key the user did not supply. If an extension ships with an embedded key, anouk will not save it, and the problem is a different one.

Where it loses: a commercial extension-AI product offers a hosted backend, analytics and a billing relationship, and for a consumer product those are the hard parts. anouk is also Chromium-first, and full Firefox support is a compatibility question we have not answered. Its bet is on the developer who wants a working prototype today with no vendor in the middle.

The broader research question behind this project is where AI plumbing belongs when there is no server. A web application can hide keys, batch requests, cache centrally and observe everything. An extension can do none of that, and the constraints push work to the client that would normally sit behind an API. Anouk is the portfolio's clearest instance of that problem, and perishable is the complementary one — it answers what to do when the key must not be the user's.

The caching layer is the part most likely to surprise. Extension users trigger the same operation on the same page repeatedly, far more than web users do, so a naive per-request cache hits more often than intuition suggests. It also introduces the usual staleness question, which is why the cache is keyed per request rather than per page and is bounded rather than indefinite.

A note on evaluation for anyone comparing frameworks here. The useful test is not feature count but what happens on the unhappy path: a revoked key, a provider returning a rate-limit response mid-burst, a service worker terminated between the request and the reply. Those are the cases that decide whether an extension feels broken to its user, and they are the cases a scaffold-and-demo comparison never reaches. anouk's queue and cache exist because of them rather than because they looked good in a feature list.

Primary use case

Add LLM features to a Chrome/Firefox extension without lock-in to a single provider.

How it compares

anouk is one option in a category that includes Harpa, Merlin , and browser-extension vendor SDKs. Our Compare page has the full side-by-side.