-
Notifications
You must be signed in to change notification settings - Fork 0
Architecture Overview
John Williams edited this page Mar 9, 2026
·
1 revision
ARGUS is a five-layer pipeline built entirely on Cloudflare's edge infrastructure. Every layer is independently deployable and replaceable.
┌─────────────────────────────────────────────────────────────────┐
│ 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
| 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 |
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]
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
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
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