From a single chat box to twenty-five services doing the work.

Communications and marketing teams monitor coverage, track emerging narratives, research briefs and produce content - four different jobs that usually mean four different tools. We built the platform where all of it happens in one conversation: twenty-five independent services, four conversational AI engines, two monitoring pipelines and a governed knowledge layer, wired asynchronously so a long research run never blocks the chat.

Communications & marketing intelligence
25 independent services
Multi-agent on LangGraph
Chat and scheduled monitoring, one product
How a message becomes an answer
request path
WEB

Next.js web appthe user types; the user waits seconds, not minutes

routes
BFF

API gatewayauthenticates, then decides which AI service owns the request

SQS queue
AI

APS · GAS · SAD · CRAresearch, converse, generate, deep-dive

SQS queue
ARPH

Asynchronous response hubpersists the result, then pushes it

WebSocket
LIVE

AppSync subscriptionthe answer appears in the open session

asynchronous end to endnothing blocks the chat
As-builtverified
0
Independent services in the platform
0
Conversational AI services behind the chat
0
Exploration agents over stored analytics
0
Risk dimensions scored on every signal
The client

An AI platform company whose product gives communications and marketing teams one place to monitor media, track risk and narratives, research topics and generate content.

The challenge

Four unrelated workloads - live chat, long-running research, scheduled monitoring and multimedia generation - had to feel like one product, for many companies at once, without any of them blocking the others.

The build

A twenty-five service platform: a routing gateway, four conversational AI engines, two monitoring pipelines, four exploration agents, four knowledge providers and an event hub that returns every result.

How it runs

Queued, never blocking. Every request crosses a queue, every result lands in PostgreSQL and S3, and the browser is updated over a WebSocket rather than left holding a request open.

The client

Four jobs that used to mean four tools.

The client is an AI platform company building for communications and marketing professionals - the people who have to know what is being said about a company before anyone else does, and then say something back.

Their product promises one surface for the whole job: watch media coverage, track the risks and narratives that are forming, research an industry question properly, and produce the content that answers it - text, audio, images, short video. All of it through a chat interface, because that is how the work actually arrives: as a question someone asks in the middle of a working day.

What makes that promise hard is not any single capability. It is that the four capabilities have almost nothing in common. A quick question wants an answer in seconds. A deep research brief takes many minutes and dozens of sources. Monitoring runs on a schedule whether anyone is logged in or not. Generation calls out to external models. Behind one text box sit four very different machines.

What the product does
  • Monitors media coverage across curated and live sources
  • Tracks emerging risks, topics and narratives, continuously
  • Researches industry questions into cited, structured briefs
  • Generates content - text, audio, images and short video
  • Answers questions about any of the above, in conversation
Media monitoring
Risk tracking
Narrative tracking
Deep research briefs
Content studio
Multi-tenant

Two clocks, one surface

The structural fact that shapes the whole platform.

On demand - the conversation

Starts when a user types

  • Sub-second acknowledgement expected
  • Runs from seconds to many minutes
  • One user, one session, one open browser tab
  • Must show progress, not a spinner
On schedule - the monitoring

Starts whether anyone is watching

  • Fires daily from a timer, not a click
  • Sweeps every tracked company and topic
  • Writes analysis nobody has asked for yet
  • Delivers by email and dashboard, not by reply

Between the two sits the question the architecture had to answer: how do you put an unbounded workload behind a live interface? Everything downstream - the queues, the event hub, the WebSocket layer - follows from refusing to make the user wait on a synchronous call.

The challenge

One interface. Four workloads that agree on nothing.

Each capability, taken alone, is a solvable problem. Putting them behind one chat box - for many companies at once, with none of them able to slow the others down - is where the architecture is decided.

Requests with no common shape

"What is the latest on this launch?", "write me a statement", "make a fifteen-second video", "why is this narrative accelerating?" - four requests, four completely different execution paths, one input field.

Research is not one thing either

A quick factual answer and an evidence-graded communications brief are different products. Forcing both through one agent makes the fast case slow and the deep case shallow.

Long jobs behind a live UI

A deep brief can take many minutes and dozens of source fetches. No HTTP request should be held open that long, and no user should watch an unmoving spinner while it happens.

Knowledge spread across stores

News, research, social, government and academic content sit in different collections, each with its own shape - and the live web sits outside all of them. Agents cannot be wired to each one individually.

Monitoring runs on its own clock

Discovery and analysis pipelines fire on a daily schedule, sweep every tracked subject, and produce reports nobody requested. That work cannot compete with a user waiting for a reply.

Multi-tenant from day one

Every company subscribes to its own topics and sees only its own knowledge base. Tenant isolation had to be a property of the data path, not a filter each agent remembers to apply.

Why it mattered

The product is judged entirely on the chat box. A user does not know or care that twenty-five services are involved - they know whether the answer arrived, whether it cited something real, and whether the alert reached them before their CEO saw the story. Every seam in the architecture has to be invisible from the front, and every service behind it has to fail without taking the conversation down.

The mandate

Three non-negotiables, fixed before a line of code.

Focaloid engaged to design and build the platform's services and agent layer. Three constraints were set as hard requirements rather than preferences, and every later decision is downstream of them.

Non-negotiable · 01

Asynchronous by default

Every request crosses a queue. The gateway hands off and returns; the result comes back through the event hub and a WebSocket push. No user-facing call ever waits on a model.

Non-negotiable · 02

One service, one job

Twenty-five services, each with a single responsibility and its own deployment. Routing does not research, research does not persist, persistence does not search. A failure stays where it happened.

Non-negotiable · 03

Configuration over code

A new assistant is a configuration file, not a deployment. Agent behaviour - model, tools, prompt - is declared and loaded at runtime, so the product can add assistants without engineering time.

The decision that shaped everything: the chat surface is the only contract. The frontend talks to exactly two things - the gateway for requests and the WebSocket for updates. It has no knowledge of which AI service handled a message, how many agents ran, or which knowledge store answered. That single constraint is what allowed the service count to grow from a handful to twenty-five without a single frontend rewrite.

A layered path from one request to twenty-five services

P1

The spine

Gateway, queues and the event hub first - the transport that every later service plugs into, built and proven before any agent existed.

P2

The agent layer

Four conversational services, each with the shape its workload needs: an agent graph, a single orchestrator, a middleware pipeline, a config-driven runtime.

P3

The knowledge layer

Four provider services in front of the vector stores and the live web, so agents call a search tool and never a database.

P4

The monitoring engine

Scheduled discovery, deep analysis and digest delivery - plus the exploration agents that let a user interrogate what the pipelines found.

Scope discipline as a design feature

Agents never query a knowledge store directly - they call a provider service. Monitoring never writes to the chat path - it writes to the database and lets the exploration agents read. And no AI service talks to another AI service: everything meets at a queue. What the services are not allowed to do is as much of the design as what they do.

How it works

A question goes in. Work is queued. The answer arrives in the open session.

The gateway classifies and routes; a queue carries the request to the service that owns it; that service does the work with the tools it needs; the event hub stores the result and pushes it to the browser. The same five beats whether the job takes two seconds or twenty minutes.

Answered in the conversation
  • What is being said about this launch right now?
  • Research this category and cite your sources
  • Draft the statement, in our tone
  • Make an image, or a short video, from this brief
  • What did we agree three sessions ago?
Answered on a schedule
  • What surfaced overnight that we should worry about?
  • Which narratives are accelerating, and how fast?
  • How has sentiment moved since yesterday?
  • Who is driving this story, and where did it start?
  • What belongs in this morning's digest?

Watch a question become a cited brief.

The console replays a representative research request: the gateway routes it, the research service classifies intent, plans its angles, searches several sources in parallel, writes a cited report, and the event hub pushes the result back into the live session - each step narrated as it happens.

  • Routed, not guessed. A classifier decides which service owns the request before any work starts.
  • Planned before searched. The request becomes structured parameters and a research plan, not a single query.
  • Several sources, in parallel. Live web, curated knowledge base and full-article extraction run together, then get filtered.
  • Persisted, then pushed. The report lands in the database and object storage before the browser is told it exists.
research service · session #4812 · queued
↻ replay
user"Where is the regulator heading on our category, and who is saying so?"
bffauthenticated · routed to research service · enqueued
classifyrequest type: research · output format: report
intentvalidated - no clarification needed · parameters extracted
plan4 angles: regulatory filings · enforcement · analyst view · press
searchlive web + curated knowledge base + article expansion, in parallel
filtersources gathered · off-topic results dropped · user context applied
writereport assembled with citations against every claim
arphresult saved · artifacts to object storage · pushed over WebSocket
Report ready. Four angles covered, each finding carrying the source it came from. Two of the four returned thin evidence - flagged in the brief rather than filled in. Delivered to the open session; the full report is saved to this conversation.

Illustrative run with representative data. In the delivered platform every step, source and citation is produced from the real request against the client's own knowledge base and the live web.

Architecture

Not one AI application. Twenty-five services that meet at a queue.

The platform is a layered system: one interface, one gateway, a queue fabric, four conversational AI services, a monitoring engine, four knowledge providers, an event hub that returns results, and a data plane underneath all of it. No service reaches past its layer.

Chat-native media intelligence platform - as delivered25 services · 8 layers
Interfacewhat the user touches
Web appNext.js chat, dashboards, content studio
AppSyncWebSocket subscription for live updates
every request in, every result out
Gatewaythe front door
BFF - backend for frontendFastAPI · auth, accounts, companies, workspaces, prompts library, dashboards · ~30 route modules · decides which AI service owns each message
SQS - reliable hand-off, FIFO where order matters
Conversational AI4 services, 4 different shapes
APSmedia monitoring & reports · 8-agent graph on LangGraph
GASgeneral assistant · single orchestrator, memory, image & video
CRAcomms research · 17-stage middleware pipeline, ~40 tools
SADassistant platform · agents loaded from YAML config
tool calls, never direct queries
Knowledge providersthe only way to the data
GKPsemantic search over the curated base, tenant-aware
KBPgeneral chat knowledge retrieval
KBTacademic, government and think-tank sources
WDPlive web search proxy
scheduled, in parallel with the conversation
Monitoring enginediscovery · analysis · orchestration
IIMS · TMSdiscovery - finds issues and topics worth tracking
ICDGS · TCGSdeep analysis - sentiment, timeline, impact, reports
IDS · TMAscheduling and orchestration, multi-tenant fan-out
Knowledge Graphpre-clustered themes, ingested continuously
users interrogate what the pipelines found
Exploration agentschat over stored analytics
MEAissue explorer · orchestrator + 7 specialists
IEAissue explorer with memory across turns
TEAtrend explorer · orchestrator + 6 specialists
TMEAtopic command centre, tenant-isolated
results converge here
Event hub & deliverywhere every result lands
ARPHconsumes every queue, persists results, pushes live updates
NOSSlack, email digests, webhooks, delivery retries
DCS · SASagent catalogue and supporting platform services
Data planestate, vectors, artifacts, schedule
PostgreSQLaccounts, sessions, issues, topics, agent state
Qdrantvector collections behind every knowledge provider
Amazon S3reports, analysis files, generated media
EventBridge · Lambdadaily schedules and dispatch
asynchronous hop tool-boundary call scheduled triggershared library: yaml-config-agent

The as-delivered system - redrawn from the engagement's architecture documentation.

Twenty-five services, by the job they do

Counted as delivered. Each is independently deployed.

Conversational AI4
  • APSMedia monitoring and report research, 8 agents
  • GASGeneral assistant with memory and media generation
  • CRADeep communications research, 17-stage pipeline
  • SADYAML-configured assistant platform
Monitoring - discovery2
  • IIMSFinds new issues and scores them for risk
  • TMSFinds new topics from Knowledge Graph themes
Monitoring - analysis2
  • ICDGSDeep-dives each issue and writes the report
  • TCGSDaily deep analysis of each tracked topic
Monitoring - orchestration2
  • IDSScheduled dispatcher, one message per issue
  • TMADiscovery, tracking and digest in one agent service
Monitoring - exploration4
  • MEAIssue analyst, orchestrator plus 7 specialists
  • IEAIssue analyst that remembers the conversation
  • TEATrend analyst, orchestrator plus 6 specialists
  • TMEATenant-isolated topic command centre
Knowledge providers4
  • GKPMulti-source semantic search, tenant-aware
  • KBPGeneral knowledge retrieval for chat
  • KBTAcademic, government and think-tank collections
  • WDPLive web search behind one interface
Infrastructure5
  • BFFGateway, accounts and dashboard data
  • ARPHResult persistence and live push
  • NOSSlack, email, webhook and SMS delivery
  • DCSCatalogue of agent configurations
  • SASSupporting platform service
Shared library1
  • YCAyaml-config-agent - factory, loader, runtime, schema, middleware and storage backends
Inside the build

The decisions that made twenty-five services feel like one product.

Splitting a system into services is easy. Splitting it so that the seams never show, the failures stay local, and a new capability is a configuration change lives in a handful of deliberate choices. Each one below is as-built.

Decision A - The spine

Queue in, queue out. The gateway never waits.

The gateway authenticates a message, decides which AI service owns it, publishes it to that service's queue, and returns. It holds nothing open. When the service finishes - two seconds later or twenty minutes later - it publishes to another queue, where the event hub picks the result up, writes it to PostgreSQL, stores large artifacts in S3, and pushes a live update to the browser over the WebSocket layer.

That one pattern is why a deep research brief and a one-line reply can share an interface. It is also why an AI service can be redeployed mid-conversation without a user noticing: the queue holds the work, and the result finds its way back to the session that asked for it.

The five beats, every time
  • Route. The gateway classifies and picks the owning service
  • Enqueue. The request crosses SQS, FIFO where turn order matters
  • Work. The service runs its own agents and tools
  • Persist. The event hub writes the result and its artifacts
  • Push. The open session is updated over the WebSocket

No AI service calls another AI service. Everything meets at a queue. It costs a hop, and it buys the property the platform depends on: one service failing degrades one capability, not the conversation.

Decision B - Research

Two research engines, deliberately different shapes.

A quick sourced answer and a full communications brief are not the same product, so they are not the same architecture. The platform runs both, and the difference between them is the most instructive decision in the build.

APS - an agent graph

Eight agents, one path each

Media monitoring and report research runs as a LangGraph workflow with state persisted in PostgreSQL. Each agent owns one decision, and the graph moves forward.

  • Classifier - what kind of request is this?
  • Intent validation - is anything unclear?
  • Intent extraction - turn it into research parameters
  • Planner - what to search for, and where
  • Researcher - run the searches in parallel
  • Writer - assemble the cited report

Plus an instant-chat agent and an output-format classifier - eight in total, over six tools: live web search, full-article extraction, vector search, web-data search, article expansion and user context.

CRA - a middleware pipeline

Seventeen stages, roughly forty tools

Deep communications research is not a loop, it is a production line. CRA runs as a middleware pipeline: each stage transforms the state and passes it on, so a complex brief decomposes instead of spiralling.

  • Intake, then orient and clarify the brief
  • Plan the question into research buckets - one per angle
  • Search and evaluate each bucket in parallel
  • Extract articles, prune crawl responses
  • Grade evidence quality and relevance
  • Assemble a structured brief, then deliver the report

Retry and state-management stages sit alongside the pipeline, so a failed extraction costs one bucket rather than the brief.

The shape follows the workload, not a house style. An agent graph suits a request that needs a decision at every step. A middleware pipeline suits one that needs the same forty tools applied in a dependable order. Forcing either pattern onto the other job would have made the fast case slow and the deep case shallow.

Decision C - Configuration

An assistant is a file, not a deployment.

Every new assistant type used to mean new code: a module, a prompt, a tool list, a release. So the assistant platform was built the other way round. A shared library reads an agent definition - model, tools, system prompt, middleware - from a YAML file and returns a running agent. The service itself contains no assistant-specific logic at all.

Five assistant types run on it as delivered: a multimedia researcher that finds video, podcast and image material for a query; a lightweight quick-chat assistant with no memory; a deep-dive analyst; a video script writer that works from an outline; and a newsletter generator for weekly and monthly sends.

The library is six modules - a factory that builds agents from definitions, a loader that reads and validates the files, a runtime that executes the agent loop, a schema that rejects a malformed definition before it runs, middleware for pre- and post-processing, and pluggable storage backends.

# illustrative shape of an assistant definition
name: newsletter-generator
model: <configured per assistant>
tools:
  - knowledge_search
  - web_search
  - report_template
middleware:
  - state_management
  - output_validation
storage: s3
prompt: |
  You assemble a monthly newsletter from
  the tracked topics for this company...

Shape only - the delivered definitions are the client's. The point is what is absent: no service code changes when this file is added.

Product decisions stop queueing behind engineering ones. A new assistant is a definition file and a catalogue entry, validated against a schema before it ever runs - which is what makes "we should try an analyst variant" a same-day change rather than a sprint.

Decision D - Grounding

Knowledge sits behind a provider, never in front of an agent.

No agent in the platform holds a database connection. Every knowledge store is fronted by a provider service that exposes search as a callable tool, so an agent asks for information and a provider decides how to find it - which store, which collection, which tenant, which date window.

ProviderWhat it frontsUsed byWhy it exists
GKP General knowledge providerCurated base across news, research, social and government content - vector searchAPS, GAS, SAD, TMEASemantic search that understands meaning, and enforces tenant scope at the source
KBP KB providerGeneral chat knowledge - product launches, executive mentions, company newsAPS, GAS, SADThe earlier retrieval path, still serving the general chat use cases
KBT KB academicAcademic papers, government publications, think-tank reports, social and company newsICDGS and the legacy discovery pipelineSpecialist collections that risk analysis depends on and chat rarely needs
WDP Web data providerLive web search behind a single integrationAPS, GASOne place to hold an external search contract, rather than one per agent

Tenancy is a property of the data path. Because search runs inside a tenant-aware provider rather than inside each agent, a company can only ever be served its own knowledge base - and an agent cannot leak across tenants by forgetting a filter, because it never had the option of writing one.

Decision E - Monitoring

Five sub-agents searching became one graph already clustered.

Legacy - risk monitoring

Discovery by parallel search

  • Five sub-agents search five collections in parallel
  • Duplicate articles removed after the fact
  • Related articles clustered at run time, then scored
  • Three services to co-ordinate: discover, dispatch, analyse
  • Single-company scope
Modern - narrative monitoring

Discovery by reading a graph

  • A Knowledge Graph ingests and clusters continuously, ahead of time
  • Discovery reads pre-computed themes instead of re-searching
  • One analysis sub-agent fetches everything it needs internally
  • One agent service handles discovery, tracking and digest
  • Multi-tenant: any company, any number of topics

The newer pipeline also pre-loads: before analysis starts, the run fetches the graph articles it will need in one batch and exposes them as an in-memory tool, so an agent that would otherwise make dozens of round trips makes none. And a history tool injects previous runs' metrics into the context, so the agent is reasoning about a trajectory rather than a snapshot.

The interesting part is what moved, not what was added. Clustering moved out of the daily run and into a continuous ingestion process; gathering moved out of five sub-agents and into one; scheduling, analysis and delivery moved into a single agent service. The risk model stayed identical - the same six dimensions scored the same way - so results from both generations remain comparable.

Decision F - Exploration

The exploration agents read analysis. They do not repeat it.

When a user opens an issue or a topic and starts asking questions, no new research runs. The monitoring pipelines have already written their analysis files to object storage - article summaries, key insights, sentiment, entities, cross-source analysis, extended extractions - and the exploration agents answer from those. It keeps a conversation about a tracked narrative fast, cheap and consistent with the report the user is looking at.

MEA

Issue explorer

An orchestrator over seven specialists: data summaries, sentiment, timeline, claims, authors, business impact and recommended responses.

IEA

Issue explorer, with memory

A lighter single-orchestrator variant that remembers earlier turns, for longer multi-turn conversations about one issue.

TEA

Trend explorer

An orchestrator over six specialists, including a prediction analyst for trajectory and escalation, and a response generator for talking points.

TMEA

Topic command centre

Searches, creates and updates topics across everything a company tracks - with tools injected per tenant and a tenant-scoped virtual filesystem over S3.

Tenant isolation is injected, not remembered. The command-centre agent receives a company context at construction time and its tools are bound to it, so "search topics" can only ever return that company's topics. The agent has no unscoped tool to reach for.

The monitoring engine

A signal is only worth an alert if it can be scored.

Two pipelines run on a schedule: one tracks issues - regulatory actions, controversies, legal disputes, product failures - for a single company; the newer one tracks topics and narratives across many companies at once. Both discover, score, analyse and report. Both use the same six-dimension risk model, which is what makes their output comparable.

ARegulatory & antitrust

Government oversight, legal action, regulatory pressure - probes, fines, new rules landing on the category.

TThreat & controversy

Reputational threat and public controversy - customer backlash, executive scandal, a story that will not settle.

MMarket impact

Financial and competitive exposure - share price movement, a competitor launch, market share shifting.

NNarrative & sentiment

How the framing is moving across sources, and whether analyst and public sentiment agree.

PPropagation

How fast the story is spreading - days to go wide, mentions accumulating across outlets.

SScale & volume

How much coverage exists - article counts and geographic spread over a window.

0 - 20  Low
21 - 50  Medium
51 - 80  High
81 - 100  Critical

A composite score above the configured threshold is what promotes a cluster from noise to a tracked issue or topic.

Discovery, analysis, delivery - three passes a day

A

Discovery

For each subscribed company: read the latest graph themes, filter for relevance, check whether the theme is already tracked, score it across the six dimensions, classify it against the threshold, enrich it, and write it.

New topics get a seven-day backfill so the first report has history behind it rather than a single day of coverage.

B

Tracking

For every tracked topic: pull the latest articles for its cluster, filter off-topic noise, then run the full analysis - sentiment, volume and velocity, timeline, quotes, claims, author profiles, network signals, business impact, risk delta, propagation and narrative characterisation.

Six analysis files per run are written to object storage, and the topic's risk score is updated in place.

C

Digest

Fetch the company's subscribers, aggregate new and updated topics, surface the high-velocity and high-risk ones, gather regional takeaways into a summary narrative, render a branded HTML email and route it for sending.

Delivery is a stage of the pipeline, not a separate reporting job bolted on afterwards.

The enrichment step that changed the product

Scoring tells you how serious a cluster is. Enrichment tells you what it is: a narrative class (regulatory scrutiny, market competition, brand safety, technology trend), a business domain (legal, regulatory, brand and reputation, market and competition, product and innovation), and a tracking threshold - continuous, watch-list or archive. That last field is what stops a monitoring product from becoming a firehose: a topic can be tracked without being escalated.

AspectRisk monitoring - the original pipelineNarrative monitoring - the newer pipeline
Unit of trackingIssuesTopics and narratives
TenancySingle companyMulti-tenant - any company, any number of topics
Service shapeMicroservices - discovery, dispatch and analysis as separate servicesOne agent service handling discovery, tracking and digest
Discovery sourceFive knowledge collections searched in parallel, then clusteredKnowledge Graph themes, pre-clustered ahead of the run
AnalysisFive sub-agents gathering separatelyOne analysis sub-agent with pre-loaded graph tools
Cluster enrichmentNone - classification straight after scoringNarrative class, business domain and tracking threshold
SchedulingA simple daily dispatcher, one message per issueScheduler with fan-out and hourly, daily and digest modes
DeliveryStandalone reportingA digest stage inside the pipeline, sent by email
User explorationTwo agents - one with eight tools, one with memoryTwo agents - a seven-agent trend explorer and a tenant-isolated command centre
Risk modelSix dimensions - A, T, M, N, P, SSix dimensions - identical, so scores stay comparable
Infrastructure

Four data systems, each chosen for one job.

Nothing in the data plane is general-purpose. Relational state, vector search, object storage and the queue fabric each hold what they are good at holding - which is why a twenty-minute research run and a live chat session can share the same platform without contending for the same store.

PostgreSQL

Accounts, companies, workspaces and preferences; chat sessions and conversation memory; the issue and topic tables with their current risk scores; and per-run agent state for the workflow services.

Why: the platform's core objects are relational and heavily queried by the dashboards. Agent state persisted here is also what lets a long workflow survive a restart.

Qdrant

The vector collections behind every knowledge provider - news, research, social, government, academic and think-tank content, each tenant-scoped.

Why: embedding-based search finds material by meaning rather than keyword, which is the difference between a librarian and a search box when a user does not know the exact headline.

Amazon S3

Reports, the six analysis files each monitoring run produces, extracted article summaries and key insights, generated images and video, and the tenant-scoped virtual filesystem the command-centre agent reads and writes.

Why: analysis artifacts are large, written once and read often. Keeping them out of the database keeps the dashboards fast and every intermediate output available for a later question.

SQS and AppSync

Queues carry every request and every result, with FIFO queues where conversation order matters. AppSync holds the WebSocket subscriptions the event hub pushes to.

Why: together they are the reason nothing blocks. The queue absorbs the latency; the subscription delivers the result whenever it is ready.

How scheduled work starts

Timers, not cron on a box

  • EventBridge schedules fire the daily monitoring passes
  • A Lambda dispatcher queries for work and publishes one message per unit
  • The orchestration agent fans out across companies and topics
  • Discovery, tracking and digest run as separate modes of the same service
  • Scheduled work shares the queue fabric, never the request path
How results reach people

Four delivery channels

  • Live updates pushed into the open browser session
  • Real-time Slack notifications when an issue or topic surfaces
  • Daily digest email, rendered branded HTML and routed via SES
  • Webhooks for third-party systems, with delivery status and retries
  • Notification preferences and subscriptions held per user

The platform is not one deployable. Twenty-five services deploy independently - FastAPI for the Python services, Node.js for the event hub, Next.js for the front end, containerised orchestration for the monitoring agent, and Lambda for the dispatchers. The coupling between them is a queue contract, which is what makes that independence real rather than nominal.

Outcomes

What shipped, and what it changes.

We report build facts, not projections. The figures below are as-delivered and verified by the engineering team; the before and after describes how the work changed rather than a claimed metric. Buyers can tell the difference - so can we.

The delivered platform, in countable facts

As-builtverified
0
Independent services, each deployed on its own
0
Conversational AI services behind one chat surface
0
Middleware stages in the deep-research pipeline
0
Risk dimensions, identical across both pipelines
0
Assistant types running from configuration alone
BeforeAfter - the delivered platform
Monitoring, research and content production lived in separate tools and separate habitsOne chat surface routes to whichever of four AI services owns the request
A long research job meant a held-open request and an unmoving spinnerEvery request crosses a queue; results are pushed into the open session when ready
Deep briefs and quick answers competed for one research pathTwo engines with different shapes - an agent graph for decisions, a pipeline for depth
Each new assistant type was code, a release and engineering timeAn assistant is a validated configuration file plus a catalogue entry
Agents wired to individual knowledge stores, each remembering its own tenant filterFour provider services own retrieval and enforce tenant scope at the source
Discovery re-searched five collections daily and clustered the results at run timeA Knowledge Graph clusters continuously; discovery reads themes it has already grouped
Monitoring served a single companyMulti-tenant discovery, tracking and digest across every subscribed company
Reporting was a separate job after the analysis finishedDigest is a stage of the pipeline, delivered by email, Slack and webhook
Failure stays local

One capability degrades, not the conversation. Because services meet at queues and never call each other directly, an image-generation outage does not take research down, and a monitoring run cannot slow a live reply.

Capability without a release

New assistants ship as configuration. Model, tools, prompt and middleware are declared, schema-validated and loaded at runtime - so trying an idea costs a file, not a sprint.

Comparable across generations

The risk model did not change. Both monitoring pipelines score the same six dimensions the same way, so the migration to graph-based discovery did not invalidate the history already collected.

What's next

Built to absorb the twenty-sixth service.

The queue contract and the provider boundary were chosen so the platform could keep growing without a rewrite. The next moves are consolidation as much as addition.

The roadmap

Where it goes next

  • Finish the monitoring migration - move the remaining discovery and analysis services fully behind the orchestration agent, so one service owns the whole lifecycle.
  • Consolidate the knowledge providers - fold the earlier retrieval paths behind the semantic provider so agents have one search contract rather than three.
  • More assistants as configuration - extend the definition schema so richer assistant types are still files rather than services.
  • Measured outcomes - time-to-alert, digest engagement and research turnaround, published once enough live runs accrue.
The reusable pattern

This generalises.

An asynchronous spine, a tool boundary in front of every data store, agents shaped to their workload rather than to a house style, and tenant scope enforced by the data path - the pattern transfers to any product where a live interface sits over work that takes longer than a request.

Chat-native platforms
Scheduled intelligence pipelines
Multi-tenant agent products
Knowledge-grounded assistants
Long jobs behind a live UI

The stack, end to end

Next.js
FastAPI
Node.js
LangGraph
yaml-config-agent
PostgreSQL
Qdrant
Amazon S3
Amazon SQS
AWS AppSync
EventBridge
AWS Lambda
Amazon SES
Slack
Hosted image & video models

Let's build

Have a product with one interface and four workloads behind it?

We design and ship production agent platforms - asynchronous, grounded in your own data, multi-tenant from the first release, and built so the twenty-sixth service does not need a rewrite.