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

docs: update decision graph after timezone fix

byarielm.fyi 8f692c7f aacbbaa2

verified
Changed files
+49 -19
docs
+27 -19
docs/git-history.json
··· 1 1 [ 2 2 { 3 + "hash": "aacbbaa27797781098dacdfd0194c93cd71d7bd2", 4 + "short_hash": "aacbbaa", 5 + "author": "Ariel M. Lighty", 6 + "date": "2025-12-26T21:46:06-05:00", 7 + "message": "fix: use TIMESTAMPTZ for all timestamp columns\n\nChanged all TIMESTAMP columns to TIMESTAMPTZ (timestamp with timezone) to\nproperly handle timezone-aware timestamps across all tables:\n- oauth_states (created_at, expires_at)\n- oauth_sessions (created_at, expires_at)\n- user_sessions (created_at, expires_at)\n- user_uploads (created_at, last_checked)\n- source_accounts (last_checked, match_found_at, created_at)\n- user_source_follows (created_at)\n- atproto_matches (found_at, last_verified, last_follow_check)\n- user_match_status (notified_at, viewed_at, followed_at, dismissed_at)\n- notification_queue (created_at, sent_at)\n\nThis fixes the 5-hour timezone offset issue where timestamps were stored\nwithout timezone info, causing display errors across different timezones.", 8 + "files_changed": 1 9 + }, 10 + { 11 + "hash": "c5adc15091cc520735b7d5c3d1ef1a9f4ff38a2f", 12 + "short_hash": "c5adc15", 13 + "author": "Ariel M. Lighty", 14 + "date": "2025-12-26T21:28:48-05:00", 15 + "message": "docs: update decision graph after loading screen fix", 16 + "files_changed": 2 17 + }, 18 + { 3 19 "hash": "46626f4a18eaaaaf42368361130bb1ddc7bd9677", 4 20 "short_hash": "46626f4", 5 21 "author": "Ariel M. Lighty", ··· 16 32 "files_changed": 4 17 33 }, 18 34 { 19 - "hash": "212660a996d6b0f1db59f9532d2b3968c7113f10", 20 - "short_hash": "212660a", 35 + "hash": "0afa0ffafd9b05f12d7d52c50082a54f237e09d8", 36 + "short_hash": "0afa0ff", 21 37 "author": "Ariel M. Lighty", 22 - "date": "2025-12-26T20:58:45-05:00", 23 - "message": "fix: pass final search results to onComplete callback\n\nFixes issue where results were displayed but not saved to database until\npage refresh. Root cause: onComplete callback accessed stale searchResults\nfrom closure instead of updated state.\n\nChanges:\n- useSearch.searchAllUsers: onComplete now receives SearchResult[] param\n- useSearch: uses setSearchResults updater to get current state\n- App.tsx: updated all 3 searchAllUsers calls to use finalResults\n- Removed setTimeout workarounds\n\nResult: Extension and file upload flows now save immediately after search.", 24 - "files_changed": 4 25 - }, 26 - { 27 - "hash": "6ced3f0b015af1c9126559a393996576402cfd03", 28 - "short_hash": "6ced3f0", 29 - "author": "Ariel M. Lighty", 30 - "date": "2025-12-26T14:12:46-05:00", 31 - "message": "fix extension flow: create user_source_follows, auto-search, time display\n\nBackend (extension-import.ts):\n- Now creates user_source_follows entries linking upload to source accounts\n- Without these, get-upload-details returned empty (queries FROM user_source_follows)\n- Uses bulkCreate return value (Map<username, id>) to create links\n\nFrontend (App.tsx):\n- handleLoadUpload now detects if upload has no matches yet\n- Sets isSearching: true for new uploads\n- Automatically triggers searchAllUsers for new uploads\n- Saves results after search completes\n- Changed platform from hardcoded \"tiktok\" to \"twitter\"\n\nFrontend (HistoryTab.tsx):\n- Fixed time display: removed \"Uploaded\" prefix\n- Now shows \"about 5 hours ago\" instead of \"Uploaded in about 5 hours\"\n- formatRelativeTime with addSuffix already provides complete sentence\n\nResolves:\n- Empty results on page load\n- No automatic searching\n- History navigation not working (will work after search)\n- Grammatically incorrect time display", 32 - "files_changed": 5 38 + "date": "2025-12-26T20:20:50-05:00", 39 + "message": "fix: sourceUser should be object {username, date} not string\n\nWas setting sourceUser to result.sourceUser.username (string)\nShould be result.sourceUser (SourceUser object)\n\nThis caused:\n- useSearch to call batch.map(r => r.sourceUser.username) on strings\n- .username on string returns undefined\n- batch-search-actors received null values\n- ValidationError: expected string, received null\n\nAlso caused localeCompare error when sorting undefined values.", 40 + "files_changed": 3 33 41 }, 34 42 { 35 43 "hash": "6ced3f0b015af1c9126559a393996576402cfd03", ··· 104 112 "files_changed": 3 105 113 }, 106 114 { 107 - "hash": "32cdee3aeac7ef986df47e0fff786b5f7471e55b", 108 - "short_hash": "32cdee3", 115 + "hash": "ba29fd68872913ba0a587aa7f29f97b3d373a732", 116 + "short_hash": "ba29fd6", 109 117 "author": "Ariel M. Lighty", 110 118 "date": "2025-12-25T13:22:32-05:00", 111 119 "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.", 112 - "files_changed": 4 120 + "files_changed": 5 113 121 }, 114 122 { 115 - "hash": "ba29fd68872913ba0a587aa7f29f97b3d373a732", 116 - "short_hash": "ba29fd6", 123 + "hash": "32cdee3aeac7ef986df47e0fff786b5f7471e55b", 124 + "short_hash": "32cdee3", 117 125 "author": "Ariel M. Lighty", 118 126 "date": "2025-12-25T13:22:32-05:00", 119 127 "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.", 120 - "files_changed": 5 128 + "files_changed": 4 121 129 }, 122 130 { 123 131 "hash": "c3e7afad396d130791d801a85cbfc9643bcd6309",
+22
docs/graph-data.json
··· 3574 3574 "created_at": "2025-12-26T21:20:42.635515100-05:00", 3575 3575 "updated_at": "2025-12-26T21:20:42.635515100-05:00", 3576 3576 "metadata_json": "{\"branch\":\"master\",\"commit\":\"46626f4\",\"confidence\":95}" 3577 + }, 3578 + { 3579 + "id": 326, 3580 + "change_id": "af76ea64-b0b1-4577-b521-4ec21cc555e1", 3581 + "node_type": "outcome", 3582 + "title": "Fixed timezone issue - all timestamp columns now use TIMESTAMPTZ", 3583 + "description": null, 3584 + "status": "pending", 3585 + "created_at": "2025-12-26T21:46:14.340967100-05:00", 3586 + "updated_at": "2025-12-26T21:46:14.340967100-05:00", 3587 + "metadata_json": "{\"branch\":\"master\",\"commit\":\"aacbbaa\",\"confidence\":95}" 3577 3588 } 3578 3589 ], 3579 3590 "edges": [ ··· 7052 7063 "weight": 1.0, 7053 7064 "rationale": "User reported results showing 'none' before search completes - needed to keep user on loading screen", 7054 7065 "created_at": "2025-12-26T21:20:53.976836200-05:00" 7066 + }, 7067 + { 7068 + "id": 317, 7069 + "from_node_id": 325, 7070 + "to_node_id": 326, 7071 + "from_change_id": "e44f45f8-bac9-4a49-ac68-ac9d7d113226", 7072 + "to_change_id": "af76ea64-b0b1-4577-b521-4ec21cc555e1", 7073 + "edge_type": "leads_to", 7074 + "weight": 1.0, 7075 + "rationale": "User reported upload times showing 5 hours ahead - timezone offset issue", 7076 + "created_at": "2025-12-26T21:46:24.801578500-05:00" 7055 7077 } 7056 7078 ] 7057 7079 }