Skip to content

Signal feed

The Signal feed is the main dashboard — every news item Claude has classified for your tracked companies lands here. One row per signal. Newest first.

What's on a row

  • Type chipfunding, hiring, fda_approval, partnership, leadership, plus any custom types you've added. Color-coded; no two types share a color
  • Company name — clicking opens the company detail dialog with the full signal history
  • Title + snippet — Claude's one-line summary of the item
  • Date — publication date (not when we ingested it)
  • Source pilllinkdapi (LinkedIn), custom, company_site, google_news, openfda, crunchbase
  • "Sent" badge — light yellow if you've already pushed this signal to Slack
  • Checkbox — for bulk-select. The footer slides up showing how many you've picked

Tabs

TabWhat it shows
AI-suggestedOnly signals Claude flagged as high importance (last 7 days), not yet sent, not dismissed
All signalsEverything Claude classified
<type> tabsOne per signal type — count badge tells you how many exist

Right-aligned + Add button creates a new signal type on the fly. Click the (i) next to it for the signal-types docs. See Signal types in the docs for slug rules + Claude prompt injection.

Filter bar (under the tabs)

ControlWhat it does
SearchSubstring match against signal title + snippet. Debounced 300 ms
Date range7d / 30d / 90d / Year / All / Custom. Filters on the publication date
SortNewest ↔ oldest. Toggles between desc and asc
SourcesMulti-select chips. Limits to only the picked sources. Empty = all
Auto-send (on AI-suggested tab)Toggles auto-send for high-importance signals — see Auto-send signals

Same filter bar style as Companies → Imported data + the import wizard map step.

Adding custom signal types

  1. Click + Add (top-right of the tab bar) OR open Settings → Signal types → + Add signal type.
  2. Name the type — anything is fine; we slugify it (M&Am_and_a).
  3. Write a description: trigger phrases, examples, edge cases. This is the most important field — it's injected verbatim into the Claude classify prompt. A bad description = noisy results.
  4. Save. We automatically trigger a sync so the new type backfills against your existing companies.

Editing a description doesn't trigger a sync — it applies on the next sync (manual or auto). You can remove a type by clicking the × on its chip in Settings; the existing signals keep their slug but the type disappears from filter UI.

AI-suggested tab

Claude assigns every signal an importance: low / medium / high. The AI-suggested tab isolates the high ones from the last 7 days that you haven't acted on yet.

  • "High" by Claude's rubric: named exec move, exact funding round, dated FDA clearance, named partnership — clearly actionable + recent + specific. Vague mentions don't make the cut.
  • Dismiss removes a row from this tab without sending it (sets suggestion_dismissed_at — the signal stays in All signals).
  • Auto-send toggle in the filter bar — when ON, high signals get auto-posted to Slack during the sync that fetched them. After auto-send they leave this tab (sent).

See AI-suggested tab docs for more on what counts as high. See Auto-send signals for the delivery format.

Sending to Slack

  • Per-row Slack button — fires a one-off send with optional custom message
  • Bulk — select checkboxes, the footer pops up with "Send N to Slack"
  • "Sent" badge shows up after delivery; if you re-send the same signal, the badge updates with the latest send time

Empty states

  • "No signals match" — your filters are too tight. Try widening the date range or clearing sources
  • "No AI-suggested signals right now" — Claude hasn't flagged any high-importance items in the last 7 days. Either trigger a sync, or lower your bar by editing signal-type descriptions to be more inclusive

Performance notes

  • Infinite scroll — rows load in pages of 30 as you reach the bottom
  • Each sync invalidates the query; new signals appear without a manual refresh
  • Search is server-side (Postgres trigram), not client filtering

Same content as the in-app docs drawer. Source of truth: frontend/src/docs/sections.ts.