JSON-based chat that has web and console clients, and a server
JavaScript Ruby
Switch branches/tags
Nothing to show
Clone or download
Alex Young
Latest commit 28bf4a2 Apr 13, 2012


JsChat is a chat system. It has an easy to learn JSON protocol, an ncurses client, a web app, and a server. You can try it right now on jschat.org.

JsChat is similar to IRC, but it’s a fundamentally simpler system.

The web app has lots of interesting features:

  • IRC-like commands: /names, /name new_name (/nick works too), /clear, /lastlog
  • It’s pretty tiny; it’s built with Sinatra and Prototype
  • Auto-linking: pasting an image displays it inline, youtube and vimeo videos will appear as well
  • Last messages are displayed on join: the last 100 messages are displayed, so you don’t feel lost when you join a room
  • Tab completion!


You can install with rubygems:

gem install jschat

Then run jschat-server and jschat-client to try out the console client locally.

To try out the web client, run jschat-web and visit http://localhost:4567.

Ruby Library Requirements

These gems are required by JsChat:

  • eventmachine
  • ncurses (for the client)
  • json


  • Run the server with ./server.rb
  • Connect a client with ./client.rb

The web app must be run alongside the server. The web app must be started in production mode:

http/jschat.rb -e production

The web app currently has no database dependencies, it’s a wrapper that links cookies to JsChat server proxies. You can run it on port 80 by configuring Rack or an Apache proxy. I have Apache set up this way on jschat.org.

Configuration Files

These are the default locations of the configuration files. You can override them with --config=PATH:

  • Client: ~/.jschat/config.json
  • Server: /etc/jschat/config.json

The web app will use the same configuration file as the server so it can find out where the server is.

The file format is JSON, like this:

{ "port": 3001 }

Server Configuration Options

  "port": integer,
  "ip": "string: IP address to bind to",
  "tmp_files": "string: path to tmp files (including PID file)"

Client Commands

  • Change name or identify: /nick name
  • Join a room: /join #room
  • Join a room (alias): /j #room

Protocol Design

The protocol is designed to be as close to executable JSON as possible, so clients and servers are simple to implement.

Look at client.rb JsChat::Protocol to see what I mean.

Hey, this is like Campfire!

I love Campfire and I didn’t intend for JsChat to compete with it. JsChat is just a fun project, it doesn’t offer Campfire’s business-friendly interface, file hosting, transcripts and Basecamp integration.


JsChat was created by Alex Young for Helicoid. A growing group of friends are helping out:

If you’d like to contribute, send alexyoung a message on GitHub.