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 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

  • 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 Landscape.

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
Signal cachedata/signal_cache_{portfolio}.json24h cached momentum scorecard + reason lines
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 Landscape, Signal, News, Milestones, and Maintain views.
  3. Add tracked sponsors — in Maintain, 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 Maintain (optionally scoped with ?portfolio=) to pull feeds, tag events, scrape IR/news, sync trials, and extract milestones.
  7. Landscape — on MaintainUpdate 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

  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 (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.