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, ingested and enriched through LLM-augmented pipelines and structured output, maintained end to end by one person.
- A Turborepo monorepo — Next.js frontend on Vercel, Directus CMS on Railway, Algolia for search, Neo4j for the brand↔product↔system relationships, and Doppler holding 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, and 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, listening genres — and hands off to an async job the client polls until it finishes. Candidates are constrained by signal-chain adjacency so components are only proposed against ones they pair with, and by per-category budget allocation so no single box eats the whole budget. It returns several complete variants rather than one answer.
- 65 Playwright E2E tests across 6 spec files, green on production. It was a much bigger suite before I cut it down.
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.