The situation
Echo exists because of a previous Tetrifox engagement. In 2024, we embedded a Mino into Teelor — a Dutch staffing agency — to automate their back-office operations around Bullhorn CRM. Part of that build included a ChatGPT-powered candidate matching feature. It worked. Recruiters used it more than anything else we built. But it was bolted onto a CRM that was never designed for AI. Bullhorn's data model couldn't support semantic search, vector embeddings, or the kind of contextual reasoning that makes AI-driven matching genuinely useful.
Teelor's founders saw the gap. They had a decade of recruitment domain expertise, a team of recruiters who understood what "good matching" actually looks like, and a market full of CRM vendors adding AI as a checkbox feature — none of them built by people who had ever placed a candidate.
The founders didn't want a Bullhorn plugin or an AI wrapper around an existing tool. They wanted a standalone platform where AI isn't a feature added on top — it's the foundation everything else is built around. Not an incremental improvement to how they worked. A fundamentally different way of working.
But Teelor is a recruitment company, not a technology company. They had no engineering team, no CTO, and no capacity to evaluate the architectural decisions that would determine whether the product scaled or collapsed. They needed the same embedded model that worked the first time — but scoped for a product build, not process automation.
How we embedded
This was not a cold start. The Mino that built Echo already understood Teelor's domain, workflows, and people from the prior engagement. Instead of spending weeks shadowing recruiters, the Product Owner started from the pain points already identified and went deeper — into the AI-specific opportunities that the first engagement had surfaced but couldn't address within Bullhorn's constraints. The six-person Mino operated as Echo's product team, with Teelor's founders as product stakeholders and direct access to recruiters for feedback.
The discovery phase focused on product discovery, not domain discovery. What should Echo be? Which capabilities deliver value first? Where does AI genuinely improve a recruiter's workflow versus where does it add complexity without payoff? The Product Owner worked alongside Teelor's senior recruiters as a product strategist, not an external consultant gathering requirements.
The AI Engineer's core challenge was translating recruiter expertise into a scoring algorithm. What makes a candidate a good fit? Recruiters know this intuitively — but articulating it as weighted dimensions with explicit thresholds is a different discipline. The scoring weights that power Echo's matching came from iterative sessions with senior recruiters evaluating real candidate pools. The AI Engineer proposed structures; recruiters tested them against their judgment; the weights shifted until the system's rankings matched what an experienced recruiter would produce.
The UX/UI Designer solved the trust problem inherent to AI products. Recruiters won't adopt a system that says "trust me" — they need to see why a candidate scored well. The fit score breakdown visible in Echo's interface makes every recommendation explainable and every score decomposable.
What we built and why
A single-stack TypeScript monolith, not a microservices architecture. The instinct when building an "AI platform" is to reach for Python, separate ML services, and message queues. We didn't. The entire platform — API routes, AI pipeline, embedding generation, vector search — runs as a single Next.js application with Supabase as the database layer. For a six-person team building a v1 product, every additional service is a tax on velocity. The single-stack choice meant any engineer on the team could debug any part of the system.
Cascade matching — fast AI narrows, deterministic scoring decides. A recruiter posts a job and needs a ranked shortlist from potentially hundreds of candidates. You can't run expensive scoring on everyone, and you can't trust a single LLM call to rank them reliably. The cascade architecture solves both: an LLM pre-filter cheaply narrows the full candidate pool to a shortlist based on semantic relevance. A deterministic scoring engine then evaluates survivors across six weighted dimensions. The recruiter sees a ranked top-10 with a breakdown of why each candidate scored the way they did. Not a black-box recommendation.
AI recommends, recruiters decide. Echo doesn't auto-place candidates. The AI generates ranked shortlists and fit scores, but recruiters move candidates through funnel stages manually via a drag-and-drop board. Recruitment is a relationship business. The AI handles the information processing that humans are bad at — scanning hundreds of CVs, cross-referencing skills, surfacing candidates who would otherwise be overlooked. Humans handle the judgment that AI is bad at — cultural fit, timing, the context of a relationship built over years.
We said no to self-hosted AI. The question of self-hosted models came up early — running inference locally to avoid sending candidate data to OpenAI's API. Self-hosting would require GPU infrastructure and ML operations expertise that a six-person team building a v1 product shouldn't carry. Instead, we implemented row-level security at the database layer, scoped every AI query by authenticated user, and designed the integration so that the migration path to self-hosted alternatives is a configuration change — not a re-architecture.
The evidence
16 weeks from concept to production. The scope was not trivial: product discovery, UX design, AI pipeline architecture, six interconnected modules, deployment infrastructure, and recruiter onboarding. The timeline worked because the Mino didn't start from zero. The prior Teelor engagement meant the team understood the recruitment domain, the founders' priorities, and the operational patterns of the business. Discovery that would normally take four to six weeks compressed into two.
Sub-3-second AI matching across the full candidate pool. End-to-end, from a recruiter requesting suggestions to seeing a ranked shortlist with explainable scores. CVs are pre-embedded at upload time, so matching at query time is vector math against pre-computed embeddings — not a cold-start AI call. The system evaluates every eligible candidate in the database and returns a ranked top-10. Nothing is overlooked because a recruiter didn't think to search for it.
What we left behind
Echo is a living product, not a delivered project. The platform runs on managed infrastructure — Vercel for the application, Supabase for the database — which means no servers to provision, no containers to orchestrate, and no DevOps expertise required to keep it running. Teelor's team operates Echo without infrastructure overhead.
The AI layer is designed for independent evolution. Each AI function reads its model from a dedicated environment variable — swapping to a future model is a configuration change, not a code change. Prompt templates are organized and documented separately from application logic: when Teelor's team wants to adjust how Echo communicates, they edit prompts.
Scoring weights, thresholds, and parameters are externalized as typed configuration separate from the scoring logic. Teelor can tune how Echo evaluates candidates without touching the scoring engine.
The single-stack TypeScript architecture is a deliberate handover decision. A single generalist developer can maintain and extend the entire system — frontend, API routes, AI pipeline, database queries — without navigating service boundaries, polyglot toolchains, or deployment orchestration. Teelor inherited a codebase where the distance between understanding a feature and changing it is as short as we could make it.
