Why I built it

I usually have more than 100 tabs open.

Some are research. Some are reminders. Some are things I have not figured out yet. The browser keeps the URL and title but loses why I opened it and what I planned to do next.

Bookmarks are too permanent. Tabs are too fragile. Tabnotes is my current experiment.

What it does

Tabnotes puts every Chrome or Edge tab in a searchable side-panel table (or a standalone tab).

I can add notes, tags, a next action, a priority, or any custom field. I can close a tab and keep its record. Opening it later restores the same context.

It preserves data across browser closes and crashes, reconnecting tabs there's a clear match, and leaving others as "Unmatched" for me to resolve. Data isn't lost.

Everything stays local. Tabnotes does not read page contents, send browsing data to a server, or require an account. It exports a full JSON backup, a TSV snapshot, or an optional live TSV file of active tabs.

How I built it

I started with an empty code repository on July 13 and a fairly detailed specification.

The specification focused on things the software must not get wrong:

  • A tab's context should survive closing and reopening.
  • A URL alone should never prove that two tabs are the same.
  • An uncertain recovery should stay uncertain.
  • A browser refresh should not destroy text I am editing.
  • An older queued TSV write should never overwrite newer content.

I used GPT-5.6 Sol in the Codex CLI to turn those rules into a plan, failing tests, plain JavaScript modules, the Manifest V3 extension, and browser-level checks.

Codex wrote and maintained PLAN.md, implemented the IndexedDB data model and service worker, built the side-panel interface, and tested the extension through the Chrome DevTools Protocol. I kept making the product calls, especially around privacy, identity, and what Tabnotes should refuse to guess.

The prompts and Codex session IDs are in prompts.md. The primary build session is:

019f5a20-e97b-7e20-9900-02c7ffe135c4

What broke

The first large-table version worked, but a 5,000-record test took 8.5 seconds to mount and created about 70,000 DOM elements.

Codex replaced the unbounded table with a 120-row window. The same test then mounted in 149 milliseconds with fewer than 1,800 elements.

A real Edge crash found the more useful failure.

Edge restored several tabs, but Tabnotes could not reconnect all of them safely. I did not want a more aggressive matcher. A wrong match would attach my notes to the wrong page and look perfectly normal.

So I added an explicit Recover restored tabs action. Unique matches reconnect. Ambiguous ones remain Unmatched.

Then the submission work found one last bug. The isolated browser capture closed a tab just as a browser refresh changed its state. Codex reproduced the race, fixed it, and added a regression test.

The current release, v0.1.1, passes 128 tests across eight suites, followed by syntax, type, and formatting checks.

What I learned

Codex is more useful when I gave it observable rules rather than a vague "tab manager" request.

Code was easy. Figuring out what I wanted, whether query-parameter or hash variations count as the same tab, what evidence is sufficient, etc. was harder.

I did NOT expect this submission tooling to improve the product :-) Building a synthetic demo profile found a race condition. I plan to add synthetic demo profiles to my workflow now.

Built With

  • chrome
  • chrome-devtools-protocol
  • chrome-sessions-api
  • chrome-side-panel-api
  • chrome-tab-groups-api
  • chrome-tabs-api
  • css3
  • ecmascript-modules
  • file-system-access-api
  • github-actions
  • gpt-5.6
  • html5
  • indexeddb
  • javascript
  • jsdom
  • manifest-v3
  • microsoft-edge
  • node.js
  • openai-codex
  • typescript
  • vitest
  • web-navigation-api
Share this project:

Updates