Extension Setup Guide
The Periscope browser extension captures browsing activity and streams it to the Periscope service, where AI agents can access it. This guide walks through installation, sign-in, configuration, and verification.
Browser Support
| Browser | Support Level | Notes |
|---|---|---|
| Google Chrome | Full support | Recommended. Manifest V3. |
| Microsoft Edge | Full support | Chromium-based, same extension as Chrome. |
| Mozilla Firefox | Beta support | WebExtension API. Some features may lag behind Chromium builds. |
| Safari | Not supported | WebExtension limitations prevent full functionality. |
| Arc, Brave, Vivaldi | Community tested | Should work as Chromium-based browsers, but not officially tested. |
Chromium-based browsers are preferred because the extension uses Manifest V3 APIs that have the best support on Chrome and Edge.
Installation
Chrome / Edge
- Open the Lovelace Extensions page at extensions.uselovelace.com/periscope
- Click Add to Chrome (or Add to Edge -- the Chrome Web Store works for both)
- Confirm the permissions dialog
- The Periscope icon appears in your browser toolbar
If the icon does not appear, click the puzzle piece icon in the toolbar and pin Periscope.
Firefox
- Open the Lovelace Extensions page at extensions.uselovelace.com/periscope
- Click Add to Firefox
- Confirm the permissions dialog in the Firefox add-ons prompt
- The Periscope icon appears in your toolbar
Manual Installation (Development)
For local development or testing unreleased builds:
# Clone the extension source
git clone https://github.com/ReasonableTech/periscope-extension.git
cd periscope-extension
pnpm install && pnpm build
Then load the unpacked extension:
- Chrome: Navigate to
chrome://extensions, enable Developer Mode, click "Load unpacked", select thedist/folder - Firefox: Navigate to
about:debugging#/runtime/this-firefox, click "Load Temporary Add-on", selectdist/manifest.json
Sign-In Flow
The extension uses the Lovelace OAuth device flow for authentication. This avoids handling passwords in the extension and works across all supported browsers.
- Click the Periscope icon in your toolbar
- Click Sign In with Lovelace
- A new tab opens to
accounts.uselovelace.com/devicewith a pre-filled device code - Sign in to your Lovelace account (or create one if needed)
- Approve the device authorization request
- The extension tab updates to show "Connected" status
- Close the authorization tab -- the extension is now authenticated
The extension stores a refresh token locally and renews the access token automatically. You should only need to sign in once per browser unless you explicitly sign out.
URL Pattern Rules
By default, the extension captures context from all HTTP and HTTPS pages. You can restrict this with URL pattern rules to control which sites are included or excluded.
Configuring Patterns
Open the extension popup and click Settings > URL Rules:
- Allow List mode: Only capture from URLs matching these patterns
- Block List mode: Capture from all URLs except those matching these patterns
Pattern syntax follows the Chrome match patterns format:
# Capture only from specific domains
https://github.com/*
https://docs.google.com/*
https://*.stackoverflow.com/*
# Block specific paths
https://mail.google.com/*
https://*.bank.com/*
Examples
| Goal | Mode | Pattern |
|---|---|---|
| Only capture from work domains | Allow List | https://*.mycompany.com/* |
| Capture everything except banking | Block List | https://*.bank.com/* |
| Only capture GitHub and docs sites | Allow List | https://github.com/*, https://docs.*/* |
Per-Domain Privacy Defaults
Each domain can have a default privacy level that controls how much context is shared with agents:
| Privacy Level | What is shared | Use case |
|---|---|---|
public | Full page content, URL, title, selections | Work documentation, public sites |
filtered | URL and title only, no page content | Sites where you want agents to know what you're reading but not the content |
private | URL only, no title or content | Sites you visit but don't want agents reading |
restricted | Nothing is shared | Banking, medical, personal sites |
Setting Domain Defaults
- Click the Periscope icon while on any page
- Click the privacy level dropdown next to the domain name
- Select the desired default level
- The setting applies to all pages on that domain going forward
You can also configure domain defaults in bulk via Settings > Privacy > Domain Rules:
github.com → public
stackoverflow.com → public
mail.google.com → restricted
mybank.com → restricted
reddit.com → filtered
Extension Permissions Explained
The extension requests these permissions during installation:
| Permission | Why it is needed |
|---|---|
activeTab | Read the content of the currently active tab when the extension icon is clicked |
tabs | Monitor tab creation, activation, and closure for context tracking |
storage | Store your authentication token, URL rules, and privacy preferences locally |
webNavigation | Detect page navigations to trigger context capture at the right time |
Host permission (<all_urls>) | Access page content on any site. Restricted by your URL pattern rules. In Allow List mode, only matched URLs are accessed. |
The extension does not request:
history-- It does not read your browser historybookmarks-- It does not access your bookmarksdownloads-- It does not interact with downloadscookies-- It does not read or write cookies
Verifying Sync Works
After installation and sign-in, verify that context is flowing correctly.
Check the Extension Popup
Click the Periscope icon. You should see:
- Connection status: "Connected" with a green indicator
- Current page: The title and URL of the active tab
- Last synced: A timestamp within the last few seconds
Verify via the REST API
Make a curl call to the Periscope API to confirm your browser context is reaching the service:
curl -s -H "Authorization: Bearer $LOVELACE_API_TOKEN" \
https://periscope.uselovelace.com/api/v1/context/current | jq .
You should see a JSON response with your current tab's URL, title, and content (depending on privacy level):
{
"id": "ctx_abc123",
"url": "https://developer.mozilla.org/en-US/docs/Web/API/WebSocket",
"title": "WebSocket - Web APIs | MDN",
"content": "The WebSocket interface provides...",
"privacyLevel": "public",
"timestamp": "2026-03-02T10:15:30.000Z",
"device": {
"name": "Chrome on MacBook",
"os": "macOS",
"formFactor": "desktop"
}
}
Verify WebSocket Streaming
For real-time verification, use a quick WebSocket test:
# Using websocat (install with: brew install websocat)
echo '{"type":"auth","token":"YOUR_TOKEN"}' | \
websocat wss://periscope.uselovelace.com/ws
# Then send a subscribe message
echo '{"type":"subscribe","channel":"current-context"}'
Navigate to a new page in your browser. You should see a context event appear in the WebSocket output.
Troubleshooting
Extension Shows "Disconnected"
- Check your internet connection
- Click the extension icon and click Reconnect
- If the issue persists, sign out and sign back in
- Check that
periscope.uselovelace.comis not blocked by your network
No Context Appearing in API
- Verify the extension shows "Connected" status
- Check that the current page's domain is not set to
restrictedprivacy - Check that the current page matches your URL pattern rules
- Open the extension's Settings > Debug and check the event log for errors
Extension Not Capturing Content
- Some pages block content extraction (e.g., pages with restrictive CSP headers)
- PDF viewers and browser internal pages (
chrome://,about:) cannot be captured - Pages loaded before the extension was installed need a refresh
High Memory Usage
The extension buffers content before sending it to the service. If you notice high memory usage:
- Open Settings > Performance
- Reduce the Content Buffer Size (default is 100KB per page)
- Enable Lazy Content Capture to only capture content when the extension icon is clicked
Firefox-Specific Issues
- The extension may need to be re-enabled after Firefox updates
- Temporary add-on installations (for development) do not persist across browser restarts
- Content script injection timing may differ from Chromium -- report issues if context is missing on fast navigations