Jsish

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.

BrowserDatabaseJsishScriptFileZVFS

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.

Deploys

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).

ServerrunningNginxJsishFossil::Browser:Fossil:User:Developer:

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.

Security

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.

C-API

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.