window.markdeepOptions={tocStyle:"medium"} Jsish


  1.1  Deploys
  1.2  Security
  1.3  C-API

Javascript Shell Interpreter

Types Builtin Reference  Index  Fossil  Demos Log Test Debug Misc



Jsi is a javascript interpreter and Web development environment with minimal dependencies. No need to learn a new language: its just javascript enhanced with parameter-type support, with everything required for web applications built-in.


Sqlite and WebSocket are compiled in, and support scripts are bundled in a ZVFS appended to the binary. This allows writing code that is easier to maintain and deploy.



A Deploy is a zip/sqlar archive or fossil repository containing one or more applications which Jsi can mount and execute.

For example, here is the configuration for serving out the Ledger demo from jsi-app fossil (via an Nginx reverse proxy).


Deploying any application inevitably entails dealing with version dependencies. Jsi handles this in a novel way by mounting tagged releases from a fossil repository. If we automatically update the repository every time the application is restarted, we can ensure the latest supported release always gets run. New code can be committed at any time by developers, but only tagged releases are used.



As Jsi is self contained, it can easily be run by itself in a chroot-jail by adding a few files from /dev and /etc. For example, this Ledger demo is run in an unprivileged chroot containing a single executable (jsish), with non-data files made immutable with chattr. And if this is not secure enough, Jsi offers Safe-mode.

In addition, serving content from a zip or fossil repository adds another abstraction layer, making it that much harder to corrupt or hijack content.

An advantage of the chroot approach compared with containers or VMs, is that it requires far less overhead both in disk space and system memory.



For embedded developers, Jsi provides a C-API that simplifies connecting low level (C) with high level (GUI) code. The use of C-Structs is intrinsically integrated into Jsi at all levels, and is the main mechanism used for module state, option parsing and C extensions. This directly interfacing with C-structs can potential be used to process very large amounts of data with little overhead. Even the Sqlite interface supports mass data transfers to/from structs, which is of particular importance for embedded applications.

C coding however is purely optional, and Ledger and the other demo applications do not use or require it.

var startOfMarkDeep=true; window.alreadyProcessedMarkdeep||('visible'); document.title=location.pathname.match(/\/([\w]+)1;

formatted by Markdeep 1.03