Extract browser history and bookmarks from Chrome, Chromium, Brave, Vivaldi, Firefox, Safari, and Edge browsers and output them in JSON format suitable for analysis by LLMs and other tools.
Privacy: This tool runs entirely on your machine and never transmits data. Your browser history and bookmarks stay local unless you explicitly pipe them to an external service (like an LLM API).
- Multi-browser support: Chrome, Chromium, Edge, Brave, Vivaldi, Firefox, and Safari
- Cross-platform: Works on Linux, macOS, and Windows
- History, Bookmarks & Open Tabs: Extract browsing history, bookmarks, and currently open tabs
- Reading Lists: Extract saved articles from Medium and Substack (with hybrid file export + web scraping)
- YouTube Watch Later: Extract your YouTube Watch Later playlist (requires OAuth2)
- Twitter/X Bookmarks: Extract your Twitter/X bookmarks using Composio (preferred) or bird CLI fallback
- Automatic detection: Auto-detects installed browsers or specify manually
- Date filtering: Extract history and bookmarks for specific dates or date ranges
- Timezone support: Parse dates in your local timezone or specify any timezone
- Time filtering: Extract history for specific hours or time ranges
- Folder structure: Preserves bookmark folder hierarchy
- Tags support: Extracts Firefox bookmark tags
- LLM-friendly output: JSON format optimized for consumption by language models
- Minimal dependencies: Pure Go implementation with no CGO required for better cross-platform compilation
- Privacy-first: Runs entirely on your machine, no data transmission (unless you explicitly pipe to external services)
Download the latest binary from GitHub Releases:
| Platform | Binary |
|---|---|
| Linux | web-recap-linux-amd64 |
| macOS (Intel) | web-recap-darwin-amd64 |
| macOS (Apple Silicon) | web-recap-darwin-arm64 |
| Windows | web-recap-windows-amd64.exe |
# Linux
curl -L https://github.com/manikanda-kumar/web-recap/releases/latest/download/web-recap-linux-amd64 -o ~/.local/bin/web-recap
chmod +x ~/.local/bin/web-recap
# macOS (Apple Silicon)
curl -L https://github.com/manikanda-kumar/web-recap/releases/latest/download/web-recap-darwin-arm64 -o ~/.local/bin/web-recap
chmod +x ~/.local/bin/web-recap
# macOS (Intel)
curl -L https://github.com/manikanda-kumar/web-recap/releases/latest/download/web-recap-darwin-amd64 -o ~/.local/bin/web-recap
chmod +x ~/.local/bin/web-recapNote: Ensure
~/.local/binis in your PATH. Addexport PATH="$HOME/.local/bin:$PATH"to your shell config if needed.
Requires Go 1.21+
git clone https://github.com/manikanda-kumar/web-recap.git
cd web-recap
go build ./cmd/web-recap
./web-recap --help# Show help
web-recap --help
# List detected browsers
web-recap list
# Show version
web-recap version# Extract bookmarks from default browser
web-recap bookmarks
# Extract from specific browser
web-recap bookmarks --browser chrome
web-recap bookmarks --browser firefox
web-recap bookmarks --browser safari
# macOS Safari: if Terminal cannot read Safari's protected files,
# use the FDA-enabled app helper instead
web-recap-safari bookmarks --browser safari
web-recap-safari bookmarks --browser safari -o safari-bookmarks.json
# Extract from all browsers
web-recap bookmarks --all-browsers
# Save to file
web-recap bookmarks -o bookmarks.json
# Custom bookmark path
web-recap bookmarks --browser chrome --db-path /path/to/Bookmarks
# Filter by date - bookmarks added on specific date
web-recap bookmarks --date 2025-12-15
# Filter by date range - bookmarks added between dates
web-recap bookmarks --start-date 2025-12-01 --end-date 2025-12-15
# Combine with timezone support
web-recap bookmarks --date 2025-12-15 --tz America/New_York
# Get bookmarks from last week
web-recap bookmarks --start-date 2025-12-09 --end-date 2025-12-16Extract currently open tabs from Chromium-based browsers (Chrome, Chromium, Edge, Brave, Vivaldi).
# Extract open tabs from all Chromium browsers
web-recap tabs
# Extract from specific browser
web-recap tabs --browser chrome
web-recap tabs --browser vivaldi
# Extract from all detected Chromium browsers
web-recap tabs --all-browsers
# Save to file
web-recap tabs -o tabs.json
# Custom session path
web-recap tabs --db-path /path/to/SessionsNote: Open tabs extraction only works with Chromium-based browsers. Firefox and Safari are not yet supported. There may be a slight delay between actual browser state and what is reported, as browsers don't immediately flush session data to disk.
Extract saved articles from Medium reading lists and Substack saved posts.
Supports three methods:
- Public URL export (for public Medium reading lists, no auth needed)
- File export (recommended for private lists, more reliable)
- Web scraping (requires authentication, may break with platform changes)
For public Medium reading lists (like https://medium.com/@username/list/reading-list):
# Export using the browser script, then import
# 1. Open the public reading list URL in your browser
# 2. Open DevTools (F12) → Console
# 3. Paste contents of scripts/export-medium-public.js
# 4. A JSON file will be downloaded
# Import the exported JSON file
web-recap reading-list --platform medium --file medium-reading-list-2025-12-28.json
# With date filtering
web-recap reading-list --platform medium --file medium-reading-list.json --start-date 2025-01-01Export your reading list to a file first, then parse it:
# Medium - Export to CSV or JSON first (see "Getting Export Files" below)
web-recap reading-list --platform medium --file medium-reading-list.csv
web-recap reading-list --platform medium --file medium-reading-list.json
# Substack - Export to JSON first
web-recap reading-list --platform substack --file substack-saves.json
# With date filtering
web-recap reading-list --platform medium --file medium.json --start-date 2025-01-01Use cookies/session tokens from your browser:
# Medium - Using cookie
export MEDIUM_COOKIE="sid=YOUR_COOKIE_VALUE"
web-recap reading-list --platform medium
# Or pass directly
web-recap reading-list --platform medium --cookie "sid=YOUR_VALUE"
# Substack - Using session token
export SUBSTACK_SESSION_TOKEN="YOUR_TOKEN"
web-recap reading-list --platform substack
# Or using cookie
export SUBSTACK_COOKIE="substack.sid=VALUE; substack.lli=VALUE"
web-recap reading-list --platform substack# Query all configured platforms
web-recap reading-list --all-platforms
# With date range
web-recap reading-list --all-platforms --start-date 2025-01-01 --end-date 2025-12-31
# Save to file
web-recap reading-list --platform medium -o reading-list.jsonFor Medium:
- Open Medium and log in to your account
- Go to your reading list: https://medium.com/me/list/reading-list
- Open DevTools (F12 or Cmd+Option+I)
- Go to Application → Cookies → https://medium.com
- Copy the
sidcookie value:export MEDIUM_COOKIE="sid=YOUR_SID_VALUE"
For Substack:
- Open Substack and log in
- Go to your inbox: https://substack.com/inbox
- Open DevTools (F12) → Network tab
- Refresh the page (F5)
- Click any API request → Headers tab
- Copy cookies from Request Headers:
export SUBSTACK_COOKIE="substack.sid=VALUE; substack.lli=VALUE"
Alternative: Copy full cookie string
- In Network tab, right-click any request → Copy as cURL
- Extract the Cookie header from the cURL command
Security Note: Never commit cookies to git. Cookies expire after weeks/months. Store them in environment variables or use the
--cookieflag.
Medium Public Reading List Export:
For any public Medium reading list:
- Open the public reading list URL (e.g.,
https://medium.com/@username/list/reading-list) - Open DevTools (F12) → Console
- Paste contents of
scripts/export-medium-public.js - Press Enter - a JSON file will download
Medium Private Reading List Export:
For your own reading list:
- Open https://medium.com/me/list/reading-list (must be logged in)
- Open DevTools (F12) → Console
- Paste contents of
scripts/export-medium.js - Press Enter - a CSV file will download
Substack Export:
- Open https://substack.com/inbox → "Saved" tab
- Open DevTools (F12) → Console
- Paste contents of
scripts/export-substack.js - Press Enter - a JSON file will download
See scripts/README.md for detailed instructions.
Quick Start: See docs/QUICK_START_READING_LISTS.md for a 5-minute setup guide.
Full Documentation: See docs/READING_LIST.md for complete instructions.
Extract your private YouTube Watch Later playlist. This requires OAuth2 authentication.
- Go to Google Cloud Console
- Create a new project (or use existing)
- Enable the YouTube Data API v3
- Go to Credentials → Create Credentials → OAuth client ID
- Select Desktop app, name it, and click Create
- Download the JSON file (recommended path:
data/youtube/client.json)
# First run - will open browser for OAuth authorization
web-recap youtube-watch-later --client-secret data/youtube/client.json
# Subsequent runs use cached token and fetch only new items
web-recap youtube-watch-later --client-secret data/youtube/client.json
# Save to specific output file
web-recap youtube-watch-later --client-secret data/youtube/client.json -o data/youtube/watch_later.json
# Specify custom data file location (for delta tracking)
web-recap youtube-watch-later --client-secret data/youtube/client.json --data data/youtube/my_watch_later.json
# Fetch any playlist by ID (not just Watch Later)
web-recap youtube-watch-later --client-secret data/youtube/client.json --playlist-id PLxxxxxxxx- On first run, opens browser for Google OAuth consent
- Saves OAuth token locally (default:
<client-secret>.token.json) - Maintains a local data file for delta sync (only fetches new items)
- Outputs video URLs, titles, channels, and timestamps
Extract your Twitter/X bookmarks using Composio (preferred) or bird CLI fallback.
Option A: Composio (recommended)
- Create a Composio account and connect Twitter/X
- Get your API key and Tool Router MCP URL from Composio
- Set environment variables:
export COMPOSIO_API_KEY="..."
export COMPOSIO_MCP_URL="https://..."
export COMPOSIO_USER_ID="your-user-id"Option B: bird fallback
- Install bird CLI from https://github.com/steipete/bird
- Bird uses cookie-based authentication from your browser (Safari, Chrome, or Firefox)
- Make sure you're logged into Twitter/X in your browser
# Fetch bookmarks (saves to data/twitter/bookmarks.json by default)
web-recap twitter-bookmarks
# Force Composio provider
web-recap twitter-bookmarks --provider composio
# Force bird provider
web-recap twitter-bookmarks --provider bird
# Save to specific output file
web-recap twitter-bookmarks -o bookmarks.json
# Specify custom data file location (for delta tracking)
web-recap twitter-bookmarks --data data/twitter/my_bookmarks.json- Uses Composio MCP
TWITTER_BOOKMARKS_BY_USERwhen configured - Falls back to bird CLI in
--provider automode if Composio is unavailable - Maintains a local data file for delta sync (only fetches new items)
- Outputs tweet URLs, text, authors, and timestamps
# Extract today's history from default browser
web-recap
# Extract from specific browser
web-recap --browser chrome
web-recap --browser firefox
web-recap --browser safari
# macOS Safari: if Terminal cannot read Safari's protected files,
# use the FDA-enabled app helper instead
web-recap-safari --browser safari --date 2025-12-15
web-recap-safari --browser safari --date 2025-12-15 -o safari-history.json
# Extract from specific date
web-recap --date 2025-12-15
# Extract date range
web-recap --start-date 2025-12-01 --end-date 2025-12-15
# Extract from all browsers
web-recap --all-browsers
# Save to file
web-recap -o history.json
# Custom database path
web-recap --db-path /path/to/History
# Timezone support (dates interpreted in your timezone)
web-recap --date 2025-12-15 --tz America/New_York
# Explicit UTC mode
web-recap --date 2025-12-15 --utc
# Time filtering - extract history for specific hours
web-recap --date 2025-12-15 --start-time 12:00 --end-time 13:00
# Shorthand for single hour
web-recap --date 2025-12-15 --time 12 # Extracts 12:00-12:59# Get Chrome history from last 7 days
web-recap --browser chrome --start-date 2025-12-09 --end-date 2025-12-16
# Export all browser history to file
web-recap --all-browsers --output all-history.json
# Check what browsers are available
web-recap list
# Extract yesterday's activity between 12pm and 1pm (in your local timezone)
web-recap --date "$(date -d yesterday +%Y-%m-%d)" --start-time 12:00 --end-time 13:00
# Extract from a specific timezone
web-recap --date 2025-12-15 --tz Europe/London --time 14
# Explicitly use UTC (useful in scripts or CI)
web-recap --start-date 2025-12-09 --end-date 2025-12-15 --utc --all-browsers
# Get bookmarks about Claude added in the last week
web-recap bookmarks --start-date 2025-12-09 --end-date 2025-12-16 | grep -i claude
# Extract all bookmarks from Firefox added in December 2025
web-recap bookmarks --browser firefox --start-date 2025-12-01 --end-date 2025-12-31
# Safari bookmarks do not currently support date filtering
web-recap bookmarks --browser safariThe tool outputs history in the following JSON format:
{
"browser": "chrome",
"start_date": "2025-12-15T00:00:00Z",
"end_date": "2025-12-15T23:59:59Z",
"timezone": "America/New_York",
"total_entries": 343,
"entries": [
{
"timestamp": "2025-12-15T09:15:23Z",
"url": "https://example.com/page",
"title": "Example Page Title",
"visit_count": 3,
"domain": "example.com",
"browser": "chrome"
},
...
]
}The tool outputs bookmarks in the following JSON format:
{
"browser": "chrome",
"start_date": "2025-12-01T00:00:00Z",
"end_date": "2025-12-31T23:59:59Z",
"timezone": "America/New_York",
"total_entries": 150,
"entries": [
{
"date_added": "2025-12-15T10:30:00Z",
"date_modified": "2025-12-16T14:20:00Z",
"url": "https://example.com/article",
"title": "Interesting Article",
"folder": "Bookmarks Bar/Tech",
"domain": "example.com",
"browser": "chrome",
"tags": ["golang", "tutorial"]
},
...
]
}Note: start_date, end_date, and timezone fields are only included when date filtering is used.
The tool outputs open tabs in the following JSON format:
{
"browser": "Google Chrome",
"total_tabs": 15,
"total_windows": 2,
"entries": [
{
"url": "https://example.com/page",
"title": "Example Page Title",
"domain": "example.com",
"active": true,
"group": "Research",
"window_id": 1,
"browser": "Google Chrome"
},
...
]
}The tool outputs reading lists in the following JSON format:
{
"platform": "medium",
"start_date": "2025-01-01T00:00:00Z",
"end_date": "2025-12-31T23:59:59Z",
"timezone": "America/New_York",
"total_entries": 42,
"entries": [
{
"saved_at": "2025-12-15T14:30:00Z",
"url": "https://medium.com/@author/article-title",
"title": "Interesting Article Title",
"author": "Author Name",
"publication": "Publication Name",
"excerpt": "Article excerpt or description...",
"domain": "medium.com",
"platform": "medium",
"read_status": "unread"
},
...
]
}Note: start_date, end_date, and timezone fields are only included when date filtering is used.
The tool outputs Twitter bookmarks in the following JSON format:
{
"fetched_at": "2025-12-28T10:30:00Z",
"total_items": 25,
"delta_added": 5,
"items": [
{
"tweet_id": "1234567890123456789",
"url": "https://x.com/username/status/1234567890123456789",
"text": "This is the tweet content...",
"author_name": "Display Name",
"author_handle": "username",
"created_at": "2025-12-15T14:30:00Z",
"saved_at": "2025-12-15T14:30:00Z",
"expanded_urls": {
"https://t.co/abc123": "https://github.com/user/repo",
"https://t.co/xyz789": "https://example.com/article"
}
},
...
],
"source": "twitter",
"description": "Twitter/X bookmarks snapshot"
}- browser: Browser name (chrome, firefox, safari, edge)
- start_date: Report period start (ISO 8601 UTC format)
- end_date: Report period end (ISO 8601 UTC format)
- timezone: Timezone used for date interpretation (e.g., "America/New_York", "UTC")
- total_entries: Number of history entries in the report
- entries: Array of history entries, each containing:
- timestamp: Visit time in ISO 8601 UTC format
- url: Full URL visited
- title: Page title
- visit_count: Total visits to this URL
- domain: Extracted domain name
- browser: Browser source
- browser: Browser name (chrome, firefox, safari, edge, brave)
- start_date: Filter period start (ISO 8601 UTC format, only when date filtering is used)
- end_date: Filter period end (ISO 8601 UTC format, only when date filtering is used)
- timezone: Timezone used for date interpretation (only when date filtering is used)
- total_entries: Number of bookmark entries in the report
- entries: Array of bookmark entries, each containing:
- date_added: When bookmark was created (ISO 8601 UTC format, optional when source doesn't provide it)
- date_modified: When bookmark was last modified (ISO 8601 UTC format, optional)
- url: Full URL of the bookmark
- title: Bookmark title
- folder: Folder path (e.g., "Bookmarks Bar/Work/Projects")
- domain: Extracted domain name
- browser: Browser source
- tags: Array of tags (Firefox only)
- browser: Browser name (chrome, vivaldi, edge, brave)
- total_tabs: Number of open tabs
- total_windows: Number of browser windows
- entries: Array of tab entries, each containing:
- url: Current URL of the tab
- title: Page title
- domain: Extracted domain name
- active: Whether this is the active tab in the window
- group: Tab group name (if grouped, Chromium feature)
- window_id: Window identifier
- browser: Browser source
- platform: Platform name (medium, substack, or "all")
- start_date: Filter period start (ISO 8601 UTC format, only when date filtering is used)
- end_date: Filter period end (ISO 8601 UTC format, only when date filtering is used)
- timezone: Timezone used for date interpretation (only when date filtering is used)
- total_entries: Number of saved articles in the report
- entries: Array of reading list entries, each containing:
- saved_at: When article was saved (ISO 8601 UTC format)
- url: Full URL of the article
- title: Article title
- author: Article author (optional)
- publication: Publication name (optional)
- excerpt: Article excerpt or description (optional)
- domain: Extracted domain name
- platform: Source platform (medium, substack, etc.)
- read_status: Read status (unread, read, archived - optional)
- fetched_at: When the bookmarks were fetched (ISO 8601 UTC format)
- total_items: Total number of bookmarks in the report
- delta_added: Number of new bookmarks added since last fetch
- source: Always "twitter"
- description: Human-readable description
- items: Array of bookmark entries, each containing:
- tweet_id: Unique tweet identifier
- url: Full URL to the tweet
- text: Tweet content
- author_name: Author's display name
- author_handle: Author's Twitter handle (without @)
- created_at: When the tweet was created (ISO 8601 UTC format)
- saved_at: Approximate time when bookmarked (ISO 8601 UTC format)
- expanded_urls: Map of t.co shortened URLs to their expanded destinations (optional)
The JSON output is designed to be easily consumed by language models.
If you have Claude Code installed:
# Save output to files and start Claude Code with them
web-recap tabs -o tabs.json
web-recap bookmarks --start-date 2025-12-20 -o recent-bookmarks.json
web-recap --date 2025-12-27 -o today-history.json
# Start Claude Code in the current directory
claude-code
# In the chat, ask Claude to analyze the files:
# "Analyze my tabs.json and tell me what topics I'm researching"
# "Based on today-history.json, summarize my browsing activity for today"
# "Review recent-bookmarks.json and categorize them"# Save history to file
web-recap --browser chrome --date 2025-12-15 -o history.json
# Save bookmarks to file
web-recap bookmarks --all-browsers -o bookmarks.json
# Save open tabs to file
web-recap tabs -o tabs.json
# Use with Claude.ai: Upload the JSON files when starting a conversation
# Use with Anthropic API: Include the content in your messages
# Or pipe to other tools for processing
web-recap tabs | jq '.entries[] | select(.active==true) | .url'
# Combine multiple sources for comprehensive analysis
web-recap --date 2025-12-27 -o today-history.json
web-recap bookmarks --date 2025-12-27 -o today-bookmarks.json
web-recap tabs -o current-tabs.json
# Then reference all three files in your LLM conversation- Platforms: Linux, macOS, Windows
- Database: SQLite (
Historyfile) - Timestamp format: Microseconds since 1601-01-01
- Platforms: Linux, macOS, Windows
- Database: SQLite (
places.sqlite) - Timestamp format: Microseconds since Unix epoch
On macOS, Safari data is protected by system privacy controls. If
web-recap --browser safariorweb-recap bookmarks --browser safarifails withoperation not permitted, installWebRecap.app, grant it Full Disk Access, and useweb-recap-safarifor Safari-specific commands.
- Platforms: macOS only
- Database: SQLite (
History.db) - Timestamp format: Seconds since 2001-01-01
If Safari commands fail with operation not permitted, macOS is blocking direct terminal access to Safari's protected files.
Use this flow:
# Build the wrapper app DMG
make dmg
# Install the Safari helper script
make install-safari-helperThen:
- Install
WebRecap.appfromdist/WebRecap.dmginto/Applications - Open System Settings → Privacy & Security → Full Disk Access
- Add
/Applications/WebRecap.appand enable it - If needed, clear quarantine:
xattr -dr com.apple.quarantine /Applications/WebRecap.app
Run Safari commands through the helper:
web-recap-safari bookmarks --browser safari
web-recap-safari bookmarks --browser safari -o safari-bookmarks.json
web-recap-safari --browser safari --date "$(date +%F)"
web-recap-safari --browser safari --date "$(date +%F)" -o safari-history.jsonNotes:
web-recapremains the normal CLI for Chrome, Firefox, Edge, Brave, Vivaldi, and non-protected workflowsweb-recap-safariis only needed when macOS privacy prevents direct Safari access from the terminalopen -a /Applications/WebRecap.app --args ...is the underlying mechanism used by the helper
History:
- Chrome:
~/.config/google-chrome/Default/History - Chromium:
~/.config/chromium/Default/History - Edge:
~/.config/microsoft-edge/Default/History - Brave:
~/.config/BraveSoftware/Brave-Browser/Default/History - Vivaldi:
~/.config/vivaldi/Default/History - Firefox:
~/.mozilla/firefox/*/places.sqlite
Bookmarks:
- Chrome:
~/.config/google-chrome/Default/Bookmarks - Chromium:
~/.config/chromium/Default/Bookmarks - Edge:
~/.config/microsoft-edge/Default/Bookmarks - Brave:
~/.config/BraveSoftware/Brave-Browser/Default/Bookmarks - Vivaldi:
~/.config/vivaldi/Default/Bookmarks - Firefox:
~/.mozilla/firefox/*/places.sqlite(same as history)
Sessions (Open Tabs):
- Chrome:
~/.config/google-chrome/Default/Sessions/ - Chromium:
~/.config/chromium/Default/Sessions/ - Edge:
~/.config/microsoft-edge/Default/Sessions/ - Brave:
~/.config/BraveSoftware/Brave-Browser/Default/Sessions/ - Vivaldi:
~/.config/vivaldi/Default/Sessions/
History:
- Chrome:
~/Library/Application Support/Google/Chrome/Default/History - Chromium:
~/Library/Application Support/Chromium/Default/History - Edge:
~/Library/Application Support/Microsoft Edge/Default/History - Brave:
~/Library/Application Support/BraveSoftware/Brave-Browser/Default/History - Vivaldi:
~/Library/Application Support/Vivaldi/Default/History - Firefox:
~/Library/Application Support/Firefox/*/places.sqlite - Safari:
~/Library/Safari/History.db
Bookmarks:
- Chrome:
~/Library/Application Support/Google/Chrome/Default/Bookmarks - Chromium:
~/Library/Application Support/Chromium/Default/Bookmarks - Edge:
~/Library/Application Support/Microsoft Edge/Default/Bookmarks - Brave:
~/Library/Application Support/BraveSoftware/Brave-Browser/Default/Bookmarks - Vivaldi:
~/Library/Application Support/Vivaldi/Default/Bookmarks - Firefox:
~/Library/Application Support/Firefox/*/places.sqlite(same as history) - Safari:
~/Library/Safari/Bookmarks.plist
Sessions (Open Tabs):
- Chrome:
~/Library/Application Support/Google/Chrome/Default/Sessions/ - Chromium:
~/Library/Application Support/Chromium/Default/Sessions/ - Edge:
~/Library/Application Support/Microsoft Edge/Default/Sessions/ - Brave:
~/Library/Application Support/BraveSoftware/Brave-Browser/Default/Sessions/ - Vivaldi:
~/Library/Application Support/Vivaldi/Default/Sessions/
History:
- Chrome:
%LOCALAPPDATA%\Google\Chrome\User Data\Default\History - Chromium:
%LOCALAPPDATA%\Chromium\User Data\Default\History - Edge:
%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\History - Brave:
%LOCALAPPDATA%\BraveSoftware\Brave-Browser\User Data\Default\History - Vivaldi:
%LOCALAPPDATA%\Vivaldi\User Data\Default\History - Firefox:
%LOCALAPPDATA%\Mozilla\Firefox\*/places.sqlite
Bookmarks:
- Chrome:
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Bookmarks - Chromium:
%LOCALAPPDATA%\Chromium\User Data\Default\Bookmarks - Edge:
%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Bookmarks - Brave:
%LOCALAPPDATA%\BraveSoftware\Brave-Browser\User Data\Default\Bookmarks - Vivaldi:
%LOCALAPPDATA%\Vivaldi\User Data\Default\Bookmarks - Firefox:
%LOCALAPPDATA%\Mozilla\Firefox\*/places.sqlite(same as history)
Sessions (Open Tabs):
- Chrome:
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Sessions\ - Chromium:
%LOCALAPPDATA%\Chromium\User Data\Default\Sessions\ - Edge:
%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Sessions\ - Brave:
%LOCALAPPDATA%\BraveSoftware\Brave-Browser\User Data\Default\Sessions\ - Vivaldi:
%LOCALAPPDATA%\Vivaldi\User Data\Default\Sessions\
The tool automatically handles browser database locking by copying the database to a temporary file before reading it. This allows you to extract history and bookmarks while your browser is running.
Different browsers use different formats for storing bookmarks:
- Chrome/Chromium/Edge/Brave/Vivaldi: JSON file format with hierarchical folder structure
- Firefox: SQLite database (places.sqlite) with bookmarks in
moz_bookmarkstable, supports tags - Safari: Property list (plist) format
Chromium-based browsers store session data in SNSS (Session Storage) binary format:
- Session files are located in the
Sessions/directory - Files named
Session_*orTabs_*contain the current session state - The parser reads the most recently modified session file
- Tab groups and active tab state are preserved
Each browser uses a different timestamp format which is automatically converted to ISO 8601 UTC format for consistency.
By default, web-recap interprets dates in your system's local timezone. You can:
- Explicitly specify a timezone with
--tz America/New_York - Force UTC interpretation with
--utc(useful for scripts and CI/CD) - Extract by time of day with
--start-timeand--end-time(in 24-hour format) - Use the
--timeshorthand for single-hour extraction (e.g.,--time 12extracts 12:00-12:59)
All dates are converted to UTC for database queries, and timestamps in the JSON output are always in UTC format.
When using --date, it extracts history for the entire 24-hour period in the specified timezone. When using --start-date and --end-date, both dates are inclusive and cover the full 24-hour period. Use --start-time and --end-time to narrow results to specific hours of the day.
go build ./cmd/web-recapgo test ./...make build-allReleases are created manually by pushing a version tag. The GitHub Actions workflow will automatically build binaries for all platforms and create a GitHub release.
# Create and push a version tag
git tag v0.1.0
git push origin v0.1.0This triggers the release workflow which:
- Builds binaries for Linux (amd64), macOS (amd64, arm64), and Windows (amd64)
- Creates a GitHub release with the tag name
- Uploads all binaries as release assets
Ensure your browser is installed at the default location. You can specify a custom database path:
web-recap --db-path /path/to/HistoryMake sure you have read access to the browser database.
On macOS, Safari's History.db and Bookmarks.plist are privacy-protected. If direct CLI access returns operation not permitted, use the app wrapper instead:
# 1. Build/package the wrapper app
make dmg
# 2. Install WebRecap.app to /Applications and grant it Full Disk Access
# System Settings -> Privacy & Security -> Full Disk Access
# 3. Install the helper
make install-safari-helper
# 4. Run Safari history/bookmarks through the helper
web-recap-safari bookmarks --browser safari
web-recap-safari --browser safari --date "$(date +%F)"If Gatekeeper quarantine blocks the app, remove the quarantine attribute:
xattr -dr com.apple.quarantine /Applications/WebRecap.appThe tool should handle locked databases automatically, but if you get errors, close your browser or try again later.
Contributions are welcome! Please feel free to submit a Pull Request.
MIT License - see LICENSE file for details
See SKILL.md for integration instructions with Claude and other LLMs. LMs. tions with Claude and other LLMs. r LLMs. LMs. tions with Claude and other LLMs.