Shray Shrotriya

Toronto · Founder-operator

Shray Shrotriya

I built the business, then I wrote the software it runs on.

I own and operate Quaza Inc., a Toronto export commerce company, profitable in its first half. I wrote the iOS app it sells through and the Cloudflare backend that both the app and the website read from. Before that I rebuilt ATR Sports' online store and grew it more than six times over in a year, as the only person on it.

I learned Swift by shipping that app. Ten days from the first commit to the App Store. That is how I work: I pick a thing up by building something real with it, and I am at production speed in days. Everything below is something I shipped.

first commit ten days live on the App Store Apple review included
The numbers

Measured, not claimed

First half of 2026 unless stated, reconciled against live platform analytics, the raw bank ledger, marketplace exports, purchase invoices and the filed tax returns. These are rates and counts rather than revenue, which is a choice: a rate is the part that is mine, and it is the part that transfers.

515%
Online sales growth in the first year at ATR Sports
Sales had been flat for three years ยท I rebuilt the store
82%
Total company sales growth in the same year
The online store was the part that moved
47.7%
Gross margin on my own store
Cost of goods costed line by line, 97% invoice-verified
385 / 402
Orders fulfilled, built alone, part-time, while employed full-time
Into more than 15 countries
10,887
Agent tool calls across 9 days on hardware I run
325 transcripts ยท 12 scheduled jobs firing logged out
90x
Reduction on the hot database path
35,000 rows per call, precomputed to 1
Builds ยท selected

Five builds, deliberately unalike

A status console, a commerce storefront, a native app, a warm community site and an editorial studio page are five different design problems, not one look shown five times. Three of these are open in a browser right now.

A dark full-screen status console. Panels show commerce figures with values masked, a node graph of connected systems, machine temperature and load gauges, a market column, a voice input bar, and a price index with per-set sparklines.
Designed and built it

A status console that never sleeps

A full-screen operations display for the business: live commerce figures, machine load, market instruments and a voice input, running continuously on a wall-mounted screen.

It is built to a written performance budget and holds it. Idle cost is measured rather than assumed, and the reduced-motion path drops it by an order of magnitude.

Canvas ยท SVG ยท Python
The Quaza Collect storefront on desktop: the sealed products grid with prices, sale and sold-out states, under a section heading and a view-all link.
Own it and run it

quazacollect.com

My own export commerce storefront. I customised the theme across 48 JSON templates, 68 sections and 18 theme blocks, and the price surfaces are authored as sections rather than installed as an app, so they are mine to change.

218 commits on the deploy branch. Pushing the branch is the deploy, and a change goes through an adversarial review before it gets there.

Liquid ยท GraphQL ยท Shopify Open the store
2.1.1
Live on the App Store
four releases in 24 days
Wrote it, solo

Quaza Collect for iOS

A native app, written alone: 98 Swift files and roughly 12,400 lines of SwiftUI and Swift Concurrency, with hand-written GraphQL over URLSession and no vendor SDKs.

Four releases in 24 days. It reads the same backend the website reads, so the two surfaces can never quote different prices, which was a deliberate constraint.

Swift ยท SwiftUI ยท Cloudflare App Store
The Reach Community Church website, showing a warm photographic hero with service times and a welcome message.
Built it, at no charge

reachcommunitychurch.ca

A site for a church I attend. Warm where the rest of this page is cool, because the audience is a congregation rather than a hiring manager, and the design brief follows the reader.

The part that matters is not the generosity. It is that the same person can hold two design languages and not let either one leak into the other.

Design ยท Build ยท Content Open the site
The Six Stones share card. A near-black starfield with a small planet mark, the line "We launch brands into global orbit" set in a serif italic, and a mono footer reading Digital Growth Studio.
Designed and built it

thesixstones.com

The site for my services practice. A single long page with a hand-written shader for the globe, not a charting library, and a sustained metaphor carried through the copy.

3,091 lines of TypeScript across 22 files, and no component library. Every element on the page was drawn rather than installed.

React ยท TypeScript ยท three.js Open the site
Case studies

Rebuilt here, not screenshotted

Three interfaces I built, running on this page. Scrub the chart. Watch the console move. Run the publishing pipeline.

iOS ยท SwiftUI

The Prices tab

App Store

A market-data client inside a shopping app: price history with touch scrubbing, a watchlist, 7-day movers, separate Sealed and Singles markets, and 46 indexes. It reads a Cloudflare Worker over D1 that I also wrote, so the app and the website can never quote different prices. Hand-written GraphQL over URLSession, no vendor SDKs.

Prices

Sealed indexSLD-IX
105.41latest
low 104.14high 105.62
Sealed movers, 7 days

Illustrative data, not live.

What the frame is doing

Markets
Sealed and Singles are separate markets in the app, with their own index and their own movers. The segmented control switches both.
Scrub
Drag the chart with a mouse or a finger. Focus it and the Left and Right keys step one sample, Page Up and Page Down step further, Home and End reach the ends of the range.
Ranges
7D reads a sample every six hours. 30D and 90D read daily closes, which is why the same series looks smoother the further back it goes.
Rows
The index card and the four movers each chart themselves. The movers are the two strongest and the two weakest seven-day changes, sorted from the data.

The figures are illustrative. Every series here is a seeded random walk computed in this component, not live market data.

The app is native iOS: SwiftUI with the Observation framework and Swift Concurrency, hand-written GraphQL over URLSession, no vendor SDKs. The Prices tab reads a Cloudflare Worker in front of a D1 database. This is a recreation of that tab in one React island, with the chart drawn as SVG rather than pulled from a chart library.

Always on

The operations console

A wall-mounted display showing the state of the business and the machine running it: load, scheduled jobs, agent activity and market instruments. It runs continuously to a written performance budget, and it stops painting the moment nobody is looking at it.

Illustrative readings from a fixed seed, not live data from the machine. The panel stops painting when it scrolls off screen or the tab is hidden.
Publishing system

Quaza News

Read the blog

A news blog produced by a pipeline, not typed into an admin. A per-post build renders each article from a shared component library, a verification pass and a regression guard check the output, and publishing goes through the Shopify Admin GraphQL API: images to the CDN first, then the article, always as a draft. The left frame is the article template it renders. The right column is the pipeline, and you can run it.

The rendered article

Quaza News

Example Set: a quiet month for sealed

Sealed held, singles drifted, and the reprint question stayed open.

illustrative post ยท 3 min read

Where prices sit

Sealed boxes of Example Set ended the month close to where they began. Singles from the set drifted a few points lower, led by the alternate arts.

None of this is real. The set, the cards and the figures are invented for this page.

What moved

The chase card of the set gained on thin volume, which is the kind of move that fades. Mid-tier holos sat flat, and listed supply held steady all month.

The reprint question

A reprint would reset most of the numbers above, and rumours of one arrive on schedule. Until an announcement lands, every figure here stays what it is: an illustration.

Sharecopy linkpost

Related posts

Illustrative article, not a real post.

The pipeline

  1. researchqueued
  2. buildqueued
  3. verify.pyqueued
  4. regressions.pyqueued
  5. fileCreate (images)queued
  6. draft via Admin GraphQLqueued

6 stages, run in order. Nothing here talks to Shopify: the run is a recreation.

The article is illustrative: the set, the cards and the figures are invented for this page. The run animates the real pipeline's order without talking to Shopify.

Quaza News is a TCG news blog on the Quaza Collect storefront, produced by a pipeline rather than typed into an admin: 18,246 lines of Python, a shared component library, and 73,195 words of prose across 30 built articles, tracked as 15,362 lines of article HTML. Publishing goes through the Shopify Admin GraphQL API, images first, article second, always as a Draft.

Decisions

Three decisions, playable

Running live on this page. Move them.

A free tier that fails closed

cost and capacity

The database behind my store and my app stops dead at 5 million row reads a day. I measured the hot endpoint at 35,000 rows a call, then precomputed it to one. Drag the traffic.

150
Before
5,250,000
After
150
0daily ceiling 5,000,000 row reads

Before: 105% of the daily ceiling. The tier has stopped serving, so every query fails for every consumer at once.

An agent with a shell and no way to write

agent safety

I gave an agent a shell on this machine, then made it read-only. This is the real policy, running here, with 61 tests behind it. Pick a call and watch it decide.

Example tool calls

Tool call

{ "tool": "Read", "input": {"file_path":"/etc/hostname"} }

ALLOWED

The guard returns no reason when it allows.

Rule: No rule fired

The call cleared every gate in order, so the guard permits it.

Tools permitted

  • Read
  • Grep
  • Glob
  • Bash

Binaries permitted under Bash

  • cat
  • ls
  • rg
  • jq
  • head
  • tail
  • wc
  • date
  • df
  • uptime

The guard is public at github.com/shraygh/readonly-agent. It carries 61 tests that run with no API key.

A page that audits its own colours

accessibility

This table is not typed out. It reads this page's own stylesheet and computes every ratio in your browser, right now.

Contrast audit, measured in this browser

InkTokenUsed forMeasured onRatioWCAG AA
Not measured yet. Every value in this table is read out of this page in the browser, so there is nothing to print before it loads.

The audit runs in the browser, because it reads the computed value of every token out of this page for itself.

The system

The system I run on

I saw where this was going and built for it early. I do not use AI as autocomplete. I run a machine with rules, gates and orchestration, and every figure below is measured on hardware in my room.

The gate

Nothing ships without an adversarial pass

Independent agents attack a change on separate dimensions, a second set attacks their findings, and the run returns a typed verdict rather than a paragraph. Six words put 56 agents on my live storefront, unattended, for 63 minutes.

15 of the 16 orchestration scripts declare a verdict schema, so an agent cannot return prose where a score and a severity are required.

The rules

Behaviour that outlives the session

I direct agents against written rules, not ad hoc prompts: 7 instruction files at 802 lines and 71 memory files, 14 of which name the specific incident that produced them.

The same rules govern two different vendors' tools, so the behaviour is a property of the system rather than of whichever model is answering.

The boundary

An agent with shell access and no way to write

I gave an agent a shell, then made it read-only with a deny-by-default pre-tool hook. It runs in the hook rather than through a declarative allowlist, because a declarative match auto-approves and short-circuits the callback that would otherwise be consulted.

93 logged sessions, no write tool in any of them. The policy is public, has 61 tests, and you can run them yourself with no API key.

Always on

A machine that works while I sleep

12 scheduled jobs fire logged out, with catch-up on boot. Across 9 days the estate recorded 325 agent transcripts and 10,887 tool calls, and the daily unattended agent costs about five cents a run.

It runs whether I am at the keyboard or asleep, and it has been running for months.

The orchestration

Work that fans out and then argues with itself

1,548 lines of orchestration across 16 scripts. A run decomposes a task, sends it wide, then sends every finding to a skeptic whose instruction is to refute it.

The pattern is the point: one pass produces confident output, and a second pass aimed at that output is what makes it worth reading.

The room

The other half of the job

Everything above is something I made. This is the part that is not making: getting a decision made by somebody whose money it was.

Shray Shrotriya seated on a stool holding a microphone in one hand and a sheet of paper in the other, mid-sentence, in a wood-panelled room. Members of the audience are blurred in the foreground.
Speaking to a room. Toronto.

I recommended that ATR Sports move its store onto a much more expensive platform. The resistance was not technical. It was cost, and underneath the cost it was timing. The owner did not disagree that the platform was better, they did not know when it would be worth paying for.

Above a certain volume the transaction-fee saving offsets the subscription. That turns the question from whether to upgrade into which month the crossover falls in, and I could show where we sat against that line. The second half mattered as much: the platform would make the work easier for the staff who use it every day, not only for me.

It took about a month. What made that possible was not the argument. I had rebuilt their website from scratch earlier that year, and I was the only person running the online side. The recommendation arrived from someone who had already done the work.

They went live the following month. The new website had already started the breakout, and the year closed with online sales up 515% and company sales up 82%. Those figures come from the store's own dashboards and I have the captures.

The dial

Eight shapes, one form

The form travels with you. It names where you are, its bezel fills as you move, and it moves through eight shapes I actually spend time on. Point at one.

  • Aperture, wide open A DSLR, and a drone when the shot needs altitude. Photography taught me the thing I use most at work: change one variable, measure the result.
  • Iris, nine blades The mechanism, not the picture. Nine blades give a rounder bokeh than six. Somebody made that decision about physics, and those are the decisions I like.
  • Crown I open watches. On one build I replaced the plastic case with machined metal, because the movement deserved better than the shell it shipped in.
  • Saucer UFOs, unironically. Not as belief but as a question about evidence: what would actually count, and who gets to decide.
  • Arch, Rome I have stood under them. Roman and Renaissance history is the longest record of people solving hard problems with worse tools than ours.
  • Cross Faith, and a church I go to and built a website for. It is in the builds above because it is real work.
  • Candlestick Markets. Same discipline as reading my own numbers: separate the signal from the story people tell about it.
  • Star, through the eyepiece A telescope, and the reason space travel holds my attention. Light that left long ago and arrives calibrated.