No server · No account · No subscription · MIT
Read the web in two languages, without losing the original.
No account. Ready to use. Translation goes from your browser directly to OpenAI, Anthropic, or Google — no Margin in between. Fully MIT open source. Your browsing and reading stay truly private.
● We deliberately don't keep an email list. Less surface area, nothing to leak, nothing to guess what we'd do with.
01See for yourself
The original stays. The translation grows beneath.
Most translation extensions replace the page. You scroll, you read, and somewhere along the way you forget which language you started in. Margin does the opposite — the translation slides in beneath, paragraph by paragraph.
Mixture of Experts: A Practical Survey for Long-Context Language Models
Most translation extensions replace the page. You scroll, you read, and somewhere along the way you forget which language you started in. Margin does the opposite: the original text stays exactly where it was, and the translation slides in beneath, paragraph by paragraph.
This matters more than it sounds. When the original is one glance away, you can verify a translated phrase the moment it feels off. The bilingual layout turns reading into a quiet collaboration between two languages instead of a one-way conversion.
There is no Margin server. The extension talks directly to OpenAI, Anthropic, or Google with the API key you provide. Your reading is yours. Your bill is yours. Your choice of model is yours.
Margin detects readable blocks—paragraphs, headings, list items, blockquotes—and skips the chrome: navigation, forms, code, hidden text. On X and longform articles, a dedicated detector targets the post body and ignores profile names and metric counts.
02Features
Every detail is shaped so you never lose the original.
Margin started from one question: when do you most need the original while reading? The answer is, always. So the original is always there.
Bilingual stacked layout
Translations don't replace originals — they appear right beneath them. Compare, verify, and learn without losing your place.
Smart text detection
Detects paragraphs, headings, lists, and blockquotes. Skips nav, forms, buttons, code, and hidden text. Even handles legacy table/font/br pages.
Bring your own AI
Supports OpenAI, Anthropic Claude, and Google Gemini. Endpoint is editable — works with compatible gateways and self-hosted routing.
Privacy first
No Margin server, no account, no default telemetry. Your API key lives in your browser. Provider requests come straight from the service worker.
X / Twitter optimization
A dedicated detector for timeline cards and longform articles. Translates the post body, skips profile names, counts, and media controls.
Cache, your way
Three modes: session by default, persistent by choice, or off. Reduce repeat calls without giving up control.
03Supported AI providers
Three frontier models, one is yours.
Margin is not bound to a single provider. The endpoint field is editable for compatible gateways and self-hosted routing. "Fetch models" reads available models directly from the provider.
OpenAI
Stable, broad model selection, mature ecosystem. Margin streams via chat completions and can fetch your account's available models from the options page.
Anthropic Claude
Strong on long passages and tone preservation. Often shines on research articles and reportage where nuance matters.
Google Gemini
Generous free tier, strong East Asian languages, low-latency Flash variants — ideal when translating large amounts of text continuously.
04Why BYO key
What you read, is yours.
Most cloud translation tools quietly send every paragraph you read to a third-party server, where it may be stored, analyzed, or used for training. Margin sidesteps that whole class of risk by not having a server at all.
- P.01
No Margin server
All provider requests come directly from the extension's service worker. There's no us in the middle, and no proxy layer.
- P.02
No login, no account
No signup flow, no OAuth, no cloud sync. Your browser profile is your "account."
- P.03
No telemetry by default
No analytics, no error reporting, no usage events. Debug info shows up only in the popup's debug mode, locally.
- P.04
Only selected text segments
Margin never sends full page HTML to the provider — only detected readable blocks, batched to keep latency low.
- P.05
API key stays in your browser
Stored in chrome.storage and never leaves your profile. Treat your browser profile as your trust boundary.
05Two display styles
Blend into the page, or stand right out. You pick.
Two render modes for two reading modes. The default inherits the page's own typography so a carefully-designed article stays that way. The highlighter mode marks every translation in butter yellow — for language learning, side-by-side comparison, or finding translations fast in dense layouts.
Blends into the flow
Translation inherits the page's own typography, weight, and rhythm — only its opacity is dialed back, like a pencil note in the same hand as the original. Best for articles you'd read for the writing itself.
Highlighter strip
Translation rides a strip of butter-yellow highlight, the way you'd mark a key sentence in a print book. Best for language learning, side-by-side comparison, or finding translations fast in dense layouts.
06X (Twitter) optimization
In a flood of posts, translate only what's worth reading.
Timelines aren't articles. Margin ships an X-specific detector that targets tweet bodies and longform articles only — skipping profile names, like and view counts, media controls, and posts X already marks as translated.
- ✓Translates tweetText only — not display names
- ✓Skips like, repost, and view counts
- ✓Detects the body of long-form X articles
- ✓Quoted posts disabled by default; opt-in from options
- ✓Skips posts X already marks as translated
- ✓Picks up newly-loaded cards as you scroll
07Tech · Open source
Every line in plain ink.
Margin is built in TypeScript on Manifest V3 and bundled with Rolldown. MIT-licensed; the source is public.
export const detectReadableBlocks = (root: Document) => {
return walker(root)
.filter(isReadableTag)
.filter(notInsideChrome)
.filter(hasMeaningfulText);
};
// skip nav / form / button / code / hidden
// keep p / h1-6 / li / blockquote / article
// handle legacy: table, font, br-separated
"No license has been selected yet." Actually, it's MIT.
Margin is an open-source MVP. Issues, PRs, forks, and self-hosting are welcome. We believe privacy you can verify is the only privacy worth claiming — so the source is public.
Want to contribute? The docs are there: Product Requirements, Principles, Threat Model, Roadmap. Start in docs/.
★ github.com/withmargin/margin-read08Honestly
Margin is still an early MVP.
It works well on article pages, legacy text-heavy pages, and a few high-value dynamic pages like X. But there are rough edges, and we're listing them here instead of hiding them.
Firefox isn't a primary target yet
Chrome / Chromium first. Firefox will follow.
Some highly dynamic apps
On SPAs that aggressively rewrite the DOM, translation blocks may get moved or removed. Working on it.
Large pages translate in batches
To stay friendly with provider rate limits, translations appear progressively rather than all at once.
09Bring your own cost
Margin is free. Your API bill is yours.
There is no Margin subscription. The only cost is the provider's per-token rate, paid directly to OpenAI, Anthropic, or Google. Most reading sessions are measured in cents.
Cost estimator · monthly
- $.01A typical research paper (≈10k words) translated end-to-end with GPT-4o mini comes in under one cent.
- $.00Session cache avoids repeat calls while you read. Persistent cache is optional for pages you revisit later.
- B Y OBring your own key. The endpoint is editable — plug in any compatible gateway, self-hosted router, or routed proxy.
- FREEGemini's free tier is generous enough for casual reading. Most users never see a bill at all.
10Frequently asked
Questions, before you install.
A short list. Longer answers live in the docs/ directory of the repository.