---
title: "Perhaps the greatest design agency in Brisbane"
url: https://gardiner.today/past/bigfish
tense: past
edition: "2026.11.02"
updated: "2026-11-02"
---

# Perhaps the greatest design agency in Brisbane

Bigfish

Senior software engineer, May to October 2026.

Senior Software Engineer at Bigfish from May to October 2026, owning client jobs end to end, from schema to deploy. Most of them were a new brand or a faster site on top of years of content that editors built.

## Highlights

- [years of pages kept](https://gardiner.today/past/bigfish#the-live-site): A national builder’s brand refresh, on a site its editors change every day, without losing a page they built.
- [rehearsed, then real](https://gardiner.today/past/bigfish#rehearsal): The block migration ran, rolled back and ran again, and was only trusted once both runs came out identical.
- [790 ms to 10 ms](https://gardiner.today/past/bigfish#measure-then-decide): The obvious performance fix measured slower, so it came out. Three small ones took the group home page from 790 ms to 10 ms.
- [the fix wasn’t the code](https://gardiner.today/past/bigfish#css-changes-do-nothing): A CDN serving stale stylesheets, then a deploy without its CSS build: twice the fix was somewhere else.

## The live site

A national builder edits its website every day. Anything I lose shows straight away and cannot be rebuilt from code, because it was never in code: it is years of pages that editors built. That was the job when I picked up its brand refresh partway through, in September, and through that month most of the commits were mine. The new defaults did nothing on their own, because the values editors had saved over the years overrode them. Of 4,978 project titles, 3,133 had been typed in capitals, so a page that looked right in the browser could still be wrong underneath. From then on I paired every render check with a database check. The refresh was still on staging when I left, with the rest of the team carrying it to launch.

Ask Ardo: [what made the national builder’s refresh risky?](https://gardiner.today/future?q=what%20made%20the%20national%20builder%E2%80%99s%20refresh%20risky%3F)

## Rehearsal

Retired style options are withdrawn from the CMS but still render wherever they are already in use, so the refresh takes nothing away from a page an editor already built.

Folding the content blocks into three types meant migrating 295 records, and I treated that migration as a rehearsal before I let it be a change. I snapshotted the database, took baseline screenshots, ran it, rolled it back, ran it again, and only trusted it once both runs came out identical.

Anything that changes the schema waits for cutover, because the client is editing the live site in the meantime, and the chart colour remap shipped as a migration that can be replayed.

> I treated that migration as a rehearsal before I let it be a change.

**the call i made**: Run the block migration on the live site once, or rehearse it first?

- Took: Rehearse it. Snapshot, run, roll back, run again, and trust it only when both runs match.
- Turned down: Run it once. The client edits the live site every day, and a lost page could not be rebuilt from code.

Ask Ardo: [how does he test a migration before it goes live?](https://gardiner.today/future?q=how%20does%20he%20test%20a%20migration%20before%20it%20goes%20live%3F)

## Why I joined

That job was one of several I owned end to end from May at Bigfish, a design agency whose work I had admired for a long time, particularly for clients like Brouhaha, a brewery, and QIMR Berghofer, in medical research. I found the ad on their own website. There was no separate backend team, so whoever took a job owned it: schema, CMS, frontend, deploy. Most jobs were on sites that editors had been filling for years.

Ask Ardo: [why did he join bigfish?](https://gardiner.today/future?q=why%20did%20he%20join%20bigfish%3F)

## Measure, then decide

A construction and property group runs several sites from one codebase, and I audited 85 of its routes. Splitting up a bundle that shipped every layout to every page looked like the answer. The obvious fix made the site slower once I measured it: the main content took 550 to 750 ms longer to appear, and the requests more than doubled. The audit it would have passed doesn’t count toward the performance score. The timings it slowed do. I took it out and wrote down why, so it would not come back.

**the call i made**: Keep the code-splitting refactor, or revert it?

- Took: Revert it. It measured slower on the timings the performance score counts.
- Turned down: Keep it. It passed an audit, and the score ignores that audit.

Three small changes went in instead: cache headers on the HTML so the CDN could hold a page (without them it missed every one), a smaller video for mobile, and meta descriptions drawn from the page copy. Measured on staging, routes with slow server responses went from eight to none, and the group home page went from 790 ms to 10 ms. Those fixes are in production.

> The obvious fix made the site slower once I measured it

Ask Ardo: [why did he revert a performance fix?](https://gardiner.today/future?q=why%20did%20he%20revert%20a%20performance%20fix%3F)

## Money moving

A livestock genetics marketplace was the one job with money moving through it. From May I built its seller side end to end, on new surfaces of an existing site: onboarding and payouts through Stripe Connect, a listing wizard that saves a draft at every step, breeding-value data with charts, and search ranked by traits.

Checkout charges the market price from one shared price helper. It verifies the session on return, shows a real receipt, and refuses listings that are out of stock or unpublished. One of those guards came from reading the flow before a same-night deploy: anonymous visitors could start a checkout on an unpublished listing, so I raised it instead of shipping around it. The site is live and trading.

Ask Ardo: [what did he build on the marketplace?](https://gardiner.today/future?q=what%20did%20he%20build%20on%20the%20marketplace%3F)

## CSS changes do nothing

Twice the fix was somewhere other than the code I was editing. Between May and July I built a national membership organisation’s redesign on a long-lived PHP platform: the mega menu, the home hero, a section catalogue and the membership join flow. At one point stylesheet changes stopped doing anything. The CSS was fine. A CDN was serving stale copies over the top of it.

Before launch I ran the migrations as a dry run, which caught a footer regression and a stale homepage, and then it launched. Later, on an animation studio’s About and team refresh, it was the deploy: the CSS build wasn’t part of it yet, so I added it.

> Twice the fix was somewhere other than the code I was editing.

Ask Ardo: [when has the fix been somewhere other than the code?](https://gardiner.today/future?q=when%20has%20the%20fix%20been%20somewhere%20other%20than%20the%20code%3F)

## The last build

The last one I took on was the exception. A wildlife sanctuary is getting a greenfield site on the new version of Tank, Bigfish’s own CMS, and I wrote most of it, from mid September to my last day. That covered the navigation and content blocks, the animal, experience and article pages with their CMS screens, pricing, a site-wide alert bar, forms that post to the client’s work-management board, and a booking overlay for its ticketing provider. AI got the well-specified implementation, the read-only diagnosis and the setup chores. I checked every change myself in a browser against the design and against the data, and sent back specific corrections. For the first time since May, nothing I built had to fit around content that was already there.

Ask Ardo: [how does he work with AI on a new build?](https://gardiner.today/future?q=how%20does%20he%20work%20with%20AI%20on%20a%20new%20build%3F)

## What shipped

A national builder’s brand refresh on a long-lived PHP platform, carried through September.

A national membership organisation’s 2026 redesign on a long-lived PHP platform, live since July. I also found its styles leaking into sibling sites and scoped them per site.

Performance and component work across a construction and property group’s sites, with the fixes in production.

A livestock genetics marketplace’s seller onboarding, listing wizard, search and checkout, live and trading.

A wildlife sanctuary’s greenfield site on the new Tank, most of the build.

A land developer’s interactive lot map from KML survey data, with stages and coming-soon states.

A civil contractor’s multi-tenant subsite and its redirect migration.

The agency’s own email campaign system. I built its email and email-render packages, a React renderer whose emails survive Outlook and Mailchimp export, and an email signature generator.

An animation studio’s About and team refresh, and the CSS build its deploy was missing.

Ask Ardo: [what else did he ship at bigfish?](https://gardiner.today/future?q=what%20else%20did%20he%20ship%20at%20bigfish%3F)

## Ask about Bigfish

Ardo has read this case study and the rest of the site. Ask it what I didn’t cover, and it shows the pages its answer rests on.

Ask Ardo: [how does he change a site without losing what editors built?](https://gardiner.today/future?q=how%20does%20he%20change%20a%20site%20without%20losing%20what%20editors%20built%3F)

## Read next

- [The biggest piece of tech debt](https://gardiner.today/past/canva) (Canva): Another live surface rebuilt without breaking what people had built on it.
- [People don’t tolerate bugs when money is involved](https://gardiner.today/past/nagaris) (Nagaris): The job before this one, where a bug cost someone money.

[All case studies](https://gardiner.today/past#case-studies)

I live and work in Magandjin, the Jagera name for Brisbane, Australia, on the Country of the Turrbal and Jagera peoples. I pay my respects to their Elders, past, present and emerging. Sovereignty was never ceded.
