CK

Systems

Internal /
systems.

Built and maintained by Chaiya Katkwao. Google Apps Script, Sheets, and a team that uses them every day.

Case 1 / 3

In daily use

Live Studio OS

One web app the team opens on whatever is to hand, a phone on the studio floor or a desktop at the office, against one Google Sheet.

20+
releases, in daily use
2
people, no other engineering resource
7
tabs in one sheet, the database
0
servers, hosting or licences to pay for
Role
Designed and built with the company’s CEO, a software engineer. Two people, no other engineering resource. In-house, Ad The Top.
Problem
Studio procedure, equipment records and fault history lived in separate documents that had begun to contradict one another. The answer to “what is in this room, and does it still work” depended on who you asked.
What I built
One web app the team opens on whatever is to hand — a phone on the studio floor, a desktop at the office. Standard settings and a shutdown checklist, per-room equipment guides, a health check that turns a walkthrough into action items, and a fault log that exports the monthly report. Google Apps Script serves a single page; a Google Sheet is the database, addressed by column name rather than position so staff can reorder and rename it without a migration.
Constraints
No budget for hosting or licences, no staging environment, and a team with no technical background. It runs on the Google Workspace the company already pays for. Every change deploys straight against the data the team is using that day — the database is a document they have open while the code is writing to it.
Outcome

In daily use by the studio team, with more than twenty releases shipped. Requests now arrive as feature ideas rather than workarounds. The data layer is round-trip tested — written, read back, compared — so reordering a column no longer breaks anything. The save path has since been rebuilt to write one row at a time, so two people can log at once without overwriting each other. The limits that remain — check results tied to row order, no audit trail — are documented and deliberately unfixed.

The split was by strength: the CEO brought the engineering depth, I brought the studio floor and the operational discipline. The database rules the system is now held to, and the deploy order that stops old code redeploying over live data, exist because I asked for them — after both had already gone wrong once.

The Studio Health Check screen of Live Studio OS. A row of room chips, 402 through 508, each carries a badge showing how many equipment issues are open; room 404 is selected and marked clear. Below, an equipment checklist lists items to inspect.

Figure 1

Live Studio OS, the Studio Health Check

Google Apps Script, one sheet, more than twenty releases

In daily use at Ad The Top, captured 25 June 2026

What changed for the team
Aspect Before After
Equipment recordsA sheet per room, edited by handOne register, read by the app
Fault historyTold in chat, then lostLogged with room, phase and severity
Monthly reportRebuilt by hand each monthExported from the log as PDF or CSV
Source of truthTwo documents disagreeingOne dashboard, named as authoritative
How Live Studio OS is put together A staff device opens the web app by URL. The app writes rows to a Google Sheet and reads that sheet back for history and statistics. The sheet feeds a report centre, which sends a monthly PDF or CSV to management. A Staff device phone, tablet or desktop B Apps Script web app one page, no build step C Google Sheet seven tabs, one source D Report centre PDF or CSV, by month E Recipient management open URL write row read for history and statistics build report send

Figure 2

How Live Studio OS is put together

Apps Script serving one page against one sheet

No build step, no npm, no server of my own

Figure 3

The spreadsheet behind the studio system, redrawn without content

Seven tabs as the single source of truth, addressed by column name rather than position

Staff can reorder the sheet by hand without breaking the app

Treating a spreadsheet as a data layer
Rule Before After
Column accessBy positionBy header name
Reordering columnsBroke the app silentlyFree, and expected
TypesCoerced by Sheets, unnoticedConverted on read, locked on write
VerificationAssumedRound-trip tested

Case 2 / 3

Keepsake

A private two-person archive, one page installed to the home screen, that would outlive whatever platform held it.

2
users, allow-listed at the edge
1
runtime dependency permitted
30
days of retention on the sweep
1
nightly backup, to a different vendor
Role
Sole designer and developer. Private commission, two users.
Problem
Two people wanted a single shared record of their life together that would outlive whatever platform held it. Consumer apps make that record someone else’s asset, and none of them promise you can get it back intact.
What I built
A private two-person archive: entries with photographs, tags and colour labels, a timeline, and an on-this-day view. One page, installed to the home screen. Cloudflare Workers with D1 and R2, behind Access allow-listing exactly two addresses.
Constraints
One of the two users is non-technical and had to manage on his own Android handset without instruction. Exactly one runtime dependency was permitted. The backup was not allowed to sit with the same vendor as the data.
Outcome
Deployed August 2026 with a nightly backup to a different vendor and a thirty-day retention sweep. The acceptance test was not a passing suite — it was the non-technical user creating a memory unassisted, on his own phone. He did.

Figure 4

Keepsake, the timeline, redrawn without content

Cloudflare Workers with D1 and R2, one runtime dependency

Each entry carries text, photos, tags and a colour label

The obvious build, and the one I shipped
Decision Before After
Photo storageObject storage on a paid tierR2, zero egress at any volume
ThumbnailsAn image transform serviceMade on the phone before upload
Sign-inPassword screen and session codeEdge auth, two addresses allow-listed
BackupSame vendor as the dataNightly export to a different one

Case 3 / 3

The studio register

A register of just over five hundred items held per room and floor, that had to stay a spreadsheet.

501
items migrated into the live register
1
workbook, still the source
4
condition states, recorded per item
0
new tools for the people who maintain it
Role
Sole author. In-house, Ad The Top.
Problem
Equipment was tracked in a workbook whose formulas had to be repaired by script before anyone could trust a total. Warranty dates sat in a column that was only ever read after something had already broken.
What I built
A register of just over five hundred items held per room and floor, with a status breakdown, a by-floor rollup, and a warranty watch counting down remaining days. Python rebuilds the rollups and repairs the formulas from the room sheets.
Constraints
It had to stay a spreadsheet. The people maintaining it work in Excel and were never going to adopt a tool. Column order had to remain theirs to change.
Outcome
501 items migrated into the studio system’s live register. The workbook stopped being the system of record and became its source.

Figure 5

The studio register, redrawn without content

One workbook per room and floor, rollups rebuilt by Python

Refreshed by a monthly inspection round

What the register became
Aspect Before After
Where it livedA worksheet per roomOne register, one table
WarrantyA date, read after failureDays remaining, watched
RollupsRetyped by handRebuilt by script
ConditionKnown by asking someoneFour states, recorded per item