Atlas Control (macOS)
Automate tab management, bookmark queries, and history search for the ChatGPT Atlas desktop app using a bundled Python CLI that drives AppleScript on macOS.
Overview
This skill wraps the ChatGPT Atlas desktop application with a Python CLI (atlas_cli.py) that communicates via osascript (AppleScript) for window/tab control and reads Chromium-style local storage for bookmarks and history.
What it automates:
- Tab listing, opening, closing, focusing, and reloading across Atlas windows
- Bookmark retrieval with folder hierarchy and text search
- Browsing history queries with date filtering and keyword search
- Atlas app detection and AppleScript capability probing
Prerequisites:
- macOS with
osascripton PATH - ChatGPT Atlas installed in
/Applicationsor~/Applications - Automation permission granted in System Settings > Privacy & Security > Automation
- Python 3.12+ (invoked via
uv run --python 3.12)
Triggers
When to Use
Invoke this skill when:
- The user asks to list, open, close, focus, or reload Atlas tabs
- The user wants to search or list Atlas bookmarks
- The user wants to query Atlas browsing history
- The user asks about Atlas app status or installed version
When Not to Use
Do not invoke when:
- The user refers to a standard web browser (Chrome, Safari, Firefox)
- The environment is not macOS (AppleScript is unavailable)
- The user asks about ChatGPT the web app (not the Atlas desktop client)
Process
Step 1: Set Up the CLI Path
Resolve the path to atlas_cli.py relative to the skill installation directory:
SKILL_DIR="${SKILL_DIR:-$HOME/.claude/skills/atlas}"
ATLAS_CLI="$SKILL_DIR/scripts/atlas_cli.py"
All CLI commands use uv run --python 3.12 python "$ATLAS_CLI" as the invocation prefix.
Step 2: Verify Atlas Is Installed
uv run --python 3.12 python "$ATLAS_CLI" app-name
This prints ChatGPT Atlas if the app bundle exists in /Applications or ~/Applications. If it fails, the user must install Atlas first.
Step 3: Execute the Requested Operation
Tab operations:
# List all open tabs (table format)
uv run --python 3.12 python "$ATLAS_CLI" tabs
# List tabs as JSON (for programmatic processing)
uv run --python 3.12 python "$ATLAS_CLI" tabs --json
# Open a new tab
uv run --python 3.12 python "$ATLAS_CLI" open-tab "https://chatgpt.com/"
# Focus a specific tab (window_id and tab_index from tabs output)
uv run --python 3.12 python "$ATLAS_CLI" focus-tab <window_id> <tab_index>
# Close a tab
uv run --python 3.12 python "$ATLAS_CLI" close-tab <window_id> <tab_index>
# Reload a tab
uv run --python 3.12 python "$ATLAS_CLI" reload-tab <window_id> <tab_index>
Bookmark operations:
# List bookmarks (default limit: 200)
uv run --python 3.12 python "$ATLAS_CLI" bookmarks --limit 100
# Search bookmarks by text
uv run --python 3.12 python "$ATLAS_CLI" bookmarks --search "docs"
# Output as JSON
uv run --python 3.12 python "$ATLAS_CLI" bookmarks --search "openai" --json
History operations:
# Search history by keywords
uv run --python 3.12 python "$ATLAS_CLI" history --search "openai docs" --limit 50
# History for today only (local time)
uv run --python 3.12 python "$ATLAS_CLI" history --today --limit 200 --json
# Full history dump
uv run --python 3.12 python "$ATLAS_CLI" history --limit 500
Verification
Success Indicators
app-namereturnsChatGPT Atlaswithout errortabsproduces a table with columns:A,window_id,tab,title,urlbookmarksreturns rows with:folder,name,url,date_addedhistoryreturns rows with:last_visited_at,title,url- Tab manipulation commands (
open-tab,focus-tab,close-tab,reload-tab) print a confirmation message
Failure Handling
| Error | Cause | Resolution |
|---|---|---|
osascript is not available on PATH |
Not running macOS | This skill requires macOS; cannot run on Linux/Windows |
Could not find ChatGPT Atlas |
App not installed | Install ChatGPT Atlas from OpenAI |
AppleScript error -1743 |
Missing Automation permission | Grant permission: System Settings > Privacy & Security > Automation |
does not appear to expose window/tab scripting |
Atlas version lacks AppleScript support | Update Atlas or check version compatibility |
SQLite database not found |
No browsing history yet | Open Atlas and browse pages first to populate history |
Local State file not found |
Atlas profile data missing | Launch Atlas at least once to create profile data |
Data Paths
Atlas stores Chromium-style profile data under:
~/Library/Application Support/com.openai.atlas/browser-data/host/
Key locations:
- Local State:
browser-data/host/Local State(JSON, containsprofile.last_used) - History:
browser-data/host/<profile>/History(SQLite, tableurls) - Bookmarks:
browser-data/host/<profile>/Bookmarks(JSON, Chromium format)
The active profile is resolved from profile.last_used in Local State, falling back to Default.
If history appears stale, check the beta data root as well:
~/Library/Application Support/com.openai.atlas.beta/browser-data/host/
The CLI copies the SQLite History database to a temporary location before querying to avoid lock contention with the running Atlas process.
Examples
Example 1: List Open Tabs and Find Duplicates
User: List all my Atlas tabs and call out duplicates.
Assistant: Let me list the open Atlas tabs.
[Runs: uv run --python 3.12 python "$ATLAS_CLI" tabs --json]
You have 12 tabs across 2 windows:
Window 1 (id: 4201):
1. ChatGPT — https://chatgpt.com/
2. OpenAI Docs — https://platform.openai.com/docs
3. ChatGPT — https://chatgpt.com/ [DUPLICATE of tab 1]
Window 2 (id: 4205):
1. GitHub — https://github.com/
...
Found 1 duplicate: "ChatGPT" appears in window 4201 tabs 1 and 3.
Example 2: Search History for Recent Visits
User: What OpenAI pages did I visit today?
Assistant: Searching today's Atlas history for "openai"...
[Runs: uv run --python 3.12 python "$ATLAS_CLI" history --today --search "openai" --limit 50]
Today's OpenAI visits (3 results):
2026-02-04 09:12 OpenAI Platform Docs https://platform.openai.com/docs
2026-02-04 10:45 API Reference https://platform.openai.com/docs/api-reference
2026-02-04 14:30 Pricing https://openai.com/pricing
Example 3: Close a Specific Tab
User: Close the pricing tab.
Assistant: I'll find and close that tab.
[Runs: uv run --python 3.12 python "$ATLAS_CLI" tabs --json]
Found "Pricing" at window_id=4205, tab_index=3.
[Runs: uv run --python 3.12 python "$ATLAS_CLI" close-tab 4205 3]
Closed window id 4205, tab 3.
Safety
Idempotency
Tab listing, bookmark queries, and history searches are read-only and fully idempotent. Tab manipulation operations (open, close, focus, reload) are not idempotent:
close-tabon an already-closed tab raises an AppleScript erroropen-tabcreates a new tab each time it runs
Reversibility
- Closed tabs cannot be reopened to the same position (use
open-tabwith the URL) - Bookmark and history queries are read-only and leave no side effects
- Tab focus changes are immediately reversible by focusing a different tab
Prerequisites Checklist
- Running on macOS
- ChatGPT Atlas installed in
/Applicationsor~/Applications - Terminal has Automation permission for Atlas in System Settings
- Python 3.12+ available via
uv
CLI Reference
| Command | Arguments | Description |
|---|---|---|
app-name |
(none) | Print detected Atlas app name |
tabs |
--json |
List open tabs across all windows |
open-tab |
<url> |
Open a new tab with the given URL |
focus-tab |
<window_id> <tab_index> |
Bring a tab to focus |
close-tab |
<window_id> <tab_index> |
Close a specific tab |
reload-tab |
<window_id> <tab_index> |
Reload a specific tab |
bookmarks |
--search <text> --limit <n> --json |
List or search bookmarks |
history |
--search <text> --today --limit <n> --json |
Search browsing history |
Notes
- The
window_idandtab_indexvalues come from thetabscommand output. Always list tabs first before operating on specific ones. - History timestamps use Chrome's epoch (microseconds since 1601-01-01). The CLI converts them to local time automatically.
- The
--jsonflag ontabs,bookmarks, andhistoryoutputs machine-readable JSON arrays for programmatic processing.