A platform that turns news into ranked content before competitors notice the story.

in one sentence

A multi-tenant SaaS that monitors industry news in real time, detects events relevant to each client, and generates SEO-optimised content — with mandatory human approval before anything publishes.

$0
AI cost per client / month
vs $450 without the funnel
0%
articles dropped before generation
funnel does the heavy lifting
0h
news → published target
days compressed to hours
0
industry verticals supported
mortgage, finance, security, devops, …
1News breaks
2Platform detects relevance
3Competitor gap analysis
4AI generates angle
5Human approves
6Published & ranks

Why this exists

Most businesses know they should be publishing content about industry news. They don't — because by the time they read the news, write a post, and get it approved, the SEO window has closed.

The platform compresses that window from days to hours. Every piece of architecture below exists to win the race against time and against competitors.

manual workflow
read write review approve publish
3-5 days · ranks behind 20+ competitors
with the platform
detect → generate → approve → publish
~3 hours · ranks before competitors notice
target verticals · phase 1
mortgage brokers RBA decisions
finance & accounting ASX, tax, super
real estate clearance rates
cybersecurity CVEs, breaches
devops / cloud k8s, AWS, GCP
SEO agencies algorithm updates
health & wellness TGA, NDIS

How it all fits together

Four worker services, one approval service, Redis streams between them, Postgres for state. Click any component to learn what it does.

client / browser / n8n
JWT via cookie or Bearer header
approval-service · FastAPI
/register · /login · /dashboard · /review · /admin/*
ingestion-worker
RSS · CVE · competitor feeds
Gate 1 rules (zero cost)
intelligence-worker
Gate 2 · Haiku scoring
Gate 3 · signals + trends
Gate 4 · Sonnet generation
publisher-worker
WordPress · Dev.to
LinkedIn · Facebook
PostgreSQL
tenants · drafts · publications
Redis streams
news.filtered → content.drafts → approved
→ click any component above to see details

Event flow · Redis streams

news.filtered ingestion-worker → intelligence-worker
content.drafts after Gate 4 generation → approval-service notified
content.approved after human approval → publisher-worker
content.published after successful publish → analytics
news.failed dead letter · ingestion errors
content.failed dead letter · generation / publishing errors

The 4-gate cost funnel

The most important architectural decision in the platform. AI calls are expensive. Every article passes 4 gates. Each gate is cheaper than the next, and drops most of what enters.

1,000
Gate 1 rules engine $0.00
1,000 articles in 100 pass
keyword match recency < 48h source trust exclusions urgency override
drops ~90%
Gate 2 Haiku relevance scoring ~$0.0001 / call
100 in 20 pass
title + 200 char summary only 5 articles per API call score 0-100 per client prompt cached
drops ~80%
Gate 3 signal detection $0.00
20 in 5 pass
source spread Google Trends 60/40 combined urgency override
drops ~75%
Gate 4 Sonnet generation ~$0.015 / call
5 in 5 articles generated
competitor gap analysis injected 8 angles · best fit selected 800-1100 word blog post LinkedIn · Twitter · newsletter
cost without funnel
$15.00/day
every article → Sonnet
cost with funnel
$0.09/day
~99% cheaper
savings
99.4%
drag the slider above to recalculate
monthly cost per client at typical volume
stagevolumecost / callmonthly
Gate 1 — rules30,000$0.00$0.00
Gate 2 — Haiku3,000$0.0001$0.30
Gate 4 — Sonnet150$0.015$2.25
total AI cost~$2.55

At $99/month per client, AI cost is 2.6% of revenue. Without the funnel: ~$450/client/month. Catastrophic.

Source spread × Google Trends

Gate 3 computes two independent signals before deciding to generate. One comes from our own data, one from outside. Drag the controls to see how they combine.

3 outlets in last 2h
spread score 60/100
last 24h search interest
trends score 50/100
combined = spread × 0.6 + trends × 0.4
combined trend score
56
marginal — won't generate
1
source spread · free, our own data

Counts how many distinct sources covered the same topic in the last 2 hours. PostgreSQL full-text search on news_items.title. No external API.

1 source20
2 sources40
3 sources60
5+ sources100
2
Google Trends · free via pytrends

Queries Google Trends search interest for matched keywords, geo-filtered to client location (e.g. geo="AU"). Cached in Redis for 1 hour. Fails open if unavailable.

  • Score 0-100 based on last 24h of search interest
  • Same keyword pair = one API call per hour
  • If unavailable → defaults to 50, pipeline continues
3
why this matters

A story covered by 5 outlets and trending on Google = high ROI. You're writing about what people are actively searching for, before the SEO competition has published.

Urgency override: breaking news always scores ≥ 70, regardless of these signals.

The 8 angles · how we differentiate

Competitors rewrite news. We generate opinionated content with a carefully selected angle. Claude is given the full list and picks the best fit for each article + client combination. Click each card to see how it sounds in production.

local_impact
policy/rate changes with geographic relevance
"What today's RBA decision means for Brisbane first-home buyers in 2026"
action_list
news requiring immediate business response
"5 things mortgage brokers must do after today's APRA ruling"
contrarian
consensus headline misses a deeper implication
"Why the RBA rate hold is actually bad news for Brisbane investors"
faq_explainer
complex topic the audience needs to understand
"Everything mortgage brokers need to know about the new APRA rules"
educational
complex concept, non-expert audience
"Understanding the RBA cash rate: a guide for first-home buyers"
expert_commentary
high-profile event, positions client as authority
"Why the Medibank breach changes everything for Australian healthcare security"
emotional_hook
news with direct personal/financial impact
"The Brisbane families caught in the middle of the housing crisis"
opinionated
significant event, bold take builds authority
"Australian mortgage brokers need to stop pretending rates are temporary"
Adding a new angle: edit intelligence.angles in values.yaml, git push, ArgoCD syncs. No Docker rebuild required.

Competitor gap analysis

Before each Sonnet generation call, we check what competitors have already published on this topic. Three cases, three different prompts to Claude.

case 1 competitor silence · 0 coverage
→ first-mover opportunity
trend_score boosted by +15
claude is told "Publish before competitors. Choose the hardest angle to copy quickly."
case 2 partial coverage · 1-2 competitors
→ extract angles they used
inferred from title patterns · no AI cost
claude is told "DO NOT use local_impact — Competitor X already published that. Pick a different angle."
case 3 heavy coverage · 3+ competitors
→ go deeper or narrower
find audience slice they missed
claude is told "Go significantly deeper or narrower. Generic coverage will not rank."

Angle inference · zero AI cost

We detect competitor angles from title patterns alone. No LLM call. The detected angles are injected straight into the Gate 4 prompt as "avoid these".

"What X means for Y" local_impact
"N things to do after X" action_list
"Why X might be wrong" contrarian
"Everything you need to know about X" faq_explainer

Multi-tenancy & data isolation

Row-level isolation. Every table with client data has client_id UUID. client_id is never trusted from the request body — it comes from the signed JWT only. One bug cannot leak another tenant's data.

per-tenant tables
clients
one row per tenant
sources
their RSS + competitor feeds
client_relevance
per-client article scores from Gate 2
content_drafts
their drafts + selected_angle
publications
their publishing history
shared tables
news_items
one row per article, across all clients
competitor_content
per-client, their competitors' articles

Three tiers of secrets

tier 1
platform secrets
ANTHROPIC_API_KEY · JWT_SECRET · SMTP_PASSWORD
K8s Secret (from SSM in prod)
envFrom on every pod
tier 2
per-tenant secrets
WordPress app password · Dev.to key · LinkedIn token
AWS Parameter Store · /clients/{id}/{platform}/
fetched at runtime by publisher
tier 3
non-secret config
prompts · thresholds · model names · angles
Helm ConfigMap (values.yaml)
envFrom on every pod

How we ship

Two paths. kind for local development, ArgoCD + GHCR for production. Same Helm chart, different values file.

1
create the cluster
kind create cluster --name content-intelligence
kubectl cluster-info --context kind-content-intelligence
2
build & load all 4 images
docker build -t ci/ingestion-worker:dev -f services/ingestion-worker/Dockerfile .
docker build -t ci/intelligence-worker:dev -f services/intelligence-worker/Dockerfile .
docker build -t ci/approval-service:dev -f services/approval-service/Dockerfile .
docker build -t ci/publisher-worker:dev -f services/publisher-worker/Dockerfile .

kind load docker-image ci/ingestion-worker:dev --name content-intelligence
# repeat for the other three
3
create the namespace + secret
kubectl create namespace content-intelligence
bash scripts/create-secret.sh
prompts for: postgres password, anthropic key, gmail, gmail app password, admin password
4
deploy with Helm
helm upgrade --install ci ./helm/content-intelligence \
  -f helm/content-intelligence/values.yaml \
  -f helm/content-intelligence/values-prod.yaml \
  --namespace content-intelligence
5
verify & access the dashboard
kubectl get pods -n content-intelligence -w
kubectl port-forward -n content-intelligence svc/ci-approval-service 8000:8000

# then open:
#   http://localhost:8000/register
#   http://localhost:8000/admin

Changing config without code

prompts & angles
helm/values.yaml
edit → git push → ArgoCD syncs → pods restart
gate thresholds
helm/values.yaml
same → no Docker rebuild
industry verticals
helm/values.yaml
same → no code change
per-client keywords
Postgres · clients table
admin dashboard or PATCH /api/v1/client/profile
secrets
K8s Secret · SSM
kubectl patch → rollout restart

Where we are · where we're going

phase 1 · single-client MVP complete

goal: one paying client. prove the value proposition.

  • multi-tenant DB schema · 12 migrations
  • 4-gate cost funnel · all gates operational
  • competitor intelligence · RSS, gap analysis, angle avoidance
  • 8-angle selection · stored in selected_angle for analytics
  • admin dashboard · audit log, source quarantine, email bypass
  • WordPress + Dev.to publishers
  • multi-provider AI · Anthropic, OpenAI, Google, DeepSeek
  • source health · auto-quarantine, exponential backoff, 3-tier replacement discovery
  • ArgoCD GitOps · GHCR · CSI-synced secrets from Parameter Store

first paying client — in progress via Tomatotree Technologies partnership.

⚡ immediate sprint · before phase 2 now

three things that matter more than any feature.

1
ship to a real client

onboard one pilot client. real data changes everything. one live client > any feature on the roadmap.

2
measure everything

approval rate · publishing speed · ranking improvements · CTR uplift. these four numbers become the sales pitch.

3
don't build — validate

resist the urge to add features until approval rate > 70%. low approval = content quality issue, not a feature gap.

phase 2 · multi-tenant SaaS weeks 7-12

goal: 5-10 paying clients across 2 verticals.

  • LinkedIn · Facebook Pages · Medium publishers
  • Slack approval channel (alongside email)
  • Google Search Console integration per client
  • Client self-service · connect WordPress, add sources from dashboard
  • Stripe billing · email verification flow
  • KEDA autoscaling on intelligence-worker (Redis queue depth)
  • Content memory · pgvector dedup before generation (threshold ~0.85)
phase 3 · intelligence depth weeks 13-20

goal: measurable SEO uplift. differentiation visible.

  • angle performance analytics · which angles rank best per industry
  • semantic deduplication at scale · topic family clustering
  • SEO scoring engine · per-article suggestions
  • FAQ schema markup · structured data for Google
  • content cluster suggestions · pillar + supporting articles
  • Instagram + Ghost publishers · Reddit + Google News sources
phase 4 · scale & enterprise month 6+

goal: white-label · enterprise contracts · trend prediction.

  • Twitter/X publisher · when API cost is justified
  • RBAC · admin / editor / viewer roles per client
  • vector search on content history · prevent near-duplicate angles
  • white-label option
  • competitor keyword gap detection
  • trend prediction · content opportunities before they break
  • API access for enterprise clients
end

That's the platform. Every decision — the 4 gates, the 8 angles, competitor inference, tiered secrets, GitOps deploy — exists to compress days into hours while keeping AI cost at 2.6% of revenue.

Questions? ping #content-intel on Slack.