Was sequential (26 records × 30s = 14min). Now batches of 5
concurrent calls — should be ~3min for 26 records.
Applies to poll endpoint, cron handler, and /api/enrich.
👾 Generated with [Letta Code](https://letta.com)
Co-Authored-By: Letta Code <noreply@letta.com>
- Year now extracted from URL (venue-specific patterns) and LLM enrichment
- Card meta shows: year · authors · poster handle
- Removed raw paperUrl from card meta (cleaner)
- Enrich endpoint also updates records missing year
- All 26 records now have year populated
👾 Generated with [Letta Code](https://letta.com)
Co-Authored-By: Letta Code <noreply@letta.com>
New papers now get Letta API enrichment immediately when ingested,
no separate /api/enrich step needed. Falls back to heuristic summary
if Letta is unavailable.
Both poll endpoint and cron handler enriched.
👾 Generated with [Letta Code](https://letta.com)
Co-Authored-By: Letta Code <noreply@letta.com>
- pollFollowedAccounts() fetches recent posts from all 39 followed accounts
- Extracts paper URLs from post text and embeds
- Merges with Paper Skygest feed results (deduped)
- Fixed contrail.notify error (replaced with direct D1 insert)
- Fixed </script> in JSON breaking SSR
- Enriched all 18 new records via Letta API
- 26 total summaries now indexed
👾 Generated with [Letta Code](https://letta.com)
Co-Authored-By: Letta Code <noreply@letta.com>