I went looking to build a HiFi stereo of my own and kept hitting the same wall. Spec sheets don't tell you how a pairing actually behaves, and a lot of the advice that ranks well online is written to earn a commission rather than to get the pairing right. The information was out there, scattered across forums and PDFs and marketing pages, but the whole thing felt disjointed and marketing-driven. So Twochannel became the catalog and system designer I wanted for myself, which meant tens of thousands of products across thousands of brands, each one carrying structured specs, and nobody but me to keep any of it current.
Rather than scrape DOMs and hand-clean the results, I built the ingestion brand by brand, pairing scrapers with Perplexity structured-JSON research as a primary source so the pipeline isn't at the mercy of whatever a brand happens to publish on its own site. An LLM normalizer handles the semantic matches regex can't reach ("P5-SERIES-2" and "P5 2" are the same speaker), and everything routes through human-reviewed semantic dedup before it lands, which I added after an early pass over-merged on me. Model-suffix variants like "1.7i" and "3.7i" look like duplicates and very much aren't, so the pipeline over-recalls on purpose and I review the merges myself.
Existing user-built systems were scraped across the web, helping to build out my knowledge graph and establish a grounded basis for the primary recommendation engine.
- 18k+ products across 2k+ brands in Directus. LLM-augmented pipelines and structured output ingest and enrich them. One person maintains it end to end.
- A Turborepo monorepo. The Next.js frontend runs on Vercel and the Directus CMS on Railway. Algolia handles search and Neo4j holds the brand↔product↔system relationships. Doppler holds the secrets across all three hosting targets.
- Claude Code as the primary development environment. Custom skills, sub-agents, hooks and MCP servers scaffold extensions, build new brand scrapers, maintain schema contracts and run data-quality passes. Saved feedback memories carry the operational lessons forward, so a new session doesn't start from nothing.
- The automated system builder. A wizard collects the things that actually determine a system: budget band, room and listening genres. It hands off to an async job that the client polls until it finishes. Signal-chain adjacency constrains the candidates, so components are only proposed against ones they pair with. Per-category budget allocation stops any single box from eating the whole budget. It returns several complete variants, not one answer.
- 86 Playwright E2E tests across 20 spec files.
The newest piece is a member assistant, a multi-turn agent with 14 tools over the catalog and a member's own systems, a scope classifier in front of it and a grounding guard behind it that rewrites any answer naming a product no tool returned that turn. I picked its model with a bake-off — six eval suites across four models, run against production data — and the first run caught the model inventing product ids, so the product tools now refuse any id they didn't hand out themselves and the rerun came back with zero tool failures. Langfuse arrived with it in September 2026, and every turn opens one trace that the classifier, the tool loop and the member's thumbs-up or -down all land on.
Curation is getting the same treatment. It used to run as a team of Claude Code agents behind approval gates, which caught real defects but stalled 215 brands in, so in October I replaced it with a judged pipeline in application code that runs nightly and in shadow, with a Langfuse eval gate each decision type has to clear before it's allowed to write. It hasn't judged a real product yet and the eval datasets are still empty, so the numbers that matter there are ahead of me.
The catalog is the size a small data team would normally carry, and it's just me. The site is live, the pipelines run on their own, and the system builder is demoed on the homepage of this site.
This is the ML and AI engineering pillar end to end, with the guardrails built around where the models actually fail.