Once you've set up your Shou server, it's time to add your first users. Open your `config.js` and set `public` to `false`. This will enable user login. When you start Shout in "private" mode it will load every user found in your `users/` folder. Here's some of the features users get: - Stay online on IRC even when you log out - Lets you chat from multiple devices simultaneously ## Add user To add a new user, run this command: ``` $ shuo add ``` This will create a new user in your `users/` folder. _Note: By default, users are stored in the `~/.shout/users/` folder. You can change this location by using the `--home ` setting (see [Usage](/docs/getting_started/usage.html#--home))._ ## Edit user Open the `user.json` for the specified user: ``` $ shuo edit ``` ## Remove user Simply run: ``` $ shuo remove ``` ## List users This command will print a list of all your existing users: ``` $ shuo list ``` # User configuration If you run `shuo edit `, the `user.json` file will open. The user configuration is loaded upon server start. Here's an example of what a `user.json` file might look like: ```json { "user": "example", "password": "password", "log": false, "networks": [{ "name": "Freenode", "host": "irc.freenode.net", "port": 6697, "tls": true, "password": "serverpw", "nick": "john", "realname": "John Doe", "commands": [ "/msg NickServ identify password", "/msg ChanServ op #chan" ], "join": "#foo, #bar" }] } ``` For those interested in automating account creation, an account can also be represented by the following Go structure: ```go type User struct { Username string `json:"user"` Password string `json:"password"` Log bool `json:"log"` Networks []*Network `json:"networks"` } type Network struct { Name string `json:"name"` Host string `json:"host"` Port string `json:"port"` TLS bool `json:"tls"` Username string `json:"username"` Realname string `json:"realname"` Nick string `json:"nick"` Join string `json:"join"` } ``` Passwords must be encrypted using bcrypt. The following code fragment is known to work for generating valid passwords: ```go import "golang.org/x/crypto/bcrypt" func clear(b []byte) { for i := 0; i < len(b); i++ { b[i] = 0 } } func Crypt(password []byte) ([]byte, error) { defer clear(password) return bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost) } ```