Overview
Waypoint is local-first intelligence for feeds, milestones, trials, and landscape views across disease pipelines, company watchlists, and sector themes.
See what's advancing in the portfolios you track—and what's stalled. Use portfolio-scoped
Feed, Milestones, Trends, and Tracked to follow sponsors and
products, compare development and eligibility, and refresh what you know from publications, trials,
and news. Runs on your machine (data/); optional LLM assistance and email alerts.
What You See in the App
- Feed
- Ingested headlines and alerts across tracked portfolios. Filter by the header portfolio selector.
- Milestones
- Announcements (dated feed items) and product milestones from IR/news, ClinicalTrials.gov, and synthesized research timelines.
- Trends
- Portfolio-scoped treatment landscape (bubble chart) and feed-activity stats.
- Tracked
- Sponsors, ticker symbols, and products per portfolio; add symbols, enrich from feed, curate pipeline lists, rebuild timelines.
- Data
- LLM-assisted edits to whitelisted JSON config files (preview or apply).
- Zotero
- Link feed events to Zotero library items when API keys are configured.
Core Concepts
- Portfolio —
portfolio_typeinportfolios.json: disease (pipeline worklists), companies (holdings watchlists), or sector (thematic focus viasector_name). - Sponsor — Company or program you track (label on a tracked entity).
- Product — Therapy or program; catalog rows in
product_registry.jsonusebrand_name,general_name, andsynonyms(code names). Open detail from Trends.
Where Data Lives
| Store | Path | Role |
|---|---|---|
| Events & milestones | data/waypoint.db | Feed events, timeline rows, trial snapshots, synthesized product facts |
| Portfolios | data/portfolios.json | Portfolio ids, portfolio_type, labels, disease/sector focus, eligibility model |
| Tracked worklist | data/tracked_entities.json | Sponsors, symbols, products, optional IR/news URLs |
| Product catalog | data/product_registry.json | Brand, general name, synonyms, indications, approved cohorts |
| Landscapes | data/micro_sector_landscapes.json | Per-portfolio competitive bubble data |
| Curation drafts | data/tracked_entities_curation_{portfolio}.json | Proposed adds/removals before apply |
| Ingest logs | data/ingest_logs/ | Per-run diagnostics |
Adding a New Portfolio
Create a portfolio from + New next to the header selector (or POST /api/portfolios).
Set portfolio_type to disease, companies, or sector. Disease portfolios need disease_name; sector portfolios need sector_name (e.g. Nuclear energy).
- Define portfolio metadata — id, display label, disease name, eligibility profile (
dmdorgeneric). Written todata/portfolios.json. - Select the portfolio in the header — scopes Feed, Milestones, Trends, and Tracked views.
- Add tracked sponsors — in Tracked, enter tickers (e.g.
VRTX, CAPR) and save. Rows append todata/tracked_entities.jsonfor that portfolio. - Optional catalog — add products and synonyms in
product_registry.json(or use Data → LLM curator). - Optional baseline — map tickers to product names in
product_baseline.jsonfor faster pipeline seeding. - First ingest — run Run ingest on Feed (optionally scoped with
?portfolio=) to pull feeds, tag events, scrape IR/news, sync trials, and extract milestones. - Landscape — on Tracked → Update Data, run Refresh landscape (LLM) after ingest and timeline rebuilds to update the bubble chart in
micro_sector_landscapes.json(shown on Trends).
┌─────────────────┐ POST /api/portfolios ┌──────────────────────┐
│ + New portfolio │ ────────────────────────────► │ data/portfolios.json │
└────────┬────────┘ └──────────┬───────────┘
│ select in header │
▼ ▼
┌─────────────────┐ POST …/symbols ┌──────────────────────────┐
│ Tracked: tickers │ ────────────────────────────► │ data/tracked_entities.json│
└────────┬────────┘ └──────────┬───────────────┘
│ optional registry / baseline │
▼ ▼
┌─────────────────┐ POST /api/ingest/run ┌──────────────────────┐
│ Feed: Run ingest │ ────────────────────────────► │ data/waypoint.db │
└────────┬────────┘ │ (+ ingest_logs/) │
│ Tracked: Refresh landscape └──────────────────────┘
▼
┌──────────────────────────────┐
│ micro_sector_landscapes.json │
└──────────────────────────────┘
Updating Data (Ongoing)
Most refresh happens through ingest (every 15 minutes automatically, or Run ingest on Feed). You can scope ingest to the active portfolio so only that worklist is tagged and backfilled.
Ingest Cycle
- Connectors — RSS and configured sources fetch new items.
- Score & store — urgency/relevance, NDA flags; upsert into SQLite
events. - Tag tracked — match text against symbols/keywords/products for the scoped portfolio(s).
- Milestone extract — new events run through the milestone agent (LLM when enabled).
- Sponsor pages — scrape optional
investor_relations_url/news_urlon tracked entities. - ClinicalTrials.gov — refresh trial snapshots per tracked product; link treatments to NCT ids.
- Backfill — scan recent events for historical milestone phrasing (IND, PDUFA, phase starts, etc.).
- Product timelines — if trial data changed, rebuild synthesized facts for affected products (research connectors + validator).
- Pipeline enrich — when ingest is portfolio-scoped, optional refresh of pipeline entities from recent feed evidence.
- Log — write summary to
data/ingest_logs/.
RSS / sources
│
▼
┌─────────┐ match tracked ┌─────────────────────┐
│ events │ ───────────────────► │ timeline_milestones │
│ (SQLite)│ enrich + backfill │ trial_snapshots │
└────┬────┘ │ product_timeline_ │
│ │ facts (synthesized) │
│ IR/news scrape └─────────────────────┘
└──────────────────────────► (per tracked sponsor)
Manual / scheduled extras:
• Rebuild timelines (Tracked / Milestones) → full connector pass per product
• Refresh landscape (Tracked → Update Data) → micro_sector_landscapes.json
• Tracked: Enrich / Curate → tracked_entities.json (+ curation draft file)
• Data tab: LLM curator → whitelisted JSON files
Other Update Paths
- Rebuild timelines — Tracked or Milestones runs research connectors (CT.gov, FDA, SEC, PubMed, etc.) and writes validated facts to SQLite without waiting for a feed item.
- Per-product ⟳ — rebuild one product from the Tracked table.
- Curate proposal — propose adds/removals for pipeline portfolios; dismiss rows you do not want; apply the rest to
tracked_entities.json. - Weekly jobs — Sunday 02:00 full timeline rebuild; Sunday 08:00 email digest (when SMTP is configured).
Local-First & Auth
The server runs on your machine (python -m waypoint, default
http://127.0.0.1:8765). With auth enabled, the dashboard requires sign-in; this page and assets are public.
Create the first administrator at /register or sign in at /login.
Administrators manage accounts at /admin. Users can request a password reset at
/forgot-password when email and SMTP are configured.
Demo accounts can browse Feed/Milestones/Trends but cannot run ingest, rebuilds, or landscape refresh.
See the project README.md for environment variables, LLM setup, and API reference.