Nesil Noble  ·  Case studyInternal tool  ·  Shipped 2026

Temple

Where Malayali Kada runs…

The internal dashboard that took Malayali Kada’s weekly delivery off pen and paper.

Every week, five co founders grouped orders by hand, wrote every packing slip, drew the route on paper and worked out profit on a calculator. Spreadsheets, Shopify’s dashboard and inventory apps all failed. I designed Temple in Figma and built it with Claude Code.

Temple Delivery home: a greeting with 22 orders to fulfil, an Order Health comparison, orders split across Ecity, Begur and Others, and the orders table.
Sample dataDelivery, the week of 5 to 11 September 2026. Member names and flat numbers replaced; real figures withheld.
At a glance
Role
Sole designer and builder. Also a co founder of Malayali Kada.
What I owned
Problem definition, information architecture, wireframes, hi fi screens in Figma, a written spec for every screen, every data rule, testing against live orders, every deploy.
What I didn’t
The code. Claude Code wrote it from my specs. I directed, reviewed and tested it; I didn’t write it by hand.
Users
The five co founders. The delivery person never logs in; they only receive what Temple produces.
Timeline
Started 22 May 2026. Inventory and Delivery live by the end of May. Finance live in June.
Status
Shipped and in use. Web, on laptops and phones, behind a sign in.
Stack
Next.js, Shopify Admin API, Google Sheets, Upstash Redis, Vercel.
Budget
None for software. That constraint shaped everything below.

Inventory

Stock across two locations, and the list of what to restock.

Delivery

Orders, sourcing, packing slips, routes.

This page follows Delivery

Finance

A weekly ledger with cost frozen per order.

Context

A Kerala food store in Bengaluru, two stock locations and one delivery run a week.

Malayali Kada sells homemade and small batch Kerala food to Malayalis in Bengaluru. Orders come through a Shopify store. Stock sits in two places, Electronic City and Begur, and delivery runs once a week, by choice.

By May 2026 the store had outgrown the way we ran it: WhatsApp groups, spreadsheets, and pen and paper. There was no budget for an analytics product or a delivery app. So I designed the tool and built it. We named it Temple, after the building at the centre of a Kerala village.

The problem

Shopify could tell us what sold. It couldn’t tell us what to pack, for whom, or in what order.

Shopify’s analytics dashboard is built for a bigger store: too much information, too many trackers, and none of the answers a weekly run needs. It shows stock, but not what to restock across two locations. It lists orders, but can’t group them by building, print a slip or plan a route. So every week, the same six jobs were done by hand.

Before, every week
Now, in Temple
Open Shopify, check two locations, guess what needs restocking
A restock list, split by location
Scan addresses to find orders going to the same building
Orders grouped by building
Write a packing slip for every order
Four slips per A4 sheet, printed
Work out who sources which items for which orders
One sourcing list per founder
Draw the delivery route on paper
A WhatsApp message in drive order
Excel, a calculator, and a script someone ran every Sunday
A weekly ledger that updates itself
Evidence

No research budget. The evidence was our own weeks and the orders in Shopify.

I didn’t run interviews or a survey. The users were the five founders, me included, and I did the weekly routine myself. I worked from that routine, the live Shopify orders, the pricing and sourcing sheets we already kept, and every failure that real data exposed once Temple was running.

The limit is plain: this is a tool designed by one of its five users. It proves the design worked for us, not that it would work for anyone else.

When a week’s orders close, I want them grouped by building, so one stop serves every order there.
When we pack, I want a printed slip for every order, so nobody copies an address by hand.
When the route goes out, I want it in the delivery person’s WhatsApp, so they never need our tool.
When I read profit, I want each order to keep the cost it sold at, so last month doesn’t change when a price does.
The turn

A weekly delivery doesn’t need a dashboard to look at. It needs two things it can hand over: a WhatsApp message the delivery person can follow, and a sheet of paper someone can cut.

Once I saw that, the brief changed. Every screen in Delivery exists to produce those two outputs correctly. The charts are secondary.

Output one: the route, in the order it is driven

GM Infinite Ecity Smondo 2 Green Terraces MJR Clique Hercules Concorde Manhattans Gopalan Lakefront MK 1882 GM Infinite Ecity Mob: +91 90000 00001 MK 1879 GM Global Techie Town Mob: +91 90000 00003
24buildings on the
Ecity route map
4on the
Begur map
1message, pasted
into WhatsApp

Output two: four slips to a sheet

cut
4slips per
A4 sheet
2cuts per
sheet
1:1print scale,
from any device
Options and tradeoffs

Spreadsheets survived as the database and died as the interface.

We tried the obvious tools before building anything. Each one failed at a specific job, and one of them earned a second life inside Temple.

The problem, stated as constraintsFive founders. One weekly run. Two stock locations. No budget.
Killed

Shopify’s dashboard

Too many trackers for five people, and no way to group orders by building, print a slip or plan a route.

Killed

Inventory apps

They covered stock, not the delivery run. The budget couldn’t stretch to one paid tool per job.

Kept, as data

Spreadsheets

The founders already maintained the pricing and sourcing sheets. Temple reads them directly: no migration, nothing new to learn.

Chosen

Build it ourselves

The cost: I become the maintainer. So it’s plain JavaScript, inline styles, no component library, one file per module. Choices I can read.

No software budgetShopify is the only backendSheets stay the source of truthA non engineer maintains itVercel Hobby planOur phones: 768 to 820 px wide

Three things I built, then reversed

Routing by pincode

Shopify hands you a pincode, so version one sorted orders by it. Then an order from a Lakeview address, a building already on our route map, landed in Others. A pincode describes a post office, not a road.

Making Order Health consistent

I matched both bars to unfulfilled orders, then put Last Week back to all orders. This week is a to do count; last week is a volume reference. Consistency was the wrong instinct.

Reading cost live

Profit read cost from the sheet on every load, so one edit to a cost rewrote every past week. Revenue was already frozen by Shopify at checkout. Cost was the missing half.

The solution

Five decisions, in the order the week happens.

When orders close

Sourcing is split by founder, and labelled with the name printed on the slip.

Unfulfilled orders become one list per founder, using the owner column of the sourcing sheet. Shopify titles and sheet names never match exactly, so a matcher compares word sets; I tested it against 24 real product titles before it shipped. Anything it can’t place is listed as unmapped: a to do for the sheet. Lists show Shopify’s name, because that is the name the packer reads.

Fulfilment Dependency tab: one card per founder listing products and unit counts to source, with an empty state reading Nothing to source.
Sabin’s card shows the empty state, “Nothing to source”, instead of hiding the card: every founder can see the whole week.
When we pack

Four slips to an A4 sheet, cut guides included, printed full size from a phone.

On a phone the preview is scaled to half, so a whole sheet fits the screen. The print always comes out full size, because it renders in its own window with its own styles. Red dashed guides mark the two cuts. The slip carries the Malayali Kada logo, not Temple’s: members see the slip, never the tool. One tap adds every order to the print queue.

Printing Paper view: a queue of order numbers on the left and a preview of packing slips with red cut guides on the right.
The browser print dialog showing one A4 page holding four packing slips with cut guides.
Sample dataLeft, the print queue. Right, what reaches the printer: four slips on one page.
Before the run

Orders are routed by the building in the address, not the pincode.

Each region has a root route map: its buildings, in the order they are driven. Temple scans every address for a building on those maps. Anything unmatched goes to Others, which turned from a dumping ground into a to do list of orders that aren’t on a route yet. Pincodes are still stored, but never used to route.

Edit Root Route Map: 24 Electronic City buildings in numbered cards that can be dragged to reorder.
Route Map footer warning: 7 orders in this date range don't match any block in the route maps, see the Others tab.
The warning that proves the reversal: seven orders this week sit outside every route, and Temple says so instead of guessing.
Dispatch

The route leaves Temple as a WhatsApp message, in drive order.

The delivery person has no login and needs none. Generate Preview writes one message with the order number, address and phone for every stop, in route order. Copy, paste, send. The design goal was an output someone else can use without ever learning Temple.

Route Map tab for Ecity: stops listed in drive order on the left and the generated WhatsApp message preview with a Copy button on the right.
Sample dataPhone numbers and flat numbers replaced.
When the week closes

Every order keeps the cost it was sold at.

The ledger runs on our own finance week, Saturday to Friday 10 pm IST, and rolls up to months and years. Revenue is the price Shopify recorded at checkout. Cost is frozen per order line the first time Temple sees it, so a cost edit in the sheet only affects orders after the edit. Tips are excluded, and a 500g pack can never match the 1kg row.

Finance home: business health and product health cards, a product of the period card, and a yearly ledger table.
Sample dataAll revenue, cost and profit figures replaced. Real figures withheld.
Craft

Dark cards, light tables. Long lists of names and numbers read better on paper.

Temple’s cards sit on a near black green, and every table inside them is light. The switch is deliberate: the dark carries summaries you glance at, the light carries rows you read. One accent, a pale lime, marks what needs action: the active tab, the primary button, the figure that matters.

#212522
NightApp background
#262B27
RoomCards and surfaces
#4C564E
SidebarThe floating nav capsule
#E6F493
LimeOn Night: 13.1:1
AAA
#FFFFFF
PaperNight text on Paper: 15.5:1
AAA
#CCE2BB / #213B29
ConnectedShopify status pill: 8.8:1
AAA
#F07D0B
Low stockOn Night: 5.7:1
AA
#E42222
Out of stockOn Night: 3.4:1
Large text only

Hi Nesil,

Urbanist Bold · 44 / 48 · the greeting that states the week’s job

welcome to MK Temple. You have 22 orders to fulfil

Urbanist Regular · 22 / 31 · one count, coloured, so the number is the sentence

55%

Matrix Sans Print, used once: the inventory health numeral. Shown here in Doto, a close dot matrix cousin.

A second typeface, allowed exactly one job. Health is the one number that should look like an instrument reading, not a label.

Inventory home: a dot matrix health percentage, total stock split between Ecity and Begur, low stock counts, and the product table.
Inventory, the first module built. Health numeral in Matrix Sans Print, stock split by location, out of stock rows tinted.

Five mobile bugs, one line of code.

After the first mobile pass I logged five bugs: a sticky bar covering content, a clipped print popup, a calendar running off screen, cramped drag handles, a table that wouldn’t reflow. The fixes for all five already existed. Our devices measured 768 to 820 pixels wide, just above the 760 breakpoint, so they were being served the desktop layout. Moving the breakpoint to 900 fixed all five at once.

600 px
700
800
900
760, before
900, after
Outcome, qualitative

The notebook is gone. The weekly cost form is still typed by hand.

No time study was run, so this is qualitative. The founders’ own estimate is that the weekly routine now takes hours less. [METRIC NEEDED: weekly prep time before and after Temple, as a founder estimate, and who did the work]

Retired

GoneHandwritten packing slips
GoneThe route drawn on paper
GoneGrouping orders by eye
GoneProfit on a calculator
GoneThe script run by hand every Sunday

Not solved

Business costsDelivery, fees and corrections are still entered by hand each week.
BundlesThe Adukkala Box has no cost yet, so it sits outside profit.
Name driftProduct names still drift between the sheet and Shopify. Temple surfaces the drift; it doesn’t fix it.

Two things on these screens are still wrong.

The Order Health badge compares this week’s unfulfilled orders with last week’s total orders, so its percentage means nothing. And years with no orders are labelled “PROFIT ₹0” with a +100% badge, when they should read as no data. Both are on the fix list; I’d rather show them than crop them out.

Reflection

I started from the fields Shopify gave me, not the road the delivery person drives.

Pincode routing was the most expensive mistake in the build, and it came from designing around the data I had instead of the job being done. The route map, the order of buildings on an actual drive, was the real model all along. Next time I’d map the physical routine first and fit the data to it second.

May 2026Naming and first mock
MayInventory, live Shopify stock
MayDelivery
We are hereJuneFinance
NextAutomated weekly summaries
LaterMore delivery zones