This repository has no description
0

Configure Feed

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

Remove poll feed button, add title enrichment

- Remove poll feed button and status from landing page (cron handles it)
- Enrichment now also fixes "Untitled" titles via Letta API
- All 3 bioRxiv records now have real paper titles
- PDS records updated to match

👾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta Code <noreply@letta.com>

author
Nandi
co-author
Letta Code
date (May 17, 2026, 9:30 PM -0700) commit c5288201 parent f6f89804
+6 -35
+2 -35
src/landing-page.ts
··· 28 28 header { margin-bottom: 2rem; } 29 29 header h1 { font-size: 1.75rem; font-weight: 700; } 30 30 header p { color: var(--dim); margin-top: 0.25rem; } 31 - .actions { margin-bottom: 1.5rem; display: flex; gap: 0.75rem; } 32 - .actions button { 33 - padding: 0.5rem 1rem; 34 - background: var(--accent); 35 - color: var(--bg); 36 - border: none; 37 - border-radius: 6px; 38 - font-weight: 600; 39 - cursor: pointer; 40 - } 41 - .actions button:hover { opacity: 0.9; } 42 - .actions button.secondary { 43 - background: var(--surface); 44 - color: var(--text); 45 - border: 1px solid var(--border); 46 - } 31 + 47 32 .paper-list { display: flex; flex-direction: column; gap: 0.75rem; } 48 33 .paper-card { 49 34 background: var(--surface); ··· 77 62 font-weight: 600; 78 63 } 79 64 .empty { color: var(--dim); text-align: center; padding: 3rem; } 80 - #poll-status { font-size: 0.8125rem; color: var(--dim); margin-left: 0.75rem; } 81 65 </style> 82 66 </head> 83 67 <body> ··· 85 69 <h1>Papers</h1> 86 70 <p>Research paper summaries from the Paper Skygest feed</p> 87 71 </header> 88 - <div class="actions"> 89 - <button onclick="pollFeed()">Poll Feed</button> 90 - <span id="poll-status"></span> 91 - </div> 92 72 <div id="papers" class="paper-list"></div> 93 73 <script> 94 74 const summaries = window.__SUMMARIES__ || []; 95 75 const container = document.getElementById('papers'); 96 - const pollStatus = document.getElementById('poll-status'); 97 76 98 77 function render(summaries) { 99 78 if (summaries.length === 0) { 100 - container.innerHTML = '<div class="empty">No papers indexed yet. Click "Poll Feed" to start.</div>'; 79 + container.innerHTML = '<div class="empty">No papers indexed yet.</div>'; 101 80 return; 102 81 } 103 82 container.innerHTML = summaries.map(s => { ··· 118 97 119 98 function escHtml(s) { 120 99 return (s || '').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); 121 - } 122 - 123 - async function pollFeed() { 124 - pollStatus.textContent = 'Polling...'; 125 - try { 126 - const res = await fetch('/api/poll', { method: 'POST' }); 127 - const data = await res.json(); 128 - pollStatus.textContent = 'Polled ' + data.polled + ', new: ' + data.new + ', written: ' + data.written + (data.errors ? ', errors: ' + data.errors : ''); 129 - if (data.written > 0) setTimeout(() => location.reload(), 1500); 130 - } catch (err) { 131 - pollStatus.textContent = 'Error: ' + err.message; 132 - } 133 100 } 134 101 135 102 render(summaries);
+3
src/paper-summarizer.ts
··· 182 182 const ENRICHMENT_PROMPT = `You are a research paper summarizer. Given a paper's URL, title, abstract, and existing metadata, produce a concise, insightful summary. 183 183 184 184 Return ONLY a JSON object with these fields (no markdown, no code fences): 185 + - "title": the paper's real title. If the current title is "Untitled" or placeholder, derive it from the URL or abstract. 185 186 - "summary": 2-3 sentence summary in your own words. Focus on what the paper does and why it matters. Not a restatement of the abstract. 186 187 - "domains": array of 1-3 research domain strings (e.g. ["machine learning", "optimization"]) 187 188 - "takeaway": one sentence — the single most important thing a reader should remember ··· 193 194 Venue: {venue}`; 194 195 195 196 export interface LettaEnrichment { 197 + title?: string; 196 198 summary: string; 197 199 domains: string[]; 198 200 takeaway: string; ··· 254 256 } 255 257 256 258 return { 259 + title: parsed.title || undefined, 257 260 summary: parsed.summary || content, 258 261 domains: parsed.domains || paper.domains, 259 262 takeaway: parsed.takeaway || "",
+1
src/worker.ts
··· 293 293 record.summary = result.summary; 294 294 record.domains = result.domains; 295 295 if (result.takeaway) record.takeaway = result.takeaway; 296 + if (result.title) record.title = result.title; 296 297 297 298 await db 298 299 .prepare("UPDATE records_summary SET record = ? WHERE rkey = ?")