Import and export format
Export (in the … menu) writes this file. Import reads it. It is plain JSON, so it is also
the way to edit your spaces in bulk, by hand, with a script, or with an AI agent.
A machine-readable version is in import.schema.json, a JSON Schema.
Shape
{
"app": "tabs",
"version": 2,
"exportedAt": "2026-10-04T21:30:00.000Z",
"spaces": [
{
"id": "k3x9qa",
"name": "Work",
"groups": [
{
"id": "p7f2mz",
"name": "Acme redesign",
"color": "blue",
"links": [
{ "title": "Designs", "url": "https://www.figma.com/file/abc/homepage-v3" },
{ "title": "Sprint 12 – Linear", "url": "https://linear.app/acme/cycle/12", "auto": true },
{ "title": "Mail", "url": "https://mail.google.com/mail/u/0/#inbox" }
]
}
]
}
],
"favorites": [
{ "title": "Mail", "url": "https://mail.google.com/mail/u/0/#inbox" },
{ "title": "Calendar", "url": "https://calendar.google.com/", "auto": true }
]
}
| Field | Required | Notes |
|---|---|---|
version |
no | 2 for this shape. See Older files below. |
spaces |
yes | Array, in display order. Everything else at the top level but favorites is ignored on import. |
favorites |
no |
Array, in the order of the strip: the pages that belong to no space, at most 8. Each is a
link like links[]. Left out, an import leaves the favorites as they are.
|
spaces[].name |
yes | Up to 60 characters. |
spaces[].id |
no | See Ids below. |
spaces[].groups |
no | Array, in display order. |
groups[].name |
yes | Up to 60 characters. |
groups[].id |
no | See Ids below. |
groups[].color |
no |
The color of its tab group: grey, blue, red,
yellow, green, pink, purple,
cyan or orange. Chosen for you if left out.
|
groups[].links |
no | Array, in tab-strip order. |
links[].url |
yes | The address the link is saved with. Entries with no address are dropped. |
links[].title |
no | Your name for the link, shown in lists and used by search. Cut to 80 characters. See Names below. |
links[].auto |
no | true when the title is just the page's own title. See Names below. |
links[].latest |
no |
Only in files from older versions, which wrote it for a link whose tab had moved on to
another page. It is read as the link's address, in place of url. Export no
longer writes it.
|
The smallest valid file:
{ "spaces": [{ "name": "Work", "groups": [{ "name": "Inbox", "links": [{ "url": "https://mail.google.com/" }] }] }] }
Older files
Files from versions before 2 (with "version": 1, or no version) say
workspaces for spaces, projects for groups and tabs for links,
in the same shape. They still import, just as before. A file is read by the new keys when it has
spaces, and by the old ones otherwise; one file does not mix the two. Export always writes
version 2.
The two import modes
Add to what's here. Every space and group in the file is added as new. Ids in the file are ignored, so importing the same file twice gives you two copies. Favorites in the file are added after the ones you have, skipping any page that is a favorite already, up to the eight the strip holds.
Replace everything. The file becomes the whole truth: anything not in it is deleted.
This is the mode for "export, tidy up, import". A file with a favorites list replaces the
favorites too; one without the key leaves them alone. A favorite that goes lets go of its pinned tabs:
they stay open, unpinned.
Ids
Ids only matter for Replace. A group whose id matches an existing group
is updated in place, which means one that is on (and stays in its space) keeps its tab group. A group
with no id (or an unknown one) is created fresh. Leave ids alone on things you are
keeping, and leave them out on things you are adding.
Names
A link keeps the address and title it was saved with: browsing its tab to another page changes neither. In the panel, a small ↩ on the link then says the tab has moved on, and offers Go back and Save current page, which makes the new page the link's address. Where the tab got to is noted on this computer, not in the file: a link whose tab has closed opens again there, until Go back.
A title is either one you gave the link yourself or the page's own. A title in a file
you write is treated as yours. Export marks titles that simply came from the page with
"auto": true, so that a round trip does not turn page titles into names. A link with no
title shows the site's name until its page first loads, then takes the page's title.
Save current page replaces a page's title with the new page's, and keeps a title of your
own.
To rename a link in an exported file, change its title and delete
"auto": true. With auto left in, the new title is kept, but
Save current page will replace it.
In the panel, Rename… in a link's menu renames it in place, and Rename… in a favorite's menu does the same; an empty name hands the title back to the page.
On and off
Importing never turns a group on. Which groups are on is not part of the file: it is simply which tab groups a window has at the moment. An import changes what is saved and leaves open tab groups as they are. If a group that is on changes in a Replace, its tab group keeps its tabs: the panel shows which links are not open, and the tab group's other tabs show as unsaved. A Replace turns a group off only if it moves it to a different space. A group it deletes leaves its tabs open, outside every group.
Limits worth knowing
-
Everything is stored in Chrome's synced extension storage, which holds about
100 KB in total. That is several hundred links across all groups; how many
depends on how long their addresses and titles are. The
…menu shows usage. - There are at most 8 favorites, and together they must fit in one item of that storage (about 6 KB), so a few very long addresses can fill the strip before eight do. Past that, the last ones in a file are left out.
-
Addresses that Chrome cannot reopen, or that a group cannot hold, are left out when a file is
imported:
chrome://pages,about:,blob:,data:,javascript:,view-source:, and addresses longer than 4,096 characters.
Building a file from your own browsing
Useful sources on a Mac, if you want to generate a file with a script or an agent:
- What is open right now: put your tabs into groups (use New group and tick the tabs it should start with), then Export. This is the easiest starting point.
-
History:
~/Library/Application Support/Google/Chrome/Default/Historyis a SQLite database (copy it first; Chrome keeps it locked). Theurlstable hasurl,title,visit_countandlast_visit_time. -
Bookmarks: Add from bookmarks in the panel's
…menu does this directly: a folder becomes a group, and a folder of folders a space. For a script,~/Library/Application Support/Google/Chrome/Default/Bookmarksis JSON; folders map naturally to groups.
A sensible approach is to sort frequently visited pages by what you use them for, keep each group to the handful of links you actually want open together, and import with Add the first time.