# JS Paint: A Pixel-Faithful MS Paint Remake in the Browser

> JS Paint recreates classic MS Paint in HTML5 canvas with extra features like nonlinear undo history, transparent image editing, and a Dwell Clicker. It is for people who want the old Paint back without giving up modern conveniences.

**1j01/jspaint** — 🎨 Classic MS Paint, ＲＥＶＩＶＥＤ + ✨Extras

- Repository: https://github.com/1j01/jspaint
- Website: https://jspaint.app/about
- Stars: 7,882 · Forks: 680
- Language: JavaScript
- License: MIT
- Published: 2026-09-22 · Updated: 2026-09-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/1j01-jspaint

## What JS Paint Actually Solves

The README is unusually direct about the motivation: "We want to undo more than three actions. We want to edit transparent images. We can't just keep using the old Paint." That is the whole pitch. Windows XP Paint capped undo at three steps; Windows 7 raised it to fifty. JS Paint ships unlimited undo and redo, and the history is a tree rather than a stack. If you undo several steps and then draw, the redos are not discarded; a new branch is created and you can jump to any point in that history. That single design decision is the strongest technical argument for the project, and it is the thing most clones do not attempt.

The audience follows from that. It is for someone who learned image editing in Paint and never wanted the ribbon interface, the skeuomorphic Fresh Paint, or Paint 3D. It is also for people who cannot use a conventional mouse: the README lists a Dwell Clicker that clicks after hovering in one spot, an Enlarge UI mode for eye trackers and head trackers, and Speech Recognition for selecting tools, colors, and menu items by voice. Those are not retro novelties. They are the reason a school, a clinic, or a kiosk might pick this over a modern editor with a denser interface.

The project is MIT licensed, the repository is not archived, and the last push was on 2026-07-19, with v1.1.0 released on 2026-04-10. Treat that as the maintenance signal: recent activity, but the release cadence between v1.0.0-beta.1 in March 2024 and v1.1.0 in April 2026 was slow.

## How the Canvas, History Tree, and Sessions Fit Together

The core is an HTML5 canvas application written in JavaScript, served as a web app at jspaint.app, with an Electron entry point at src/electron-main.js and a bin script named jspaint in package.json. The menu structure mirrors MS Paint: a tool box, a color box, a foreground and background color, and the File, Edit, View, Image, Colors, and Extras menus. Fidelity is the stated goal, down to "little-known features" the README says it recreates.

The interesting architecture is the document history. Because undo is nonlinear, the app has to model edits as a tree of states rather than a linear list, and the GIF export rides on the same structure: Extras > Animated GIF, or Ctrl+Shift+G, builds an animation from the current document history. That is a genuinely unusual feature and it only makes sense because the history is addressable. The README also suggests limiting the image size, which is a fair hint that the export is not free.

Collaboration is the thinnest part. Sessions start at a URL of the form jspaint.app/#session:multi-user-test and you send the link to other people. The README calls the support "rudimentary" and then states the failure modes plainly: actions by other users interrupt what you are doing and vice versa, sessions are not private, and you may lose your work at any time. Anyone evaluating this for a shared whiteboard should read that sentence twice. The README points to a separate project, Mopaint, for better collaboration support.

Other web-specific paths: File > Load From URL opens a remote image, File > Upload to Imgur pushes the current image out, and a URL fragment can preload an image, for example https://jspaint.app/#load:https://i.imgur.com/zJMrWwb.png. Paste also accepts URLs.

## Running JS Paint Locally and Drawing Your First Transparent Image

The simplest way to use it is the hosted app at jspaint.app; there is nothing to install for that. For a local checkout, the repository is a Node project with an Electron Forge setup, and package.json exposes a jspaint binary. The README does not print a full local setup sequence, so check CONTRIBUTING.md and release-process.md in the repository for the commands the maintainer actually uses before assuming a workflow.

Once the app is open, the feature that separates it from the original Paint is transparency. The README gives these steps: open Image > Attributes..., select Transparent, confirm with OK, then either Image > Clear Image or the Eraser tool. Any image that already contains translucent pixels opens in Transparent mode automatically.

A few shortcuts are worth memorizing on day one. Alt plus mousewheel zooms. Ctrl+. and Ctrl+, rotate the image. Holding Shift with the fill tool replaces a color across the entire image instead of only the contiguous region, which is the fastest way to recolor a flat background.

Palettes are a separate workflow. Colors > Get Colors loads a palette, Colors > Save Colors writes one out, and the README says many palette formats are supported through the AnyPalette.js library. You can also drag palette files straight into the app.

## Where JS Paint Is the Wrong Tool

There are no layers. The topic list on the repository includes "jspaint layers", but the README describes a single canvas with selections, transparency, and a history tree, not a layer stack. If your work depends on compositing, blend modes, or toggling visibility per element, this is the wrong program and no menu in it will change that.

Color management is absent from the documentation. There is no mention of ICC profiles, CMYK, or soft proofing, so anything destined for print should be prepared elsewhere. The same applies to non-destructive editing: rotation, stretch, and skew are commands applied to pixels, and while the history tree lets you jump back, there is no adjustment layer to revisit later.

The collaboration session is the third boundary. The README's own words are that sessions are not private and you may lose your work at any time. That rules it out for anything involving confidential images or work you cannot recreate. If you need shared drawing, the README points at Mopaint instead.

Finally, the Electron build is a desktop convenience, not a hardened application. It is a wrapper around the same web app, and the README does not document a sandboxing or update policy for it. If you are deploying to managed machines, verify the packaging behavior yourself rather than assuming it matches a native editor.

## JS Paint Versus Krita and Other Desktop Editors

The honest comparison is not against another browser paint app. It is against a full raster editor such as Krita or GIMP. Those are native applications with layer stacks, masks, color management, and a plugin ecosystem. They also have a learning curve measured in weeks, and their interfaces assume a large screen and a precise pointer.

JS Paint takes the opposite position on every one of those axes. It has one canvas, a fixed menu bar, and a tool box you can learn in an afternoon because it is the same tool box people already know. It runs from a URL, so a shared machine needs no install and no administrator rights. Its accessibility features are the clearest differentiator: the Dwell Clicker supports dragging windows and drawing on the canvas, and the README notes the underlying Tracky Mouse API is published on npm as tracky-mouse, so the same input method can be added to other web applications. Krita has no equivalent out of the box.

The trade is depth for reach. Choose Krita or GIMP when the output has to survive a print pipeline or when the composition is complex. Choose JS Paint when the constraint is the environment (a browser, a locked-down machine, an eye tracker) or when the user already knows Paint and should not have to relearn anything.

## Licence, Maintenance, and the Cost of Upgrading

The licence is MIT, stated in package.json and in LICENSE.txt. That permits commercial use, modification, and redistribution provided the copyright notice and permission notice are included. It does not grant trademark rights, and it comes with no warranty. This is a description of the licence text, not legal advice; if you are embedding JS Paint in a product, have counsel read LICENSE.txt rather than this paragraph.

Maintenance is a real consideration for a project this size. The last push was on 2026-07-19, and the gap between v1.0.0-beta.1 (2024-03-11) and v1.1.0 (2026-04-10) shows releases can be far apart. The repository carries a CHANGELOG.md and a release-process.md, so upgrade impact is traceable, but you should read the changelog between your pinned version and the target rather than assuming compatibility. There is no documented deprecation policy for the URL fragment features such as #load: or #session:, which means a deep link you build today is not contractually stable.

The upgrade path for the hosted app is nothing: users get whatever is deployed. That is convenient and also the risk, because a regression ships to everyone at once. If you need a fixed version, vendor the repository and serve it yourself, and pin the Electron build if you use the desktop wrapper.

## Conclusion

Adopt JS Paint if you want a zero-install, MIT-licensed paint program that behaves like the Windows 95 to XP era Paint, or if you need the accessibility features (Dwell Clicker, Speech Recognition, Enlarge UI) that the original never had. Do not adopt it if you need layer-based compositing, CMYK output, or a collaboration session you can trust with unsaved work; the README itself warns sessions are not private and you may lose your work at any time. Before committing, verify two things in the running app: that Undo branches the way you expect after you undo and then draw, and that the file format you need (PNG, TIFF, JPEG, BMP, or a palette format) survives a round trip through File > Save As and Colors > Save Colors.

## FAQ

### Is JS Paint the same as MS Paint?

No. It is an independent remake that recreates the tools and menus of classic MS Paint with high fidelity, and it adds features the original never had, such as unlimited nonlinear undo, transparent image editing, themes, and speech recognition. It is not affiliated with Microsoft.

### Is the JS Paint app safe?

The project is MIT licensed and the source is public, so the code can be inspected. The one documented risk is collaboration: the README states that sessions are not private and that you may lose your work at any time, so avoid sharing sensitive images through a session link.

### What is the JS Paint app used for?

It is a web-based image editor that recreates classic MS Paint, used for drawing and editing raster images, editing transparent images, exporting an animated GIF from the document history, and loading or saving color palettes. It also offers accessibility input modes such as a Dwell Clicker and Speech Recognition.

### What is a JS Paint alternative if I need layers?

JS Paint has no layer stack; it is a single canvas with selections, transparency, and a history tree. For layered work you need a different editor. If what you want is better shared drawing, the README points to the separate Mopaint project.

## Sources

- [1j01/jspaint on GitHub](https://github.com/1j01/jspaint)
- [License: MIT](https://github.com/1j01/jspaint/blob/master/LICENSE)
- [Project website](https://jspaint.app/about)
- [README](https://github.com/1j01/jspaint/blob/master/README.md)
- [Releases](https://github.com/1j01/jspaint/releases)

---

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