# DPaint.js, a browser paint program that still writes IFF ILBM

> DPaint.js is a browser image editor modelled on Deluxe Paint, with an unusual emphasis on the Amiga side of the format history: it reads and writes Amiga icon files, IFF ILBM images including HAM6, HAM8 and SHAM, IFF ANIM animations, and it can read straight from Amiga disk files. The editor itself has no dependencies and processes everything in the browser.

**steffest/DPaint-js** — Webbased image editor, modeled after the legendary Deluxe Paint with a focus on retro Amiga file formats: read and write Amiga icon files and IFF ILBM images/animations

- Repository: https://github.com/steffest/DPaint-js
- Website: https://dpaint.app
- Stars: 1,031 · Forks: 61
- Language: JavaScript
- License: MIT
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/steffest-dpaint-js

## The Amiga formats are the point, not the theme

DPaint.js is a webbased image editor modelled after Deluxe Paint with a focus on retro Amiga file formats. Next to modern image formats, it can read and write Amiga icon files and IFF ILBM images.

The Amiga section of the feature list is where the project's actual work is. It reads, writes and converts Amiga icon files in all formats. It reads and writes IFF ILBM images in all formats including HAM6, HAM8, SHAM and 24-bit. It reads and writes IFF ANIM files, the Amiga animation format. And it reads and writes directly from Amiga Disk Files, ADF.

Then the features that make it usable for the kind of art those formats hold. There is a heavy focus on colour reduction with fine-grained dithering options, because a 256-colour or 4-colour indexed image is a colour reduction problem and the dithering is where the result is won or lost. You can limit the palette to 12 bit for Amiga OCS and ECS mode, or 9 bit for Atari ST mode, which are the two hardware palettes those machines actually had. And there is an embedded Amiga Emulator to preview your work in the real Deluxe Paint, with the caveat that the emulator files are the one part not included in this repository, the emulator being based on the Scripted Amiga Emulator.

The Deluxe Paint legacy support is more specific than the name suggests. It supports PBM files as used by the PC version of Deluxe Paint, and it supports the Deluxe Paint Atari ST compression modes. Both are credited to named contributors in the README, which is the sort of detail that indicates the format work was contributed by people who knew the formats.

The main feature list for the editor itself covers layers, selections, masking, transformation tools, effects and filters, multiple undo and redo, copy and paste from any other image program or image source, customizable dither tools, colour cycling, and frame based animation.

The online version is at dpaint.app, the last push was on 2026-09-19, the default branch is master, and the release tags are v0.2.0-alpha from 2026-02-16 and v0.1-alpha from 2023-04-12. The licence is MIT.

## Colour cycling, and the reason the emulator is in the project

Colour cycling is listed as a separate top-level feature, and it deserves its own section because it explains the whole project.

DPaint.js supports Color Cycling, a long lost art of animating a static image by only rotating some colors in the palette. On an Amiga, a static image plus a palette rotation produced a moving picture, because the hardware did the animation rather than the file. The file never changed, only the colour table underneath it.

That is a capability that no modern image editor has a reason to implement, and it is exactly what a browser-based tool for retro formats can offer that a modern tool cannot. The README links an example and a layered source file that can be opened directly in the application with the play parameter, so the effect can be seen rather than described.

The embedded emulator exists to close the loop. If you are making an image for an Amiga, the real test is whether it looks right in the real Deluxe Paint on the real hardware, and an emulator preview of that is a much shorter feedback loop than flashing a disk image onto an Amiga. The constraint is that the emulator files are not in this repository, so the preview depends on an external dependency the project does not ship.

The Amiga file formats are read and written directly, including from ADF disk files. That matters because the ADF is the container the other formats were actually distributed in, and a tool that can open one and pull an icon or a brush out of it is doing something a generic editor cannot.

The downside of the focus is visible in the planned features list, which names support for non-square pixel modes such as HiRes and Interlaced, PSD import and export, SpriteSheet support, Commodore 64 graphics modes and animated brushes. All of those are future work, and the first one in particular is a limitation rather than a roadmap item for a tool that claims to target retro formats.

## No dependencies, no build step, and how to run it offline

The Free and Open section makes four claims, and they are the kind that get tested by anyone who opens the network tab.

It runs in your browser, works on any system and works fine on touch-screen devices like iPads. It is written in 100% plain JavaScript and has no dependencies. It is 100% free, with no ads, no tracking, no accounts, no nothing. And all processing is done in your browser, with no data sent to any server.

The dependency-free claim is about the editor itself, and the package.json shows how that is true. The runtime dependencies list is three entries, mp4-muxer, opentype.js and webm-muxer, all of which are for output formats and font handling rather than for the editor core, and the devDependencies are Vite and Playwright. The no-dependency statement predates the package.json, which was added for convenience, so the honest reading is that the editor core pulls in nothing and the build tooling is minimal.

The build section is equally direct. DPaint.js doesn't need building. It also has zero dependencies so there's no need to install anything. It is written using ES6 modules and runs out of the box in modern browsers. Just serve index.html from a webserver and you're good to go. There is an optional build step to create a compact version, using Vite, with a package.json included for convenience, so npm install and then npm run build produces a compact version in the dist folder.

Running offline has one caveat worth knowing. DPaint.js is a web application, not an app you install on your computer, and it has no online dependencies so it runs fine offline if you want to. But you have to serve the index.html file from a webserver, not just open it in your browser, because the ES6 modules need an origin. The README suggests the Spark app, downloading the binary for your platform and dropping it in the folder, then pointing the browser at http://localhost:8080/, and notes that any webserver will do, including the one built into Python with python -m http.server, or npx serve or npx http-server if you have node installed. If you are using Chrome you can also install dpaint.js as an app, and it will then show up in your Chrome apps and work offline.

The repository layout follows the static site pattern, with index.html at the root, dev.html for development, the _script/, _style/, _font/, _img/ and _data/ directories for the assets, a docs/ directory, a tests/ directory, a scrap/ directory, a vite.config.js, a manifest.json, and both a Dockerfile and a docker-compose.yml for serving the whole thing from nginx.

## Alpha status, browser quirks and the container

The contributing section is blunt about the state of the project. The current version is still alpha. The author is sure there are bugs and missing features, and bug reports and pull requests are welcome.

That matters for a project with a specific niche, because the niche users are exactly the people who will hit the edge cases. Someone restoring artwork from an ADF or animating a HAM8 palette is doing things that the author has covered but that a general user never does, so the alpha is alpha in the way that matters most for the people who would use it.

The browser quirks section is the most useful thing in the README for a user, and it is a warning about Brave. The Brave browser is using farbling that introduces random image noise in certain conditions, which they claim is to protect your privacy. The author's view is stated in the same section: although the sentiment is understandable, a browser should not actively alter the content of a webpage or intentionally break functionality. The practical advice is to lower your shields for this app in Brave or use another browser.

That is a genuine hazard for a pixel editor, because random image noise in a canvas would corrupt the artwork rather than merely misrender the page. The farbling defence is designed to make canvas fingerprinting harder, and a paint program is exactly the case where it damages the result.

The container setup is the simplest possible. The Dockerfile is nginx:alpine with a copy of the whole directory into the web root, and the compose file builds it and maps port 8080 to 80. There is a README-docker.md alongside, and a check:lazy-chunks script in package.json that inspects the built output for chunk sizes, which is a sensible guard for a project where the optional features are large.

The tests are Playwright, with a configuration in the tests directory, so the editor's own behaviour is checked in a real browser rather than a headless DOM. For an alpha with a small test suite, that is a reasonable amount of rigour.

## Conclusion

DPaint.js suits someone who needs to produce or open genuine Amiga artwork in a modern browser, since the ILBM, HAM, icon and ADF handling is the reason the project exists and is not something a general image editor offers. It is the wrong choice if you need a full pixel editor, because the feature list stops at drawing, dithering and colour cycling rather than layers with masking and filters, and it is the wrong choice if you need stability, because the project describes the current version as still alpha with bugs and missing features. Before relying on it, read the planned features list, since PSD import and export, non-square pixel modes and Commodore 64 graphics modes are listed as future work, and note that the Amiga emulator preview depends on files that are not included in the repository.

## FAQ

### What is DPaint.js?

A webbased image editor modelled after Deluxe Paint with a focus on retro Amiga file formats. Next to modern image formats it can read and write Amiga icon files, IFF ILBM images, IFF ANIM animations and Amiga Disk Files, and it includes colour cycling and an embedded Amiga emulator for previewing.

### Which IFF formats does DPaint.js support?

IFF ILBM images in all formats including HAM6, HAM8, SHAM and 24-bit, IFF ANIM files for animation, Amiga icon files in all formats, and it reads and writes directly from Amiga Disk Files. The palette can be limited to 12 bit for Amiga OCS and ECS mode or 9 bit for Atari ST mode.

### Does DPaint.js send my images to a server?

No. The README states that all processing is done in your browser with no data sent to any server, and that it is free with no ads, no tracking and no accounts. It is written in plain JavaScript with no dependencies.

### How do I run DPaint.js locally?

It does not need building. Serve index.html from any webserver, for example python -m http.server or npx serve, and point the browser at it. Opening the file directly does not work because the ES6 modules need an origin, and in Chrome you can install the site as an app so it works offline.

### Is DPaint.js ready to use?

The README says the current version is still alpha, that there are surely bugs and missing features, and that bug reports and pull requests are welcome. Planned features include non-square pixel modes such as HiRes and Interlaced, PSD import and export, SpriteSheet support, Commodore 64 graphics modes and animated brushes.

## Sources

- [License: MIT](https://github.com/steffest/DPaint-js/blob/master/LICENSE)
- [Project website](https://dpaint.app)
- [README](https://github.com/steffest/DPaint-js/blob/master/README.md)
- [Releases](https://github.com/steffest/DPaint-js/releases)
- [steffest/DPaint-js on GitHub](https://github.com/steffest/DPaint-js)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/steffest-dpaint-js
