{sources.length} sources
(showAdd ? cancelForm() : startAdd())}> {showAdd ? 'Cancel' : '+ Add source'}
{#if showAdd}
RSS
API
Telegram
YouTube
Nitter
Custom
{#if form.type === 'youtube'}
{:else if form.type === 'nitter'}
{:else if form.type === 'telegram'}
{:else}
{/if}
Every 5 minutes
Every 15 minutes
Every hour
{#if form.type === 'telegram'}
Public channels only for now — private channels without a public username aren't supported yet.
{/if}
Categories
{#each assignableCategories as cat (cat.id)}
toggleCategory(cat.name)} /> {cat.name}
{/each}
Push to Top Stories?
Off by default — keeps the homepage from being flooded by every source.
Cancel
{editingId ? 'Save' : 'Add'}
{/if}
Name
Type
Category
Poll
{#each sources as source (source.id)}
pollNow(source)} disabled={pollingId === source.id} title="Poll now" aria-label={`Poll ${source.name} now`} > {typeIcon(source.type)}
{source.name}
{#if justCleared?.id === source.id || justReissued?.id === source.id || justPolled?.id === source.id || source.lastError}
{#if justCleared?.id === source.id} ✓ cleared {justCleared.items} item(s), {justCleared.articles} article(s) {:else if justReissued?.id === source.id} ✓ deleted {justReissued.articles} article(s), requeued {justReissued.items} item(s) — republishing within ~1 min {:else if justPolled?.id === source.id} {justPolled.count > 0 ? `✓ ${justPolled.count} new item(s)` : '✓ up to date, nothing new'} {:else if source.lastError} last poll failed · {source.lastError} {/if}
{/if}
{source.type.toUpperCase()}
{source.category.join(', ')}
{source.pollIntervalMinutes} min
toggleTopStories(source)} title={source.pushToTopStories ? 'Pushing to Top Stories — click to stop' : 'Not pushed to Top Stories — click to enable'} > {source.pushToTopStories ? '★' : '☆'}
startEdit(source)} title="Edit">✎
toggleEnabled(source)} title={source.enabled ? 'Disable' : 'Enable'}> {source.enabled ? '⏸' : '▶'}
handleClearContent(source)} disabled={clearingId === source.id} title="Clear content (keep source)" > ⟲
handleReissue(source)} disabled={reissuingId === source.id} title="Reissue: delete published articles and republish from the same raw items" > 🔁
handleDelete(source.id)} title="Delete">✕
{/each}