keanan.w
Title
Nuansa
Role
Software Engineer, end to end
Year
2026
Nuansa

Four decades of scattered records, turned into an agentic memory layer that finally gives the business observability.

~20 hrs/wk
manual reporting removed
6,842
item catalog under search
4 apps
one shared backend

The problem

Nuansa is a music retail business in Indonesia, built up over four decades and run on habit, memory, and daily updates over chat. It works. But the business has almost no observability. What sells where, which store is quietly losing money, what a customer asked for and walked out without. The data is scattered across separate systems that never talk to each other, or it lives in one person's head and leaves when they do, so even basic questions about the business can't really be answered.

I researched it, sat with the people who actually do the work, and built it end to end. The constraint was physical: a fixed window on the ground, and it had to be live before I left. The principle was to integrate, not replace. The old systems stay; I built a layer that reads from all of them and reconciles them into one picture, so the business can be ranked and compared instead of guessed at.

What I built

It starts with how staff already work: they send daily reports over chat, and now the system listens. An ingestion pipeline parses each free-text message into structured records at a 90% straight-through rate, with exactly-once semantics so nothing double-counts. Four apps sit on one Postgres backend with cross-app SSO and role-based access: ingestion, an analytics dashboard, a marketing pipeline, and a company hub.

Search matches free-text product names against a 6,842-item catalog at 95%+ accuracy, using cosine-similarity embeddings with LLM re-ranking for the close calls, tuned against a labeled eval harness instead of eyeballed. Years of fragmented sales and accounting records get stitched into one warehouse, so for the first time which store carries the business and which quietly loses money is a question with an answer.

Every inbound message becomes structured line items, matched against the catalog with a confidence score. A human confirms the edge cases, and each correction trains the matcher.
Every inbound message becomes structured line items, matched against the catalog with a confidence score. A human confirms the edge cases, and each correction trains the matcher.

Citta, the company brain

On top of the platform sits an agentic memory layer: atomic, self-linking facts connected in a Hebbian graph, retrieval with provenance, and autonomous agents on a schedule. You ask a question in plain language; it answers from the real numbers, queried live at answer time, never raw SQL. Citta is 'mind' in Pali. The interesting part was that building a memory system for a business meant translating how the people who run it actually think about it into schema, which took real time on the ground to understand.

One brain, any client

The shared memory is exposed over a remote MCP server, so the company brain isn't locked inside one app. Any AI client can reach it: I can catch up on the whole company, summarize what shipped, or create and update tasks straight from my IDE, and it all reads and writes the same store the team's chat uses. Writes land in a review queue, so an agent can propose but a human confirms before anything sticks. It turns the business into something you can query and act on from wherever you already work.

The company brain, queried from an AI client over MCP: catch up, summarize, and write tasks back to the shared store.
The company brain, queried from an AI client over MCP: catch up, summarize, and write tasks back to the shared store.

Agents that do the legwork

Scheduled agents run over the same memory: they take a snapshot, generate candidate insights and actions, then judge their own output and publish or kill each one. Nothing lands unreviewed, so the system proposes constantly but a human still decides. It is the difference between a dashboard you have to interrogate and a brain that surfaces things on its own.

An agent run: generate candidates, judge each, publish or kill. The brain works even when no one is asking.
An agent run: generate candidates, judge each, publish or kill. The brain works even when no one is asking.

Security

A cross-repo hardening pass: row-level security to lock down browser-exposed tables, constant-time secret comparison in webhooks to close timing attacks, and fencing untrusted agent input behind human-review queues before it can act.

Stack  Next.js, TypeScript, Cloudflare Workers, Deno, Postgres, pgvector, MCP