Skip to content

Repository files navigation

Image Shred

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.

Features

Tools

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

Layers

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.

Adjustments and filters

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

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.

Paths

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.

Files

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.

Fillable PDF forms

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.

Interface

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.

Getting Started

Quick launch

  • Linux./ImageShred.sh, or double-click image-shred.desktop. On every launch the script rewrites that entry (and the per-user applications menu entry) with absolute Exec/Path/Icon, installs multi-size theme icons, and marks the .desktop files 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

Via npm

npm start

npm 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.jsonnwjs.version (currently 0.114.0).

Project Structure

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.

Development

Quality gates

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 audit

Actionable audit findings fail the process; deliberately advisory lists (for example uncalled methods in the reachability report) still print but do not fail the gate.

Cutting a release

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 nothing

One 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.

Running the parity audit

npm run test:parity

Prints 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.

Localization review

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-Hans

Open 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 i18n

The 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.

Testing

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 tool

Image 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.

Building

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 package

Zipped 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.

License

MIT

Credits

Built with NW.js and PixiJS v8.

About

Image Shred 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.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages