TempoLife › Features › Browser extension › firefox
Firefox
Nothing is published on addons.mozilla.org. Here is how the Firefox build would differ from the Chromium one, and a bookmarklet that works in Firefox today.
Not publishedBookmarklet: works todayChecked 2026-09-02
There is no TempoLife browser extension. It is not in the Chrome Web Store, not on addons.mozilla.org, and there is no unpacked build to sideload. Anything you find under that name is not ours. What is on this page is a description of what it would do, and a bookmarklet that does a useful slice of it today.
The bookmarklet in Firefox
Press Ctrl+Shift+B to show the bookmarks toolbar and drag the button onto it. Firefox has kept bookmarklets working more consistently than most browsers, and it lets you edit the bookmark afterwards to read exactly what you installed — worth doing with any bookmarklet, including this one.
Drag that button to your bookmarks bar. Do not click it here. This page sends a strict Content-Security-Policy that forbids inline script, so a click on this site is blocked by design — which is also a small demonstration that the page is not running it for you. Once the link lives in your bookmarks bar it runs against whatever page you are on instead.
What it does, in order
- Reads the text you have selected on the current page. Nothing else on the page is read.
- If you selected nothing, it asks you what to look up, pre-filled with an example.
- Collapses whitespace, trims, and cuts anything over 160 characters — the limit
/api/answerenforces, so a long selection returns an answer instead of an error. - Opens
https://tempolife.app/api/answer?q=…in a new tab withnoopener, so the new tab cannot reach back into the page you came from.
The source, in full
Read it before you install it. That is the point of a bookmarklet: it is small enough that you can.
javascript:(function () {
var q = '';
try {
q = String(window.getSelection ? window.getSelection() : '');
} catch (e) {
q = '';
}
q = q.replace(/\s+/g, ' ').trim();
if (!q) {
q = String(window.prompt('Ask TempoLife about a food', 'calories in banana') || '');
q = q.replace(/\s+/g, ' ').trim();
}
if (!q) { return; }
if (q.length > 160) { q = q.slice(0, 160); }
window.open('https://tempolife.app/api/answer?q=' + encodeURIComponent(q), '_blank', 'noopener');
})();There is no fetch, no XMLHttpRequest, no injected <script>, no cookie access, no localStorage, and no code loaded from anywhere. It reads a selection and opens a URL. The minified form in the link above is this and nothing more, percent-encoded so no quote or angle bracket ends up in an HTML attribute.
What it sends, and where
The text you selected is sent to tempolife.app in the URL of the new tab, because that is how a query parameter works. Select a food name, not a private sentence. The endpoint logs are ordinary web-server logs; nothing is attached to an account, because the bookmarklet sends no cookie and needs no sign-in.
Where it will not work
Sites with a strict Content-Security-Policy of their own can block bookmarklets — behaviour varies by browser and has changed more than once. Browser-internal pages such as chrome:// or about: never run one. And on mobile, bookmarks bars mostly do not exist; use the form below instead. When a bookmarklet fails it usually fails silently, so if nothing happens, that is why.
Firefox will not run one on about: pages or on addons.mozilla.org. On a page with a strict Content-Security-Policy the behaviour has changed across releases; if a click does nothing, that is the likely cause.
The same thing without a bookmark
No JavaScript, no extension, no account. It returns raw JSON because it is an API endpoint rather than a page — which is exactly what makes it useful from a script of your own. The developer portal documents the response shape and the 60-per-hour rate limit.
How the Firefox build would differ
Less than you would expect, and the differences are worth naming. Firefox supports Manifest V3 but keeps the blocking request API that Chrome removed — irrelevant here, since a nutrition overlay never inspects network traffic. Firefox uses a persistent background script rather than requiring a service worker, which makes state handling simpler. And its APIs are promise-based under the browser.* namespace, so one thin compatibility shim covers both stores from a single source tree.
The one real divergence is packaging. Firefox requires a signed .xpi and an explicit extension id, and addons.mozilla.org reviews source: for a build step of any complexity you submit the unminified source alongside the package so a human can reproduce it. That is a higher bar than the Chrome Web Store sets, and a good reason to keep the codebase small enough to read.
Permissions it would ask for, and why each one
A recipe overlay needs less access than people assume, and the difference between a well-scoped extension and a badly scoped one is visible in the install prompt. This is the manifest it would ship with.
| Permission | What it allows | Why it is needed |
|---|---|---|
activeTab | Read the page in the current tab, and only after you click the toolbar button. | The overlay has to read the ingredient list. This grant expires when you leave the tab, so it cannot be used to watch you browse. |
scripting | Inject the overlay script into that tab. | Modern extensions cannot draw on a page without it. It is inert without a host grant. |
contextMenus | Add one right-click item on selected text. | The "look up this ingredient" path. It adds a menu entry and nothing else. |
storage | Store settings in the browser. | Your unit preference and which tips you have dismissed. Local to the browser; never sent anywhere. |
| Optional host access | Run on a site you explicitly allow. | Requested per site, at the moment you first use it there, instead of asking for every site at install time. |
What it would deliberately not ask for
<all_urls>at install time — the permission that makes an extension able to read every page you ever open. Per-site consent is slower to use and much easier to trust.tabs— the full URL and title of every open tab, which is a browsing history feed.cookies,webRequest,history,bookmarks,downloads,identity— none of them are needed to put nutrition on a recipe.- Remote code. The whole point of a review process is defeated by an extension that fetches its logic after installation, and both stores now forbid it.
If a nutrition extension you are considering asks for access to all sites at install time and does not explain why, that is worth a moment's thought regardless of whose it is.
Firefox on Android
Firefox for Android runs a curated subset of extensions, which is why some desktop favourites are missing there. A recipe overlay is a poor fit for a phone in any case — the panel would cover the recipe. On mobile the honest answer is the form on this page, or the app itself, which already photographs a meal and returns the macros without any of this machinery.
Frequently asked questions
Is a TempoLife add-on on addons.mozilla.org?
No. Nothing is published there.
Can I read the bookmarklet after installing it?
Yes — open the bookmark's properties in the Firefox bookmark manager and the whole program is there. Do that with every bookmarklet you install.
Would the Firefox version be a separate product?
No. It would be one codebase with a thin compatibility shim, submitted to both stores.
Source: TempoLife /api/answer endpoint — live, documented in the developer portal · checked 2026-09-02
Other pages
Chrome and Edge
Status, and what works today.
Privacy
Status, and what works today.
Changelog
Status, and what works today.
Extension overview · The API it would use · Embeddable widgets
The diary is the part that exists
Photograph a meal, get the macros, and watch the week rather than the plate. That is shipping today, in the app.