Slick app icons,
generated in seconds.

Describe your app, pick a style, and get a crisp, modern, full-bleed 1024px icon master in seconds — powered by the latest image model. Built for indie makers and studios who need great icons fast, without the design-agency price tag.

1 dependency No build step Built for AI agents Stripe + SES ready
Prompt in, owned pixels out

Type a line. Watch it develop.

A credit-metered FLUX pipeline with a live render reveal — the prompt types itself, the canvas resolves out of noise, and one credit clicks off the meter. Every result is re-fetched into storage you own.

PROMPT TO PIXEL

A fal.ai image studio, already wired

Type a prompt, pick a FLUX model and size, spend a credit per image. Results land in a composer and gallery you own — keys, billing and storage all included.

Studio composer with live reveal

Prompt, negative prompt, FLUX schnell/dev/pro, size preset and a 1-4 image count, all on one /studio screen. The generating card polls every second and reveals each image the moment fal finishes — no refresh.

Gallery with folders and lightbox

A /gallery masonry grid with likes, folders you create and rename, and a lightbox that does prev/next, copy-prompt and download. Filter by liked or collection; move images between folders.

Free to open, gated by credits

/studio and /gallery live in the member sidebar app and open for any signed-in user — no hard paywall. Each generation spends 1 credit up front; hit zero and you're routed to top-up. If fal fails or the submit throws, the credits are refunded automatically.

Remix any result

Hit Remix on a gallery image and its prompt, model, seed and size load straight back into the studio. Lock the seed or randomise it.

Your own R2 bucket

Every image is downloaded from fal and uploaded into your private Cloudflare R2 bucket. No SDK — a plain cURL S3 Sig V4 signer in bootstrap.php.

Off until you add a FAL_KEY

The whole pipeline is dormant until FAL_KEY and your R2 keys are set, so the rest of the stack runs clean without it. A built-in dev mock paints gradient PNGs so you can click through the full studio and gallery before you spend a penny on fal.

Render, reconcile, own

Watch a batch land in storage you own

Type a prompt, pick a FLUX model, spend a credit per image — and every result is re-fetched server-side and self-hosted in your private R2 before it hits the grid.

low-angle ember-lit foundry, molten sparks, volumetric haze, cinematic 35mm — negative: text, watermark
FLUX dev · 4cr
seed 4471
seed 4472
reconciling…

fal → your private R2 (S3 Sig V4 PUT) → presigned GET, expires in hours

Prompt in, owned pixels out

The whole render pipeline, by the numbers

Every figure here is how the pipeline actually behaves — not a sales number.

1 credit per image, charged up front and auto-refunded if fal fails
3 FLUX models on tap — schnell, dev and pro, switchable per render
0 paywalls at the door — /studio and /gallery open free in the sidebar member app, gated only by your credit balance; a zero balance routes to top-up
0 renders left on fal's CDN — every result is re-fetched into your own private R2
THE PIPELINE

Submit, reconcile, self-host

The bit other starters hand-wave: getting an async render from fal onto your own storage, reliably, without a queue or a worker process.

1

Webhook or poll, whichever lands first

On submit we pass fal a webhook URL derived from APP_URL. The browser also polls generation_status every second for up to 60. The webhook (push) and the poll (pull) both finish the job; storing images is idempotent, so the loser is a harmless no-op. On localhost there's no public webhook — the poll covers it.

2

Re-fetched from fal, never trusted

Whichever path completes, image_gen_reconcile re-fetches the authoritative result from fal server-side with your key. A spoofed webhook payload can't inject an image, because the payload is never the source of truth.

3

Downloaded to your private R2

On completion each image is pulled from fal and PUT into your own R2 bucket via a hand-rolled S3 Sig V4 signer — no AWS SDK, no S3 client. The bucket stays private; nothing is left sitting on fal's CDN.

4

Served via short-lived presigned URLs

Image rows are served through presigned GET URLs that expire in a couple of hours, floored to the hour so the same URL is cacheable within that window. The bytes are a capability that lapses, not a public ACL — and every query is user-scoped, so other people's image IDs 404.

THE WHOLE STACK

The whole fal.ai render pipeline, on one core

fal.ai FLUX in, your own private R2 out, credits metered per image and a gallery you own — every subsystem of the studio hangs off one app core.

AI studio FLUX · fal.ai fal.ai FLUX Image-to-image Private R2 Presigned URLs Remix · seed lock /studio sidebar app Credit-gated render Studio admin AI studio FLUX · fal.ai fal.ai FLUX Remix · seed lock Image-to-image /studio sidebar app Private R2 Credit-gated render Presigned URLs Studio admin
Superadmin, not a spreadsheet

A real admin console — have a poke around.

Every install ships with this. Search users, replay webhooks, inspect billing and revoke keys — server-rendered, access-gated, no second app.

app.yoursaas.com/admin superadmin
MRR$0▲ 12%
Active subs0▲ 6
Credits today0spent
Signups · 7d0▲ 18%
UserPlanStatusJoined
ada@example.comProactive2d ago
grace@example.comScaleactive5d ago
linus@example.comStarterpast due3w ago
margaret@example.comProactive1mo ago
blocked@example.comFreeblocked1mo ago
processedinvoice.paidevt_1Q8x…a3
processedcustomer.subscription.updatedevt_1Q8w…f1
processedcheckout.session.completedevt_1Q8w…7c
retryinginvoice.payment_failedevt_1Q8v…02
refundedcharge.refundedevt_1Q8u…9d
curl -H "Authorization: Bearer ss_live_••••" \
     https://app.yoursaas.com/api.php?resource=notes

{
  "ok": true,
  "data": [ "note_18f2", "note_18f9" ],
  "rate_limit": "58/60",
  "credits_left": 1840
}
From download to charging cards

Live on a real VPS in an afternoon.

01

Unzip & copy

copy a template folder

02

Install & connect

composer install · Stripe + SES

03

Ask your agent

rebrand · plans · run doctor

04

Deploy & charge

NGINX + PHP-FPM · take cards

unzip → live on a VPS — one afternoon.

Most SaaS dies of complexity, not competition.
Indie builders like Pieter Levels (@levelsio) run profitable products on exactly this shape — PHP · SQLite · jQuery · a cheap VPS per project.
0 SQLite reads / sec
daily_hits100,000+
cost / 10k logins$1
whole_stack / month< $10
reads_block_writesnever · WAL mode
Pricing you control

Tiers, access levels and credits from one config file.

Define plans in app/subscriptions.php, attach Stripe price IDs, and the checkout flow stays generic across every project.

Included

Free

$0

Sign in free and browse — buy credits to generate.

Access 00 credits/mo
Subscription

Indie

$9/mo

For indie makers shipping a few apps.

Access 1020 credits/mo
Subscription

Studio

$19/mo

For studios iterating on lots of icons.

Access 2060 credits/mo
Subscription

Agency

$49/mo

For agencies producing icons at volume.

Access 30200 credits/mo
Questions

The honest FAQ.

Whatever you decide — a generation, an API call, an export, a render minute. Plans grant credits; each action spends them through one ledger via consume_credits_for_action().

Your call per plan. Period credits top up to a fresh allowance each period by default, and you can switch to rollover in the plan config.

Yes — combine recurring plans that grant credits with one-time purchases for top-up packs.

Yes — parameterised SQL throughout, signed Stripe webhooks, CSRF, rate limiting and session hardening, all security-reviewed. Real plumbing, not a toy.

One small VPS runs the whole stack for a few dollars a month, and passwordless login emails on Amazon SES are about $1 per 10,000 sign-ins. Prefer Apple or Google sign-in? Both are built in with no per-login cost — Google's is free, and Apple's only needs an Apple Developer account ($99/yr) you likely already have to ship an app — so you can skip login emails entirely. No per-seat platform bills.

Get started

Ship your SaaS this week.

Passwordless sign-in, Stripe billing, credits and admin — already wired. Copy a folder, rename it, start charging.

Get Access