Arc

Arc Spaces

Overview

A Space is Arc's top-level workspace. Each Space has its own name, icon, colour theme, pinned tabs, and Today tabs, and is tied to one browser profile. Users typically create Spaces per project, client, or identity ("Work", "Personal", "Side Project"). Space names alone can explain browsing that otherwise looks unrelated, and the profile link tells you which Chromium databases hold that Space's history and cookies.

Spaces are stored in StorableSidebar.json, which also holds every sidebar item (see Sidebar Items). Arc does not document this file. The structure below is taken from real-world samples and open-source parsers, and it may change between Arc versions.

File Locations

ArtifactPath
Sidebar state~/Library/Application Support/Arc/StorableSidebar.json
Backups~/Library/Application Support/Arc/StorableSidebar.<yyyy-MM-dd-HH-mm-ss-SSS>.json

Collect the backups

Arc keeps timestamped backup copies of the sidebar file. Each backup is a point-in-time snapshot, so comparing them can show Spaces and tabs that were later renamed or deleted.

File Structure

Arc writes the file with Swift's Codable encoder in Apple's pretty-print style ("key" : value, with / escaped as \/). Two Swift conventions shape the whole file:

  • Alternating arrays. Swift dictionaries keyed by a non-string type become flat arrays of key, value, key, value, …. The containers, spaces, items, and topAppsContainerIDs arrays all use this form, so a parser must step through them in pairs and keep only the object entries.
  • Enum markers. Swift enums become single-key objects, e.g. {"pinned" : {}} or {"custom" : {"_0" : {…}}}.

Top Level

KeyContents
versionSchema version (observed: 1)
sidebar.containersAlternating marker/data pairs (see below)
sidebarSyncStateArc Sync state: lastSuccessfulSyncDate plus synced copies of Spaces and items (may be {})
firebaseSyncStateAdditional sync state

Containers

sidebar.containers pairs a marker with the data object it labels:

"containers" : [
  { "standalone" : { "_0" : "6A1F…" } },
  { "spaces" : [ … ], "items" : [ … ], "topAppsContainerIDs" : [ … ] },
  { "global" : { } },
  { "spaces" : [ … ], "items" : [ … ], "topAppsContainerIDs" : [ … ] }
]

The main sidebar is the data object that follows {"global" : {}}. Its position varies. Some files have only the global pair, while others have littleBrowser and standalone pairs first, which hold the tabs of Little Arc and standalone windows. Never assume the main sidebar is containers[1].

Space Object

"spaces" : [
  "thebrowser.company.defaultPersonalSpaceID",
  {
    "id" : "thebrowser.company.defaultPersonalSpaceID",
    "title" : "Personal",
    "profile" : { "default" : true },
    "customInfo" : {
      "iconType" : { "emoji" : 127969, "emoji_v2" : "🏡" },
      "windowTheme" : { … }
    },
    "containerIDs" : [
      "unpinned", "thebrowser.company.defaultPersonalSpaceUnpinnedContainerID",
      "pinned",   "thebrowser.company.defaultPersonalSpacePinnedContainerID"
    ],
    "newContainerIDs" : [
      { "pinned" : { } }, "thebrowser.company.defaultPersonalSpacePinnedContainerID",
      { "unpinned" : { "_0" : { "shared" : { } } } }, "thebrowser.company.defaultPersonalSpaceUnpinnedContainerID"
    ]
  },
  …
]
FieldMeaning
idSpace identifier. The first Space uses the fixed ID thebrowser.company.defaultPersonalSpaceID; later Spaces use UUIDs
titleUser-given Space name
profileBrowser profile the Space uses (see below)
customInfo.iconTypeIcon: a named icon ({"icon" : "planet"}) or an emoji (emoji_v2)
customInfo.windowThemeColour theme (sRGB colour components)
containerIDslabel, id pairs naming the Space's pinned and unpinned (Today) item containers
newContainerIDsThe same mapping with enum-object labels

Match container labels, not positions

Arc writes pinned and unpinned in either order, even within one file. Always look up the ID that follows the label. If containerIDs is missing, fall back to newContainerIDs.

Profile Mapping

profile valueProfile directory
{"default" : true} or {"default" : {}}User Data/Default/ (both forms occur in real files)
{"custom" : {"_0" : {"directoryBasename" : "Profile 1", "machineID" : "…"}}}User Data/Profile 1/

machineID identifies the Mac on which the profile reference was created. With Arc Sync, a file can hold references created on other devices.

Timestamps

Times in StorableSidebar.json (item createdAt, tab timeLastActiveAt, lastSuccessfulSyncDate) are Mac absolute time: seconds, as a float, since 2001-01-01 00:00:00 UTC. Add 978307200 to get Unix seconds. For example, 746426747.51 is 2024-08-27 04:45:47 UTC.

Space objects themselves carry no creation time. Use the earliest createdAt among a Space's items, or compare against backups, to estimate when a Space came into use.

Manual Analysis

List each Space with its profile and icon using jq:

jq -r '
  .sidebar.containers as $c
  | ($c | to_entries | map(select(.value | type == "object" and has("global"))) | .[0].key) as $g
  | $c[$g + 1].spaces[]
  | objects
  | [ .title,
      (if .profile.default != null then "Default" else .profile.custom._0.directoryBasename end),
      (.customInfo.iconType.emoji_v2 // .customInfo.iconType.icon // "") ]
  | @tsv' \
  ~/Library/Application\ Support/Arc/StorableSidebar.json

Analysis Notes

  • Spaces as context. Space names often map to employers, clients, or personas. Use them to group the rest of the evidence.
  • Profile separation. Two Spaces on different profiles have separate history, cookies, and saved passwords. Analyse each profile's databases with the Space's name in mind.
  • Sync artefacts. sidebarSyncState holds Arc Sync's copies of Spaces and items. These may differ from the live sidebar and can preserve stale or deleted entries.
  • Shared Spaces. An unpinned marker of {"_0" : {"shared" : {}}} appears on ordinary Spaces too, so it does not by itself show that the Space was shared with another person.

What macfor Collects

The browser.arc plugin collects StorableSidebar.json and every timestamped backup as raw files, and emits one arc_space record per Space:

FieldSource
space_id, title, iconSpace object
profile, profile_machine_idprofile enum, resolved to the profile directory
pinned_container_id, today_container_idResolved by label from containerIDs / newContainerIDs
pinned_item_count, today_item_countItems resolved into each container
containerContainer marker (global, standalone, littleBrowser)
is_backuptrue when the record came from a timestamped backup

References

Previous
Cookies