Skip to content
barts.work
The Pickup wordmark and the tagline "Your place, kept.", beside three layered browser windows.
Live extension

Pickup

Save the useful tabs and the thought that connects them, then pick up where you left off.

Screenshots

  • The Pickup popup with a title, next action, note, and a checklist of four tabs from a Firefox tab group.
    Choose the tabs that still matter and leave a short note for future-you.
  • The Pickup library page showing three saved pickups as cards, each with its next action, note, tab list, and a Pick up button.
    The library keeps temporary projects ready to reopen together, all in this browser profile.
  • The Pickup library filtered by a search for Kraków, above a panel explaining that Pickup has no account, no server, and no page access.
    Search the local library, archive or delete what's done, and export a backup you keep yourself.

Pickup is a small browser extension for Chrome, Firefox, and Safari. You choose the tabs that still matter, give the set a title, and optionally write down the next action and a note. Later, Pickup reopens the set so you can continue without reconstructing why those tabs were open in the first place. It is deliberately not a bookmark manager. Bookmarks are good at remembering a page; Pickup is for remembering a temporary piece of work.

Where it is right now

Pickup is on Firefox Add-ons. Version 0.2.0 passed Mozilla’s review and is listed publicly under Tabs, so installing it is one button and updates arrive on their own. It needs Firefox 142 or newer, because that is the version whose native tab-group API Pickup rebuilds a saved group with.

Chrome and Safari are a different story. Both builds exist in my repository and do everything the Firefox one does — the shared code is the same — but neither is in a store yet. Chrome needs a Web Store listing + developer account; Safari needs the non-beta Xcode to sign it, and a willingness to go through the AppStore review process. Until then those two are load-unpacked and temporary-extension installs, which is fine for me and not fine for anybody else. Firefox got there first because AMO asks for the least ceremony between a working extension and a person who can install it.

What shipping to AMO actually took

The extension was already working. Almost none of the release work was extension code.

  • A separate Firefox manifest. Chrome MV3 wants background.service_worker; Firefox MV3 wants background.scripts. The build script now emits a background-classic.js for Firefox from the same source modules, which is also why the submission included a source archive — AMO reviewers are entitled to see that a generated file is generated, not obfuscated.
  • browser_specific_settings. A stable add-on ID (pickup@barts.work), strict_min_version: "142.0", and Firefox’s newer data_collection_permissions: { required: ["none"] } — a machine-readable declaration that the add-on transmits nothing, which is a nice thing to be able to say in the manifest rather than only in prose.
  • Screenshots of the real thing. The three images above are generated by a script that drives the actual popup and library with fictional data, at Mozilla’s 1280x800. No mockups, no marketing text baked into the pixels; the explanation goes in the caption, where it can be translated if I ever decide to go multilangual. I mean, why not…?
  • The boring paperwork. Listing copy, category, licence, support email, reviewer notes with exact build steps, and the privacy policy — which had to be publicly reachable before submission, not after.

Roughly: a day of extension work, and several days of everything around it. That ratio was the most useful thing I learned from this release.

Local on purpose

A pickup contains the title, next action, and note you enter, plus the selected tabs’ titles, URLs, order, pinned state, and active state. Chrome or Firefox group details are saved when relevant. Everything lives in the browser’s extension storage on the device. There is no account, server, sync service, analytics, or advertising. You can export a readable JSON backup, but Pickup never uploads it. That keeps the privacy model simple: the extension handles a personal list of pages, but that list does not leave your browser unless you export it and move the file yourself.

One idea, three browsers

Chrome, Firefox, and Safari share most of the extension, but not every browser capability. Chrome and Firefox have compatible native tab-group APIs, so Pickup can rebuild a saved group with its title and colour. Safari restores the same tabs into a new window instead. The permission models differ too. Chrome and Firefox need storage, tabs, and tabGroups, with no host permissions. Safari requires website access before it reveals the title and URL of inactive tabs. Pickup declares that access so a saved set is not full of blanks, but has no content scripts, reads no page body, and sends nothing over the network. The plain-English privacy policy explains the exact boundary.

Design lessons from the MVP

  • Context is the feature. Saving URLs is easy. Saving the next action is what turns a pile of tabs back into a task.
  • Restore fidelity matters. Order, pinned state, the active tab, and Chrome or Firefox group details are small pieces individually; together they make the restored workspace feel familiar.
  • Local-only still deserves a privacy policy. Tab URLs and notes can be sensitive even when they never reach a server, so the permission and backup behaviour should be clear before installation.
  • “Works on my machine” and “installable by a stranger” are different projects. The second one is mostly writing.

Next

Chrome Web Store, then Safari. Nothing in the product needs to change for either; the code is ready and the queue is administrative. If you find a bug in the Firefox build, that is the most useful thing you can send me.

Questions, bugs, or ideas: App Support, with Pickup already selected.