Skip to content

Phase 2 — Implementation

AI-assisted. Use your coding agent freely — please do. Share your screen and think out loud. We're watching how you scope the work, how you direct the agent, and how you review and integrate what it produces, as much as the final code.

You'll do one track, depending on the role you're interviewing for:

  • Track A — General / Backend SWE: a revenue dashboard.
  • Track B — Applied AI Engineer: natural-language hybrid search.

We'll tell you which track is yours at the start of the phase. Both are comparable in scope.

Refer to the Environment page for the API surface and the scaffolding each track builds on.


Track A — Revenue dashboard (General / Backend SWE)

This is a streaming / data-engineering task: read a Redis stream, aggregate, persist, and expose the results through the API and UI.

The task

The worker service is already simulating sales — every sale is appended to a Redis stream. You'll build a revenue dashboard: a backend consumer that reads that stream and aggregates revenue per machine and per region, persists the aggregates, exposes them via the API, and a new React view in the existing UI that shows total revenue, top machines, and a by-region breakdown. Live-updating is a bonus. Use your agent — we want to see how you drive it.

What's provided

The stream contract, throughput, and how to inspect the stream are all documented under Revenue stream on the Environment page. In short:

  • Stream name: vendomo:revenue:events.
  • Fields (all stored as strings): machine_id, region, item, amount (USD as a string), ts (epoch milliseconds as a string).
  • The stream is capped via MAXLEN (trimmed — the full history is not retained), and runs at roughly 8 events/sec.
  • You can inspect it live with redis-cli (XINFO STREAM / XREVRANGE).

You have Postgres and Redis available, plus the existing React UI to mount a new view in.


Track B — Natural-language hybrid search (Applied AI Engineer)

Build a search feature where a user types a natural-language query and the app returns the nearest machines that actually stock the product they want, ranked by distance.

The task

A user types a natural-language query into a new search box — for example, "what's the closest vending machine that has coke near West 42nd Street in New York City" — and the app returns the nearest machines that stock that product, ranked by distance, on a new search UI. You'll build the backend NL→search pipeline and a UI on top. Use your agent — we want to see how you drive it, and especially how you review what it gives back.

What's provided

The details are on the Environment page; the relevant pieces for this track:

  • Per-machine inventory. Each machine's products list is { "product": <name>, "quantity": <int> }, and quantity == 0 means sold out. It's returned on GET /api/machines/{id}.
  • Canonical product catalog. GET /api/products returns the canonical vocabulary (~27 items). Names are canonical — e.g. the catalog has "Cola", not "Coke" — so a user's product term may need to be matched to a canonical name.
  • Geo + metadata. Machines have latitude / longitude, region, status, city, address, and a free-text location_description.
  • Redis 8 with the query engine (FT.*), GEO, JSON, and vector built into core — no modules to install.
  • Anthropic Claude is configured via environment (ANTHROPIC_API_KEY, ANTHROPIC_MODEL), and the anthropic package is installed, so LLM features are ready to use.

You'll build the search endpoint, any LLM/query-understanding piece, the retrieval/index, and the new search UI.