Skip to content

Architecture Overview

John Williams edited this page Mar 9, 2026 · 1 revision

Architecture Overview

ARGUS is a five-layer pipeline built entirely on Cloudflare's edge infrastructure. Every layer is independently deployable and replaceable.


System Diagram

┌─────────────────────────────────────────────────────────────────┐
│  INPUT SOURCES                                                  │
│  Browser Extension  │  Community Submit  │  API  │  Admin      │
└────────────┬────────┴──────────┬─────────┴───┬───┴─────────────┘
             │                  │             │
             ▼                  ▼             ▼
┌─────────────────────────────────────────────────────────────────┐
│  CLOUDFLARE WORKER API                                          │
│  Rate Limiting (KV) │ Auth │ Routing │ Queue dispatch          │
└─────────────────────────────────┬───────────────────────────────┘
                                  │
                    Cloudflare Queue (async)
                                  │
                                  ▼
┌─────────────────────────────────────────────────────────────────┐
│  INGESTION LAYER                                                │
│  Agent-Reach connectors │ Playwright fallback │ Normalizer      │
└─────────────────────────────────┬───────────────────────────────┘
                                  │
                    ┌─────────────┴─────────────┐
                    │    PARALLEL DISPATCH       │
                    ▼             ▼             ▼             ▼
            ┌───────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
            │  IMAGE    │ │  TEXT    │ │BEHAVIORAL│ │ NETWORK  │
            │  ENGINE   │ │  ENGINE  │ │  ENGINE  │ │  ENGINE  │
            │ Hive AI   │ │ GPTZero  │ │ Age/Act  │ │  Graph   │
            │ C2PA      │ │ Stylo    │ │ Footprint│ │ Clusters │
            │ EXIF      │ │ Agenda   │ │ Patterns │ │ Coord.   │
            └─────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
                  └────────────┴─────────────┴────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────┐
│  AGGREGATION & SCORING                                          │
│  Weighted score │ Confidence │ Verdict │ JSON output            │
└─────────────────────────────────┬───────────────────────────────┘
                                  │
                    ┌─────────────┴─────────────┐
                    ▼                           ▼
        ┌───────────────────┐       ┌───────────────────┐
        │   D1 DATABASE     │       │   R2 EVIDENCE     │
        │  profiles         │       │  VAULT            │
        │  disputes         │       │  analysis.json    │
        │  networks         │       │  profile_photo    │
        │  submissions      │       │  manifest.json    │
        └─────────┬─────────┘       └───────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────────────────────────┐
│  ADMIN APPROVAL QUEUE                                           │
│  Human review → Approve / Reject / Escalate                    │
└─────────────────────────────────┬───────────────────────────────┘
                                  │ approved
                                  ▼
┌─────────────────────────────────────────────────────────────────┐
│  PUBLIC REGISTRY (Cloudflare Pages / Next.js)                  │
│  argus.googleadsagent.ai/profiles/[slug]                       │
│  Evidence archive │ Signal breakdown │ Dispute form            │
└─────────────────────────────────┬───────────────────────────────┘
                                  │
                                  ▼
                    Google Search Console Indexing API

Cloudflare Services

Service Binding Purpose Free Tier
D1 DB Primary database (profiles, disputes, networks) 5GB, 25M reads/day
R2 EVIDENCE_VAULT Immutable evidence archive 10GB, 10M ops/month
R2 SCREENSHOTS Profile screenshots 10GB shared
KV SCORE_CACHE 1-hour score caching 100K reads/day
KV RATE_LIMITER Per-IP rate limiting 100K reads/day
KV SESSION Admin session tokens 100K reads/day
Queues ANALYSIS_QUEUE Async analysis jobs 1M messages/month
Queues NOTIFY_QUEUE Email notifications 1M messages/month
Workers Main API + queue consumer 100K req/day
Pages Frontend Next.js public site Unlimited

Data Flow: Community Submission

1. User visits argus.googleadsagent.ai/submit
2. Pastes LinkedIn URL + optional reason + email
3. POST /api/submit → Worker validates + rate limits
4. Submission record created in D1 (status: queued)
5. Job pushed to ANALYSIS_QUEUE
6. Admin notified via NOTIFY_QUEUE → email
7. Queue consumer picks up job
8. Ingestion layer fetches profile data
9. Four engines run in parallel (3–15 seconds total)
10. Profile record created in D1 (status: pending)
11. Evidence archived to R2
12. Score cached in KV (1 hour)
13. Admin dashboard shows new item in queue
14. Admin reviews → approves or rejects
15. If approved: slug generated, status → approved, published_at set
16. Google Indexing API called with page URL
17. Submitter email notification sent
18. Page live at argus.googleadsagent.ai/profiles/[slug]

Data Flow: Browser Extension (Real-Time)

1. User visits linkedin.com/in/someprofile
2. Content script detects profile card in DOM
3. Extracts platform + handle
4. GET /api/score?platform=linkedin&handle=someprofile
5. Worker checks KV cache first (< 1ms if cached)
6. If not in D1: auto-queues for analysis, returns "analyzing"
7. If in D1 and approved: returns score + risk level
8. Badge injected into DOM next to profile name
9. Color: red ≤25, orange ≤40, yellow ≤60, green >60
10. Hover shows tooltip with verdict summary
11. Click opens full landing page

Database Schema Summary

profiles          — every analyzed account (core table)
disputes          — opt-out and challenge requests  
networks          — coordinated account clusters
network_members   — junction: profiles ↔ networks
community_reports — crowdsourced flags from users
submissions       — incoming analysis queue + admin status
watchlist         — profiles being monitored for score changes

Full schema: d1_schema.sql


Repository Structure

argus/
├── workers/
│   ├── api/
│   │   └── index.js           ← Main Worker — all API routes + queue consumer
│   ├── pipeline/
│   │   └── analyze.js         ← Detection engine orchestration
│   └── lib/
│       ├── utils.js           ← ID gen, slugs, rate limiting, platform detection
│       ├── evidence.js        ← R2 evidence vault operations
│       ├── seo.js             ← Sitemap generation + Google indexing
│       ├── notify.js          ← Email notification helpers
│       └── page-generator.js  ← (planned) server-side page generation
├── pages/
│   └── app/
│       ├── admin/page.js      ← Admin approval dashboard
│       ├── profiles/[slug]/   ← Public profile landing pages
│       ├── submit/page.js     ← Community submission form
│       ├── dispute/page.js    ← Dispute/opt-out form
│       └── api/               ← Next.js API routes (thin wrappers)
├── extension/
│   ├── manifest.json          ← Chrome Manifest V3
│   ├── content_script.js      ← Badge injection on social platforms
│   ├── background.js          ← Service worker
│   └── popup.html             ← Extension toolbar popup
├── schema/
│   └── d1_schema.sql          ← Complete D1/SQLite schema
├── wiki/                      ← This documentation
├── .github/
│   ├── workflows/deploy.yml   ← CI/CD via GitHub Actions
│   └── ISSUE_TEMPLATE/        ← Bug, feature, platform templates
├── wrangler.toml              ← All Cloudflare bindings
├── CONTRIBUTING.md
├── SECURITY.md
└── README.md

Clone this wiki locally