Components

  • apps/pulse-ingest: ingestion worker for uploads, queue consumption, parsing, dedupe, AI summarization.
  • apps/pulse-public: public JSON + HTML endpoints and admin helpers.
  • R2 bucket: beacon-pulse-exports (raw exports).
  • Queue: beacon-pulse-uploads (ingest trigger).
  • D1 database: beacon-pulse-db (exports, hashes, digests, summaries, metadata).
  • Workers AI: daily and weekly models for summaries.

Sources: beacon-platform/README.md, beacon-platform/docs/architecture.md, beacon-platform/docs/operations.md


System overview

flowchart LR
  Uploader -->|POST /presign| IngestWorker
  IngestWorker -->|objectKey| Uploader
  Uploader -->|PUT export| R2Bucket
  R2Bucket -->|ObjectCreated| UploadQueue
  UploadQueue --> IngestWorker
  IngestWorker -->|hashes/digests| D1
  IngestWorker -->|AI daily/weekly| WorkersAI
  PublicWorker -->|GET /pulse.json| D1
  PublicUser -->|GET /pulse| PublicWorker

Sources: beacon-platform/docs/architecture.md


Ingestion pipeline (WhatsApp)

sequenceDiagram
  participant Uploader
  participant Ingest as PulseIngest
  participant R2 as R2Bucket
  participant Queue as UploadQueue
  participant Parser as WhatsAppParser
  participant Dedupe as DedupeEngine
  participant AI as WorkersAI
  participant DB as D1

  Uploader->>Ingest: POST /presign
  Ingest-->>Uploader: objectKey
  Uploader->>R2: PUT export file
  R2-->>Queue: ObjectCreated event
  Queue->>Ingest: queue message
  Ingest->>R2: read file
  Ingest->>Parser: parse export
  Parser-->>Ingest: messages
  Ingest->>Dedupe: content+sender hashes per day
  Dedupe->>DB: read/write message_hashes
  Dedupe-->>Ingest: new messages only
  Ingest->>AI: generate daily digest
  AI-->>Ingest: daily sentiment/themes/summary
  Ingest->>DB: upsert daily_digests
  Ingest->>AI: generate weekly summary
  AI-->>Ingest: weekly summary
  Ingest->>DB: upsert weekly_summaries_public

Sources: beacon-platform/docs/architecture.md


Public read path

flowchart LR
  Browser -->|GET /pulse| PulsePage
  PulsePage -->|fetch| PulseJson
  PulseJson -->|query| WeeklySummaries
  Browser -->|GET /pulse/history.json| HistoryApi
  HistoryApi --> WeeklySummaries
  Browser -->|GET /pulse/daily.json| DailyApi
  DailyApi --> DailyDigests
  Browser -->|GET /pulse/trends.json| TrendsApi
  TrendsApi --> WeeklySummaries
  Browser -->|GET /pulse/embed| EmbedPage

Sources: beacon-platform/docs/architecture.md


Public vs private data boundary

flowchart LR
  subgraph PrivateZone
    RawExports
    MessageHashes
    DailyDigestsTable
  end
  subgraph PublicZone
    WeeklyPublic
    PulseApi
    PulseHtml
  end
  RawExports -->|parse + hash| MessageHashes
  MessageHashes --> DailyDigestsTable
  DailyDigestsTable --> WeeklyPublic
  WeeklyPublic --> PulseApi
  PulseApi --> PulseHtml

Sources: beacon-platform/docs/architecture.md, beacon-platform/docs/privacy.md


Key behaviors

  • Parsing supports multiple WhatsApp export formats and multi-line messages.
  • Deduplication is keyed by (community_id, source_id, day_date, content_hash) with sender hashing for unique counts.
  • Daily digests are capped to 1000 messages per AI call, redacted for PII, and validated against JSON schema and privacy checks.
  • Weekly summaries are generated from daily digests only and require >=3 days or >=20 messages.
  • Sentiment trends are computed via confidence-weighted linear regression over weekly summaries.

Sources: beacon-platform/docs/architecture.md, beacon-platform/docs/privacy.md, beacon-platform/docs/operations.md