# Free4AllHub image workbench

Original MIT-licensed, zero-dependency software for one still image plus editable
text layers. Crop, resize, rotate, add text, save an editable project and export
PNG/JPEG/WebP. This is not miniPaint, Squoosh or Photoshop and contains none of
their code or assets.

## Run and modify

Open image-workbench.html in a current browser. Runtime CSS and JavaScript are
embedded. No installation, package, external font, server, analytics, account,
automatic storage or app network request is needed. Optional documentation and
host links are ordinary links. The web host serves the page normally.

Edit page.html, style.css, core.mjs and app.js (keep poster-project.json alongside them in the source ZIP), then run `python3 build.py` to
regenerate the standalone page. Python is needed only to rebuild. Keep the full
MIT notice; it is embedded in the HTML and included as LICENSE.txt. The ZIP build
is reproducible. Only these original files and the original practice image are
covered; visitor images and unrelated Hub assets retain their own rights.

## A result you can revise

1. Choose a still image, Try the practice picture, or Start the editable fictional poster.
2. Crop, rotate and choose output width/format.
3. Add text layers. Change their text, position, size, system font, colours,
   visibility and stacking order. Positions refer to the final output canvas.
4. Prepare editable project and download the JSON file.
5. Reopen the JSON in a fresh tab with “Or reopen an editable project.”
6. Revise a text layer, save a new project, and export a flattened image to share.

Image exports flatten text; they cannot restore editable layers. Project JSON
preserves the complete original image bytes, crop, output settings and layers.
Invalid images and project files are rejected before replacing the current work.
Replacing any loaded work with an image, practice picture, project or fictional
poster asks first, even after a download click. Cancel keeps the work and prepared
links. Failed image decoding or practice-picture construction also keeps them. Reset image settings retains text layers.
Clear removes current in-memory work, not files you have downloaded. Nothing is
saved automatically. Download the flattened PNG/JPEG/WebP and inspect the saved
file in a fresh tab or image viewer while keeping the editor open. Keep and check
the editable JSON before replacing your work. Reopening a PNG in this editor
does not restore its text layers. Neither the in-page preview nor a download
click proves that a file was saved or reopened.

## Important privacy difference

Editable project files are **not redacted images**. They retain the original
image, original metadata, cropped-out pixels, filename, and hidden text layers.
They are plain JSON, not encrypted. Keep them private when they contain private
material. Share a flattened exported image when you mean to show only the final
composition. Raster exports do not deliberately copy original EXIF/IPTC/XMP,
but this is not a certified metadata sanitizer or evidence-preserving workflow.

## Limits

Input image: 12 MiB, 24 megapixels and 12,000 pixels per side. Project JSON:
20 MiB. Output: 16 megapixels and 8,192 pixels per side. Up to 20 text layers,
500 characters/10 lines each. Text size 1–40% of output height, positions 0–100%.
System fonts and glyphs can differ between devices. Long lines can be clipped;
check preview and exported image. There is no automatic wrapping or text fitting.

Header checks precede decoding, then dimensions and crop bounds are checked
against the orientation-correct decoded image. Animated PNG/WebP and unsupported
formats are rejected. Browser decoders remain trusted; this is not a full parser
or malformed-image security audit.

No general image layers, masks, PSD, RAW, retouching, batch processing, cloud
collaboration, professional colour/CMYK or guaranteed smaller files. JPEG flattens
alpha onto white. Browser colour, font and encoding differences can change the
result. Devices may run out of memory below the caps. Source and projects are
portable files, not managed backups or account sync.

## Honest comparison

Official Adobe documentation supports the narrow crop/resize/rotation overlap
linked in the page. Text stacking and our JSON projects do not provide general
Photoshop layers or PSD compatibility. No equal quality, price, full replacement
or realized savings is claimed. Existing free/device tools may already do the job.

## Testing evidence

Previous v19 checks: 59 Hub tests; actual cropped/rotated PNG, JPEG and WebP
browser downloads independently decoded for dimensions, crop and alpha. Downloaded
PNG/WebP reopened. That evidence is retained unchanged in verification/image/ in
the containing Hub source.

Version 20: 66 aggregate Hub tests passed. Cloud Chromium desktop checks used actual
project downloads: original image plus two text layers, fresh-tab reopen, changed
text/font/position, second project download, and PNG export/reopen at 480 × 480.
Original bytes matched exactly in both project files; the hidden layer and crop
settings survived. A malformed project was rejected with current work kept;
canceling replacement also kept the unsaved revision.

Editable-project checks are recorded separately in verification/image-project/.
Focused tests cover exact original bytes/settings, fresh reopen/revise/save,
malformed inputs, cancellation, layer order/visibility, invalid edits and prior
asset preservation. The release receipt records actual browser/file checks.
Not a real-beginner, screen-reader, physical-mobile, professional-colour,
maximum-memory or security certification. Direct file:// launch is not certified;
standalone dependency-free output and exact source rebuild are checked.

## Direct fictional poster practice

The explicit Start button parses the bundled original poster JSON through the same
parser, decoder and settings path as project import. It does not fetch anything,
auto-load from links, download a file, or count a new practice as saved. The four
original layers and 1200 × 440 crop are preserved; the intended exercise changes
3 pm to 4 pm. Keep the fictional label and MIT notice. The original practice
picture remains separate. Busy loading/export disables the starter button. Clear
invalidates pending loads; failed decoding and canceled replacement keep current work.

The Hub builder packages the exact poster-starter/assets/image-project-v2.json
bytes as poster-project.json in the standalone source ZIP. Its build.py embeds
that local input without needing the Hub checkout. Controller tests simulate
decoding, canvas and downloads; they are not browser/native-download acceptance.
This new shortcut has not yet been browser-tested.
