Build vs Buy

Why buy a photo editor when an AI agent can build one?

An agent can write a crop box in an afternoon. What you buy is everything after it: iPhone photos that arrive as 48-megapixel HEIC files, Safari's canvas limit, touch that feels right, the on-screen keyboard, three browser engines, and keeping all of it working with every release.

Day One

An agent writes day one. Your users bring the rest.

Ask an agent for a photo editor and by the evening you have a crop box, a brightness slider and a Save button. It works on your laptop, with your test photo. Then your users arrive, with their own phones and their own photos.

Above the Waterline

  • A Crop Box

  • A Brightness Slider

  • A Save Button

Below the Waterline

  • HEIC Photos from iPhones

    Chrome and Firefox can't open the format iPhones save photos in. Safari decodes it; everywhere else the editor loads a decoder only when a HEIC arrives, and runs it in a background worker.

  • 48-Megapixel Photos

    2.78 GB

    Safari on iOS draws no canvas past 16.7 million pixels. In WebKit sized as an iPhone 15, a 48 MP photo held 0.84 GB at rest and 2.78 GB on export. The editor scales it once to 16.7 MP: 0.44 GB and 1.17 GB.

  • Orientation and CMYK

    8 orientations

    A phone photo comes out sideways when its EXIF orientation is ignored, and a CMYK JPEG in the wrong colors. Every orientation is tested, with CMYK and Display P3 samples.

  • GPU Limits

    16 contexts

    Some GPUs can't hold a texture as large as the photo, and a WebKit page gets 16 WebGL contexts, a lost one still counted. The editor draws its screen copy within the GPU's limit, measured once per page.

  • Colors That Shift on Export

    WebKit uploads a Display P3 or CMYK photo as decoded, so the saved file's colors shift; forcing sRGB everywhere damages nearly transparent pixels in Chromium and Firefox. The editor checks each engine and converts only where it must.

  • Touch That Feels Right

    A pinch keeps the point under the fingers, a flick coasts on with iOS-style inertia, a hand held still doesn't fling, a second finger never takes over a drag, and the whole gesture undoes in one step.

  • The Phone's On-Screen Keyboard

    337 px

    iOS zooms into any field under 16 px, and scrolled the page 337 px, 80 ms after the tap, to show the field. The editor keeps its fields at 16 px, takes the focus without the scroll and fits itself over the keyboard.

  • Fonts Before Text

    9 fonts

    Canvas text drawn before its font lands comes out in a fallback, and WebKit never fires loadingdone. The editor loads its 9 fonts on demand and keeps its own signal for when each has landed.

  • Your Page's CSS

    A page's resets and !important rules reach into what it embeds. The editor renders in its own shadow root and sets nothing on :root, html or body, so your styles can't reach in, and there's no CSS to import.

  • Edits That Reopen

    6 decimals

    A saved edit reopens with every change still editable, its geometry kept to 6 decimals so no pixel moves. An invalid state is refused with INVALID_STATE.

  • Every Framework

    6 frameworks

    React 18.3 and 19, Next.js with server rendering on the App and Pages Routers, Vue, Angular, Svelte and plain HTML. Importing it on a server touches no browser global.

  • Narrow Screens and Old Browsers

    320 px

    It lays out by its own width, not the window's, from 320 px up. Below its browser floor (Chrome 111, Firefox 114, Safari 17), checked by feature rather than by name, it still opens, with a banner.

Embed Editor at iPhone size: a pinch that keeps the owl's eye under the fingers, a flick that coasts on, the straighten ruler, a second finger that doesn't take over a drag, and Undo taking the whole gesture back
The details at iPhone size: a pinch that keeps the owl's eye under the fingers, a flick that coasts on, the straighten ruler, a second finger that doesn't take over a drag, and one Undo for the whole gesture.

In Numbers

Our editor, counted.

  • 69,000

    Lines of TypeScript, without the tests and the data.

  • 540,000

    Test runs in Chromium, Firefox, WebKit and two emulated phones. Most try every gesture on every pair of annotations.

  • 6

    Real apps, one per framework, that build and open the code this site gives you.

  • 21

    Adjustments and filters measured against an iPhone's Photos app, on color and detail charts.

Build it yourself, and each of these is something someone on your team reads, tests and keeps working.

Counted in the editor's code and its test reports on November 3, 2026, and rounded up.

Upkeep

Writing it is the cheap part.

Tokens are cheap. Reading 69,000 lines is not. Every Safari and iOS release, every new camera with bigger photos, every new React, Next.js or Angular, and every bug your users report lands on your team.

A Few Workarounds the Code Carries for a Single Engine

  • Firefox 114 and 115Measure no font box for canvas text, so the editor carries each letter's own metrics to place a text where every other browser does.
  • Firefox Before 149Ignores resizeQuality, so Auto and the crop's subject detection read a smoothed copy of the photo.
  • WebKitCopies the whole photo once per row on a 1:1 canvas copy, 0.7 to 1.2 s on 12 to 24 MP. The editor reads its copy through createImageBitmap instead.
  • SafariWrites to the clipboard only from inside the tap itself.
  • WebKitDoesn't focus a clicked button, so keyboard shortcuts would stop after the first click.
  • WebKitDrops a click when the text under the finger changes during the press.

34 of the editor's source files name WebKit or Safari.

Calculator

Do the math with your numbers.

What does an hour of the developer who keeps your editor working cost, and how many hours a month would it take? The fields open on a starting point. Put in your own: these numbers are yours, not ours.

Lite has the Adjust tools only, Full has every tool. Both are yearly prices in US dollars.

Lite
$49
Full
$1,499
Your Upkeep
$9,600

Full costs the same as 15 hours a year at your rate.

When to Build

When building it yourself is the right call.

You Need One Fixed Operation

A square crop for avatars, or a resize before upload. A small library or your agent covers it, and so does the Free edition: no cost, a small badge.

Photo Editing Is Your Product

If editing photos is what your product sells, own every pixel and every decision. Build it, and plan for everything below the waterline.

No Paid Dependency, Ever

If your company can't take on a paid dependency of any kind, build it, and use the list above as your checklist.

For Your Agent

Put your agent to work on your product.

An agent sets ours up in minutes, then gets back to what only your product does. It's one package and one component, with no CSS to import.

Typed and Documented

Every public type carries its documentation, so your agent and your IDE see each prop's meaning, range and default.

One Plain Value per Prop

Every prop is optional, one plain value with a default, applied live.

Markdown for Agents

Every page of this site is also served as markdown, and /llms.txt lists them all.

Read llms.txt, or this page in markdown.

PhotoEditor.tsx

// npm install @embededitor/free
import { EmbedEditor } from '@embededitor/free/react';

const PhotoEditor = ({ src }: { src: string }) => (
	<div style={{ height: 600 }}>
		<EmbedEditor lang='en-us' src={src} />
	</div>
);

export default PhotoEditor;

FAQ

Questions

Can I try it before paying?

Yes. The playground runs the whole editor, every tool, in your browser, and gives you the code for your framework. The Free edition costs nothing, commercial use included, with the Adjust tools and a small embededitor.com badge. The free tools on this site run the same editor on your own photos.

What happens if I stop paying?

You keep using the last version you received, and every version released until then stays installable. The editor never stops working: there is no license check in the browser, no domain lock and no call to our servers. Only new versions and support stop.

Do my users' photos go to your servers?

No. The editor edits in the browser and never calls a server of ours. Besides its own code, which ships inside your app, the only addresses it loads are the ones you give it: the photo's src, and your logo and mark images. Save hands your app the edited File and its saved state through onProcess, for you to keep wherever you choose.

Can my AI agent set it up?

Yes. It's npm install @embededitor/free and one component, with no CSS to import. Every public type carries its documentation, so your agent sees each prop's meaning, range and default, and every page of this site is also in markdown, listed in /llms.txt.

Is it priced per developer?

No. Developers are never counted. Full covers one project, a website with its subdomains and test environments, or an app; Lite and Full Unlimited cover unlimited projects.

Can I get a refund?

Yes: within 30 days of a payment, in full, no questions asked. Refunding the first payment revokes the license and its key.

Try it on your own photos.

The playground runs the whole editor in your browser. Change the edition, the colors and the tools, then copy the code for your app.