product update13 min read

The extension popup was answering the wrong question. In 1.16 it draws the page you are on instead.

Telli.sh: Every Translator 1.16 rebuilds the toolbar popup as a status view: a miniature of the page you are on, five labelled chips, and dots that go green only when the extension can confirm it is running. Every setting moved to a dedicated settings page with live skeleton previews, instant translation gained its own tab with a self-pruning 30-day history, and a notification bell now carries the Telli.sh blog in your browser's language across 15 locales.

K
Ken Jo
#every-translator#chrome-extension#browser-extension#translation#product-update#ux

Until this week, clicking the Telli.sh toolbar icon opened a settings drawer. Version 1.15's popup markup was 16,936 bytes, and it inlined the full configuration form for all eight providers that need configuring — Chrome built-in AI, Google, Apps Script, DeepL, Ollama, OpenAI-compatible, OpenRouter and Claude — plus five toggle rows. The options page next to it was 7,621 bytes. Less than half the size, and it was the surface with room to spare.

That is an inverted information architecture, and no amount of font tuning fixes it. A toolbar popup exists to answer one question, which we started calling the glance question: is it on, and what is it going to do on this page? You should get that answer in under a second, without scrolling, and then close the popup.

Telli.sh: Every Translator 1.16 was submitted to the Chrome Web Store on September 4, 2026 and is in review as this goes out. It answers the glance question with a drawing.

TL;DR

  • The popup is now a status view. 372 pixels wide, capped at 560 tall, no scrolling. It contains zero credential fields — we checked, and the count is literally zero.
  • It draws a miniature of the page you are on, with leader lines running from each part of the mock to a labelled chip: languages, display mode, send preview, provider, input assist. The mock mirrors what the extension actually renders, down to the 8-pixel gap between the floating button and the composer.
  • Green means verified, not "the checkbox is ticked." Three states: green for running on this tab, amber for enabled but unconfirmed, grey for off.
  • Instant translation and history are a second and third tab. Unpinned history entries expire 30 days after they were made; pinned ones do not.
  • A notification bell carries our blog in your browser's language, read from a per-locale RSS feed across 15 locales. If you want to hear about new posts without visiting the site, that bell is now the cheapest way.
  • Everything you configure lives on the settings page, which shows you a working miniature of each display mode instead of describing it in a sentence.

The popup stopped holding settings, and that is the whole change

The single decision behind 1.16: configuration moves out, status moves in. The gear icon in the popup header now jumps to the matching section of the settings page, so nothing became harder to reach — it just stopped being in the way of the answer.

What is left in the popup is deliberately small. A header with the site name and a per-site on/off switch, because "turn it off here, on this site" is a status action and not a setting. A bell. A gear. And the body.

The body is the part worth talking about.

The status view is an anatomy drawing of your own page

Open the popup on a chat site and you see a wireframe of that site: two message bubbles, a composer at the bottom, the Telli.sh floating button sitting above it, and a preview panel above that. Grey skeleton bars stand in for text. From five parts of that mock, thin leader lines run left to a column of labelled chips.

Each chip names one thing and gives its current value:

ChipWhat it points atWhat it shows
Languagesthe message bubbleyour reading language → your outgoing language, e.g. English → Auto-detect
Displaythe translation under the bubbleInline comment, Bilingual, Click to expand, or Click to toggle
Send previewthe panel's buttonsOn or Off
Providerthe floating buttonwhich of the nine providers is selected
Input assistthe composerthe target language, or Off

The chips are ordered top to bottom to match the parts they point at, so the leader lines never cross. Their vertical positions are measured at render time rather than hard-coded: chips whose ideal positions overlap are merged into a run, and the run is centred so the alignment error is shared across the group instead of dumped on the last chip. Hovering a chip highlights the part of the drawing it belongs to.

Here is the point of doing it this way. A settings list tells you displayMode: bilingual. A drawing tells you where the translation is going to appear on the page you are looking at. The mock is not a stylised illustration either — it mirrors the real geometry the content script uses: the floating button sits 8 pixels above the composer's top edge, right-aligned, and the 350-pixel preview panel sits 8 pixels above the button, same alignment. The popup teaches the actual UI rather than a friendly fiction of it.

A green dot has to mean something, so we made it expensive

The old toggles showed intent. You could see that a switch was on and still have no idea whether anything was translating, whether your API key was accepted, or whether this site was supported at all.

So 1.16 spends the colour green carefully. There are three states, and each one is a claim the extension is willing to defend:

  • Green — "Running on this tab." The extension can confirm this right now.
  • Amber — "Enabled, not verified." The setting is on and the credentials are present, but nothing has proven the round trip works.
  • Grey — "Off." Either switched off, or a required field is still empty, which comes to the same thing: nothing will translate.

The provider chip is the strict case. Only two providers can earn green. Free Google Translate mode needs no user credential and is always reachable, so it is green. Chrome's built-in on-device AI is green only after the popup actually asks Translator.availability() for your language pair and gets a usable answer back. Every other provider — DeepL, Claude, OpenRouter, Ollama, an OpenAI-compatible endpoint, Apps Script, the Google API — sits at amber once it has a URL or a key, because verifying it would mean spending your quota on a test call every time you open a popup. If the field it needs is empty, it is grey, not amber. The extension will not tell you something is on when it knows it cannot work.

That is a deliberately unflattering rule. Most users on the default settings will see one green provider dot; most users on a paid API will see amber forever. Amber is honest, and we would rather ship honest than ship green.

Instant translation: a tab for the text that has no page

Everything above assumes you are on a page the extension supports. Often you are not — someone pastes a paragraph into a ticket, or you copy a sentence out of a PDF.

Instant translation is a second popup tab for exactly that. Pick a source and target language, paste up to 2,000 characters, get the translation, copy it. There is a swap button between the two selects.

It is not a second translator sitting beside the first. The request goes through the same background queue, the same cache and the same provider as every translation the extension does on a page, so whatever you configured once applies here too. And it is off by default — instantTranslateEnabled starts false — because the popup's job is the glance question, and a scratch pad you never asked for would be one more thing between you and the answer. Turn it on in settings and the popup grows its tab strip; leave it off and the popup stays a single status view.

History that cleans itself up: 30 days, unless you pin it

Turn instant translation on and a History tab appears next to it, holding what you translated there, newest first, on this device.

The retention rule is one line: unpinned entries expire 30 days after they were made; pinned entries never expire. Pin the phrase you keep needing, and it stays. Everything else ages out on its own.

Two implementation details are worth stating because they change what you can rely on. Pruning happens when the list is read, not on a background timer — the popup is the only thing that ever reads this list, so an alarm could not delete anything sooner than opening the popup already does. And unpinning an entry that is already older than 30 days is what deletes it: the pin was the only thing holding the expiry off, and the next read collects it.

There is a hard cap of 200 entries as a backstop. If it is ever hit, pinned entries are kept and the oldest unpinned ones go first. A clear-all button sits at the top of the tab.

The bell is our blog, in your language

This is the part we would most like you to notice, because it is the one that keeps working after you close the tab.

The popup header carries a notification bell. It shows Telli.sh blog posts — up to three stacked as cards in the status view, with the full list behind the bell and an unread badge on the icon. Every post opens the article on telli.sh.

The feed is per-locale. The extension reads your browser's UI language, matches it against the 15 locales the blog publishes in — English, Korean, Japanese, Chinese, German, French, Spanish, Italian, Portuguese, Russian, Polish, Vietnamese, Thai, Indonesian and Malay — and fetches that language's RSS feed. If your browser is set to Thai, the announcements arrive in Thai. If your browser's language is not one of the 15, you get English. Both Chinese variants resolve to the same Chinese feed.

The mechanics are built to stay out of your way. The feed is fetched by the popup itself, never by a background alarm, and it is served from cache first, so the cards are already drawn before the network is touched. The cache lasts 6 hours, which surfaces a new post within one working day while collapsing a day's worth of popup opens — dozens — into at most four requests. Up to 12 items are kept. A failed refresh never displaces a good cache; the fallback chain runs live feed, then cache, then a single evergreen Telli.sh card, then nothing at all.

Dismissing a post makes it stay dismissed. Item identity comes from the post's own URL with the query string stripped — the tracking parameters on those links are ours, not the post's — so a dismissed article does not reappear the next time the feed refreshes and reorders.

If you have been meaning to follow what we publish about meeting translation and speech recognition and never got around to it: install the extension and the posts come to the toolbar, in your language, three at a time.

Settings you can see before you commit to them

The settings page grew into the surface that was always supposed to carry this weight, and its main idea is that you should not have to imagine a display mode.

Under the display-mode selector there is a live miniature — the same grey-skeleton wireframe language as the popup drawing — showing a message bubble with the translation rendered the way that mode renders it. Switch from Inline comment to Bilingual to Click to expand to Click to toggle and the miniature changes with you. There are matching demos for send preview, for input assist, and for instant translation, each with a one-line caption that changes with the setting rather than describing it in the abstract.

The provider section stopped asking you to know model IDs by heart. Ollama's model list is fetched from your local server's /api/tags; OpenAI-compatible endpoints are read from {your base URL}/models; OpenRouter and Anthropic come from their own catalogue endpoints. Where the API publishes per-token pricing, the picker shows it, converted to a per-million-token figure — OpenRouter states prices as numbers like 0.0000001, which nobody can read at that scale. Nothing about pricing is hardcoded, estimated, or remembered between refreshes, so a stale price is structurally impossible: if the catalogue does not carry a price, the picker shows none.

The supported-site list was 30 sites in one flat, unscannable column. It is now grouped into 8 categories — Chat & email (7 sites), Social (3), Communities & forums (4), Developer (5), Wikis & reference (2), Blogs & newsletters (3), News (4), and Comments & reviews (2) — with a "Missing a site? Ask us to add it" line at the bottom, which is the first time the extension has offered any route for that at all.

And there is a first run now. On install — and only on install, keyed to Chrome's install reason so an update never triggers it — three steps walk you through what the extension does, which two settings decide everything else, and where the toolbar button is. Two of the three steps spotlight the real controls on the page rather than showing a picture of a control you then have to go find.

The bottom line: a toolbar popup is a dashboard light, not a dashboard

The mistake in the old popup was not that it was ugly or that it scrolled. It was that it treated a one-second surface as a workspace. You cannot configure eight providers in a 372-pixel-wide box, and you should not have to scroll past the attempt to find out whether anything is running.

1.16 splits those jobs cleanly. The settings page is where you decide things, once, with a picture of what each decision looks like. The popup is where you confirm the decision is in effect, in under a second, on this page, right now. If we got it right, you will open the popup more often and stay in it for less time.

Version 1.16 is in Chrome Web Store review as of September 4, 2026. It appears as an automatic update once approved.


Where Telli.sh fits: the extension covers fast text — chats, posts, comments, mail, forum threads — across 30 sites, 52 reading languages and 9 translation providers, with a UI that ships in 50 languages. Telli.sh itself covers the other half: spoken work. It records or ingests a meeting, transcribes it in the language it was actually spoken in, translates into 44 target languages, and keeps the source text, the aligned translation and the AI summary in one editable note. Same idea in both places — put the translation next to the original and keep the original.

Start a live translated meeting note

Sources


Back to Blog