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
| Artifact | Path |
|---|---|
| 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, …. Thecontainers,spaces,items, andtopAppsContainerIDsarrays 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
| Key | Contents |
|---|---|
version | Schema version (observed: 1) |
sidebar.containers | Alternating marker/data pairs (see below) |
sidebarSyncState | Arc Sync state: lastSuccessfulSyncDate plus synced copies of Spaces and items (may be {}) |
firebaseSyncState | Additional 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"
]
},
…
]
| Field | Meaning |
|---|---|
id | Space identifier. The first Space uses the fixed ID thebrowser.company.defaultPersonalSpaceID; later Spaces use UUIDs |
title | User-given Space name |
profile | Browser profile the Space uses (see below) |
customInfo.iconType | Icon: a named icon ({"icon" : "planet"}) or an emoji (emoji_v2) |
customInfo.windowTheme | Colour theme (sRGB colour components) |
containerIDs | label, id pairs naming the Space's pinned and unpinned (Today) item containers |
newContainerIDs | The 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 value | Profile 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.
sidebarSyncStateholds 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
unpinnedmarker 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:
| Field | Source |
|---|---|
space_id, title, icon | Space object |
profile, profile_machine_id | profile enum, resolved to the profile directory |
pinned_container_id, today_container_id | Resolved by label from containerIDs / newContainerIDs |
pinned_item_count, today_item_count | Items resolved into each container |
container | Container marker (global, standalone, littleBrowser) |
is_backup | true when the record came from a timestamped backup |
References
- Sidebar Items — tabs, folders, and Favorites in the same file
- arc-export — open-source StorableSidebar.json parser
- arc-oss: Arc sidebar format notes