Turn vague user searches into conversions in under 100ms.

Slake designs and ships search systems that cut "zero-result" screens, keep responses under 100ms, and reduce infra spend—deployed to production at ScoutLocal handling real-time query loads.

Deployed to production at ScoutLocal
Book Free Technical Review See How ScoutLocal Scaled
Stack:
Next.js 15 NestJS PostgreSQL Azure OpenAI
At a Glance:
  • Validated hybrid semantic + SQL search for messy queries
  • Designed geospatial fetching that cuts wasted map requests
  • Implemented polymorphic schema + optimistic UI patterns

Built For

SaaS Product Teams

Needing faster search/recommendations without hiring a full-time specialist, so users find what they need in 1–2 taps.

Marketplaces

Dealing with overlapping entities (merchants, events) and heavy read-traffic.

Scaling Startups

Trying to scale past MVP without letting technical debt in search crush your velocity.

The Transformation

The Context: ScoutLocal needed users to find the right venue in 1–2 taps, from vague queries like "vibey coffee spot," without hiring a full-time search team or blowing up infra costs.

Pilot Outcome: In an early semantic search pilot, the team successfully validated a hybrid architecture that handled messy natural-language queries more reliably than the SQL baseline in early tests.

The Friction

Standard SQL search fails on semantic queries. Users don't search for "Category: Coffee"; they search for "espresso near me".

The Risk

Retaining user engagement on mobile requires sub-100ms interaction times. Standard "Load -> Wait -> Render" patterns cause bounce rates to spike.

Hybrid Architecture

The solution is a Hybrid Search Engine that combines the semantic power of Vector Search (Azure OpenAI) with the precision of SQL filters.

1. User Intent "Vibey coffee" → Vector Embedding
2. Semantic Match pgvector finds nearest neighbors
3. SQL Validate Prisma filters by location/hours

Result: Users get relevant results from messy queries, while your team keeps strict control over filters, joins, and analytics.

Efficiency Strategy

The Problem: Mobile maps typically drain battery and spike API costs by fetching data on every micro-movement.

Infrastructure Protection

  • Up to 80% Request Reduction: Scroll and pan events are debounced and bundled, so accidental jitter doesn't hammer your APIs.

Universal Access

  • Device Agnostic: Targets 60fps scrolling performance on low-bandwidth networks, maximizing the addressable market.

Result: lower map-related API costs and smoother scrolling on mid-range devices, without rewriting your entire stack.

Enterprise Data Modeling

In the real world, entities rarely fit into neat boxes. A "Coffee Shop" might also be a "Coffee Roaster" (Maker). Instead of creating three separate accounts, we implemented a Polymorphic Schema.

Why this matters for scaling: A unified identity means you upload a product once and surface it across locations, brands, and events—without duplicate records or sync scripts.

UX Engineering: Optimistic State

Performance isn't just about server response times; it's about Perceived Latency. The solution employs an Optimistic UI pattern for high-frequency user actions.

The Strategy:
  • 1. UI updates instantly (0ms) when user clicks.
  • 2. API request processes in the background.
  • 3. If sync fails, UI self-heals automatically.

This keeps the interface feeling instant even when APIs are under load.

Implementation Spotlight

Below are the patterns used to keep vectors and entities in sync, avoiding "ghost" records and race conditions.

1. Backend: Atomic Integrity

api/embeddings/sync.service.ts

await prisma.$transaction(async (tx) => {
    // 1. Reserve Entity ID (Atomic)
    const record = await tx.embedding.create({ ... });

    // 2. External Vector Gen (Rollback on Fail)
    const vector = await openai.embeddings.create({ input: text });

    await tx.embedding.update({ ... });
});

2. Frontend: Optimistic UI

hooks/useSavedItems.ts

const toggleSave = useCallback(async (id) => {
    // 1. Zero Latency Update
    setSavedIds((prev) => new Set(prev).add(id));

    try {
        await api.post(`/user/saved/${id}`);
    } catch (err) {
        // 2. Self-Healing Rollback
        setSavedIds((prev) => { ... });
        toast.error("Sync failed");
    }
}, []);

Want this level of engineering on your product?

Work With Slake

Technical Review

A 30-minute deep dive into your architecture. Risk-Free Guarantee: If we don't find at least two meaningful improvements to your setup, you get a written summary and can walk away—no obligation.

  • Architecture Audit
  • Bottleneck Identification

Good fit if you already have a live product and real users searching, even if the current search is basic.

Book Free Review

Quick Start Sprint

$2,500 / One-time

A 7-day intensive sprint from Audit to Roadmap. You leave with a concrete, implementation-ready architecture plan instead of a vague "we should improve search someday."

  • Full Architecture Diagram
  • Database Schema Design
  • Implementation Roadmap

Limited to 2 Quick Start Sprints per month to ensure hands-on work.

Kick Off Quick Start Sprint