ATlast Importer - Browser Extension#
Browser extension for importing Twitter/X follows to find them on Bluesky.
Development#
Prerequisites:
- ATlast dev server must be running at
http://127.0.0.1:8888 - You must be logged in to ATlast before using the extension
Build Extension#
# From project root:
cd packages/extension
pnpm install
pnpm run build # Dev build (uses http://127.0.0.1:8888)
pnpm run build:prod # Production build (uses https://atlast.byarielm.fyi)
The built extension will be in dist/chrome/.
Load in Chrome for Testing#
- Open Chrome and navigate to
chrome://extensions - Enable Developer mode (toggle in top right)
- Click Load unpacked
- Select the
packages/extension/dist/chrome/directory - The extension should now appear in your extensions list
Testing the Extension#
Step 0: Start ATlast Dev Server#
# From project root:
npx netlify-cli dev --filter @atlast/web
# Server will start at http://127.0.0.1:8888
Then open http://127.0.0.1:8888 and log in with your Bluesky handle.
Step 1: Navigate to Twitter Following Page#
- Open Twitter/X in a new tab
- Go to
https://x.com/{your-username}/following- Replace
{your-username}with your actual Twitter username - Example:
https://x.com/jack/following
- Replace
Step 2: Open Extension Popup#
- Click the ATlast Importer icon in your browser toolbar
- You should see "Ready to scan Twitter/X" state
- If you see "Go to x.com/following to start", the page wasn't detected correctly
- Check the browser console for
[ATlast]log messages to debug
Step 3: Scan Following Page#
- Click Start Scan button
- The extension will:
- Scroll the page automatically
- Collect usernames as it scrolls
- Show progress (e.g., "Found 247 users...")
- Wait for "Scan complete!" message
Step 4: Upload to ATlast#
- Click Open in ATlast button
- Extension will:
- POST usernames to ATlast API
- Open ATlast in a new tab with
?importId=xxx
- ATlast web app will:
- Load the import data
- Start searching Bluesky automatically
- Show results page
Debugging#
Enable Console Logs#
Open Chrome DevTools (F12) and check the Console tab for [ATlast] messages:
Content Script logs (on x.com pages):
[ATlast] Content script loaded
[ATlast] Current URL: https://x.com/username/following
[ATlast] Host: x.com
[ATlast] Path: /username/following
[ATlast] ✅ Detected Twitter/X following page
[ATlast] ✅ Notified background: ready state
Background Worker logs (in extension service worker):
[Background] Received message: STATE_UPDATE
[Background] State updated: {status: 'ready', platform: 'twitter', pageType: 'following'}
Popup logs (when extension popup is open):
[Popup] Initializing...
[Popup] Updating UI: {status: 'ready', platform: 'twitter'}
[Popup] Ready
Common Issues#
Issue: Extension shows "Not logged in to ATlast"
Solution:
- Open
http://127.0.0.1:8888in a new tab - Log in with your Bluesky handle
- Return to extension and click "Check Again"
Issue: Extension shows "ATlast server not running"
Solution:
- Start dev server:
npx netlify-cli dev --filter @atlast/web - Wait for server to start at
http://127.0.0.1:8888 - Click "Check Again" in extension
Issue: Popup shows "Go to x.com/following" even when on following page
Possible causes:
- Content script didn't load (check for console errors)
- URL pattern didn't match (check console for pattern mismatch)
- Background worker didn't receive state update
Debug steps:
- Open DevTools Console on the Twitter page
- Look for
[ATlast] Content script loadedmessage - Check if pattern matched:
[ATlast] ✅ Detected Twitter/X following page - If no detection, check
[ATlast] Supported patternsoutput
Issue: Extension doesn't show in toolbar
- Go to
chrome://extensions - Verify ATlast Importer is enabled
- Click the puzzle piece icon (extensions menu)
- Pin ATlast Importer to toolbar
Issue: Scan doesn't find any users
- Make sure you're scrolled to the top of the following page
- Check that usernames are visible on the page (not loading state)
- Open Console and look for scraping logs during scan
Production Build#
For production deployment (Chrome Web Store):
cd packages/extension
pnpm run build:prod # Uses production API URL
cd dist/chrome
zip -r ../chrome.zip .
Upload dist/chrome.zip to Chrome Web Store.
Note: Production build connects to https://atlast.byarielm.fyi instead of local dev server.
Architecture#
- Content Script (
src/content/index.ts) - Runs on x.com, detects page, scrapes usernames - Background Worker (
src/background/service-worker.ts) - Manages state, coordinates messaging - Popup UI (
src/popup/) - User interface when clicking extension icon - Scrapers (
src/content/scrapers/) - Platform-specific scraping logic (Twitter, future: Threads, etc.) - Messaging (
src/lib/messaging.ts) - Communication between components - API Client (
src/lib/api-client.ts) - Uploads data to ATlast API
Future Enhancements#
- Firefox support (Manifest V2/V3 compatibility)
- Threads.net scraper
- Instagram scraper
- TikTok scraper
- Auto-navigate to following page button
- Username detection from DOM
- Safari extension (via iOS app wrapper)