Index

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

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:

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.