An alternative Secure Scuttlebutt client interface that is fully compatible with Patchwork
mixmix b8e8bccb7f kill PgUp/PgDn if you're in an input/text field 5 days ago
.github Add org-wide config for Stale app 6 months ago
about lint 1 month ago
app kill PgUp/PgDn if you're in an input/text field 5 days ago
blob/sync standard autofix 1 year ago
build lint 1 month ago
contact/html leave notes about an intermitent contact bug 2 months ago
message/html lint 1 month ago
router make settings page addition for picking language 2 months ago
sbot/async ssb-unread : show unread bells on message threads 11 months ago
styles kill that pageDown page-slip bug! 2 months ago
.babelrc Adds patchbay-gatherings 2 years ago
.eslintrc.js bump marama, tweak meta/private, lint some 11 months ago
.gitignore WIP - electron 4 + electron-builder 2 months ago spellchekcer: first pass 2 months ago
config.js parse config files which have comments! 2 months ago
exports.js refactor /network into groups+subgroups 3 weeks ago
index.js install ssb-ahoy@1.1.0 1 week ago
lite.js replace npm run dev with "lite" 2 months ago
menu.js ssb-ahoy work (tidying) 2 months ago
package-lock.json 8.1.0 1 week ago
package.json 8.1.0 1 week ago
screenshot.png drop shadow 2 years ago
ui.js replace npm run dev with "lite" 2 months ago


Patchbay is a scuttlebutt client designed to be easy to modify and extend. It uses the same database as Patchwork and Patchfoo, so you can easily take it for a spin with your existing identity.

Patchbay was created by Dominic Tarr towards the end of the life of Patchwork v1. It was born our out of the observation that maintaining a large client apps can be really hard work. Patchbay was designed to sidestep this by using some technology (depject) to make parts easier to swap and extend.

Patchbay now shares a common core library (patchcore) with Patchwork, and connects this in using the depject This is another experiment in sharing useful code and mainmtenance.

Current features boasted:

  • gatherings - a booking system
  • chess - p2p chess games and chat
  • bookblub - a book review interface
  • blogs - can read blogposts created in Ticktack


Download easy installer for Mac / Windows / Linux here :

If you'd like to hack on Patchbay, check out the Developer Install below.

Keyboard shortcuts

See here or in patchbay for to the page /shortcuts

Developer Install

Libsodium has some build dependencies. On ubuntu systems the following might help:

sudo apt-get install m4 libtool eclipse-cdt-autotools

You also might need these for the spellchecker:

sudo apt-get install libxext-dev libxtst-dev libxkbfile-dev

On MacOS you may need the following packages installed (in this example, via Homebrew):

brew install libtool automake autoconf

Embedded sever (recommended)

This runs an embedded sbot with all the right plugins already installed.

git clone
cd patchbay
npm install

Patchbay doesn't give you a way to join pubs yet, so this is good if you've already done that with another client (like Patchwork).

External server

This method runs the ssb-server as a standalone command-line driven server. The danger in this is that you don't install the right plugin versions, and the server won't necessarily be started with the right config (unless you add it to ~/.ssb/config etc).

For this reason I wouldn't currently recommend this approach

Install a standalone ssb-server (your gossip server)

npm install ssb-server@latest -g
sbot server

# then in another tab (these must be separate commands)
sbot plugins.install ssb-about
sbot plugins.install ssb-backlinks
sbot plugins.install ssb-unread
sbot plugins.install ssb-suggest
sbot plugins.install ssb-search # for search
sbot plugins.install ssb-chess-db # for chess
sbot plugins.install ssb-private # for private messages
sbot plugins.install ssb-meme # for image search

# restart sbot server (go back to previous tab and kill it)

Restart your sbot, then (optionally) use an invite code. This will give you your first friend, from which point you can find others:


Install Patchbay

git clone
cd patchbay
npm install

Running the desktop app

Easy mode (embedded sbot):

# from the patchbay repo folder
npm start

Harder mode:

sbot server

# from the patchbay repo folder
npm run dev


Key depject modules in Patchbay

Here's a quick high level overview of the depject modules you're going to want to know about:

The top level module which starts the front end js.


A collection of function which are called on app start. Does things like load css into the app, set up custom listeners, set default settings


The function you call when you want to open a new location. location can be a string (like a message or blob id) or an object.

Note - some locations are normalised before being passed onto the router. Check out router.async.normalise for explicit detail.


This is the module where you can add routes to the app. This is ultimately reduced along with all other router.sync.router modules into the final router.


Giving modules here will add settings sections to the settings page (

Requiring the core of patchbay

If you don't want the default modules, you can grab the main part of patchbay and pick and choose modules like this:

const patchcore = require('patchcore')
const patchbay = require('patchbay/main')
const combine = require('depject')
const entry = require('depject/entry')
const nest = require('depnest')

const sockets = combine(
  require('patchbay-dark-crystal'), // the module(s) you want
  patchcore // required

const api = entry(sockets, nest('', 'first'))

You'll need to be running your own sbot and launch this with electro / electron. See index.js to see that

How to add a new page

e.g. to add a 'cats' page to the app:

  • Add a file app/page/cats.js which gives
  • Tell the router to send people browsing to location {page: 'cats'} to send them to this page
    • route will look like [location => === 'cats',]
    • Note the normaliser will automaticall turn location /cats to {page: 'cats'}
  • Add a link somewhere which will trigger that route:
    • e.g.'/cats') onclick
    • e.g. add a link <a href='/cats'>Cats!</a> (which will be clicked up by listeners)