# Piskel: a browser sprite editor you can also self-host

> Piskel is a JavaScript pixel-art and animation editor that runs in the browser and ships offline and CLI builds. It is a good fit for small sprite work and a poor fit for anyone who needs mobile support or a fast-moving feature set.

**piskelapp/piskel** — A simple web-based tool for Spriting and Pixel art.

- Repository: https://github.com/piskelapp/piskel
- Website: http://piskelapp.com
- Stars: 12,815 · Forks: 919
- Language: JavaScript
- License: Apache-2.0
- Published: 2026-09-21 · Updated: 2026-09-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/piskelapp-piskel

## What Piskel is for, and who it is actually for

Piskel is a sprite editor. The README describes it as an easy-to-use tool for creating game sprites, animations and pixel art, and it is the editor running on piskelapp.com. The people it serves are narrow and specific: hobbyist and indie game developers who need small raster assets, and anyone teaching pixel art who wants a tool that opens in a tab with no install.

The design follows from that audience. It is built purely in JavaScript, HTML and CSS, so there is no native binary to distribute for the hosted version. The README is explicit that there is no support for mobile, which rules out tablets as a drawing surface. Browser support is a short list: Chrome, Firefox and Edge at their latest versions, plus Brave only if canvas fingerprinting is disabled. That Brave caveat is not a footnote. Canvas-based fingerprinting protection interferes with how the editor reads pixel data, and the README links a wiki page about it rather than offering a workaround.

The contribution policy tells you what kind of project this is. Small fixes such as documentation updates, typos and minor bugs are accepted. Large bug fixes spread across the codebase, major refactors, and anything that modifies the user experience or adds features are unlikely to be reviewed or merged, with the README citing limited time and resources. Read that as a maintenance posture, not a bug list. The repository is not archived and the last push was on 2026-09-20, so the code is touched, but the newest release listed is v0.15.0 from 2018-11-25. The release channel and the branch have diverged for years, and anyone evaluating the project should look at both before deciding.

## How the editor is put together

Piskel is a client-side application. Everything the editor does happens in the browser tab: drawing, frame management, onion skinning and export all run on the canvas element in JavaScript. There is no server component in the editor itself, which is why a static build can be served from any file host and why the hosted version at piskelapp.com needs no account backend for the editing workflow.

The dependency list in the README maps directly onto the features. Spectrum handles the color picker. gif.js generates animated GIFs in JavaScript using web workers, so GIF encoding does not block the drawing surface. A modified SuperGif parses and imports GIFs, which is the inverse path. JSZip reads and writes .zip files in JavaScript, and canvas-toBlob is a shim for the canvas toBlob method. jQuery is present but the README says it is used sporadically, and bootstrap-tooltip supplies the tooltips. Playwright is the end-to-end test runner.

The repository layout confirms a modern toolchain wrapped around that legacy core. There is a vite.config.js and a vite-plugins/ directory, a biome.jsonc for linting, a karma.conf.js for unit tests, and a playwright.config.ts for end-to-end tests. The build script chains three steps: npm run build:sprites, then vite build, then node scripts/partials.js. The sprite build step exists because the editor's icons and UI graphics are themselves sprites generated at build time, which is a neat bit of dogfooding but also means a broken sprite script breaks the whole build.

Two entry points are declared in package.json. The bin field exposes piskel-root from misc/scripts/piskel-root and piskel-cli from cli/index.js. The main field points at ./dest/prod/index.html, which is the built editor page. The package is published with files limited to dest/prod and misc/scripts/piskel-root, so an npm install gives you the built editor and the root script, not the source tree.

## Running Piskel locally from the repository

The README does not spell out install steps inline. It says to have a look at the wiki to set up the development environment, so the authoritative instructions live there. What the repository does give you is the script surface in package.json, and that is enough to describe the shape of a local run.

The build pipeline is driven by npm scripts. The following runs the sprite generation, the Vite build and the partials step in sequence:

```bash
npm run build
```

After that, the start script runs the build again and then serves the result through node scripts/serve.js:

```bash
npm run start
```

If you are working on tests rather than the editor, start:test runs the same build and serve path with a --test flag passed to the serve script. Unit tests run under Karma and end-to-end tests run under Playwright:

```bash
npm run unit-tests
npm run e2e
```

There is also a combined test script that runs the unit tests and then the end-to-end suite. For a first real use, the practical path is npm run start, open the served page, and draw a frame. The README's own description of the tool is that it creates game sprites and animations, so the first exercise worth doing is a two-frame animation with onion skinning enabled, then an export, since export is where the GIF and spritesheet dependencies actually get exercised. The README does not document the export dialog's options in detail, so judge the output by opening the generated file rather than by reading about it.

For a packaged editor rather than a source build, the README points at offline builds and a wiki page titled Desktop applications. That is the route for users who do not want a Node toolchain. There is also a CLI entry point, piskel-cli, declared in package.json, but the README does not document its flags or subcommands.

## Where Piskel stops being the right tool

The clearest boundary is mobile. The README states plainly that there is no support for mobile, and the browser list does not include Safari or any mobile browser. If your workflow involves drawing on a tablet, Piskel is the wrong choice and no configuration will fix it.

The Brave situation is a second boundary that is easy to miss. Brave is listed as supported only if canvas fingerprinting is disabled. That is a browser-level privacy feature, and asking a user to turn it off to draw sprites is a real cost. On any browser with similar canvas protections, expect the same class of problem.

The third boundary is contribution velocity. The README's PR policy rules out new features and UX changes because of limited time and resources. That means a bug that requires a cross-cutting fix may sit unresolved even though the repository is still receiving pushes. A team that needs a guaranteed fix path should treat Piskel as a frozen dependency and plan to patch it themselves, which is feasible under Apache-2.0 but is real work.

Finally, there is a version gap. The latest release in the list is v0.15.0 from 2018-11-25, while package.json declares version 0.15.2-SNAPSHOT. If you install from npm, you are likely getting a published artifact that predates a lot of what is on master. If you build from source, you are on an unreleased snapshot. Neither is wrong, but they are different products, and the README does not reconcile them.

## Piskel versus Aseprite, and what the difference means in practice

The comparison people actually search for is Aseprite, and the two tools sit in different categories. Aseprite is a downloadable desktop application. Piskel is a browser application built in JavaScript, HTML and CSS, with offline builds available through a wiki page. The practical consequence is deployment: Piskel can be served from a static host or embedded in a web workflow, while a desktop editor has to be installed per machine.

That difference cuts both ways. A desktop application can use native file dialogs, native input handling and platform-specific performance paths. Piskel's GIF encoding runs through gif.js and web workers inside the browser, and its file handling runs through JSZip and canvas-toBlob. Those are capable libraries, but they are browser libraries, and the editor's ceiling is set by what the browser canvas and the JavaScript runtime allow.

The other difference is inertia. Aseprite is a commercial product with its own release cadence. Piskel's newest listed release is from 2018-11-25, and its README explicitly discourages feature contributions. If you want a tool that gains features, the comparison is not close. If you want a tool you can read, fork and self-host under a permissive licence, Piskel's Apache-2.0 terms and its plain JavaScript source are the reason to pick it. Neither answer is universal, and anyone who tells you one editor wins outright is skipping the deployment question.

## Licence, maintenance and the cost of staying current

Piskel is licensed under the Apache License, Version 2.0, copyright 2017 Julian Descottes. The README reproduces the standard Apache-2.0 notice and points to the full text at apache.org. For a self-hosted deployment, that is a permissive licence with a patent grant and a requirement to preserve notices. It is not legal advice, and if you plan to redistribute a modified build you should read the licence text rather than this summary.

The maintenance picture has two layers. The repository is not archived and the last push was on 2026-09-20, so the codebase is still being touched. The release history is a different story: v0.15.0 in November 2018, v0.14.0 in March 2018 and v0.13.0 in October 2017. Anyone tracking releases is tracking a channel that has been quiet for years, while master moves.

Upgrade cost depends on which of those you depend on. If you consume the npm package, the files field limits it to dest/prod and misc/scripts/piskel-root, so you get a built editor and the root script rather than the source. If you build from source, you inherit the toolchain: Vite, Biome, Karma and Playwright, plus the sprite generation step. The preversion script runs lint, the full test suite and a build before a version bump, and postversion pushes commits, tags and publishes to npm. That is a conventional release process, and it means a release is gated on both unit and end-to-end tests passing. It also means a contributor who wants to publish a fix has to get the whole suite green, which is a meaningful barrier given the stated time constraints.

## Conclusion

Adopt Piskel if you need a zero-install browser editor for small sprites, animations and spritesheets, or if you want to self-host it from the repository. Do not adopt it if you need mobile or tablet support, since the README states there is none, or if you depend on new features landing quickly, because the contribution policy rules out UX changes and large fixes. Before committing, verify two things yourself: that your browser is on the supported list (Chrome, Firefox, Edge, or Brave with canvas fingerprinting disabled) and that the export path you need, PNG or animated GIF, behaves as you expect on your own sprite sizes. The repository is not archived and the last push was on 2026-09-20, but the newest release is v0.15.0 from 2018-11-25, so treat the release channel and the master branch as two different things.

## FAQ

### What is Piskel used for?

Piskel is a sprite editor for creating game sprites, animations and pixel art. The README describes it as easy to use and notes that it is the editor used on piskelapp.com.

### Can you download Piskel?

Yes. The README states that offline builds are available, with more details on a dedicated wiki page about desktop applications. There is also an npm package whose files field includes dest/prod and misc/scripts/piskel-root.

### How do you install Piskel on Linux?

The README does not give platform-specific install steps. It directs readers to the wiki to set up the development environment, and the offline build wiki page covers desktop applications. From the repository, the build is driven by npm run build and served with npm run start.

### Is Piskel good?

That depends on the use case. The README lists Chrome, Firefox, Edge and Brave (with canvas fingerprinting disabled) as supported and states there is no mobile support, so it suits desktop browser work on small sprites rather than tablet drawing or a feature-hungry workflow.

### How do you animate using Piskel?

Piskel manages frames inside the editor and exports animated GIFs using gif.js, which generates GIFs in JavaScript with web workers. The README does not walk through the animation UI step by step, so the specifics are in the application itself.

### How do you use onion skin in Piskel?

Onion skinning is part of the editor's frame workflow, but the README does not document the control or its settings. The repository's tests and source under src/ are where the behaviour is defined.

## Sources

- [License: Apache-2.0](https://github.com/piskelapp/piskel/blob/master/LICENSE)
- [piskelapp/piskel on GitHub](https://github.com/piskelapp/piskel)
- [Project website](http://piskelapp.com)
- [README](https://github.com/piskelapp/piskel/blob/master/README.md)
- [Releases](https://github.com/piskelapp/piskel/releases)

---

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