# Skulpt: the manifest says 1.2.0, the newest tag says 1.3.0 from 2021, and the test command runs twice

> Skulpt is a JavaScript implementation of Python that runs in a browser, wrapped for webpack by a two-pass build script. Its manifest version has fallen behind its newest tag, the newest tag is five years old, the package description still advertises Python 2.x, the single test command runs the unit suite once in each of two modes, and the ideas list that drives contributions is numbered 1, 1, 2, 3, 4, 6, 7, 8.

**skulpt/skulpt** — Skulpt is a Javascript implementation of the Python programming language

- Repository: https://github.com/skulpt/skulpt
- Stars: 3,403 · Forks: 909
- Language: Python
- License: NOASSERTION
- Published: 2026-09-23 · Updated: 2026-09-23 · Language: en
- Canonical page: https://hysenlabs.com/projects/skulpt-skulpt

## The manifest, the tag and the last commit tell three stories

`package.json` declares `"version": "1.2.0"`. The newest release is 1.3.0, published 2021-02-28 and described as internal updates and breaking changes. Before that, the two previous releases are 0.10.0 from 2015-06-30 and 0.9.10 from 2015-06-01, so there is a six-year gap between 2015 and 2021 and then nothing tagged for the five years since. The last commit on master is dated 2026-10-02, so the repository has moved a long way past anything a release names. The practical consequence is that a checkout reports a version lower than the newest tag it does not contain, and neither number describes the code you are holding. The package description has drifted in the same way: it still calls the project a JavaScript implementation of Python 2.x, while the README's own priorities have listed Python 3 work as the top item for years.

## Python 3 mode is one flag, shown in a snippet with a placeholder

The whole configuration surface for Python 3 is four lines:

```
Sk.configure({
    .... other settings
    __future__: Sk.python3
});
```

The flag is `Sk.python3`, passed as the `__future__` key, and the ideas list confirms its role by naming it as the mechanism to keep Python 2 and Python 3 behaviour behind one switch. Two things about that snippet are worth noting. It contains an elision, a line of four dots standing in for settings the reader is not shown, so the only complete thing about it is the flag. And the surrounding prose is anchored to a moment rather than a date: Python 2 is described as coming to the end of its life at the end of this year, with no year given, in a file whose last commit is from October 2026. The priority section does concede the limit of the claim, saying how much Python 3 you need depends on the situation, that for many uses Skulpt is already there, and that for more advanced work it is not.

## One test command runs the unit suite in both modes

The test script is three node invocations: a test wrapper, then the unit suite, then the unit suite again with a Python 3 flag. So a plain `npm test` executes the same unit tests twice, once under each configuration, which is the practical guarantee behind the single-flag claim. The pretest hook matches that shape by wrapping modules twice as well, once for the unit2 variant and once for unit3. Two further runners sit alongside: `brun` runs a browser runner in one mode and `btest` runs the same runner in test mode, and there is a `start` script pointing at a file runner for executing a script directly. Profiling is wired too, with a target that runs node under the V8 profiler flags for per-isolate logging and internal timer events, and a post-profile step that processes the resulting `v8.log`. The build documentation tells contributors the tests run during the build and that the outputs land in the dist folder.

## The standard library is wrapped in two passes around webpack

The build is a three-stage npm lifecycle. A prebuild hook runs a module wrapper in its internal mode, the build itself is a single webpack production run, and a postbuild hook runs the wrapper again in its builtin mode. So the Python standard library sources are transformed before bundling and transformed again after it, and the transformation is the project's own script rather than a webpack plugin. On top of that sits the `dist` target, which chains four steps in order: the build, the tests, a documentation build that runs jsdoc against HACKING.md with a configuration file into a docs directory, and a copy step that moves the results. The webpack step also takes a language target as an environment flag, and three targets are defined for it, output as ECMASCRIPT3, ECMASCRIPT5 and ECMASCRIPT_2019, which is an unusual amount of accommodation for a library that has to run in whatever browser a classroom has.

## Bower, Mercurial and Travis artefacts are still in the tree

The repository root holds configuration for tools that predate the one it tells you to use. There is a `.bowerrc` and a `bower.json`, so Bower is still configured alongside npm and a package lock file. There is a `.hgignore`, left from before the move to git, next to a `.gitignore` and a `.gitattributes`. There is a `.travis.yml` for a continuous integration service, and the README's badge row links a Gitter room rather than anything on GitHub. Alongside those are files whose purpose is not obvious from a listing: `dist-update.sh`, a Windows batch file named `skulpt.cmd`, a Python file named `skulpt.py`, a `stdlibstubs.py`, a `tok_test.py`, a single-character entry called `m`, and directories for documentation, examples, generation, support, a read-eval-print loop and a debugger. None of those are described in the README.

## The ideas list is numbered 1, 1, 2, 3, 4, 6, 7, 8

The contribution list is the closest thing the project has to a roadmap, and it is worth reading as written rather than as rendered. It contains eight items, and their numbers in the source run 1, 1, 2, 3, 4, 6, 7, 8: the first two share the number 1 and there is no 5. Markdown renders an ordered list by position, so the gap is invisible on the page and only appears in the source. The items themselves are honest about difficulty. Python 3 is first. Second is expanding the standard library, with the current inventory given as math, random, turtle, unittest and image, plus partial implementations of time, random, urllib, DOM and re, and random appearing in both the complete and the partial list. Third is the foreign function API, called critical for implementing parts of the standard library. Then come matplotlib, tkinter and numpy, named as much harder because they contain C code in their implementations.

## A debugger directory in the tree, a debugger on the list

Item 8 of that list proposes implementing the hooks for a debugger, noting it may be a half step towards the first item or may point somewhere else entirely, and arguing that letting students debug a program line by line would have real benefit. At the root of the repository there is a `debugger/` directory. So either that directory is the half step the item describes, in which case the list is behind, or it is something else, in which case the list does not say. The same pattern runs through the coverage claim: the README says Skulpt does an excellent job of meeting the 80/20 rule, covering the vast majority of the language features used by 80% and maybe even 90% of code, and then immediately concedes that there are builtins not implemented at all and builtins with only partial implementations. The examples directory makes the same point concretely, holding turtle, IPython in the browser and two WebGL example sets, none of which the README lists.

## Conclusion

Skulpt fits teaching material and anything that needs Python to execute client-side without a server, and its standard library covers the modules such material actually reaches for. Before you depend on it, know what you are reading. The version in the manifest is behind the newest tag, the newest tag predates the last commit by five years, and the README's forward-looking statements are anchored to an unnamed year in which Python 2 was ending, so the document has not kept pace with the repository even though commits have. The library is explicitly partial: five of its modules are marked partial, three heavyweight ones are named as too hard because they contain C code, and the coverage claim comes with its own hedge. Read the foreign function interface before planning a module, since the README calls it the critical piece for library work. And if you want Python 3 semantics, know that it is one configuration flag, tested by running the suite twice.

## FAQ

### What does Skulpt do?

It is a JavaScript implementation of Python that runs in a browser, described in the README as an implementation of Python 2.x. Python 3 behaviour is available by passing `Sk.python3` as the `__future__` key inside `Sk.configure`, and the developer toolchain is Node.js with webpack.

### How do I build Skulpt from source?

Clone the repository, install Node.js, run `npm install`, then `npm run dist`. That target chains four steps: a webpack production build, the test suite, a jsdoc documentation build driven from HACKING.md, and a copy step that leaves `skulpt.min.js` and `skulpt-stdlib.js` in the dist folder.

### How do I run Skulpt in Python 3 mode?

Pass `Sk.python3` as the `__future__` key inside `Sk.configure`. The test script exists to keep both modes honest: it runs the unit suite once normally and once with a `--python3` flag, and the pretest hook wraps modules separately for the unit2 and unit3 variants.

### Which Python standard library modules does Skulpt include?

math, random, turtle, unittest and image, plus partial implementations of time, random, urllib, DOM and re, with random appearing in both lists in the README. Modules named as candidates to add include functools, itertools, collections, datetime, operator and string, while matplotlib, tkinter and numpy are called much harder because they contain C code.

### What is the current version of Skulpt?

The manifest says 1.2.0, the newest release tag is 1.3.0 from 2021-02-28, and the last commit on master is dated 2026-10-02. The two releases before that are 0.10.0 and 0.9.10, both from June 2015.

## Sources

- [Issues](https://github.com/skulpt/skulpt/issues)
- [README](https://github.com/skulpt/skulpt/blob/master/README.md)
- [Releases](https://github.com/skulpt/skulpt/releases)
- [skulpt/skulpt on GitHub](https://github.com/skulpt/skulpt)

---

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