CampusLookout Platform Architecture

Two-part system: Edge Appliance (on school network) + Central Server (cloud)

School Network (On-Premises)
Student Devices
CampusLookout Edge (port 53 DNS)
Blocked = NXDOMAIN
/
Allowed = Forward to upstream DNS
DHCP points student devices to the Edge Appliance as their DNS server. Every DNS query is intercepted and checked.
📡
DNS Proxy (port 53)
Intercepts all DNS queries from student devices. Checks each domain against central API.
💾
Local Cache
In-memory cache with 1h TTL. Repeat lookups are instant — no API call needed.
📝
Traffic Logging
Every query logged with domain, decision, category. School admin can see all activity.
Central Server (campuslookout.net — 65.109.120.100)
🌐
Caddy + Filter API
Port 80/443 + 8090. Receives domain check requests from edge appliances.
🗄️
PostgreSQL
Port 5432. 11 tables. 64+ classified domains. Blocklist, policies, traffic logs.
🤖
Background Cruncher
systemd service. Polls queue → crawl → ZDR AI → store. Classifies new domains.
Full Request Flow (Edge → Central → Decision)
Student visits site
Edge intercepts DNS
Check local cache
Central API check
Block (NXDOMAIN)
/
Allow (forward DNS)
If domain is in DB → instant decision. If unknown → allowed immediately, submitted to cruncher for async AI classification.
If domain is in the DB → instant decision. If unknown → submit to cruncher queue (async).
Core Services (Server: 65.109.120.100)
🌐
Caddy Reverse Proxy
Port 80/443
campuslookout.net
Auto-SSL (Let's Encrypt)
Filter Gateway
Port 8090
axum HTTP server
50 certified Rust modules
🗄️
PostgreSQL
Port 5432
11 tables
63+ classified domains
🤖
Background Cruncher
systemd service
Polls queue → crawl → AI → DB
ZDR providers only
Database Schema (PostgreSQL — campuslookout)
domains
Domain → category, confidence, source, hit_count
blocklist
51 known-bad domains with categories
cruncher_queue
Pending domains for AI classification
traffic_logs
Every filter decision with reason + timestamp
policies
Per-school category → block/allow rules
schools
Tenant registry with license keys
devices
Registered network devices per school
flagged_devices
Students flagged for review
review_queue
Unknown domains for human review
tickets
Unblock requests and support tickets
sync_log
Federated sync events between schools
Background AI Classification Pipeline (Offline — not in request path)
New domain detected
cruncher_queue (pending)
Cruncher service
Web crawl
ZDR AI Provider
domains table
Cruncher polls every 30s. Crawls website, extracts title/keywords/content, sends to ZDR-certified AI for classification, stores result in DB.
Federated Intelligence (Schools share metadata, not student data)
School A discovers new gaming site
Cruncher classifies it
Central domains DB
School B, C, D...
Instant protection
Only domain metadata (category, confidence) is shared. No student data, no browsing history, no device IDs.
API Endpoints
POST /api/v1/filter/check
Main filter pipeline
GET /api/v1/stats
Dashboard statistics from DB
GET /api/v1/domain/lookup/:domain
Domain classification lookup
GET /api/v1/health
System health check
POST /api/v1/blocklist/*
Blocklist management
POST /api/v1/classify/*
Individual classifier endpoints
POST /api/v1/device/*
Device management
POST /api/v1/dash/*
Dashboard data
POST /api/v1/ai/ticket/*
AI ticket triage
POST /api/v1/sync/*
Federated sync
Privacy Architecture
ZDR Providers
AI requests use Zero Data Retention providers. Data processed and immediately discarded.
No Student Data to AI
AI receives only website metadata (title, keywords, content). No student data.
Local Traffic Logs
All browsing logs stay in school's local DB. Only domain metadata syncs.
FERPA + COPPA
No educational records or student data sent to third parties.
Database / Core
AI / Allow
Block
Supporting