{"id":50457586,"url":"https://github.com/withmargin/margin-read","last_synced_at":"2026-06-01T03:06:47.264Z","repository":{"id":356631811,"uuid":"1233405473","full_name":"withmargin/margin-read","owner":"withmargin","description":"Privacy-first bilingual webpage translation browser extension.","archived":false,"fork":false,"pushed_at":"2026-05-12T00:21:35.000Z","size":656,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-12T02:29:44.942Z","etag":null,"topics":["anthropic","bilingual","browser-extension","chrome-extension","chromium-extension","gemini","manifest-v3","open-source","openai","privacy-first","translation","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/withmargin.png","metadata":{"files":{"readme":"README.de.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-08T23:33:43.000Z","updated_at":"2026-05-12T00:21:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/withmargin/margin-read","commit_stats":null,"previous_names":["linyiru/toast","linyiru/margin-read","withmargin/margin-read"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/withmargin/margin-read","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withmargin%2Fmargin-read","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withmargin%2Fmargin-read/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withmargin%2Fmargin-read/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withmargin%2Fmargin-read/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/withmargin","download_url":"https://codeload.github.com/withmargin/margin-read/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withmargin%2Fmargin-read/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33757791,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anthropic","bilingual","browser-extension","chrome-extension","chromium-extension","gemini","manifest-v3","open-source","openai","privacy-first","translation","typescript"],"created_at":"2026-06-01T03:06:42.712Z","updated_at":"2026-06-01T03:06:47.226Z","avatar_url":"https://github.com/withmargin.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Margin Read\n\nSprachen: [English](README.md) · [繁體中文](README.zh-TW.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Español](README.es.md) · [Français](README.fr.md)\n\nMargin Read ist eine datenschutzorientierte Browser-Erweiterung fuer zweisprachige Webseitenuebersetzung.\n\nMargin ersetzt den Originaltext nicht. Es fuegt die Uebersetzung unter den passenden Quelltextbloecken ein, damit Leser beide Versionen vergleichen koennen, ohne den Seitenkontext zu verlieren.\n\nRepository: https://github.com/withmargin/margin-read\n\n## Status\n\nMargin ist ein fruehes MVP fuer Chrome und Chromium-Browser mit Manifest V3.\n\nDie Erweiterung ist fuer normale Artikelseiten, alte textlastige Seiten und einige dynamische Seiten nutzbar, befindet sich aber noch in aktiver Entwicklung. Auf sehr interaktiven Web apps, ungewoehnlichen Layoutsystemen oder Websites, die das DOM stark umschreiben, kann es noch raue Kanten geben.\n\n## Funktionen\n\n- Uebersetzt die aktuelle Webseite aus dem Extension-Popup.\n- Erhaelt Originaltext und fuegt Uebersetzungen unter den passenden Quellbloecken ein.\n- Erkennt lesbare Textbloecke wie Absaetze, Ueberschriften, Listenelemente und Zitate.\n- Behandelt alte `table`-, `font`- und `br`-getrennte Seiten.\n- Umgeht typische Nicht-Lesebereiche wie Navigation, Formulare, Buttons, Codebloecke, versteckten Text und Seiten-UI.\n- Verwendet vom Nutzer konfigurierte provider endpoints und API keys.\n- Unterstuetzt OpenAI, Anthropic Claude und Google Gemini provider adapters.\n- Unterstuetzt lokale OpenAI-compatible runtimes wie LM Studio, Ollama, llama.cpp server und omlx (Apple Silicon).\n- Ruft provider model lists von der Optionsseite ab.\n- Bietet integrierte oder hervorgehobene Uebersetzungsanzeige.\n- Optional einen schwebenden Seitenbutton anzeigen, der die Uebersetzung erst nach einem Nutzerklick startet.\n- Erlaubt persistenten, sitzungsbasierten oder deaktivierten Uebersetzungs-Cache.\n- Zeigt Popup-Diagnosen fuer Texterkennung, Queue-Zustand und provider-Fehler.\n- Beobachtet dynamisch eingefuegte Inhalte.\n- Optimiert X timeline cards und longform article pages, indem lesbarer Inhalt gezielt uebersetzt und Profilnamen, Zaehler, Medien und Controls vermieden werden.\n\nMargin enthaelt keine PDF-Uebersetzung, EPUB-Uebersetzung, Untertitel-Uebersetzung, OCR, Eingabefeld-Uebersetzung, Cloud-Sync, Accounts, Social Features, Standard-telemetry oder ein offizielles bezahltes Uebersetzungskontingent.\n\n## Aus dem Quellcode installieren\n\nMargin ist noch nicht in einem Browser Extension Store paketiert. Lade es als unpacked extension:\n\n```sh\ncorepack enable\npnpm install\npnpm build\n```\n\nDann:\n\n1. Oeffne `chrome://extensions`.\n2. Aktiviere Developer mode.\n3. Waehle Load unpacked.\n4. Waehle das erzeugte `apps/extension/dist/` Verzeichnis.\n5. Oeffne Margin options.\n6. Konfiguriere provider, API key, model, Zielsprache und Cache-Verhalten.\n7. Oeffne eine Webseite und klicke im Margin popup auf Translate this page.\n\n## Provider Setup\n\nMargin enthaelt keinen API key. Nutzer geben ihren eigenen rohen provider API key ohne `Bearer` Prefix an.\n\nEingebaute provider verwenden Standard-endpoints:\n\n```text\nOpenAI: https://api.openai.com/v1/chat/completions\nAnthropic Claude: https://api.anthropic.com/v1/messages\nGoogle Gemini: https://generativelanguage.googleapis.com/v1beta/models\n```\n\nDas Endpoint-Feld wird nur fuer OpenAI Compatible / Local LLM Setups angezeigt, bei denen der Nutzer einen lokalen endpoint waehlen oder eingeben soll.\n\nFetch models liest verfuegbare Modelle vom gewaehlten provider:\n\n- OpenAI: `GET /v1/models`\n- Anthropic Claude: `GET /v1/models`\n- Google Gemini: `GET /v1beta/models`\n\nAbgerufene Modelle erscheinen im model selector. Margin behaelt das aktuell konfigurierte Modell als Option, wenn ein provider default oder zuvor gespeichertes Modell nicht in der provider-Liste vorkommt.\n\n## Datenschutz\n\nMargin sendet nur ausgewaehlte Textsegmente an den konfigurierten provider. Standardmaessig wird kein vollstaendiges Seiten-HTML gesendet, kein Login benoetigt, kein Cloud-Sync genutzt und keine telemetry eingebaut.\n\nProvider requests werden vom Extension service worker mit dem vom Nutzer konfigurierten endpoint und API key ausgefuehrt. Der Datenschutz beim provider haengt vom gewaehlten endpoint und Modell-provider ab.\n\nAPI keys werden im browser extension storage gespeichert. Behandle das Browserprofil als Teil deiner vertrauenswuerdigen Umgebung.\n\n## X Optimierung\n\nMargin enthaelt einen optionalen X-specific detector fuer timeline cards und longform article pages. Wenn aktiviert, zielt er auf `tweetText` in tweet articles und lesbare Bloecke in X article views, statt alle sichtbaren Textnodes zu scannen.\n\nQuoted posts sind standardmaessig deaktiviert und koennen in options aktiviert werden. Posts, die X bereits als uebersetzt markiert, werden standardmaessig uebersprungen, um doppelte Uebersetzung zu vermeiden.\n\n## Lokale LLMs\n\nMargin unterstuetzt lokale LLM runtimes ueber den OpenAI Compatible provider. Dieser provider verwendet die OpenAI-artige `/v1/chat/completions` API, erlaubt einen leeren API key und nutzt eine niedrigere Standard-concurrency fuer lokale Inferenz.\n\nHaeufige endpoint presets:\n\n```text\nLM Studio: http://localhost:1234/v1/chat/completions\nOllama: http://localhost:11434/v1/chat/completions\nllama.cpp server: http://localhost:8080/v1/chat/completions\nomlx: http://localhost:8000/v1/chat/completions\n```\n\nLokalen runtime verwenden:\n\n1. Starte den lokalen model server.\n2. Oeffne Margin options.\n3. Waehle OpenAI Compatible als provider.\n4. Waehle ein endpoint preset oder gib die URL ein, die dein runtime anzeigt.\n5. Lasse API key leer, sofern dein lokales gateway keinen benoetigt.\n6. Klicke Fetch models und waehle ein bereitgestelltes Modell im model selector.\n7. Lasse Request JSON mode aktiviert, wenn unterstuetzt. Deaktiviere ihn, falls der lokale runtime das Feld `response_format` ablehnt.\n\n## Lokale Entwicklung\n\n```sh\ncorepack enable\npnpm install\npnpm check\npnpm lint\npnpm check:extension\npnpm test\npnpm build\n```\n\nDer Build verwendet Rolldown und schreibt die unpacked extension nach `apps/extension/dist/`.\n\n## Projektstruktur\n\n```text\napps/extension/src/background/     Service worker, provider requests, settings und cache flow\napps/extension/src/content/        Seitentexterkennung, Queue und Uebersetzungseinfuegung\napps/extension/src/options/        Extension options page\napps/extension/src/popup/          Popup UI und Diagnosen\napps/extension/src/background/providers/      Provider adapters\napps/extension/src/shared/         Gemeinsame types, defaults, storage und messages\napps/extension/public/             Statische extension UI und content CSS\napps/extension/scripts/            Build und extension validation scripts\ndocs/                              Product, roadmap, principles und threat model\n```\n\n## Fehlerbehebung\n\nAktiviere Debug mode in Margin options, wenn eine Seite aktiv wirkt, aber keine Uebersetzungen eingefuegt werden. Das Popup zeigt Erkennungsanzahl, Queue, laufende requests, pending translations, completed translations, Fehleranzahl, letzten Fehler und ein Beispiel des erkannten Texts.\n\n## Bekannte Einschraenkungen\n\n- Firefox ist noch nicht das Hauptziel.\n- Site-specific DOM handling ist auf wenige hochwertige Faelle beschraenkt.\n- Sehr dynamische Web apps koennen Uebersetzungsbloecke verschieben oder entfernen.\n- Grosse Seiten werden in Batches uebersetzt, daher erscheinen Uebersetzungen schrittweise.\n- Provider rate limits, Modellverfuegbarkeit und Ausgabequalitaet haengen vom konfigurierten provider ab.\n\n## Dokumentation\n\n- [Product Requirements](docs/PRD.md)\n- [Project Principles](docs/PRINCIPLES.md)\n- [Threat Model](docs/THREAT_MODEL.md)\n- [Roadmap](docs/ROADMAP.md)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwithmargin%2Fmargin-read","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwithmargin%2Fmargin-read","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwithmargin%2Fmargin-read/lists"}