diff --git a/README b/README
index 7d56d0d..88efe9c 100644
--- a/README
+++ b/README
@@ -1,3 +1,5 @@
+# Installation
+
Build the server binary:
CGO_ENABLED=0 go build -ldflags='-s -w'
@@ -21,7 +23,6 @@ Set up a group
vi groups/public.json
{
- "allow-anonymous":true,
"public":true,
"op":[{"username":"jch","password":"1234"}],
"presenter":[{}],
@@ -38,4 +39,72 @@ Run the server binary:
cd /home/sfu/
nohup ./sfu &
--- Juliusz Chroboczek
+
+# Group definitions
+
+Groups are defined by files in the directory defined by the `-groups`
+command-line option, one per group. The group definition file does not
+contain the name of the group -- that makes it possible to set up a new
+group just by copying a template file.
+
+The group definition file contains a JSON directory with the following
+fields, all of which are optional.
+
+ - `op`, `presenter`, `other`: each of these is an array of user
+ definitions (see below) and specifies the users allowed to connect
+ respectively with operator privileges, with presenter privileges, and
+ as passive listeners;
+ - `public`: if set to true, then the group is visible on the landing page;
+ - `max-clients`: the maximum number of clients that may join the group at
+ a time;
+ - `allow-anonymous`: if set to true, then users may connect with an empty
+ username; this is not recommended, since anonymous users are not
+ allowed to participate in the chat.
+
+A user definition is a dictionary with the following fields:
+
+ - `username`: the username of the user; if omitted, any username is
+ allowed;
+ - `password`: the password of the user; if omitted, then any password
+ (including the empty paassword) is allowed.
+
+For example
+
+ {"username":"jch","password":"topsecret"}
+
+specifies user *jch* with password *topsecret*, while
+
+ {"password":"topsecret"}
+
+specifies that any username will do. The empty dictionary
+
+ {}
+
+specifies that any username can connect, and that password are not
+verified.
+
+
+# Commands
+
+Typing a line starting with a slash `/` in the chat dialogue causes
+a command to be sent to the server. The following commands are available
+to all users:
+
+ - `/me text`: sends a chat message starting with the sender's username;
+ - `/leave`: equivalent to clicking the *Disconnect* button.
+
+The following commands are only available to users with operator
+privileges:
+
+ - `/clear`: clears the chat history for all users;
+ - `/lock`: prevents any new users from connecting to the group unless
+ they have operator privileges;
+ - `/unlock`: reverts the effect of `/lock`;
+ - `/op user`: gives operator privileges to a user;
+ - `/unop user`: takes away operator privileges;
+ - `/present user`: gives presenter privileges to a user;
+ - `/unpresent user`: takes away presenter privileges from a user and
+ forcibly closes any presentations from that user that may be taking place;
+ - `/kick user`: forcibly disconnects a user from the group.
+
+--- Juliusz Chroboczek