A browser extension that translates text from any region of a webpage. Select an area on screen, and the extension captures, extracts, and translates the text using AI — all without leaving the page.
Named after the Rosetta Stone — the ancient artifact that unlocked the mystery of Egyptian hieroglyphs. Just as the stone bridged languages carved in stone, Rosseta bridges languages rendered on screen.
Successor of select-and-translate — rebuilt from scratch with a proper architecture.
Built with Svelte 5, TypeScript, Tailwind CSS v4, and a DDD + Hexagonal architecture.
See CONTRIBUTING.md for setup instructions, architecture details, coding standards, and the pull request process.
Rosseta can route all API requests through a proxy server instead of calling the AI provider directly.
Why use a proxy?
generativelanguage.googleapis.com or api.groq.comThe proxy URL replaces the base URL of the API. Rosseta appends the original path and query string to your proxy URL:
| Provider | Without proxy | With proxy https://my-proxy.com |
|---|---|---|
| Gemini | https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key=... |
https://my-proxy.com/{model}:generateContent?key=... |
| Groq | https://api.groq.com/openai/v1/chat/completions |
https://my-proxy.com/chat/completions |
Important: Your API key is still included in the request (as a query param for Gemini, as an
Authorizationheader for Groq). Make sure you trust your proxy server.
To go back to direct connections, click Clear.
A minimal reverse proxy that forwards requests to the original API:
// The path after your worker URL is the AI provider's path.
// Your proxy URL should be set to: https://your-worker.workers.dev/v1beta/models
// (for Gemini) or https://your-worker.workers.dev/openai/v1 (for Groq).
const PROVIDERS = {
'/v1beta/': 'https://generativelanguage.googleapis.com',
'/openai/': 'https://api.groq.com',
};
export default {
async fetch(request) {
const url = new URL(request.url);
// Determine target based on path prefix
let target;
for (const [prefix, origin] of Object.entries(PROVIDERS)) {
if (url.pathname.startsWith(prefix)) {
target = origin;
break;
}
}
if (!target) {
return new Response('Unknown provider path', { status: 400 });
}
return fetch(target + url.pathname + url.search, {
method: request.method,
headers: request.headers,
body: request.body,
});
},
};
With this worker deployed at https://your-worker.workers.dev, set your proxy URL to https://your-worker.workers.dev/v1beta/models for Gemini or https://your-worker.workers.dev/openai/v1 for Groq.
Tip: Since both providers use different base URLs, you'll only be proxying whichever provider you configure. To proxy both, you'll need one proxy URL per provider — or a single proxy that inspects the path to determine the target (like the example above).
Rosseta does not collect, store, or transmit any personal data to our servers.
browser.storage.local and never leave your device.This project is licensed under the MIT License.