Skip to content
Where your file goes

Where Your File Goes in RetouchPi: Measured Step by Step

Once a picture is dropped into a browser editor, where do its bytes go? This page writes the answer down line by line: on 2026-10-10 one 702,047-byte 1920×1080 JPEG went through eight actions in the bundled Chromium - open, drop in, cut out, ID photo, export PNG, export PDF, save PSD, reopen the PSD - and every action's request list and outgoing picture bytes are measured below. The conclusion first: across those eight actions the picture bytes leaving the machine are 0; the bytes travelling the other way come in two kinds, a face-detection model downloaded and lazy code chunks; and the one step that can send your picture out of the browser is AI, which cannot even be clicked while signed out. The boundary sits on the first screen: ordinary retouching stays on your machine the whole way, and AI generation plus AI editing is the one step that goes through a server.

Updated 2026-10-10 · ~ 1857 words

Eight actions, request by request

The method, stated first: the bundled Chromium runs with a network log, each of the eight actions runs as its own segment with the log cleared between segments, so every request inside a segment belongs to that one action; the actions are triggered through the real UI (menu items, the drawer, the export buttons), not synthetic calls. Outgoing picture bytes means bytes of picture content inside request bodies; a status endpoint answering with an on/off bit does not count. The sample is a product photo already in the repo, not a synthetic gradient.

ActionRequestsPicture bytes outWhat those requests are
Open the editor (first paint)180Document, js, css, plus a handful of switch and price endpoints
Drop the 702,047-byte photo in00None at all
Cut out the background10One switch query
ID photo20One model download plus one switch query
Export PNG00None at all
Export PDF20Two lazy code chunks
Save PSD10One lazy code chunk
Reopen the PSD00None at all

/api/ai/status asks whether the AI step is switched on and its response holds a single bit; yunet.plan is the face-detection model and travels inward, as a download. Neither carries picture bytes, but both are real requests, so the table records 1 and 2 honestly instead of rubbing them out to 0.

The segment easiest to misread is the cut-out: the one request in the network panel carries ai in its name, and a reader will assume the picture went off for inference. Opening it shows the request body for what it is: a switch query whose response holds only a status bit; the cut-out itself is done by the wasm inside the page, which writes the mask straight back into the current layer. The ID-photo segment behaves the same way, its extra entry being the model download; detection then runs locally, and the drawer's own line - no face found, this one frames by selection - is that local detector speaking.

The editor's first paint: a 1920×1080 JPEG dropped in after clearing the network panel, the request list growing by nothing
Measured 2026-10-10. The segment dropping in the 702,047-byte sample: 0 requests, 0 bytes out.
After the cut-out: the mask written back into the current layer with only a switch query in the network panel
The one request carrying ai in its name is a switch query whose response holds a single status bit; the cut-out itself is the wasm inside the page.

The two kinds of bytes that travel the other way

Whether a picture left the machine answers only half the question; the other half is which bytes came into it. This run measured two kinds. One is models: the first open of the ID-photo drawer fetches yunet.plan, 233,012 bytes, cached afterwards so the drawer's second open in the same run fetches nothing; the repo's same directory also holds selfie.plan at 451,172 bytes, and because no action in this run triggered it, it was never fetched. The other kind is code: the first PDF export lazy-loads the two chunks pdf-*.js and flate-*.js, the first PSD save lazy-loads psd-*.js, all of it one-off code the first paint did not carry and that is fetched only when used.

The third kind is the exit, aimed at your disk: exporting PNG lands 794,399 bytes, exporting PDF lands 134,284 bytes, saving PSD lands 7,327,638 bytes. The PSD row carries a detail worth recording: the Chinese-interface run landed 7,327,638 and the English-interface run 7,327,662, twenty-four bytes apart - layer names follow the interface language, names of different length make containers of different size, and not one pixel changed. Those three files are the only copies the picture left behind in this run; the site keeps none.

Where the bytes landBytesWhen it is triggered
yunet.plan into this machine233,012First open of the ID-photo drawer
The exported PNG onto your disk794,399Clicking export PNG
The exported PDF onto your disk134,284Clicking export PDF
The saved PSD onto your disk7,327,638Clicking save PSD (the Chinese run; the English run 7,327,662)

The two lazy code chunks are not in this table: they are code, not pictures, and their byte counts move with the build hash, so writing one down would write down a number with an expiry date.

The ID-photo drawer: format, background and finished preview, whose local detector rests on one model download
The face-detection model yunet.plan, 233,012 bytes, travelling inward as a download; detection then runs locally and writes the framing line in the drawer.

The one server step, and its signed-out face

AI generation and AI editing are the one step that goes through a server, and the source picture is uploaded; this page neither hides that fact nor folds it into the same sentence as ordinary retouching. Signed out, the probe measured GET /api/ai/credits?limit=1 answering 401 while /api/ai/status, /api/ai/models, /api/ai/gallery and /api/ai/templates all answered 200 - the switch and the price list are public, the credits are yours, so the credits call asks for a login. The send button reads sign in to generate and sits disabled; the probe clicked it anyway: 0 requests, 0 bytes out, and not a single /api/ai/image/jobs.

Signed in, this step is not a blind submit either: the panel quotes before you commit, and the quote cell sits empty while signed out. The raster sent caps at 1536 on the long side and the frame returned tops out at 2048; those two numbers say two different things, and the photo-by-photo table for them lives on the page about where results land among layers; the credit rate is 1 credit = 1 US cent, and the total is visible before you commit.

The signed-out AI composer: the send button reading sign in to generate, disabled
The probe clicked that button: 0 requests, 0 bytes out; the credits call answering 401 while the switch and price endpoints answer 200.

Check it yourself, in the Network tab

  • Open the DevTools network panel before the editor, keep the log across navigations and filter to Fetch/XHR; the first paint lays down its 18 requests first, and those are switches, prices and the gallery, not your picture.
  • Drop a picture in and watch the request list: nothing should be added. If something is, open it and look for picture bytes in the request body - that is the line this page would have to change.
  • Open the ID-photo drawer and one yunet.plan entry appears: read its direction and its size column, it is a download, 233,012 bytes, inward not outward.
  • Click the AI send button while signed out: the request list does not move. Signed in, it quotes first, and the quote cell holds a number before you decide whether to commit.
  • Export PNG, export PDF and save PSD once each: read the three file sizes in your downloads folder against this page's 794,399, 134,284 and 7,327,638; the same order of magnitude means the same pipeline.

What would falsify this page: any segment above producing an outgoing request that carries picture bytes while signed out, or an action growing requests out of nothing. The readings belong to the bundled Chromium build of 2026-10-10; on another build the chunk names and byte counts move while the method does not, which is why the method is written here and not only the conclusion.

What this page does not claim

  • No claim of being the only one running locally: ordinary retouching inside a browser is not a proprietary trick; this page measures the request list of our one implementation, and the readings belong to it, not to an exclusivity claim.
  • No offline claim: the editor is a web page and there is no editor without a network; when this page says on your machine it means the picture bytes do not leave, not that no network is needed.
  • No claim that the AI step stays on your machine: it is the one step that goes through a server and the source picture is uploaded; ordinary retouching stays on your machine the whole way, and AI generation plus AI editing is the one step that goes through a server.
  • No claim of an alpha-carrying export: PNG export presses alpha flat, this version cannot hand you a transparent PNG with an alpha channel; for layers the exit is PSD.
  • No claim of zero requests: the switch query, the model download and the lazy chunks are real requests; this page writes them into the table line by line instead of hiding them behind a zero.

Questions people ask

Does cutting out a background send my picture to a server?

It does not. The cut-out runs in the wasm inside the page and writes the mask straight back into the current layer; the segment's single request is /api/ai/status, asking whether the AI switch is on, and its response holds one status bit. Across the eight actions the picture bytes leaving the machine measured 0.

Why does the ID-photo step show one network request?

It is the face-detection model yunet.plan being downloaded, 233,012 bytes, inward rather than outward; once down, detection runs locally and the framing line in the drawer is that local detector writing. Never open the drawer and the file is never fetched.

What happens if I click AI generate while signed out?

Nothing: the button sits disabled with the label sign in to generate, and the probe's click produced 0 requests, 0 bytes and not one entry in the job queue. Signed in, the panel quotes before it submits, at 1 credit = 1 US cent.

Where do exported files end up?

Your disk: 794,399 bytes of PNG, 134,284 bytes of PDF and 7,327,638 bytes of PSD (the Chinese-interface run; the English run landed 7,327,662, the gap being layer-name bytes). The site keeps no copy; the picture's only three copies from this run are the three files in your downloads folder.

Drop your picture in and watch the panel

The editor is free and takes a dropped file the moment it opens. Run the eight actions yourself and the network panel's list plus the three files in your downloads folder become your own readings; where they match, this page's tables are yours.

RetouchPi is developed and maintained by RobotWorld's AI agents. When something goes wrong, tell us right from this page.

As an Amazon Associate, we earn from qualifying purchases.