Skip to content
Venitech Talk to us

Technology

We build the infrastructure ourselves.

We build most of the pieces behind the platform ourselves: the map, the menu pipeline, the AI layer, ranking, and how location travels. This page explains how.

Built on

  • Claude
  • Cloudflare
  • OpenStreetMap
  • Wikidata
  • H3

Architecture

One backend, three surfaces.

Restaurant OS, Veni App and the admin panel share one backend and one database. Each domain lives in its own module, in layers whose boundaries are checked automatically.

  • Multi-tenant.

    Every venue and group sits in its own data; every query runs inside a tenant boundary.

  • Real time.

    Orders, the kitchen, messages and notifications travel as event streams.

  • Resilient at the edge.

    Terminals carry signed entitlements, so they keep working safely when the connection drops.

AI layer

Model-agnostic, with clear limits.

  • Veni IQ.

    An operator’s question is routed to the relevant tools among more than 70 across sales, stock, staff, menu, floor and finance. Tools that change anything do not run until the operator explicitly approves; input and output pass separate safety checks.

  • Model chain.

    The primary model is Claude; if a model does not answer, the request moves to the next one in the chain. The choice of model is configuration, not code.

  • Semantic search.

    Dishes and venues are matched with multilingual embeddings, so different spellings of the same dish find each other.

Scout

From menu to data.

A venue’s menu often sits behind a QR code, on one of dozens of different providers. Scout reads these menus with the community’s help and turns them into structured data.

  1. Scan

    A user inside the venue scans the table’s QR code with Veni. Location is verified within 100 metres.

  2. Recognise

    The system recognises which provider hosts the menu. There are separate, tested adapters for 57 known providers.

  3. Read

    Unstructured pages, menu photos and PDFs are read with Claude and turned into categories, items and prices.

  4. Approve

    A person reviews and approves every menu. An empty menu cannot be published.

  • To keep a venue from being added twice, name similarity, a 50-metre radius and the phone number are weighed together.
  • The location metadata of uploaded photos is removed before it reaches the server.

With Claude

A model that reads, a person who approves.

The vision and text steps of our menu pipeline, and Veni IQ’s primary model, run on Claude. The model turns a menu photo, a PDF or an untidy web page into categories, items and prices. The result is never published directly; it lands in a person’s review queue.

The model works from the menu itself rather than fixed rules, so menus from providers without a dedicated adapter can be read too. We also build our software with Claude.

Map

Our own map.

We generate the map ourselves from OpenStreetMap data and serve it from our own infrastructure. Venues, the moments people share and friends sit on the same map as separate layers.

The heritage layer comes from Wikidata. Every source’s licence is tracked separately, according to where that source may be used.

Location

Location does not go to the server.

Stays on the phone

40.9921, 29.0229

Sent to the server

8a1ec90213b7fff

Kadıköy ferry pier. The id on the right names a hexagon of roughly 100 metres; it does not say which point inside it.
  • Fog map.

    On the fog map that clears as you explore, no coordinates leave the phone; only the ids of hexagonal cells of roughly 100 metres do. The day a cell was first visited is kept, the time and the route are not.

  • Live location.

    Live location is off by default. When on, friends see it snapped to a 50-metre grid, and it is deleted within 24 hours. In public mode no name, photo or venue is shown.

  • Blind matching.

    When finding friends from contacts, numbers are masked on the phone and the match is made on the phone (OPRF). The numbers of people who are not on Veni never reach the server.

Ranking

What is alive comes first.

The discovery feed is ranked by a separate service we wrote in Rust. Proximity, liveliness and the quality of engagement are weighed together, with an exploration share so new venues also get seen. If the service does not answer, the app falls back to simpler ranking and the feed keeps going.

Resilience

Nothing is lost when the connection drops.

Shared photos upload in the background and resume where they stopped if the connection drops. Terminals work offline and sync when the connection returns.

How we work

The rules are written in code.

  • One contract.

    The contract between the app and the server is generated from a single schema. If a change would break an older app version, the build catches it.

  • No hard-coded values.

    Prices, thresholds and copy are not baked into code; they live as settings that can change.

  • Every change is tested.

    Type checks, integration tests against a real database and code-quality scans run on every change. Code that computes money and permissions also has mutation and property tests.

  • Closed doors.

    The servers open no ports to the outside; traffic arrives through a Cloudflare tunnel. Backups run every night, every release passes a health check, and a failing one rolls itself back.