← All work

Souqek

Product discovery
Local search prototype

A search companion for Morocco's market, turning everyday requests into product discoveries with source facts you can inspect.

Souqek — Authentic desktop and mobile captures of my local Souqek prototype, composed for this case study. Landing artwork is illustrative. The search uses a sample request and live retailer listings captured on 26 October 2026; prices and availability can change.

Authentic desktop and mobile captures of my local Souqek prototype, composed for this case study. Landing artwork is illustrative. The search uses a sample request and live retailer listings captured on 26 October 2026; prices and availability can change.

01 / The idea

Start with a need. Follow the evidence.

Finding a product often starts with a need rather than a product name. I built Souqek to connect that first thought to a useful shortlist across Moroccan retailers, keeping the request, the search, and the evidence in one conversation.

A useful search needs more than similar words. It needs to preserve a budget, understand a follow-up, and distinguish a published fact from a missing detail. I wanted the interface to make those distinctions visible without making the person learn the search engine.

My contribution

Product design and development across the visual identity, responsive Leptos interface, Rust search service, and local semantic search integration.

Built with

  • Rust
  • Leptos
  • WebAssembly
  • Axum
  • SearXNG
  • ONNX Runtime

02 / The process

From a request to a reason to click.

  1. Understand the need, keep the constraints

    A pretrained sentence encoder runs locally to connect descriptive requests to product meanings. Rust rules handle exact budgets, brands, stock, and cities. In the captured example, protecting my hands while riding becomes motorcycle gloves under 500 DH. Follow-ups retain context; ambiguous requests ask for clarification.

  2. Show the work as it happens

    SearXNG discovers retailer pages, and the Rust service reads product records and checks their facts. The Leptos interface follows backend events through interpretation, search, source reading, and filtering. The progress screen describes actual work, with the conversation kept beside it on desktop and in a separate tab on a phone.

  3. Separate relevance from verification

    Local embeddings help order retrieved descriptions by meaning. Exact checks decide whether published facts meet the request. Product cards expose their source, price, stock, and check time; missing location evidence stays unconfirmed. A similarity match does not establish compatibility, authenticity, or safety.

  4. Make the next search easier

    A request such as Only Casablanca keeps the previous product and budget. Cheaper alternatives lowers the ceiling using the previous matching prices. Cached results carry their saved timestamp when a live lookup fails, and a labeled keyword fallback keeps the search usable if the local encoder is unavailable.

03 / The result

A shortlist with something behind it.

Souqek brings a conversational request, visible retrieval, and inspectable retailer evidence into a working local prototype. The same mint and charcoal identity connects the landing page to a focused desktop and mobile workspace. The result shown here is an implemented search journey, with source links as the next step.

  • English and French requests with contextual follow-ups
  • Visible search stages driven by backend events
  • Published source facts, seller links, and explicit unknowns

What these captures show

Real interface captures from a sample search against live retailer pages on 26 October 2026. Product images, prices, and stock are retailer-published observations at that time. The separate fictional offline catalogue is a demo mode; it is not the source of the live listings shown here.

Prototype scope

Live search needs internet and a running local backend. Retailer coverage, blocked pages, and missing facts limit results. English and French requests are supported; Arabic and Darija parsing are not. The pretrained encoder supports retrieval without model training or a generative LLM. This case study demonstrates no checkout, retailer partnership, or production launch.