A one-photo tool that turns any pet into a cosmic portrait — and files a small adventure report on what they get up to out there.
That's where this started — not with AI, but with a brush. For years I've been making illustrated animal portraits as a side practice, and the response was always the same: people cried a little. Sometimes a lot.
The problem was time. A hand-made portrait takes days. I could only make so many, and the waiting list kept people waiting too long for something that mattered to them. Their pet was getting older. Some of them didn't have that much time left.
I wanted to scale the feeling without losing it — to make something that still felt intentional, ceremonial, like the universe had actually noticed your animal. Cosmic Pets is my answer to that question.
"A universe that noticed your beloved pet."
The name came first, which is unusual for me. Once I had it, the whole concept snapped into place: every pet as a cosmic being, rendered with the kind of specificity that makes people say that's exactly her.
I'm a designer but I'm also a collector of images — I've been pulling references for years before I ever knew what I'd use them for. For this project, four bodies of work shaped every visual decision: the palette, the composition rules I gave the AI, even the typography of the landing page.
Old star charts have a peculiar quality — they treat the cosmos as something knowable, almost domestic. That's the tone I wanted. Not vast and cold, but intimate and charted.
The precision of specimen plates — the way each flower is arranged like it's being formally introduced — gave me the framing device. Every portrait is a specimen. Every pet, a documented discovery.
The cut-and-paste energy. Mixed media that feels assembled with love rather than generated. I used this as a check: does the output look intentional? Does it look like someone cared what was in the frame?
The composition rules of painted portraits — subject centred, surrounded by objects that say something about them — are exactly what I wanted the AI to produce. Every cosmic portrait is, structurally, a Renaissance commission.
The core flow is six screens. I treated each one as a micro-moment — it either builds anticipation or it's in the way. There's no room for neutral screens when someone's about to hand you a photo of their dog.
The first screen sets the register: slightly ceremonial, warm. It explains what's coming without over-explaining. A photo guide shows good versus bad examples — this turned out to be the most important piece of copy on the page. Bad inputs were the biggest source of disappointing outputs.
A full crop-and-rotate tool before anything is sent off. This is a meaningful pause — it asks the user to choose how their pet is framed. In testing, people spent more time here than I expected. They were already imagining the portrait.
The generation takes a few minutes. The processing screen doesn't pretend otherwise — it uses that time to build the idea that something real is happening. Planets being arranged. A small moon being polished. The wait is part of the ceremony.
The result screen is quiet. The portrait at full size, the adventure story beneath it. No distractions. The share button appears small, below the fold — I didn't want the first thing people saw to be a push to share. I wanted them to just look first.
Every portrait ships with a short written report on the pet's cosmic life — their title, their known offences, the trouble they cause out there. This was the part I wasn't sure would land. It's the part people quote back to me most.
A permanent, beautiful URL for each portrait: cosmicpets.love/p/[id]. The share page is designed to stand alone — no app chrome, just the portrait, the story, and a quiet invitation to make one of your own.
Screen · the upload
Screen · the portrait
Screen · the story
I built this end-to-end, which meant every technology choice was also a personal commitment to maintain it. The principle: reach for a managed service before writing custom code, and write custom code before adding a framework.
Local model, runs on-server. No third-party API call — the pet is extracted without leaving the pipeline.
The cosmic background is generated from a prompt built around the pet's appearance. Each result is genuinely one of one.
Background, extracted pet, and reference elements are composited together at 1440×2016 — print-quality from the start.
The adventure story is written fresh for each pet, informed by what the AI sees in the image.
A single Python HTTP server handles everything — no framework overhead. Deployed on Railway with a Postgres volume for share persistence.
The in-browser crop tool. Lets users frame their pet before anything is sent to the server — the quality of the crop directly affects the quality of the output.
Getting the images right took iteration — prompt engineering, reference tuning, compositing adjustments. But the hardest design problem was quieter than that. It was tone.
AI tools tend toward either clinical neutrality or aggressive delight. I wanted something neither of those — something that felt like a small, private thing that had been made with care specifically for you. That's almost impossible to engineer. It has to live in every piece of copy, every transition, every pause.
The "don't like AI? perfectly reasonable" line on the landing page is the one I'm most proud of. It makes space for scepticism, which makes the people who do trust the tool trust it more. I kept the human option — me, making portraits by hand — because that's where this started, and I didn't want to pretend otherwise.
A tool is only as good as what it makes people feel.
Not about the tool — about themselves, their pet, the thing they made together
When people send me their share links — and they do, unprompted — they're not saying "the AI was impressive." They're saying look at Biscuit, she's been spotted commanding a ringed planet. That's the thing. That's what I was trying to make.