# GJS

GJS is JavaScript bindings for the GNOME platform APIs. Powered by
Mozilla's [SpiderMonkey][spidermonkey] JavaScript engine and
[GObject Introspection][gobject-introspection], it opens the entire GNOME
ecosystem to JavaScript developers.

The stable version of GJS is based on the latest Extended Support Release (ESR)
of SpiderMonkey. To find out when a language feature was added to GJS, review
[NEWS][gjs-news] in the GitLab repository.

[gobject-introspection]: https://gi.readthedocs.io
[spidermonkey]: https://spidermonkey.dev/
[gjs-news]: https://gitlab.gnome.org/GNOME/gjs/raw/HEAD/NEWS

## Documentation

If you are reading this file in the GJS repository, you may find it more
convenient to browse and search using the [API Documentation][gjs-docs] website
instead. There is documentation for GLib, GTK, Adwaita, WebKit, and many more
libraries. General documentation about built-in modules and APIs is under the
[GJS Topic](https://gjs-docs.gnome.org/gjs).

[GJS Guide][gjs-guide] has many in-depth tutorials and examples for a number of
core GNOME APIs. The repository also has [code examples][gjs-examples] and
thorough coverage of language features in the [test suite][gjs-tests].

[GTK4 + GJS Book](https://rmnvgr.gitlab.io/gtk4-gjs-book/) is a start to finish
walkthrough for creating GTK4 applications with GJS.

The [GNOME developer portal][gnome-developer] contains examples of a variety of
GNOME technologies written GJS, alongside other languages you may know.

[gjs-docs]: https://gjs-docs.gnome.org/
[gjs-examples]: https://gitlab.gnome.org/GNOME/gjs/tree/HEAD/examples
[gjs-tests]: https://gitlab.gnome.org/GNOME/gjs/blob/HEAD/installed-tests/js
[gjs-guide]: https://gjs.guide
[gtk4-book]: https://rmnvgr.gitlab.io/gtk4-gjs-book/
[gnome-developer]: https://developer.gnome.org/

## Applications

GJS is a great option to write applications for the GNOME Desktop.

The easiest way to get started is to use [GNOME Builder][gnome-builder], start a
new project and select `JavaScript` language. There is a also a
[package specification] and [template repository][template] available.

[gnome-builder]: https://apps.gnome.org/app/org.gnome.Builder/
[package specification]: https://gitlab.gnome.org/GNOME/gjs/-/blob/HEAD/doc/Package/Specification.md
[template]: https://github.com/gcampax/gtk-js-app

Here is a non-exhaustive list of applications written in GJS:

GNOME Apps

* [Characters](https://gitlab.gnome.org/GNOME/gnome-characters)
* [Maps](https://gitlab.gnome.org/GNOME/gnome-maps)
* [Weather](https://gitlab.gnome.org/GNOME/gnome-weather)
* [Extensions](https://gitlab.gnome.org/GNOME/gnome-shell/-/tree/HEAD/subprojects/extensions-app)
* [Polari](https://gitlab.gnome.org/GNOME/polari)
* [Tangram](https://github.com/sonnyp/Tangram)
* [Flatseal](https://github.com/tchx84/Flatseal)
* [Commit](https://github.com/sonnyp/commit/)
* [Junction](https://github.com/sonnyp/Junction)
* [Oh My SVG](https://github.com/sonnyp/OhMySVG)
* [Workbench](https://github.com/sonnyp/Workbench)
* [GNOME Sound Recorder](https://gitlab.gnome.org/GNOME/gnome-sound-recorder) (TypeScript)

Others


* [Quick Lookup](https://github.com/johnfactotum/quick-lookup)
* [Foliate](https://github.com/johnfactotum/foliate)
* [Clapper](https://github.com/Rafostar/clapper/)
* [Almond](https://github.com/stanford-oval/almond-gnome/)
* [Lobjur](https://github.com/ranfdev/Lobjur) (Clojure)
* [Touché](https://github.com/JoseExposito/touche)
* [Annex](https://github.com/andyholmes/annex)
* [Bolso](https://github.com/felipeborges/bolso)
* [Design](https://github.com/dubstar-04/Design)
* [Capsule](https://gitlab.gnome.org/verdre/Capsule)
* [Spiel](https://gitlab.gnome.org/feaneron/spiel)
* [Retro](https://github.com/sonnyp/Retro)
* [libportal test](https://github.com/flatpak/libportal/tree/main/portal-test/gtk4)

Archived

* [GNOME Books](https://gitlab.gnome.org/GNOME/gnome-books)
* [GNOME Documents](https://gitlab.gnome.org/GNOME/gnome-documents)

### GNOME Shell Extensions

GJS is used to write [GNOME Shell Extensions](https://extensions.gnome.org),
allowing anyone to make considerable modifications to the GNOME desktop. This
can also be a convenient way to prototype changes you may want to contribute to
the upstream GNOME Shell project.

There is documentation and tutorials specifically for extension authors at
[gjs.guide/extensions](https://gjs.guide/extensions).

### Embedding GJS

GJS can also be embedded in other applications, such as with GNOME Shell, to
provide a powerful scripting language with support for the full range of
libraries with GObject-Introspection.

## Getting Help

* Discourse: https://discourse.gnome.org/
* Chat: https://matrix.to/#/#javascript:gnome.org
* Issue Tracker: https://gitlab.gnome.org/GNOME/gjs/issues
* StackOverflow: https://stackoverflow.com/questions/tagged/gjs

