Cless — an image toolkit that mostly never uploads

Two dozen image and PDF tools that run entirely in the visitor's browser, alongside AI tools that bill by the coin. Trilingual, right-to-left in Arabic, and built so the free half needs no account and no server.

Not open to the public yet — this page goes up ahead of launch.

Next.js 15React 19TypeScriptPostgreSQLPrisma 7Auth.jsWebAssemblyDocker

The brief

Every free image tool online asks you to upload the file first. That is a strange bargain for a document you might not want to hand over — an invoice, an ID photo, a client's artwork — and it is not even necessary. A browser can decode, resize, convert and re-encode an image on its own. Cless is built on that: the tools that can run on your device do, and only the ones that genuinely need a model on a server ever send anything.

Two halves, and the split is the architecture

The free half is about twenty-two tools — compress to WebP, resize, convert, crop, HEIC to JPG, SVG to PNG, image to PDF, merge and split PDFs, strip or read EXIF, extract a palette, generate a favicon or a QR code, build a passport photo — and every one of them runs in the page. No upload, no account, no queue. The file never leaves the device, which is a privacy claim the code can actually keep rather than a promise in a policy.

The paid half calls an image provider: background removal, generative fill, relighting, AI retouching. Those are metered in coins, and the balance is the interesting part. A run is charged inside a row lock, so two tabs firing at once cannot drive a balance negative; and a beta account spends a separate wallet that never mixes with real credit, so the cost reporting can still answer what a run actually cost us.

Three languages and a right-to-left layout

French, English and Arabic — with Arabic as a real RTL layout, not translated strings in a left-to-right shell. Nothing in the interface is a hardcoded literal, and the whole brand is two CSS variables: every other colour is mixed from them, so the palette changes in two lines instead of two hundred files.

Decisions worth the argument

  • Licences are a hard constraint. Two of the best background-removal models were rejected outright — one AGPL, one non-commercial — because a tool people can use for their own work cannot sit on a licence that forbids it.
  • The public pages stay static. A single session or cookie read anywhere in that tree quietly turns every page per-request, and nothing fails visibly when it happens — so per-viewer work lives in its own route group.
  • An uploaded SVG is a document, not an image. It can carry a script, and serving one from your own origin is stored XSS against every visitor. Brand uploads take raster formats only.

Under the hood

Next.js 15 App Router with React 19, TypeScript in strict mode, Prisma 7 on PostgreSQL, Auth.js for sessions, and WebAssembly for the decoders the browser does not ship itself. Image work in the browser is fussier than it looks: the same decode call reports three different sizes depending on what the browser did with it, and a crop rectangle has to use the right one; a fresh canvas is transparent and the JPEG encoder composites onto black. Both are settled once, in a shared layer, rather than rediscovered per tool.

Where it stands

The demo runs an earlier build than the current one: the tools are there, the redesign of the public surface is not yet deployed.