繁體中文 | English
Last updated: September 14, 2026
Shinkansen is a browser extension that translates foreign-language web pages, documents (PDF / EPUB / Word / TXT / Markdown / HTML / subtitle files), and YouTube and Google Drive video subtitles into your chosen target language (Traditional Chinese, Simplified Chinese, English, Japanese, Korean, Spanish, French, or German). Shinkansen performs translation through a translation engine you select; three engines are currently supported:
The following is stored in your local browser only and the developer cannot access it:
Your Gemini API Key and your custom-provider API Key are both kept in storage.local (not synced across devices) and used only to issue requests to the corresponding translation service. These keys are never transmitted anywhere except the endpoint you specified.
Translation-related settings (target language, UI language, model selection, temperature, auto-translate domains list, etc.) are stored in storage.sync, synced only between your own devices via the browser's built-in sync mechanism. The fixed glossary and blocked-word list are stored in storage.local (not synced across devices; move them with export / import on the settings page). On iOS, the app and the Safari extension on the same device share the API key and settings through an App Group; the data never leaves the device.
Already-translated web page segments and document segments are cached in storage.local to avoid redundant API calls. By default, Shinkansen does not auto-clear the cache on extension version updates (to prevent users from losing data); you can manually clear the translation cache from the toolbar icon menu or the document-translation page at any time.
API call counts and token usage are recorded in your local browser's IndexedDB to power the usage charts on the settings page. This data never leaves your browser.
If you enable "Send to Instapaper" and link your account, Shinkansen stores an Instapaper access token (OAuth token) in storage.local (not synced across devices, not included in exports) and your account email in storage.sync. Your Instapaper password is only used at link time to exchange for the token, then discarded — it is never stored. The token is used solely to send page content to Instapaper when you trigger it.
Sessions for EPUB / Word / text / subtitle-file translation (translations, your manual edits, the whole-document glossary, accumulated cost) are stored in your browser's local IndexedDB so you can resume after closing the page. This data is not affected by "clear translation cache"; it is deleted when you discard the document on the document-translation page. Fonts downloaded for translated PDFs in Simplified Chinese / Japanese / Korean are kept in the browser's Cache Storage and downloaded only once.
Shinkansen's outbound network connections are limited to the following. Apart from the once-a-day exchange-rate refresh, they are only initiated when the corresponding feature is used:
| Endpoint | Purpose | Data sent |
|---|---|---|
generativelanguage.googleapis.com |
Gemini API translation | Your Gemini API Key, the text to be translated, and the translation system prompt |
translate.googleapis.com |
Google Translate (key-free path) | Text to be translated (no API Key, no identity) |
| Endpoint configured by you | OpenAI-compatible translation (OpenRouter / Ollama / etc.) | That provider's API Key, the text to be translated, and the translation system prompt |
jimmysu0309.github.io |
Downloads the font used for translated PDFs (only when the target language is Simplified Chinese / Japanese / Korean and you translate a PDF; fetched once on first use, then kept in the browser cache) | No user data, no document content |
api.github.com |
Check for new Shinkansen versions (release metadata only; only builds installed manually from GitHub connect, at most once a day — store builds never do) | No user data |
open.er-api.com |
Fetch the USD↔TWD exchange rate (to display API costs in TWD; refreshed once a day in the background regardless of the currency setting) | No user data |
youtube.googleapis.com |
Google Drive video subtitle translation: re-fetches the caption file the player has already loaded | The caption file URL, without login credentials |
www.instapaper.com |
Send to Instapaper (optional, user-initiated) | Your Instapaper access token, and the content, URL, and title of the current (translated) page. By default a short summary is generated with Gemini first (the article text is sent to Gemini; can be turned off in settings) |
Data sent to the two Google endpoints (Gemini and Google Translate) is governed by Google's Privacy Policy and the Gemini API Terms of Service. When using a custom provider, your data is governed by that provider's own privacy policy and terms of service. When the Instapaper integration is enabled, page content is sent to Instapaper's own endpoint only when you actively click "Send to Instapaper" or press its keyboard shortcut, and is governed by Instapaper's own privacy policy. Please read the relevant terms before use.
Shinkansen does not:
The extension requests the following browser permissions:
<all_urls> (access to all websites)Translation needs to read and modify the text content of arbitrary web pages, which requires this permission. The extension only modifies a page when you actively trigger a translation (or visit a domain on your auto-translate list). Additionally, automatic local Chinese-variant conversion is on by default: pages in the opposite Chinese variant are converted in place with a built-in dictionary, with no network access; it can be turned off in the toolbar icon menu.
generativelanguage.googleapis.com / translate.googleapis.comNetwork access to the Gemini API and Google Translate endpoints, declared explicitly. Declaring the permission alone does not initiate any connection — that only happens when you use the corresponding translation path.
www.instapaper.comNetwork access to the Instapaper Full API endpoint, for the optional "Send to Instapaper" feature. No connection is made unless the feature is enabled and your account is linked.
storage (local storage)Used to store settings, API Keys, the translation cache, and usage statistics.
alarmsUsed to schedule service-worker idle wake-ups (e.g., maintaining translation streaming connections, periodic update checks, the daily exchange-rate refresh). It does not collect data in the background.
webNavigationUsed for cross-tab translation continuity (when you open a link from an already-translated page in a new tab, the new tab inherits the translation settings). Browsing history is not collected.
Your API Keys live in the browser's local storage, protected by the browser sandbox. We recommend that you do not share your API Keys with anyone, and that you set appropriate usage limits on each Key in the corresponding service's dashboard.
Shinkansen is not designed for children under 13. We do not knowingly collect children's personal information.
If this Privacy Policy changes substantively, the change will be announced alongside an extension update. You can always view the latest version on this page.
If you have any questions about this Privacy Policy, please reach out:
Twitter (X): @jimmy_su