ATlast — you'll never need to find your favorites on another platform again. Find your favs in the ATmosphere.
atproto
17
fork

Configure Feed

Select the types of activity you want to include in your feed.

Extension Implementation Status#

Current State: DEBUGGING 🔧#

What's Complete ✅#

  1. Environment Configuration

    • Dev/prod builds with correct API URLs
    • Build: npm run build (dev) or npm run build:prod
    • Dev: http://127.0.0.1:8888
    • Prod: https://atlast.byarielm.fyi
  2. Server Health Check

    • Extension checks if dev server is running (dev mode only)
    • Shows "Server offline" state with instructions
    • "Check Again" button to retry
  3. Authentication Flow

    • Extension checks /session endpoint on init
    • Shows "Not logged in" state if no session
    • "Open ATlast" button to log in
    • "Check Again" to retry after login
    • User must be logged in to ATlast BEFORE using extension
  4. Upload Flow (matches file upload)

    • Scan Twitter Following page
    • POST to /extension-import (requires auth)
    • Backend:
      • Gets DID from session
      • Creates user_upload entry
      • Saves to source_accounts table
      • Returns uploadId
    • Opens /results?uploadId={id}
    • Frontend searches and displays (same as file upload)
  5. CORS Permissions

    • Extension has host_permissions for:
      • http://127.0.0.1:8888/*
      • http://localhost:8888/*
      • https://atlast.byarielm.fyi/*
  6. Cleanup Complete

    • ❌ Removed extension_imports table
    • ❌ Removed get-extension-import function
    • ❌ Removed ExtensionImport.tsx page
    • ❌ Removed /import/:id route
    • ❌ Removed utils/import-store.ts

What Needs Testing 🧪#

  1. Full Flow Test

    # 1. Start dev server
    npx netlify-cli dev --filter @atlast/web
    
    # 2. Build extension
    cd packages/extension
    npm run build
    
    # 3. Load extension in Chrome
    chrome://extensions/ → Load unpacked → packages/extension/dist/chrome/
    
    # 4. Log in to ATlast
    Open http://127.0.0.1:8888 → Log in
    
    # 5. Go to Twitter
    https://twitter.com/justadev_atlast/following
    
    # 6. Open extension popup
    - Should show "Ready to scan Twitter/X"
    - Click "Start Scan"
    - Wait for completion
    - Click "Open in ATlast"
    - Should open /results?uploadId={id}
    - Results should load and search automatically
    
  2. Error Cases to Test

    • Not logged in → should show login prompt
    • Server offline → should show offline state
    • Empty results → should show appropriate message
    • Network errors → should handle gracefully

Current Issues 🐛#

Fixed:

  • ✅ NaN database error - Fixed missing matchedUsers parameter in extension-import.ts (node #287)
  • ✅ Database initialized successfully (node #288)
  • ✅ API response unwrapping - Fixed api-client to access ApiResponse.data field (nodes #290-295)
    • Backend wraps responses in { success: true, data: {...} }
    • Extension was expecting flat response, causing undefined errors
    • Fixed both uploadToATlast and checkSession functions

Active Testing:

  • Ready for end-to-end testing with fixed upload flow
  • Extension should now properly redirect to results page

Next Steps 📋#

  1. ✅ Build extension: cd packages/extension && npm run build
  2. ✅ Reload extension in Chrome
  3. ✅ Test login flow
  4. ✅ Test scan and upload
  5. ✅ Verify results page works
  6. Fix any bugs found
  7. Test production build: npm run build:prod

Architecture Notes 📝#

Removed temporary import storage approach:

  • Previously tried in-memory storage (doesn't work in serverless)
  • Then tried database storage with temp table (overkill)

Current approach:

  • User logs in to ATlast FIRST
  • Extension requires authentication
  • Upload creates permanent records immediately
  • No temporary storage needed
  • Matches file upload behavior exactly

Why this is better:

  • Simpler architecture
  • No temporary storage to expire
  • Proper user association from the start
  • Reuses existing upload/search infrastructure
  • Same flow as file uploads (consistency)

Files Modified in Latest Refactor#

Deleted:

  • packages/functions/src/get-extension-import.ts
  • packages/functions/src/utils/import-store.ts
  • packages/web/src/pages/ExtensionImport.tsx

Modified:

  • packages/functions/src/extension-import.ts - Now requires auth, creates upload
  • packages/functions/src/infrastructure/database/DatabaseService.ts - Removed extension_imports table
  • packages/functions/src/core/types/database.types.ts - Removed ExtensionImportRow
  • packages/web/src/Router.tsx - Removed /import/:id route
  • packages/extension/src/popup/popup.ts - Added session check, login state
  • packages/extension/src/popup/popup.html - Added not-logged-in state
  • packages/extension/src/lib/api-client.ts - Added checkSession(), credentials: 'include'

Decision Graph Summary#

Total nodes: 295 Key decisions tracked:

  • Environment configuration approach (#261-269)
  • Port 8888 conflict resolution (#270-274)
  • CORS permissions fix (#275-277)
  • Storage approach: in-memory → database → proper auth flow (#278-284)
  • Refactor and build (#285-286)
  • Bug fixes: NaN parameter error (#287), database initialization (#288)
  • API response unwrapping fix (#290-295)

Live graph: https://notactuallytreyanastasio.github.io/deciduous/