Skip to content
All builds
AI systems

MurmurReview Sentiment Dashboard

What it does for you

See what customers love, and which reviews need a reply.

Paste customer reviews and get batch sentiment, aspect heatmaps, trends and a needs-a-reply queue, with an optional Claude second opinion.

Murmur screenshot

Who it's for

Small businesses that collect reviews in several places and rarely read them side by side. It shows how people feel over time and drafts replies to the ones that need one.

Screenshots

Murmur screenshot 1

In more detail

Paste your customer reviews and Murmur tells you how people feel, what they talk about, how that changes over time, and which reviews need a reply. Small businesses collect reviews in several places and rarely read them as a whole. A score per review is easy. Seeing that "speed and wait" went bad in July, and drafting a sensible reply to the urgent ones, is the useful part.

Honest limits

Claude mode is only tested against a fake, never the live API. The 85% agreement is measured against my own demo labels on invented reviews, not real customer data. It runs, it's tested, and it's not battle-hardened.

How I built it

Claude Code wrote the logic core in an earlier session, and then that agent died mid-build because long streamed responses kept dropping. In the final session on September 23, about 0.3 hours, a fresh agent with the tiny-writes brief wrote the tests, 12 small UI modules, the chart palette, and a 20-step headless smoke test, every file in pieces under about 4 KB, one tool call at a time. That got the whole app shipped in one pass.

I set the rules: local mode has to fully work without a key, the cost is labeled an estimate and shows its math, demo data must be clearly invented (a fictional cafe with 120 made-up reviews), and no API calls during the build. The local analyzer handles negation, intensifiers, emoji, but-clause weighting, a mixed label, and confidence, and pulls out ten aspects with their own sentiment. There are six hand-rolled SVG views and a ranked needs-a-reply queue with editable drafts. The optional Claude mode classifies reviews in batches with a concurrency limit, retry with backoff, a progress bar, and a cost estimate, then compares itself with the local analyzer in an agreement matrix.

What I learned

  • Swap fetch instead of mocking the module. A fake fetch in a same-origin iframe gave me a real end-to-end check of the Claude path (headers, 4096 max tokens, a retry after a 529, 13 calls for 12 batches, cost from usage) with zero spend.
  • The local analyzer agrees with my hand-written reference labels on 85% of the demo set (kappa 0.74). Most misses are mixed reviews, where "but" weighting tips a review fully negative.
  • Run the palette validator instead of eyeballing colors. It caught a dark-mode yellow and red pair that full-color readers could barely tell apart.
  • Headless Chrome won't render narrower than about 500px, so a 390px screenshot looks broken when the layout is fine. I fixed the real overflow risks and stopped trusting that screenshot.
  • The Write tool turned escaped em dash checks into literal em dashes, which tripped the no-em-dash test on the tests themselves. String.fromCharCode(0x2014) fixed it.

What carried forward

It's the same pure-core setup I've used since #9: the page and the Node tests share one code path, so the UI never computes anything the tests can't reach. It's also one of seven Claude Code projects in 41 to 50 where a stalled first attempt got finished by the small-modules brief, which is the clearest sign the fix was process, not code.

If I took it further

I'd let you correct a label in the table and feed those corrections back as a per-business lexicon tweak. And I'd run Claude mode against the live API with a small batch before calling it done.

#050 Built with Claude Code September 23, 2026 138 automated checks

Want one like this?