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
Landscape (the map), Signal (the clock), News (the pulse),
Milestones, and Maintain 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
- Landscape
- The map (default home): therapies by development stage and eligible population, with next milestone and momentum from Signal. Highlight rings mark high-momentum programs.
- Signal
- The clock: ranked convergence points (science + data + funding) with plain-language reasons and stalled flags.
- News
- The pulse: latest portfolio-scoped events plus recent feed activity.
- Milestones
- Announcements (dated feed items) and product milestones from IR/news, ClinicalTrials.gov, and synthesized research timelines.
- Maintain
- Worklist of sponsors and products; add symbols, enrich, curate, and run ingest → rebuild → refresh landscape.
- Data / Agent / Zotero
- Advanced tools under the account menu: LLM JSON edits, goal-driven agent chat, and Zotero linking.
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 Landscape.
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 |
| Signal cache | data/signal_cache_{portfolio}.json | 24h cached momentum scorecard + reason lines |
| 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 Landscape, Signal, News, Milestones, and Maintain views.
- Add tracked sponsors — in Maintain, 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 Maintain (optionally scoped with
?portfolio=) to pull feeds, tag events, scrape IR/news, sync trials, and extract milestones. - Landscape — on Maintain → Update Data, run Refresh landscape (LLM) after ingest and timeline rebuilds to update the bubble chart in
micro_sector_landscapes.json(shown on Landscape).
┌─────────────────┐ POST /api/portfolios ┌──────────────────────┐
│ + New portfolio │ ────────────────────────────► │ data/portfolios.json │
└────────┬────────┘ └──────────┬───────────┘
│ select in header │
▼ ▼
┌─────────────────┐ POST …/symbols ┌──────────────────────────┐
│ Maintain: tickers│ ────────────────────────────► │ data/tracked_entities.json│
└────────┬────────┘ └──────────┬───────────────┘
│ optional registry / baseline │
▼ ▼
┌─────────────────┐ POST /api/ingest/run ┌──────────────────────┐
│ Maintain: ingest │ ────────────────────────────► │ data/waypoint.db │
└────────┬────────┘ │ (+ ingest_logs/) │
│ Maintain: Refresh landscape └──────────────────────┘
▼
┌──────────────────────────────┐
│ micro_sector_landscapes.json │
└──────────────────────────────┘
Updating Data (Ongoing)
Most refresh happens through ingest (every 15 minutes automatically, or Run ingest on Maintain). 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 (Maintain / Milestones) → full connector pass per product
• Refresh landscape (Maintain → Update Data) → micro_sector_landscapes.json
• Maintain: Enrich / Curate → tracked_entities.json (+ curation draft file)
• Data tab: LLM curator → whitelisted JSON files
Other Update Paths
- Rebuild timelines — Maintain 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 Maintain 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 Landscape/Signal/News/Milestones but cannot run ingest, rebuilds, or landscape refresh.
See the project README.md for environment variables, LLM setup, and API reference.