Skip to content


Repository files navigation

This is the server component for Ennuicastr, a system for recording multiple users distributed across the world in a well-synchronized way, without significant loss, over the web. This is the server software that runs , the main installation of Ennuicastr.

This software is divided into several subcomponents:

db: The database

njsp: The configuration for NodeJS-Server-Pages (npm install nodejs-server-pages), which is needed to run the templated web site component.

server: The server for Ennuicastr recordings itself.

web: The web page

cook: Tools used to process raw audio into usable formats.

Some very light documentation on running your own instance of Ennuicastr is provided in docs/

Server requirements

The server has two main components: The Ennuicastr protocol server, and the web components. The web components use nodejs-server-pages, so you'll need to set up your web server of choice to use that.

For nodejs-server-pages WebSockets to work, your web server needs to delegate /ws accesses to it. In nginx, for example:

        location ~ /ws$ {
                proxy_pass http://unix:/tmp/nodejs-server-pages-ws.sock;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
                proxy_set_header Host $host;
                proxy_read_timeout 86400;
                proxy_send_timeout 86400;
                send_timeout 86400;

For the AudioWorkletProcessor to be able to use SharedArrayBuffer, you need the correct "security" features. For instance, in nginx:

        add_header 'Cross-Origin-Opener-Policy' 'same-origin';
        add_header 'Cross-Origin-Embedder-Policy' 'require-corp';

The client uses Jitsi to communicate, so you'll need to set up a Jitsi server. If the client is at , then Jitsi must be at . That is, it must be at jitsi.X, where X is the domain used for the client.

You can hide the actual Jitsi interface, since Ennuicastr provides its own. In nginx, for example:

    location = / {
        return 301;


    location @root_path {
        #rewrite ^/(.*)$ / break;
        return 301;

Jitsi will also need correct CORS so that it can be connected to from another domain. For instance, with nginx and

    location = /http-bind {
        add_header 'Access-Control-Allow-Origin' '';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';