HOME / WORK / KARACHI CHAAT HOUSE

A full restaurant platform for Karachi Chaat House

Everything a busy Chicago restaurant runs on: a custom site, online ordering with first-party delivery, a self-serve kiosk, a live digital menu board, and SMS loyalty at checkout. We designed and built it, and we have run it in production since April 2026. All of it is live, so you can check it yourself.

RESTAURANT PLATFORM · JAMSTACK · SQUARE · UBER DIRECT   karachichaathouse.com
4
Connected surfaces: web · kiosk · menu wall · ad loop
3
Self-serve order channels
1
Source of truth for menu and prices: Square
Pass
Field Core Web Vitals (CrUX)
1.2 s
Real-visitor load time · LCP, mobile
94%
Visits that load fast by Google’s standard
0
Layout shift for real visitors · CLS
1,606
Google Search clicks · Apr 1 – Sep 28, 2026

These numbers come from Google. Speed: Chrome UX Report via PageSpeed Insights — 75th percentile, mobile, all pages on karachichaathouse.com, Sep 4 – Oct 1, 2026. Search: Google Search Console, April 1 to September 28, 2026. Run the same speed test on PageSpeed Insights

The problem

A busy restaurant needs more than a website. It needs one system that takes orders online and at the counter, dispatches its own delivery, keeps the menu on the wall in sync with the register and rewards regulars. It has to stay fast and stay up through a midnight rush. When the rush hits, it tells guests the honest wait, a number the kitchen can keep. Off-the-shelf tools each cover one piece and leave the gaps between them to the staff.

The brief was one hand-built platform with no page builder or template and nothing rented, fed from a single source of truth at the point of sale. It had to pass Core Web Vitals on real phones and be hardened enough to move real money safely. Then we had to keep it running in production ourselves. That work is what we deliver as e-commerce & POS systems engineering and restaurant websites.

Who owns what

Square
The menu, item prices, tax and every payment. The site and the kiosk send Square item IDs, and Square works out the total that gets charged.
Our server
Netlify functions sit between the browser and Square. Before any charge they recompute the subtotal from Square prices, re-quote the delivery fee and check the loyalty limits. A browser total more than ten cents away from Square’s is refused.
Uber Direct
Delivery quotes, dispatch and the courier.
ChaatPass
Loyalty balances and the points ledger, held in Supabase. The ChaatPass case study covers how they are kept in step.

What we built

Custom Jamstack site

Designed and coded by hand, with original food photography and structured data on the menu. It's fast because of how it's built.

Ordering + first-party delivery

A Square-powered menu with online checkout. Delivery is dispatched through Uber Direct. Payment is taken at checkout. If Uber can’t dispatch, the order is refunded in full automatically. On delivery orders the whole tip is passed to Uber Direct as the courier’s tip.

Self-serve ordering kiosk

An in-store tablet that reads the same Square menu and pricing rules as the web and takes payment on its own card terminal, so the counter doesn't become the bottleneck at peak.

Live digital menu board

A three-screen menu wall plus a large-format ad loop, fed live from the point of sale. Change a price on the register and it changes on the wall. There's no second system to update.

SMS loyalty

Rewards redeem on all three self-serve channels, including the QR code on each table. Nobody gets sent to the counter to use them.

Structured for discovery

Every item on the menu page carries JSON-LD, including HalalDiet. Separate pages cover the menu, late-night food, catering and single dishes. The site is structured for search engines and machine-readable discovery.

What has to stay true

The price charged is Square’s price
Orders carry Square item IDs. The amount charged is the total Square computes, and the order is refused if the browser’s total disagrees with it.
A failed delivery gives the money back
When Uber rejects a dispatch, the payment is refunded in full and any redeemed points go back to the member. If Uber’s answer is unclear the order is held, and a job that runs every two minutes either dispatches it or refunds it.
Loyalty can’t block a sale
A loyalty error after payment is logged and the order still completes.
A failed release leaves the live site alone
Every Git deploy runs an integrity and regression gate as its build command. If a check fails the build fails, and Netlify keeps serving the previous deploy.

See it live

This is the platform in the room where it runs. Every surface below is live on Devon Ave. You can see it in person or at karachichaathouse.com.

Karachi Chaat House — live site
The live Karachi Chaat House site, with original food photography
Karachi Chaat House — self-serve ordering kiosk
Self-serve kiosk running the live KCH ordering flow
Karachi Chaat House — three-screen menu wall
Three-screen menu wall, fed live from Square POS
Karachi Chaat House — 100-inch storefront display
100-inch storefront display running an automated promo loop
Karachi Chaat House — system data flow Conceptual, partner/category-level data flow: guest orders through web, kiosk, or table QR into a hand-built app layer that reads menu and writes orders and payments to Square (the single source of truth), records loyalty in Supabase, dispatches delivery through Uber Direct, and sends SMS through Twilio. Square feeds the live menu wall and ad loop. KCH PLATFORM · SYSTEM DATA FLOW How the platform fits together CONCEPTUAL · PARTNER / CATEGORY LEVEL · EVERY PATH LIVE ON DEVON AVE GUEST in-store · online ORDER SURFACES · 3 SELF-SERVE WEB ORDERING custom site · checkout SELF-SERVE KIOSK same flow as web TABLE QR scan · order · redeem APP LAYER Hand-built Jamstack + serverless functions SERVER-AUTHORITATIVE ① NETLIFY GIT-CD IN-BUILD VERIFY GATE ④ CSP · ALLOWLISTED SOURCES CORE SERVICES SQUARE — POS menu catalog · payments · orders SINGLE SOURCE OF TRUTH SUPABASE loyalty state — ChaatPass ③ UBER DIRECT first-party delivery dispatch ② TWILIO SMS — confirmation + loyalty DISPLAY SURFACES · FED LIVE FROM POS MENU WALL & AD LOOP three-screen menu wall + 100″ storefront loop — a price change on the register is a price change on the wall LIVE MENU · PRICE SYNC 1 Server-authoritative — subtotal, delivery fee tiers & loyalty caps are recomputed or checked on the server before any charge. 2 Delivery paid at checkout and refunded in full if Uber cannot dispatch; the delivery tip is passed to Uber Direct for the courier. 3 Loyalty redeems across all three self-serve channels — a guest is never routed to the counter, and a loyalty failure never blocks the sale. 4 Every release ships through an in-build verify-and-assert gate; a failed check publishes nothing and the last good version keeps serving.

The stack

FRONT

Jamstack front end

Vanilla ES6+ with no framework. An enforcing Content-Security-Policy with an explicit source allowlist names, in the header, every origin the page may load from.

COMMERCE

Square · Uber Direct

Square POS is the single source of truth for menu and payments. Uber Direct handles first-party delivery. Square computes the total that is charged, so the browser can't set its own. A stripped-down version of its price check is public: pricelock on GitHub.

BACK

Netlify · Supabase · Twilio

Git-connected CD with a verification gate in the build. If a check fails, nothing publishes. Supabase holds loyalty state and Twilio sends the SMS. Every release is checked on the live site.

Search evidence

We gave each thing people search for its own page: the menu, late-night food, catering and single dishes. Search Console later showed those pages appearing in Google on their own. Six of them are below, with the whole-site totals.

Source: Google Search Console for karachichaathouse.com. Period: 12 months ending September 28, 2026, unless the row says otherwise.
PageClicksImpressionsAverage position
Whole site, 12 months2,044169,325
Whole site since April 1, 20261,606121,933
/order17821,8784.68
/menu918,2113.38
/catering295,3805.71
/late-night245,9643.45
/biryani123,9577.89
/nihari1010,2668.30

First-party figures from a Search Console export downloaded October 1, 2026. They are not estimates from an SEO tool. April 2026 is the month this platform went live.

Limits

  • The 12-month total includes about six months before this platform went live, when an older site was on the domain. The row from April 1 leaves those months out.
  • Average position covers every query a page appeared for, brand searches included. It is not a ranking for any one search.
  • Some of these pages earn few clicks. Search Console shows that they appear in Google. It cannot show that the page structure is the reason.
  • Ordering pages read prices live from Square. The dish pages written for search carry prices from a Square snapshot that a test checks at release, so they can lag a price change until the next release.
  • The tip is whatever the customer enters. The delivery fee comes from the browser and has to match the server’s own quote.
  • The release gate checks files and runs regression tests at build time. It does not call Square or Uber, and a manual deploy from the command line would skip it.
  • Speed figures come from a rolling 28-day Chrome window and will move. The dates are printed with them.

We run this one ourselves

We can build a project and hand it over in full, and the client owns the code outright. This one we also run in production, every day, which is why we show it. You don't have to trust a case study here. The site, the ordering, the kiosk flow, the menu board and the loyalty program are all live right now, and you can press every button yourself.

Verified every deploy

Each release goes through an automated verify-and-assert gate in the build. A failed check publishes nothing. The last good version stays up.

Money path, server-side

The server recomputes the subtotal, re-quotes the delivery fee and checks the loyalty caps before any charge.

Fast on real phones

Core Web Vitals measured on real visitors' devices pass. That is field data, the kind Google ranks on, and it is separate from any lab score.