Image Shred 0.98 is an open-source desktop application for editing images, layered documents, animations, and PDF forms. It runs locally on Windows, Linux, and macOS with no account or subscription required.
The core editing workflows are functional: layers, masks, selections, transforms, painting,
retouching, editable text, paths, animation frames, PSD interchange, native projects, and
multi-page PDF form editing. Image Shred is still pre-1.0 software. Bugs and incomplete edge
cases remain, so keep backups of important source files and use .ishrd when work needs to
remain fully editable.
Source releases and development history are published at https://github.com/Psychronic-Games/ImageShred. See CHANGELOG.md for the complete release history and the 0.97 release notes for a short overview intended for users.
The toolbar groups related tool families. Press and hold a tool button to switch modes, the way Photoshop groups its own.
- Select — rectangle, ellipse, single row, single column, lasso, polygonal lasso, magnetic lasso, magic wand, quick selection, selection brush, object selection
- Move, Crop, Perspective crop, Slice
- Measure & annotate — eyedropper, colour sampler, ruler, note, count
- Navigate — hand (or hold space from any tool), rotate view, zoom
- Paint — pencil, brush, mixer brush, eraser, paint bucket, gradient (linear, radial, angle, reflected, diamond)
- Retouch — dodge, burn, sponge, smudge, blur, sharpen, liquify and colour replacement
- Repair — spot healing, healing brush, patch, clone stamp, pattern stamp, content-aware move, red eye
The retouch, healing and clone tools carry a Sample All Layers toggle: they read from the merged picture and write onto the active layer alone, so you can heal or dodge onto an empty layer and keep the original untouched underneath.
Liquify and Puppet Warp preview changes until Apply. Applying a changed warp converts Smart Objects, text, and vector layers to pixels; Undo restores their editable sources. Cancel and an unchanged Apply retain editability. Layer styles remain editable after warping.
Free Transform remembers a layer's rotation: re-selecting a rotated shape brings its frame back at the shape's own angle, and the corner handles scale along its axes — for raster and vector layers as well as text, which is a step past Photoshop.
- Erase — eraser, magic eraser, background eraser
- Type — horizontal, vertical, and both as type masks
- Shapes (rectangle, rounded rectangle, ellipse, triangle, star, polygon, line, freehand)
- Paths — pen, freeform pen, curvature pen, anchor point, path selection, direct selection
Photoshop blend modes are supported. Modes without a native renderer equivalent are composited per pixel, with the same code driving the screen and flattened exports so the two cannot disagree. Also per-layer opacity, groups, layer styles, layer masks (paintable, invertible, applicable), and re-editable, stackable adjustment layers with their own masks.
Brightness/Contrast, Levels, Curves (monotone cubic, with a histogram), Hue/Saturation, Colour Balance, Vibrance, Black & White, Photo Filter, Channel Mixer, Selective Colour, Threshold, Posterize, Gradient Map, Desaturate, Equalize, Auto Tone, Auto Contrast, plus the filter gallery.
Selections carry 0-255 coverage rather than a yes/no mask, so Feather means something and partial coverage flows correctly through every adjustment. Select > Modify offers Feather, Smooth, Border, Expand, Contract, Grow, Similar and Colour Range. Expand and Contract use an exact Euclidean distance transform, so round selections stay round.
Bézier paths that stay live in the document. Draw with any of the six pen tools, edit the anchors and handles afterwards, then fill, stroke, or load as a selection — or trace an existing selection back into a path. Paths export as SVG, which is more than Photoshop will do with them.
Opens PNG, JPEG, GIF, WebP and BMP through the image decoder; PDF through the
project's importer; SVG as editable vector/text layers (or as a single raster);
Word .docx as raster pages; layered PSD/PSB through the PSD reader;
DDS game textures (BC1-BC5 and BC7 block compression, uncompressed bitmask, 16-bit and
float formats; the largest mip of the first face of a cube map or array);
and native .ishrd projects.
The PSD reader restores supported layer names, bounds, opacity, blend modes, visibility,
masks and groups from Raw, RLE and ZIP channels in supported RGB and Grayscale files.
Indexed PSD composites use their embedded palettes; truncated raw and RLE composites
are rejected instead of opening with incomplete pixels.
Saves flattened PNG, JPEG and WebP images, animated GIF, multi-page PDF, layered PSD, and
native .ishrd projects. PSD is an interchange format: it preserves the supported raster
layer structure, but Image Shred-specific editable state is not guaranteed to round-trip.
.ishrd is the full-fidelity working format for continuing an Image Shred edit.
Word documents are not re-editable as Word. .docx / .docm / .dotx / .dotm and
legacy .doc open as pages (the same frame bar PDFs use). Paper blanks, underscores,
and Word form controls become PDF form fields; Save As defaults to a fillable PDF.
.doc uses LibreOffice when it is installed, otherwise the text is extracted in-process.
Floating drawings, columns, and magazine-style wrap are best-effort.
TIFF and HEIC have no project encoder or decoder and are not claimed as supported. A particular Chromium runtime may happen to decode additional image types, but the Save dialog only offers formats for which Image Shred has a real output path.
Draw text fields, checkboxes, radio groups, dropdowns, list boxes, signature fields and buttons straight onto a page, and export a PDF anyone can fill in — the job you would otherwise open Acrobat for.
A PDF that was opened here is edited by incremental update, the same mechanism Acrobat uses: the original bytes are kept verbatim and the form is appended, so embedded fonts, colour profiles, tagged structure, bookmarks and signatures on earlier revisions remain in earlier revisions. Painting a page replaces that page's displayed artwork with a raster image in the incremental update; unchanged pages retain their original content. Adding, deleting or duplicating pages rebuilds the exported page tree. An existing form can be read back and edited rather than only added to.
Native .ishrd projects (format 1.4) retain pages, editable layer state, form fields,
original PDF bytes, notes, measurements and slices. Older project versions still open.
Field properties include values, appearance, alignment, required/read-only flags, comb and multiline text, choice options, button actions, validation, formatting, and bounded calculation scripts. PDFs can also be digitally signed with a PKCS#12 identity through an installed OpenSSL executable. Dynamic XFA rendering is not implemented; hybrid-XFA data is preserved while its AcroForm fields remain editable.
Dark theme, dockable panels, rulers and guides, grid and pixel grid, multiple open documents as tabs, a frame bar for PDF pages and animation frames, and full undo/redo history with a visible history panel.
Available in English, Japanese, Spanish, Simplified and Traditional
Chinese, Russian, Portuguese, German, French, Greek, Korean, Arabic (right-to-left),
Italian, Polish, Indonesian, Vietnamese, Thai and Turkish. Translation keys and dialog
bindings are checked by the i18n audit and application test suites. These automated checks
measure table completeness and UI wiring, not linguistic quality; native review remains
pending as recorded in docs/i18n-review-status.json.
- Linux —
./ImageShred.sh, or double-clickimage-shred.desktop. On every launch the script rewrites that entry (and the per-user applications menu entry) with absoluteExec/Path/Icon, installs multi-size theme icons, and marks the.desktopfiles executable so GNOME trusts them. Run it once after moving the folder. Details:LINUX_ICON_README.md. - Windows — double-click
ImageShred.bat - macOS — double-click
ImageShred.command
npm startnpm start runs nw ., so it needs the NW.js binary on your PATH. The launcher scripts
above use the bundled runtime in nwjs-linux/ (or nwjs-win/, nwjs-mac/) instead, which
is why they work without one. Those runtimes are large and are not committed — see
build-scripts/ for how they are fetched. Release builds pin NW.js via
package.json → nwjs.version (currently 0.114.0).
Image Shred/
├── .github/workflows/ # CI quality + artifact smoke
├── build-scripts/ # Cross-platform packaging and artifact smoke
├── docs/ # Status notes and i18n review manifest
├── images/ # Application and toolbar icons
├── libs/ # Third-party libraries
├── nwjs-linux/ # NW.js runtimes (not committed)
├── nwjs-mac/
├── nwjs-win/
├── src/
│ ├── app.js # Application shell and document management
│ └── modules/ # Modules grouped by editor subsystem
├── tools/
│ ├── photoshop-parity-audit.js # Tool-by-tool parity report
│ ├── i18n-export.js # Localization review export/check/apply
│ ├── icons/ # Toolbar icon generator
│ └── test/ # CDP-driven test runner and suites
├── image-shred.desktop # Linux launcher entry (rewritten on launch)
├── ImageShred.sh # Linux launcher
├── index.html # Markup for the whole UI
├── styles.css
├── CHANGELOG.md
└── package.json
src/modules/ is where nearly everything lives. Most managers are constructed once with
a reference back to the app, while parsers, static utilities and a few subordinate managers
have narrower lifetimes. app.js wires the subsystems together and swaps the active
document state they share.
npm run check:static # syntax, gate helper tests, i18n/parity/reachability audits
npm run check # static gates + full live test suite
npm run check:release # check + sequence fuzz + runtime tool/menu auditActionable audit findings fail the process; deliberately advisory lists (for example uncalled methods in the reachability report) still print but do not fail the gate.
node tools/cut-release.js 0.98 # suite → roll versions → commit → tag → push
node tools/cut-release.js 0.98 --dry-run # show what would happen, touch nothingOne command from a clean working tree to a published GitHub release. It runs the full
test suite as the gate, renames the changelog's ## [Unreleased] section to the
version, rolls package.json and this README's version line, commits, tags v<x.y>,
and pushes. Pushing the tag starts .github/workflows/publish-release.yml, which
creates the GitHub release with that changelog section as its notes — the release and
the changelog are the same text by construction. Release entries accumulate under
## [Unreleased] in CHANGELOG.md between releases.
npm run test:parityPrints Photoshop's toolbar grouped as Adobe groups it, with a tick or a dot against each tool, and a list of what is still missing or deliberately declined.
Export one prefix for every non-English locale, or one locale using its runtime ID:
npm run i18n:export
node tools/i18n-export.js --prefix=fp. --lang=zh-HansOpen the locale TSV in a spreadsheet and edit only the translation column. Keep the five
metadata/header rows and every scoped key. Before applying a returned file, validate its
locale, scope, English checksum and proposed changes without touching i18n.js, then apply
the same file:
node tools/i18n-export.js --check=i18n-review/de.tsv
node tools/i18n-export.js --apply=i18n-review/de.tsv
npm run audit:i18n-review
npm run audit:i18n
node tools/test/run.js i18nThe final smoke is visual: switch to the reviewed language, open at least one generated
dialog and the filter gallery, and confirm translated labels are visible, current and not
clipped. For Arabic, also confirm the document is dir="rtl", dialog/filter ordering reads
right-to-left, and controls remain usable. Update docs/i18n-review-status.json to
reviewed with the actual review date only after a native specialist has completed that
scope; automated audits do not earn that status.
npm test # every suite
node tools/test/run.js coverage # one suite
node tools/test/run.js --shots # screenshot every test, not just the failures
npm run test:sequences # random multi-step operation orders
npm run test:branches # V8 function + branch coverage report
node tools/test/real-input.js # real mouse/keyboard: transform scenarios
node tools/test/real-input-tools.js # real mouse/keyboard: every toolbar toolImage Shred is an NW.js application, so its code cannot be exercised by importing it — the
canvas, the PixiJS stage and the layer stack only exist inside a running window. The runner
launches a real instance, attaches over the Chrome DevTools Protocol and evaluates each
test inside the page. This needs the SDK flavour of NW.js; a packaged build has no
debugging port. The runner verifies the SDK matches package.json nwjs.version.
Suites live in tools/test/suites/. tools/test/README.md covers how to write one, and
the two rules they follow — look at a screenshot, and pick a signal the operation can
actually move.
The six September 5 audits repaired 83 confirmed findings and added 138 behavioral regression scenarios. See the first repair report, second repair report, third repair report, fourth repair report, fifth repair report, and sixth repair report for fixes, validation results, and remaining limitations. Reports distinguish complete suite runs from focused reruns and explain corrected test measurements.
The latest complete run passes 1,653 checks across 131 suites, including all 27 new sixth-pass scenarios. Static gates pass across 248 JavaScript files and 16 helper tests. The sixth pass repairs merge bounds and compositing, duplication of masks and effects, Layer Properties history, Eraser targeting, painting with disabled effects, persistent pixel edits and Pixel Art Scale on editable artwork, and faint Patch selections. Raster edits and Pixel Art Scale convert affected editable artwork to pixels; Undo restores the editable source. Mask edits preserve Smart Object artwork editability.
For Linux testing without desktop windows or dialogs, use a private Xvfb display and isolated profile as described in the offscreen audit instructions. Give each concurrent test application its own private display to keep rendering callbacks active.
The two real-input harnesses drive the app with real CDP mouse and keyboard events —
Chromium hit-testing end to end — where the suites' helpers emit synthetic events on the
PIXI stage and cannot grab a transform handle or press a toolbar button. Bugs reported
from actual use are reproduced there first.
npm run test:coverage / test:branches report which functions and paths suites actually
executed, counted by V8 rather than by searching the source. A suite named after a module
is not coverage of it.
npm run build:stage # staged payload only (+ structural smoke)
npm run build:linux
npm run build:win
npm run build:mac
npm run build:all # everything, zipped (+ structural smokes)
npm run smoke:packaged:linux # launch a built Linux normal-runtime packageZipped release builds leave only versioned archives in the selected output directory,
for example ImageShred-v0.98-linux-x64.zip. Desktop archives contain one ImageShred/
folder; the web archive contains its deployable files at the archive root.
Packaged builds omit build-scripts and devDependencies; the in-app Build menu is hidden
when those are absent.
MIT