The problem
The internal version (the case study is here) worked, but it was welded to one agency's infrastructure, brand and CRM. A tool is not a product.
And the market it would sell into has a specific pain: agencies pay for AI SaaS subscriptions they barely use, and hand their listing photos to a third party in the process. In France and Germany, that second part is not a detail. It is a data-sovereignty objection that kills the sale.
What I built
A clean-room rebuild: same capability, none of the original. It runs on the buyer's own n8n, calls the image model with the buyer's own API key, and stores renders on the buyer's own Drive. I never see their data, and neither does anyone else.
- One
CONFIGblock at the top re-skins the entire product: logo, colours, the 30-style catalogue, and the interface language (EN / FR / DE). - Native n8n Data Tables instead of an external database, so a buyer wires up two or three credentials, not five.
- A one-click table setup, a usage-and-cost page, and a README credentials card, so the product supports itself instead of me.
- Access code, editable daily quota and a honeypot, so a public form cannot quietly burn through the buyer's API budget.
Select an agency preset below to observe how updating 1 single JSON config node instantly adapts the public form styling, language dictionary, styling catalogue, and quota limits.
How it works
It runs on the buyer's own n8n, with the buyer's own key. The photos never leave their infrastructure.
Under the hood
Self-hosted, not a SaaS
The whole product runs on the buyer's own n8n instance, calling the AI with the buyer's own API key. Their listing photos never touch my servers, because I don't have any in the loop.
TRADE-OFF No recurring subscription revenue, and the buyer has to wire up a few credentials. In exchange, the data-sovereignty objection that kills SaaS deals in the EU simply doesn't apply, and I have zero infrastructure to run.
Everything re-skins from one block
Logo, colours, the 30-style catalogue, the interface language: all of it lives in a single CONFIG node at the top. One edit turns the product into the buyer's product. No hunting through nodes.
TRADE-OFF Front-loading that config discipline cost real time. It is what makes the difference between a demo and something a stranger can actually operate.
A public form must not be able to drain a wallet
The moment the form is public, anyone who finds the URL is spending the buyer's API budget. So the product ships an access code, a daily quota the buyer edits from a dashboard, and a honeypot field checked server-side.
TRADE-OFF A little friction for the buyer's own staff. The alternative is a stranger turning their AI bill into a denial-of-wallet attack overnight.
“Generic” has to be proven, not assumed
Shipping a clean-room version means zero trace of where it came from. I grepped the whole build for the original brand, city and domain. Fun trap: a naive search for the company name flagged the German word herunterladen (“download”), which contains the same letters.
FIX Whole-word, case-aware matching, and a manual read of every hit. The exported product has no residue, verified before it could ever leave my machine.
Results
A self-contained product a buyer imports, configures from one block, and runs entirely on their own stack, in English, French or German. Validated end to end: a real photo through the real pipeline, then the throwaway test instance deleted and the exported JSON checked for leftovers.
What it demonstrates. The interesting part here isn't the AI, it's the productisation: turning something that worked for one team into something a stranger can install, brand, protect and pay for, without me in the room.
Stack
- n8n, self-hosted by the buyer: the product ships as a single importable workflow
- Gemini image model: called with the buyer's own key, billed to them
- n8n Data Tables: the job ledger and quota, no external database
- Google Drive: the buyer's own, so renders stay in their hands
- Vanilla JS front end, re-skinned entirely from the CONFIG block
What I took away
A tool solves your problem. A product solves a stranger's problem when you are not there to help. The gap between the two is almost entirely config, guardrails and documentation, not features.
And in the EU market, “your data never leaves your server” is not a footnote. It is the whole pitch.