Snap! Visual Programming and Extension Platform
a visual programming language inspired by Scratch
At a glance
- What is it?
- Snap! is a browser-based visual programming language inspired by Scratch, with a JavaScript codebase and a documented extension API. It suits learners, educators, and developers modifying the IDE, but storage and deployment details require verification.
- Who is it for?
- Snap! fits browser-based visual programming, especially for teaching and experimenting with block-defined programs. It is a poor fit for teams that need a documented native installation workflow, automatic offline migration, or evidence that uploaded classroom content remains private.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 20, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Snap!'s Block-Based Programming and Target Users
Snap! addresses the problem of expressing program logic through visual blocks rather than requiring every user to begin with source-code syntax. It is inspired by Scratch and is primarily implemented in JavaScript. The repository identifies the Snap! IDE as its main codebase, while the hosted site at `https://snap.berkeley.edu/snap/` provides a direct route to the environment.
The clearest audience is teachers, students, and others who prefer a visual representation of programming. Repository topics include `apcsp`, `bjc`, `cs10`, and `byob`. The `Examples/` directory contains XML projects such as `Examples/animal-game.xml`, `Examples/copter.xml`, and `Examples/swimmer.xml`. Those filenames indicate a substantial set of graphical project assets, although the README does not explain how each example is intended to be used.
Snap! also serves developers who want to change the IDE or connect it to custom functionality. `docs/API.md` documents the interface for modifying the Snap! interface, while `docs/Extensions.md` describes a JavaScript extension mechanism. A school or research team can therefore evaluate Snap! either as an educational environment or as an extensible visual programming platform. The repository does not establish that it is suitable for unattended production services or conventional backend application development.
IDE Architecture, Projects, and Extension Points
The repository presents Snap! as a web IDE rather than a conventional library with a small public function surface. The top-level `index.html` and `snap.html` sit beside `src/`, which is consistent with a browser application loading JavaScript code. Asset-oriented directories including `Backgrounds/`, `Costumes/`, `Sounds/`, and `img/` indicate that project media is part of the application model.
Project examples are stored as XML, including `Examples/live-tree.xml` and `Examples/tree.xml`. The repository also contains `Examples/EXAMPLES.json`, but the README does not define its schema or explain an import workflow. It would therefore be unsafe to assume that opening an XML file in a browser automatically loads it, or that every example follows the same import process.
The documented extension path is clearer. JavaScript extensions can add functionality through the interface described in `docs/Extensions.md`, while interface-level changes use the API documented in `docs/API.md`. These are extension points, not evidence of a stable plugin package registry. The README does not publish compatibility guarantees, sandboxing rules, package names, or a release-specific extension manifest schema. `docs/Migrating.md` covers migration from older extensions to Morphic 2 and Snap! v6, which shows that extension evolution has required explicit adaptation work.
The presence of `pyret/` also indicates code or integration associated with Pyret, but the README does not explain its role. It should not be treated as a documented public interface without checking the repository and relevant documentation.
Opening Snap! and Making a First Browser-Based Project
The repository does not give npm, package-manager, build-tool, or command-line installation instructions. For an initial use, the README directs users to the hosted IDE:
https://snap.berkeley.edu/snap/The README calls this the "Try Snap! Now" destination. Open it in a browser, then use the Snap! Manual for the editor workflow and language semantics. The README does not identify supported browser versions, required screen sizes, or account requirements, so those details cannot be inferred.
The README also says that users can save and share their own projects at `snap.berkeley.edu`. It does not say whether sharing is anonymous, whether an account is required, what retention rules apply, or whether a hosted project can be made private. Those are material constraints for classroom or public deployment and need verification in the product interface or community documentation.
For a repository-based first review, inspect the XML projects under `Examples/`. One example is `Examples/count-change.xml`. The README does not document the steps for opening that file in Snap!, so this is an inspection task, not a confirmed import tutorial. Likewise, the exact controls for creating a sprite, connecting blocks, or running a project are absent from the README and belong in the linked manual.
If offline use matters, `docs/Offline.md` is the stated source for running Snap! as a progressive web application. The README does not reproduce its commands or deployment settings, so this article does not invent them.
Offline Operation and Progressive Web App Constraints
Snap! explicitly supports progressive web application operation. The top-level `manifest.json` and `sw.js` support that repository-level design, while `docs/Offline.md` is identified as the documentation for this mode. This establishes a browser installation concept, but the README does not state whether offline behavior includes project storage, cloud synchronization, or all hosted services.
Offline operation changes deployment responsibilities. A hosted editor can change without a package-manager update, but an offline copy becomes the user's installed artifact. Service worker and cache behavior must then be managed through the documented Snap! process. The README does not say how updates are delivered, whether stale service workers are supported, or how cached projects are migrated.
This is a real limitation for organizations that require centralized version pinning. The repository release list includes `v12.3.0`, but the README does not map that release to a stable Snap! URL or explain how administrators select a release for offline deployment. Do not infer that downloading the repository is equivalent to installing the IDE. The documented offline file is `docs/Offline.md`, and that file should be consulted before promising a reproducible internal deployment.
Extension Development Versus Conventional JavaScript Development
Snap! offers a concrete alternative to writing every interaction as a standalone JavaScript application. A JavaScript extension can provide custom capabilities inside the visual environment through `docs/Extensions.md`, and modifications to the IDE interface can use `docs/API.md`. That approach keeps the block-based programming context intact instead of requiring users to leave it for a separate console or conventional web interface.
The tradeoff is interface coupling. Extension authors need to understand Snap!'s extension contract and may need to follow the migration guidance in `docs/Migrating.md` when moving older code to Morphic 2 and Snap! v6. The README does not describe dependency isolation, testing commands, extension packaging, or a compatibility matrix. An extension that works against one Snap! interface should not be treated as portable across every release without checking those details.
For a custom visual experience, Snap! can be more direct than building a complete block editor. For a conventional service with ordinary modules, an established JavaScript application stack may fit better because the README presents Snap! as an IDE, not as a backend framework or deployment library. Code modification occurs inside a visual IDE's architecture and follows its documented extension interfaces.
Release Cadence, Migration Work, and AGPL-3.0 Obligations
The repository is not archived. Its last push was on 2026-10-16, and the listed releases include `v12.3.0` on 2026-10-15, `v12.2.3` on 2026-10-06, and `v12.2.2` on 2026-10-02. This release history shows recent changes around Snap! v12, although the README does not define the scope or stability policy of each release.
Upgrade cost is most visible for interface and extension work. `docs/Migrating.md` specifically targets older extensions moving to Morphic 2 and Snap! v6, so extension compatibility has required migration rather than remaining static across the project's history. Teams maintaining private interface changes should budget time to compare their implementation with `docs/API.md` and to review migration guidance before upgrading across major interface generations.
Snap! is licensed under `AGPL-3.0`. The README permits redistribution and modification under that license and points to the GNU Affero General Public License. For an organization embedding or modifying Snap!, license compliance should be reviewed for its specific distribution and network-use model. This is a licensing issue, not legal advice. The README also provides `[email protected]` for questions about using the project under the open-source license.
Editorial conclusion
Snap! fits browser-based visual programming, especially for teaching and experimenting with block-defined programs. It is a poor fit for teams that need a documented native installation workflow, automatic offline migration, or evidence that uploaded classroom content remains private. Before adoption, check the current Snap! Manual for the required user workflow, review `docs/Extensions.md` against your extension requirements, and confirm how the deployment handles project storage and AGPL-3.0 obligations.
Frequently asked questions
What is Snap! used for?
Snap! is a visual, blocks-based programming language inspired by Scratch. The repository targets people building programs through visual blocks and developers modifying the IDE or building JavaScript extensions.
How do I start using Snap! without installing it?
The README provides a hosted editor at `https://snap.berkeley.edu/snap/`. It does not document npm installation or command-line setup.
Can Snap! be used offline?
Yes, according to the README, `docs/Offline.md` contains instructions for running Snap! as a progressive web application. The README does not explain offline update delivery or project synchronization behavior.
How do developers extend Snap!?
JavaScript extensions use the interface documented in `docs/Extensions.md`. Changes to the Snap! interface are covered by `docs/API.md`, while older extensions may need the migration guidance in `docs/Migrating.md`.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/jmoenig-snap)Was this useful?