Arc
Arc Sidebar Items
Overview
Arc's sidebar replaces the tab strip and the bookmarks bar. Each Space has two sections, and each profile has a row of Favorites:
| Section | What it is | Forensic meaning |
|---|---|---|
| Pinned | Tabs and folders the user pinned to a Space | Long-lived resources the user deliberately kept |
Today (Arc's unpinned container) | Ordinary open tabs | Recent browsing; archived automatically after a set period |
| Favorites | Icon row at the top of the sidebar, one set per profile | The user's most-used sites |
All three are stored as items in StorableSidebar.json, not in Chromium's Bookmarks file. Each item records its URL, the page title, any title the user set, when it was created, and when it was last active. The sidebar can therefore show what a user had open and kept, with timestamps, independently of browsing history.
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 |
| Archived tabs | ~/Library/Application Support/Arc/StorableArchiveItems.json |
Item Structure
Items sit in the items array of the main sidebar container (the object after {"global" : {}}, see Spaces). Like the rest of the file, items alternates ID strings and item objects:
"items" : [
"641CE573-48C7-417F-B014-7E45BE994A4C",
{
"id" : "641CE573-48C7-417F-B014-7E45BE994A4C",
"parentID" : "87DC5386-D5EE-4447-AE0A-CE7E33E3128F",
"childrenIds" : [ ],
"title" : null,
"createdAt" : 746426747.510035,
"isUnread" : false,
"originatingDevice" : "24564BF1-21DC-43F4-B69A-6991DBCCA1B0",
"data" : {
"tab" : {
"savedURL" : "https:\/\/www.alfredapp.com\/help\/workflows\/inputs\/script-filter\/json\/",
"savedTitle" : "Script Filter JSON Format - Alfred Help and Support",
"timeLastActiveAt" : 746426762.639586,
"savedMuteStatus" : "allowAudio",
"activeTabBeforeCreationID" : "0604BE08-EC6A-4C41-A343-FB6BCD82649C"
}
}
},
…
]
| Field | Meaning |
|---|---|
id | Item UUID |
parentID | Parent folder or root container; null for root containers |
childrenIds | Child item IDs in display order |
title | Title the user set (null or "" if they never renamed it) |
createdAt | When the item was created (Mac absolute time) |
isUnread | Item has not been viewed since it was added |
originatingDevice | UUID of the Mac the item was created on (relevant with Arc Sync) |
data | One key giving the item type (below) |
Item Types
data key | Item | Notable fields |
|---|---|---|
tab | A web page | savedURL, savedTitle, timeLastActiveAt, activeTabBeforeCreationID (the tab that was active when this one was opened), referrerID |
list | A folder | Usually {}; a Live Folder carries automaticLiveFolderData with a dataSource (e.g. github) |
splitView | Tabs shown side by side | Children are the tabs; layoutOrientation, focusItemID |
easel | An Arc Easel (canvas) | easelID, title (the content itself is stored elsewhere) |
arcDocument | An Arc document (note) | arcDocumentID |
itemContainer | A root container | containerType: spaceItems (a Space's pinned or Today section) or topApps (a profile's Favorites) |
Resolving an Item's Section
An item does not record its section directly. Follow parentID upward, through any folders, until you reach a root itemContainer. Then identify that container:
- If a Space's
containerIDs(ornewContainerIDs) lists it underpinnedorunpinned, the item is in that Space's Pinned or Today section. - If
topAppsContainerIDslists it, the item is a Favorite of that profile. - Otherwise, its
containerType.spaceItems._0still names the owning Space.
If parentID is missing, look for the item in another item's childrenIds. Folder titles passed on the way up give the item's folder path.
Timestamps
| Field | Meaning |
|---|---|
createdAt | Item was added to the sidebar |
data.tab.timeLastActiveAt | Tab was last the active (focused) tab |
Both are Mac absolute time: seconds since 2001-01-01 UTC. Add 978307200 for Unix seconds.
Last-active time survives history clearing
timeLastActiveAt is written to the sidebar file, not the History database. When a user clears browsing history, pinned tabs, their URLs, and their last-active times can remain, along with copies in the timestamped backups.
Manual Analysis
List every tab with its Space, section, title, URL, and last-active time:
jq -r '
.sidebar.containers as $c
| ($c | to_entries | map(select(.value | type == "object" and has("global"))) | .[0].key) as $g
| $c[$g + 1] as $main
| ($main.items | map(objects) | map({key: .id, value: .}) | from_entries) as $items
| ([ $main.spaces[] | objects | . as $s
| (.containerIDs // []) as $ids
| range(0; $ids | length; 2)
| {key: $ids[. + 1], value: {space: $s.title,
section: (if $ids[.] == "pinned" then "pinned" else "today" end)}} ]
+ [ $main.topAppsContainerIDs | range(1; length; 2) as $i
| {key: .[$i], value: {space: "", section: "favorites"}} ]
| from_entries) as $roots
| def root($id): if $roots[$id] then $roots[$id]
elif $items[$id].parentID then root($items[$id].parentID)
else {space: "", section: "unknown"} end;
$items[]
| select(.data.tab)
| root(.parentID) as $r
| [ $r.space, $r.section,
(if (.title // "") != "" then .title else .data.tab.savedTitle end),
.data.tab.savedURL,
((.data.tab.timeLastActiveAt // 0) + 978307200 | todate) ]
| @tsv' \
~/Library/Application\ Support/Arc/StorableSidebar.json
This recipe reads containerIDs only. For files that have only newContainerIDs, adapt it to match enum labels.
Archived Tabs
When Arc archives a Today tab (automatically after 12 hours by default, configurable by the user), the tab moves to StorableArchiveItems.json. That file has the shape {"version" : 1, "items" : [id, {…}, …]}. Each entry holds:
| Field | Meaning |
|---|---|
archivedAt | When the tab was archived (Mac absolute time) |
reason | Why, e.g. auto for automatic archiving |
source.space._0 | ID of the Space the tab came from |
sidebarItem | The full item, in the same shape as above |
Archived tabs hold recently closed browsing with exact archive times, a useful complement to History.
Not yet collected by macfor
macfor does not currently parse StorableArchiveItems.json. Collect it manually, or enable raw collection and copy the Arc directory.
Analysis Notes
- Intent. A pinned tab took a deliberate action to create. Pinned and Favorite URLs are stronger evidence of regular use than a single history visit.
- Custom titles. A user-set
titlethat differs fromsavedTitleis the user's own label for the page and can reveal how they thought about it. - Folder paths. Folder names (e.g. "Clients / Acme / Contracts") add context to the URLs inside them.
- Multiple devices. Different
originatingDevicevalues show items created on another Mac and synced in through Arc Sync. - Unknown types. Arc adds new item types over time. Treat an unfamiliar
datakey as data to examine, not noise.
What macfor Collects
The browser.arc plugin emits one arc_sidebar_item record per tab, folder, split view, easel, or note in every sidebar container (main, Little Arc, and standalone windows), from the live file and every backup:
| Field | Meaning |
|---|---|
kind | tab, folder, split_view, easel, arc_document, or the raw key for unrecognised types |
section | pinned, today, favorites, or unknown |
space_id, space_title, profile | Resolved owning Space and profile directory |
folder_path | Titles of enclosing folders, outermost first |
title, saved_title, url | User title, page title, URL |
created_at, last_active_at | Converted to UTC |
is_unread, originating_device, live_folder_source, easel_id | As stored |
container, is_backup, source_file | Where the record came from |
References
- Spaces — file structure and profile mapping
- arc-export — open-source StorableSidebar.json parser
- arc-oss: Arc sidebar format notes