Waypoint About

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

  • Portfolioportfolio_type in portfolios.json: disease (pipeline worklists), companies (holdings watchlists), or sector (thematic focus via sector_name).
  • Sponsor — Company or program you track (label on a tracked entity).
  • Product — Therapy or program; catalog rows in product_registry.json use brand_name, general_name, and synonyms (code names). Open detail from Trends.

Where Data Lives

StorePathRole
Events & milestonesdata/waypoint.dbFeed events, timeline rows, trial snapshots, synthesized product facts
Portfoliosdata/portfolios.jsonPortfolio ids, portfolio_type, labels, disease/sector focus, eligibility model
Tracked worklistdata/tracked_entities.jsonSponsors, symbols, products, optional IR/news URLs
Product catalogdata/product_registry.jsonBrand, general name, synonyms, indications, approved cohorts
Landscapesdata/micro_sector_landscapes.jsonPer-portfolio competitive bubble data
Curation draftsdata/tracked_entities_curation_{portfolio}.jsonProposed adds/removals before apply
Ingest logsdata/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).

  1. Define portfolio metadata — id, display label, disease name, eligibility profile (dmd or generic). Written to data/portfolios.json.
  2. Select the portfolio in the header — scopes Feed, Milestones, Trends, and Tracked views.
  3. Add tracked sponsors — in Tracked, enter tickers (e.g. VRTX, CAPR) and save. Rows append to data/tracked_entities.json for that portfolio.
  4. Optional catalog — add products and synonyms in product_registry.json (or use Data → LLM curator).
  5. Optional baseline — map tickers to product names in product_baseline.json for faster pipeline seeding.
  6. First ingest — run Run ingest on Feed (optionally scoped with ?portfolio=) to pull feeds, tag events, scrape IR/news, sync trials, and extract milestones.
  7. Landscape — on TrackedUpdate 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

  1. Connectors — RSS and configured sources fetch new items.
  2. Score & store — urgency/relevance, NDA flags; upsert into SQLite events.
  3. Tag tracked — match text against symbols/keywords/products for the scoped portfolio(s).
  4. Milestone extract — new events run through the milestone agent (LLM when enabled).
  5. Sponsor pages — scrape optional investor_relations_url / news_url on tracked entities.
  6. ClinicalTrials.gov — refresh trial snapshots per tracked product; link treatments to NCT ids.
  7. Backfill — scan recent events for historical milestone phrasing (IND, PDUFA, phase starts, etc.).
  8. Product timelines — if trial data changed, rebuild synthesized facts for affected products (research connectors + validator).
  9. Pipeline enrich — when ingest is portfolio-scoped, optional refresh of pipeline entities from recent feed evidence.
  10. 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.