← Work
// product · self-hosted, rebrandable

AI home-staging, rebuilt as a product

I built the staging pipeline internally first. Then I asked a harder question: could any agency run this without me? So I rebuilt it from scratch, generic, self-hostable, and impossible to trace back to where it came from.

1config block re-skins it
0data leaves the buyer's server
3languages, 30 styles

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 CONFIG block 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.
LIVE ONE-BLOCK RESKIN & WHITELABEL SIMULATOR
Test Dynamic Rebranding Driven by a Single n8n Config Node

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.

SELECT AGENCY BRAND PRESET:
// TOP-LEVEL n8n CONFIG NODE (JSON SCHEMA)

      
CLIENT-FACING FORM PREVIEW LANG: DE
BL
Berlin Loft Estates
KI-gestütztes virtuelles Home Staging
📷 Foto hierher ziehen oder durchsuchen
DAILY QUOTA: 50 images STORAGE: Client Google Drive
HOSTING Self-hosted on buyer's n8n (Docker)
DATA PRIVACY 100% On-Premise · GDPR Compliant
SETUP TIME < 15 minutes (One-click tables)
SECURITY Access code + Quota + Honeypot

How it works

Buyer Agent uploads photo WHITELABEL Rebrandable form their logo · language ✦ AI ENGINE (FLUX / SD) Image model the buyer's own key pay per generation Their Drive renders stay with them Result page before / after CONFIG block logo · colours · styles Access + quota protects their budget Usage & cost page cents per image telemetry

It runs on the buyer's own n8n, with the buyer's own key. The photos never leave their infrastructure.

Under the hood

DECISION

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.

DECISION

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.

DECISION

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.

// THREAT MODEL · DENIAL-OF-WALLET MITIGATION
Open Public Webhook Form
UNRESTRICTED DRAIN RISK
❌ Bots can spam image submissions, generating thousands of costly GPU inference API calls.
Studio Triple-Lock Defense
CAPPED BUDGET SAFE
✅ Daily quota table halts runs when budget reached + hidden bot honeypot + agent access token.
COMMERCIAL DIRECTIVE: Any white-label tool calling paid AI APIs on a client's credit card MUST implement hard daily spend limits at the orchestration layer.

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.

PITFALL

“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.