Awakening the water…

The position

One team, from the first argument to the fifth release

Definition, interface, artwork, apps, backends, submission — and the releases after. Both products below are ours, opened down to the rule that decides a verdict.

  • Definition
  • Interface
  • Artwork
  • Apps
  • Backends
  • Security
  • Submission
  • Launch
  • The years after

Mechanism

The parts that decide whether it works

Every product has a few places where the whole thing is won or lost — the model, the network, the surface, and the tier with no interface at all. These are ours, and what happens at each one.

Video and audio, one call

One Gemini call takes the video with its audio still attached, and a 512px reference photo goes ahead of it so the model reads the right dog when several are in frame. What comes back is a record, not prose — one of six defined states, a real confidence, separate face, body and sound scores. The research-grade version is specified and costed: frozen audio encoders, pose keypoints, cross-attention fusion, leave-dogs-out evaluation splits.

docs/01-ai-approach.md §7quality: "insufficient"≤512px reference, 6s bound

Ten hops, three devices

One tap walks up to ten redirect hops by hand, resolves the same URL under desktop, iPhone and iPad user-agents in parallel to catch a link that cloaks, and runs Google Web Risk on every hop rather than only the last. Issuer, SAN and chain trust are validated on the certificate that actually served the page — then the HTML is parsed for the registrable domain each form really posts to.

redirectResolver.jsdomainDiverged / deadEndDevicecertClient.js

From game engine to PDF

A four-world HTML5 endless runner runs in a WebView inside Dogoos, retinted live to whichever accent is active. Alongside it: vet-visit summaries composed into a PDF on the phone rather than on a server, a scanned barcode falling through a shared food catalogue, a live open-data lookup and an AI label scan, and an assistant with around twenty-five tool functions that logs a meal and a walk from one spoken sentence.

4 worlds / 3 laneson-device PDF~25 tool functions

The parts with no screen

QR Protector's client holds no keys — every one sits behind a Node service on Cloud Run, with entitlements and quota enforced server-side. Dogoos keeps rewards, household membership and single-use 24-hour invites in ~1,940 lines of Cloud Functions, behind deny-by-default Firestore rules. Every await in its read pipeline carries a deadline scaled to clip length, and a regression suite drives the real camera on-device.

deriveBackendStatus()~1,940 lines of Cloud Functionsdeny-by-default rules

How we use models

The model is a witness, not a judge

A model can support a finding. It is not allowed to originate one. That is a line in the architecture, not a sentiment, and it is why both products can say a useful thing when they are unsure instead of an impressive one.

Dogoos returns a refusal — a state it will not name, with the reason — rather than a mood it cannot see. QR Protector will not call a code dangerous on a model's say-so: something deterministic has to agree first, and the AI pass is cast in the prompt as a corroborating voice.

It can support a finding. It cannot originate one.

Around the build

The half that usually gets bought separately

Naming, icons, illustration, the screens and the way they move, the listing and the shots on it. It is the half a product most often buys elsewhere, and the half that decides whether it looks like a template.

Original illustration: a bright, alert dogOriginal illustration: a dog listeningOriginal illustration: a puzzled dogOriginal illustration: a startled dogOriginal illustration: an uncertain dogOriginal illustration: an appeasing dog

Naming and identity

A wordmark drawn twice, once for the dark theme and once for the light one, and an icon that still reads at 48px on a crowded home screen.

Illustration

The six illustrations to the left are ours, drawn for one app rather than licensed for it. So is the game world it ships with, and the eight-frame run cycle inside it.

Store presence

Listing copy, the screenshot set, the Data Safety answers, and a privacy page at a real URL for each app — this site generates that page from the same file that builds the app's page.

The site itself

This one. Every route is prerendered to static HTML so a link from a store listing resolves to a real document, then hydrated so it still moves.

Day to dayFlutter · Dart · Node · Express · TypeScript · Cloud Run · Cloud Functions · Firestore · Firebase Auth · App Check · Cloud Storage · Gemini · Vertex AI · Google Vision · Google Web Risk · RDAP · CameraX · mobile_scanner · SQLite · SARIF · React · Vite · Tailwind · WebView · Play Install Referrer · Open Pet Food Facts

How we work

What you can hold us to

Four things that follow from one team doing the whole of it, and one trade that comes with them. All five are worth knowing before you write.

Nothing gets briefed twice

The people who argued about the scope are the people who write the security rules and draw the icon. There is no document whose only job is to carry an intention between teams, and no meeting where the intention gets lost anyway.

No account layer

You talk to whoever is building it. When something is a bad idea you hear that in the reply, not three weeks later in a change request.

One head holds the whole system

The schema, the failure modes, and the reason a screen looks the way it does all fit in the same mind — which is why the twentieth screen still resembles the first, and why a change to the data model does not quietly break the artwork.

We kept the load-bearing half of a heavy process

The parts of a heavy release process that are genuinely protecting the product — deny-by-default rules, a deadline on every call, a regression suite that drives the real camera on-device — we kept. The parts that existed because an organisation was large, we did not.

The trade, stated plainly. This is one team building one thing properly. If what you need is a large parallel effort staffed next week, that is a different kind of company and we will say so in the first reply — rather than take the work and subcontract it.

Next

Tell us what you are trying to build

A paragraph is enough to start. If it is a poor fit you will hear that in the first reply, usually along with what would fit better.

How a project starts