Select the types of activity you want to include in your feed.
fix: add Firefox extension CORS support
- Added moz-extension:// origin detection to CORS handler - Added cookies permission to Firefox manifest for credentialed requests - Functions now properly reflect Firefox extension origins with credentials
···88 "files_changed": 4
99 },
1010 {
1111- "hash": "bd3aabb75abb1875aef125610fcdccb14967a8e3",
1212- "short_hash": "bd3aabb",
1111+ "hash": "603cf0a187850664336a12c9e5cbb49038906f53",
1212+ "short_hash": "603cf0a",
1313 "author": "Ariel M. Lighty",
1414- "date": "2025-12-27T22:10:11-05:00",
1515- "message": "fix: extension dark mode and build mode messaging\n\n- Changed darkMode from 'class' to 'media' for automatic system preference detection\n- Made server offline message conditional on build mode (dev vs prod)\n- Hide dev server instructions in production builds",
1616- "files_changed": 5
1414+ "date": "2025-12-27T22:42:43-05:00",
1515+ "message": "fix: CORS for extension credentialed requests\n\nUpdated CORS headers to support credentials from Chrome extensions:\n- Added getCorsHeaders() to detect chrome-extension:// origins\n- Changed from wildcard Access-Control-Allow-Origin to specific origin\n- Added Access-Control-Allow-Credentials: true for credentialed requests\n- Updated session endpoint to pass event for CORS header detection",
1616+ "files_changed": 4
1717 },
1818 {
1919 "hash": "bd3aabb75abb1875aef125610fcdccb14967a8e3",
···4040 "files_changed": 6
4141 },
4242 {
4343- "hash": "2a163c5f033a79324b100a236ea26c905909bfc6",
4444- "short_hash": "2a163c5",
4343+ "hash": "fe29bb3e5faa0151f63c14724f7509af669860de",
4444+ "short_hash": "fe29bb3",
4545 "author": "Ariel M. Lighty",
4646- "date": "2025-12-27T15:49:08-05:00",
4747- "message": "docs: update decision graph after documentation improvements",
4848- "files_changed": 2
4646+ "date": "2025-12-27T16:02:10-05:00",
4747+ "message": "docs: update all .md files to reflect current project status\n\nUpdated 4 markdown files with current state:\n\nEXTENSION_STATUS.md:\n- Changed status from DEBUGGING to COMPLETE\n- Updated decision graph count (295 → 332 nodes)\n- Added recently completed section (nodes 296-332)\n- Marked all extension bugs as resolved\n\nCONTRIBUTING.md:\n- Replaced npm with pnpm throughout\n- Added monorepo structure documentation\n- Updated development commands (netlify-cli dev --filter)\n- Added extension development workflow\n\nPLAN.md:\n- Updated status to Phase 1 COMPLETE\n- Added all recent fixes to completion list\n- Updated decision graph count to 332 nodes\n- Added changelog entries for latest work\n\npackages/extension/README.md:\n- Added prerequisites section (dev server + login required)\n- Updated build commands with dev/prod distinction\n- Added Step 0: Start ATlast Dev Server\n- Added common issues for auth and server states\n\nAll files now accurately reflect completion status and use pnpm.",
4848+ "files_changed": 6
4949 },
5050 {
5151 "hash": "fcf682bb8969aca108262348e7e17531077713be",
···160160 "files_changed": 3
161161 },
162162 {
163163- "hash": "ba29fd68872913ba0a587aa7f29f97b3d373a732",
164164- "short_hash": "ba29fd6",
163163+ "hash": "32cdee3aeac7ef986df47e0fff786b5f7471e55b",
164164+ "short_hash": "32cdee3",
165165 "author": "Ariel M. Lighty",
166166 "date": "2025-12-25T13:22:32-05:00",
167167 "message": "configure Netlify dev for monorepo with --filter flag\n\nFixed Netlify CLI monorepo detection issue by using --filter flag:\n- Updated root package.json scripts to use 'npx netlify-cli dev --filter @atlast/web'\n- Updated netlify.toml [dev] section to use npm with --prefix for framework command\n- Added monorepo development instructions to CLAUDE.md\n- Documented Windows Git Bash compatibility issue with netlify command\n\nSolution: Use 'npx netlify-cli dev --filter @atlast/web' to bypass monorepo\nproject selection prompt and specify which workspace package to run.\n\nDev server now runs successfully at http://localhost:8888 with all backend\nfunctions loaded.",
168168- "files_changed": 5
168168+ "files_changed": 4
169169 },
170170 {
171171- "hash": "32cdee3aeac7ef986df47e0fff786b5f7471e55b",
172172- "short_hash": "32cdee3",
171171+ "hash": "ba29fd68872913ba0a587aa7f29f97b3d373a732",
172172+ "short_hash": "ba29fd6",
173173 "author": "Ariel M. Lighty",
174174 "date": "2025-12-25T13:22:32-05:00",
175175 "message": "configure Netlify dev for monorepo with --filter flag\n\nFixed Netlify CLI monorepo detection issue by using --filter flag:\n- Updated root package.json scripts to use 'npx netlify-cli dev --filter @atlast/web'\n- Updated netlify.toml [dev] section to use npm with --prefix for framework command\n- Added monorepo development instructions to CLAUDE.md\n- Documented Windows Git Bash compatibility issue with netlify command\n\nSolution: Use 'npx netlify-cli dev --filter @atlast/web' to bypass monorepo\nproject selection prompt and specify which workspace package to run.\n\nDev server now runs successfully at http://localhost:8888 with all backend\nfunctions loaded.",
176176- "files_changed": 4
176176+ "files_changed": 5
177177 },
178178 {
179179 "hash": "c3e7afad396d130791d801a85cbfc9643bcd6309",
+237-6
docs/graph-data.json
···40324032 "node_type": "goal",
40334033 "title": "Create Firefox-compatible version of Twitter scraper extension",
40344034 "description": null,
40354035- "status": "pending",
40354035+ "status": "completed",
40364036 "created_at": "2025-12-28T18:09:33.241860800-05:00",
40374037- "updated_at": "2025-12-28T18:09:33.241860800-05:00",
40374037+ "updated_at": "2025-12-28T19:21:32.412499-05:00",
40384038 "metadata_json": "{\"branch\":\"master\",\"confidence\":85,\"prompt\":\"let's make the extension have a firefox compatible version too.\"}"
40394039 },
40404040 {
···41204120 "node_type": "action",
41214121 "title": "Installing webextension-polyfill and updating source files to use browser.* API",
41224122 "description": null,
41234123- "status": "pending",
41234123+ "status": "completed",
41244124 "created_at": "2025-12-28T19:08:14.642882400-05:00",
41254125- "updated_at": "2025-12-28T19:08:14.642882400-05:00",
41254125+ "updated_at": "2025-12-28T19:21:32.531034800-05:00",
41264126 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}"
41274127 },
41284128 {
···41314131 "node_type": "outcome",
41324132 "title": "Successfully implemented Firefox compatibility with webextension-polyfill. Both Chrome and Firefox builds compile successfully. Chrome uses service_worker (MV3), Firefox uses scripts array with browser_specific_settings. All chrome.* API calls replaced with browser.* imports.",
41334133 "description": null,
41344134+ "status": "completed",
41354135+ "created_at": "2025-12-28T19:14:22.309457600-05:00",
41364136+ "updated_at": "2025-12-28T19:21:32.658297400-05:00",
41374137+ "metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
41384138+ },
41394139+ {
41404140+ "id": 377,
41414141+ "change_id": "1dffa024-413f-4a95-b069-66db350abfaa",
41424142+ "node_type": "goal",
41434143+ "title": "Fix Firefox extension server detection and login check",
41444144+ "description": null,
41344145 "status": "pending",
41354135- "created_at": "2025-12-28T19:14:22.309457600-05:00",
41364136- "updated_at": "2025-12-28T19:14:22.309457600-05:00",
41464146+ "created_at": "2025-12-28T20:14:51.646204800-05:00",
41474147+ "updated_at": "2025-12-28T20:14:51.646204800-05:00",
41484148+ "metadata_json": "{\"branch\":\"master\",\"confidence\":85,\"prompt\":\"The extension works in chrome. In firefox, it's failing to detect that the dev server is running and open + logged in on firefox. There's no right-click to inspect on the popup either.\"}"
41494149+ },
41504150+ {
41514151+ "id": 378,
41524152+ "change_id": "9d5626d2-a9ae-42aa-8fda-be3c7528156f",
41534153+ "node_type": "observation",
41544154+ "title": "Firefox extension debugging differs from Chrome - need to use about:debugging Inspect button or Browser Console, not right-click popup",
41554155+ "description": null,
41564156+ "status": "pending",
41574157+ "created_at": "2025-12-28T20:15:11.710473-05:00",
41584158+ "updated_at": "2025-12-28T20:15:11.710473-05:00",
41594159+ "metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
41604160+ },
41614161+ {
41624162+ "id": 379,
41634163+ "change_id": "7a5af3fe-8567-4f1c-85cd-e47891704974",
41644164+ "node_type": "observation",
41654165+ "title": "Potential Firefox issues: 1) CORS with credentials:include may be stricter, 2) Cookie partitioning/third-party cookie blocking, 3) Extension needs explicit host_permissions for cookies to work. Firefox manifest has host_permissions but may need additional cookie permissions.",
41664166+ "description": null,
41674167+ "status": "pending",
41684168+ "created_at": "2025-12-28T20:15:31.278249900-05:00",
41694169+ "updated_at": "2025-12-28T20:15:31.278249900-05:00",
41704170+ "metadata_json": "{\"branch\":\"master\",\"confidence\":85}"
41714171+ },
41724172+ {
41734173+ "id": 380,
41744174+ "change_id": "9c197aae-18d5-46ae-87e7-82c240c8f313",
41754175+ "node_type": "action",
41764176+ "title": "Adding cookies permission to Firefox manifest for credentials:include support",
41774177+ "description": null,
41784178+ "status": "pending",
41794179+ "created_at": "2025-12-28T20:16:12.019659700-05:00",
41804180+ "updated_at": "2025-12-28T20:16:12.019659700-05:00",
41814181+ "metadata_json": "{\"branch\":\"master\",\"confidence\":90}"
41824182+ },
41834183+ {
41844184+ "id": 381,
41854185+ "change_id": "485a03b0-8a25-4fdf-a8e2-9d3a25c8edf8",
41864186+ "node_type": "outcome",
41874187+ "title": "Fixed Firefox cookie issue by adding cookies permission to manifest. Firefox requires explicit permission even with host_permissions. Rebuild successful.",
41884188+ "description": null,
41894189+ "status": "pending",
41904190+ "created_at": "2025-12-28T20:16:41.702322300-05:00",
41914191+ "updated_at": "2025-12-28T20:16:41.702322300-05:00",
41924192+ "metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
41934193+ },
41944194+ {
41954195+ "id": 382,
41964196+ "change_id": "35b13d37-0228-435f-a4bc-c5c42811fec3",
41974197+ "node_type": "observation",
41984198+ "title": "Firefox blocks extension fetch with CORS error despite host_permissions. Server responds 200 but missing Access-Control-Allow-Origin header. Firefox stricter than Chrome on extension CORS.",
41994199+ "description": null,
42004200+ "status": "pending",
42014201+ "created_at": "2025-12-28T20:17:23.414134300-05:00",
42024202+ "updated_at": "2025-12-28T20:17:23.414134300-05:00",
42034203+ "metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
42044204+ },
42054205+ {
42064206+ "id": 383,
42074207+ "change_id": "adc120cd-e56d-400a-9b3e-8207880378c3",
42084208+ "node_type": "action",
42094209+ "title": "Adding CORS headers to netlify.toml for extension compatibility - wildcard origin with credentials for dev",
42104210+ "description": null,
42114211+ "status": "pending",
42124212+ "created_at": "2025-12-28T20:18:22.172869600-05:00",
42134213+ "updated_at": "2025-12-28T20:18:22.172869600-05:00",
42144214+ "metadata_json": "{\"branch\":\"master\",\"confidence\":90}"
42154215+ },
42164216+ {
42174217+ "id": 384,
42184218+ "change_id": "0f77bfd9-590f-4f1e-be08-78a9deef6d8a",
42194219+ "node_type": "outcome",
42204220+ "title": "Added CORS headers to netlify.toml for all paths including root and functions. Headers include Access-Control-Allow-Origin:*, Allow-Credentials:true for dev environment. User needs to restart dev server.",
42214221+ "description": null,
42224222+ "status": "pending",
42234223+ "created_at": "2025-12-28T20:19:54.829093600-05:00",
42244224+ "updated_at": "2025-12-28T20:19:54.829093600-05:00",
42254225+ "metadata_json": "{\"branch\":\"master\",\"confidence\":90}"
42264226+ },
42274227+ {
42284228+ "id": 385,
42294229+ "change_id": "cc0910f0-2381-4aee-bb5d-397cb0f804d1",
42304230+ "node_type": "observation",
42314231+ "title": "CORS wildcard (*) incompatible with credentials:include. Browser security prevents wildcard CORS with credentialed requests. Extension origins are dynamic (moz-extension://, chrome-extension://). Need to handle CORS in serverless functions by reflecting request origin.",
42324232+ "description": null,
42334233+ "status": "pending",
42344234+ "created_at": "2025-12-28T20:27:31.848523900-05:00",
42354235+ "updated_at": "2025-12-28T20:27:31.848523900-05:00",
42364236+ "metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
42374237+ },
42384238+ {
42394239+ "id": 386,
42404240+ "change_id": "ad4a5ca7-15d1-4776-8ede-6b615613f6e1",
42414241+ "node_type": "action",
42424242+ "title": "Adding moz-extension:// origin detection to CORS handler for Firefox extension support",
42434243+ "description": null,
42444244+ "status": "pending",
42454245+ "created_at": "2025-12-28T20:28:31.661326900-05:00",
42464246+ "updated_at": "2025-12-28T20:28:31.661326900-05:00",
42474247+ "metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
42484248+ },
42494249+ {
42504250+ "id": 387,
42514251+ "change_id": "cffdee0f-8535-4d88-83ed-fdf6101f7ac3",
42524252+ "node_type": "outcome",
42534253+ "title": "Fixed Firefox extension CORS by adding moz-extension:// origin detection to response.utils.ts. Reverted netlify.toml changes as functions handle CORS correctly. User needs to restart dev server.",
42544254+ "description": null,
42554255+ "status": "pending",
42564256+ "created_at": "2025-12-28T20:29:39.856303800-05:00",
42574257+ "updated_at": "2025-12-28T20:29:39.856303800-05:00",
41374258 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
41384259 }
41394260 ],
···82408361 "weight": 1.0,
82418362 "rationale": "Implementation completed successfully",
82428363 "created_at": "2025-12-28T19:14:24.961595600-05:00"
83648364+ },
83658365+ {
83668366+ "id": 374,
83678367+ "from_node_id": 377,
83688368+ "to_node_id": 378,
83698369+ "from_change_id": "1dffa024-413f-4a95-b069-66db350abfaa",
83708370+ "to_change_id": "9d5626d2-a9ae-42aa-8fda-be3c7528156f",
83718371+ "edge_type": "leads_to",
83728372+ "weight": 1.0,
83738373+ "rationale": "First observation about debugging",
83748374+ "created_at": "2025-12-28T20:15:13.725635900-05:00"
83758375+ },
83768376+ {
83778377+ "id": 375,
83788378+ "from_node_id": 378,
83798379+ "to_node_id": 379,
83808380+ "from_change_id": "9d5626d2-a9ae-42aa-8fda-be3c7528156f",
83818381+ "to_change_id": "7a5af3fe-8567-4f1c-85cd-e47891704974",
83828382+ "edge_type": "leads_to",
83838383+ "weight": 1.0,
83848384+ "rationale": "Hypothesis about root causes",
83858385+ "created_at": "2025-12-28T20:15:33.187041700-05:00"
83868386+ },
83878387+ {
83888388+ "id": 376,
83898389+ "from_node_id": 379,
83908390+ "to_node_id": 380,
83918391+ "from_change_id": "7a5af3fe-8567-4f1c-85cd-e47891704974",
83928392+ "to_change_id": "9c197aae-18d5-46ae-87e7-82c240c8f313",
83938393+ "edge_type": "leads_to",
83948394+ "weight": 1.0,
83958395+ "rationale": "Fix based on hypothesis",
83968396+ "created_at": "2025-12-28T20:16:14.104406300-05:00"
83978397+ },
83988398+ {
83998399+ "id": 377,
84008400+ "from_node_id": 380,
84018401+ "to_node_id": 381,
84028402+ "from_change_id": "9c197aae-18d5-46ae-87e7-82c240c8f313",
84038403+ "to_change_id": "485a03b0-8a25-4fdf-a8e2-9d3a25c8edf8",
84048404+ "edge_type": "leads_to",
84058405+ "weight": 1.0,
84068406+ "rationale": "Fix implemented and tested",
84078407+ "created_at": "2025-12-28T20:16:43.953511400-05:00"
84088408+ },
84098409+ {
84108410+ "id": 378,
84118411+ "from_node_id": 381,
84128412+ "to_node_id": 382,
84138413+ "from_change_id": "485a03b0-8a25-4fdf-a8e2-9d3a25c8edf8",
84148414+ "to_change_id": "35b13d37-0228-435f-a4bc-c5c42811fec3",
84158415+ "edge_type": "leads_to",
84168416+ "weight": 1.0,
84178417+ "rationale": "Root cause identified from error logs",
84188418+ "created_at": "2025-12-28T20:17:25.488041200-05:00"
84198419+ },
84208420+ {
84218421+ "id": 379,
84228422+ "from_node_id": 382,
84238423+ "to_node_id": 383,
84248424+ "from_change_id": "35b13d37-0228-435f-a4bc-c5c42811fec3",
84258425+ "to_change_id": "adc120cd-e56d-400a-9b3e-8207880378c3",
84268426+ "edge_type": "leads_to",
84278427+ "weight": 1.0,
84288428+ "rationale": "Fix for CORS issue",
84298429+ "created_at": "2025-12-28T20:19:41.484076700-05:00"
84308430+ },
84318431+ {
84328432+ "id": 380,
84338433+ "from_node_id": 383,
84348434+ "to_node_id": 384,
84358435+ "from_change_id": "adc120cd-e56d-400a-9b3e-8207880378c3",
84368436+ "to_change_id": "0f77bfd9-590f-4f1e-be08-78a9deef6d8a",
84378437+ "edge_type": "leads_to",
84388438+ "weight": 1.0,
84398439+ "rationale": "Implementation complete",
84408440+ "created_at": "2025-12-28T20:19:56.872404900-05:00"
84418441+ },
84428442+ {
84438443+ "id": 381,
84448444+ "from_node_id": 384,
84458445+ "to_node_id": 385,
84468446+ "from_change_id": "0f77bfd9-590f-4f1e-be08-78a9deef6d8a",
84478447+ "to_change_id": "cc0910f0-2381-4aee-bb5d-397cb0f804d1",
84488448+ "edge_type": "leads_to",
84498449+ "weight": 1.0,
84508450+ "rationale": "New error reveals real issue",
84518451+ "created_at": "2025-12-28T20:27:34.035766400-05:00"
84528452+ },
84538453+ {
84548454+ "id": 382,
84558455+ "from_node_id": 385,
84568456+ "to_node_id": 386,
84578457+ "from_change_id": "cc0910f0-2381-4aee-bb5d-397cb0f804d1",
84588458+ "to_change_id": "ad4a5ca7-15d1-4776-8ede-6b615613f6e1",
84598459+ "edge_type": "leads_to",
84608460+ "weight": 1.0,
84618461+ "rationale": "Fix for Firefox extension origin",
84628462+ "created_at": "2025-12-28T20:28:33.839045700-05:00"
84638463+ },
84648464+ {
84658465+ "id": 383,
84668466+ "from_node_id": 386,
84678467+ "to_node_id": 387,
84688468+ "from_change_id": "ad4a5ca7-15d1-4776-8ede-6b615613f6e1",
84698469+ "to_change_id": "cffdee0f-8535-4d88-83ed-fdf6101f7ac3",
84708470+ "edge_type": "leads_to",
84718471+ "weight": 1.0,
84728472+ "rationale": "Complete fix implemented",
84738473+ "created_at": "2025-12-28T20:30:09.745415200-05:00"
82438474 }
82448475 ]
82458476}
+2-1
packages/extension/manifest.firefox.json
···55 "description": "Import your Twitter/X follows to find them on Bluesky",
66 "permissions": [
77 "activeTab",
88- "storage"
88+ "storage",
99+ "cookies"
910 ],
1011 "host_permissions": [
1112 "https://twitter.com/*",