PHPackages                             atomjump/loop-server - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. atomjump/loop-server

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

atomjump/loop-server
====================

A server to the open messaging client AtomJump Loop https://atomjump.com

v3.4.1(3y ago)484MITPHPPHP &gt;=5.3.0

Since Aug 11Pushed 3y ago1 watchersCompare

[ Source](https://github.com/atomjump/loop-server)[ Packagist](https://packagist.org/packages/atomjump/loop-server)[ Docs](https://atomjump.com)[ RSS](/packages/atomjump-loop-server/feed)WikiDiscussions master Synced 3w ago

READMEChangelog (10)Dependencies (1)Versions (200)Used By (0)

[![](https://camo.githubusercontent.com/60441a1c4f2b19501fdab7c52ed4e4542ce428aa4c9e442207c87fa5a34666e1/68747470733a2f2f61746f6d6a756d702e636f6d2f696d616765732f6c6f676f38302e706e67)](https://camo.githubusercontent.com/60441a1c4f2b19501fdab7c52ed4e4542ce428aa4c9e442207c87fa5a34666e1/68747470733a2f2f61746f6d6a756d702e636f6d2f696d616765732f6c6f676f38302e706e67)

**WARNING: this project has now moved to **

AtomJump Messaging Server
=========================

[](#atomjump-messaging-server)

This acts as a server to the AtomJump Messaging front-end at

Requirements
============

[](#requirements)

- PHP. This software has been fully tested on PHP 5.3, 5.5, 7.0, 7.1, 7.2, 7.4 (with curl, php-mbstring, zip, php-xml support added). Note: Preliminary tests have been carried out with PHP 8.0 and 8.1, and most features appear to work, but we cannot yet guarantee 100% compatibility, although this will come in time.
- MySQL 5+
- Apache 2
- Linux server (though a Windows server may be partially functional)

Recommended pre-installation steps
==================================

[](#recommended-pre-installation-steps)

Modify the upload size in php.ini (found in e.g. /etc/php5/apache2/php.ini)

```
upload_max_filesize = 10M
max_execution_time = 200
sudo service apache2 reload

```

Imagemagick can be used to handle image uploads (Ubuntu command):

```
sudo apt-get install imagemagick

```

To keep timing in-sync (Ubuntu command):

```
sudo apt-get install ntp

```

MySQL &gt;= 5.7 users: add this 'SQL mode' into your my.cnf MySQL configuration file (found in e.g. /etc/mysql/mysql.conf.d/mysqld.cnf)

```
sql_mode = STRICT_TRANS_TABLES

```

and restart the MySQL server with

```
sudo service mysql restart

```

Optional Components
===================

[](#optional-components)

- Multi-server MySQL clusters (single-write or multi-write)
- Load balancers with haproxy
- SSL messaging server
- SSL database connection

Installation
============

[](#installation)

On your Linux server, download and unzip the latest release of the loop-server from

```
https://src.atomjump.com/atomjump/loop-server/releases

```

Or git clone

```
git clone https://git.atomjump.com/loop-server.git

```

Or using composer  see

```
composer require atomjump/loop-server

```

We will refer to paths as being from the root of the loop-server folder.

1. /server folder. You can refer to some example server configuration files. Replace atomjump with your own domain, and put any relevant files into your Apache 'sites available' setup. You may need to restart Apache.
2. /config/configORIGINAL.json. Copy this file to /config/config.json. Replace the options with your own accounts and paths. Copy /config/messagesORIGINAL.json to /config/messages.json. Replace these options with your own words or languages.
3. Allow image uploads, and image caching by the browser

```
a2enmod expires
chmod 777 /images/im

```

4. Copy /SET\_AS\_htaccess to /.htaccess and replace atomjump.com with your domain in this file.
5. Customer defined themes must be on a secure server if the server is on ssl.
6. To the ajFeedback object in your index.html, add a parameter

```
 "server": "http://yourserver.com"

```

7. In a MySQL prompt, run 'create database atomjump'. Then from the command line:

```
 mysql -u youruser -p atomjump < db/atomjump-loop-shell.sql

```

Optional Installation
=====================

[](#optional-installation)

Add three cron tasks to your server:

- A typing cleanup task. On rare instances, a 'typing...' message is left (if the machine cut out etc.). This cleans up any of these old messages periodically (every 5 minutes).
- A system monitoring warning, that checks whether the server's CPU or disk space have gone over a threshold. See warningDiskUsage, warningCPUUsage in the "Server Options" section, for more details.

```
sudo crontab -e
*/5 * * * *	/usr/bin/php /yourserverpath/typing-cron.php
sudo crontab -e
*/5 * * * *	/usr/bin/php /yourserverpath/monitor.php

```

- A sentiment analysis task. This sentiment is reflected when you download a spreadsheet of the messages. It requires nodejs to be installed and available to be run by a cron job.

On your internet server, first install NodeJS and npm. See Ubuntu install notes at , but there are several ways to do this depending on your platform e.g. MacOSX may vary slightly.

```
cd /yourserverpath/node
npm install
sudo crontab -e
 */1 * * * * /usr/bin/nodejs /yourserverpath/node/sentiment.js -production

```

This will update the production database message sentiments once every minute (or remove the -production to go to staging).

Windows installation
====================

[](#windows-installation)

Running on Windows has currently not been tested, but you can use a Ubuntu 14.04 virtual machine from

Messaging Client
================

[](#messaging-client)

**(sometimes called the 'loop' project)**

Is available from or you can add this to your site from

This tool provides a 'WhatsApp-like' group discussion forum from a popup on your website. It is good for general messaging, either within a company or family, in either a private or public setting.

The client software is entirely Javascript and CSS, but it refers to an AtomJump Messaging server to store messages. This is freely available as a separate project at , or you can use the AtomJump.com server, by default.

Private forums on the hosted AtomJump.com hosted platform are purchased for US$10 / year to cover the (non-profit) Foundation's costs, but public forums are free, within reason.

Supported client platforms: IE8 upwards, Edge, Chrome, Firefox, Safari, Android Native, Android Chrome, Android Firefox, iPad, iPhone, Opera. There may be other supported platforms we haven't tested on.

See the demo at [AtomJump](http://atomjump.org)

You can adjust the styling by making changes to the CSS file for your project.

Client Installation
-------------------

[](#client-installation)

With [bower](http://bower.io) from within the root of your project path:

**`bower install atomjump`**

(Or without bower, unpack into your project, edit index.html, and replace bootstrap css and javascript paths as mentioned)

Run atomjump/index.html in your browser. You should see a 'Click me for comments' link. Click this to see the pop-up. For Wordpress instructions, see below.

Client Setup
------------

[](#client-setup)

Look carefully at the index.html example.

The code between `\`

and `\`

should be put into your page's `` section.

Links can be added to the comments with `Click me for comments`

The code ``must be placed anywhere in the `` section.

Note: jQuery ver 1.9.1 is used. Other jQuery versions will likely work also.

1. Adjust 'uniqueFeedbackId' value to a unique value to suit your forum's name. This can be unique per page or the same throughout the whole site.
2. For messaging usage, refer to the Messaging guide at

To have more than one messaging forum on a single page
------------------------------------------------------

[](#to-have-more-than-one-messaging-forum-on-a-single-page)

You can do this three different ways. The simplest is to set the link's href to '"#comment-open-' followed by the forum name: `Open special forum`

Or, you can add the 'comment-open' class to a link with an 'id' referring to the forum name (you also need a 'data-useid' tag): `Open special forum`

Or, for further control over the owner of the forum, you can add the following data tags, and enter your own names/ips: `Open special forum`

To open custom URLs within notifications
----------------------------------------

[](#to-open-custom-urls-within-notifications)

When the app or email setup sends notifications, it provides a clickable address for the user to go to in order to see the forum. If the usual current web address is behind a token or password, this link needs a lead-up page to allow for client-side logins. You can set this address with the 'data-notifyurl' token.

`Open with specific notification URL`

To open a Shortmail enabled forum
---------------------------------

[](#to-open-a-shortmail-enabled-forum)

You can add the 'shortmail' data tag e.g.

`Open special email forum`

Or, you can use an href "#shortmail-open-" class: `Open shortmail forum`

To change the theme
-------------------

[](#to-change-the-theme)

Add

"cssBootstrap":"relative/url"

and

"cssFeedback":"relative/url/to/your/css"

to the ajFeedback object.

Note: your css file must be on an https server, if your server is using https.

To download a forum's messages programmatically
-----------------------------------------------

[](#to-download-a-forums-messages-programmatically)

**Endpoint**

or for atomjump.com's web-service:

**Parameters**

1. **email**Your AtomJump Loop email address from the standard interface
2. **pass**
    Your AtomJump Loop password
3. **uniqueFeedbackId**
    The particular forum to view. Note: include 'ajps\_' at the start of this string for x.atomjump.com forums.
4. **from\_id**
    There is a limit of 2000 records per request. To download more, include the 'id' of the last record, from the previous download request, in this field.

Which returns a JSON object. Included for reporting is a 'sentiment' field which measures how positive the comment is (&lt; 0 negative, 0= neutral, &gt; 0 positive).

Getting a live sentiment
------------------------

[](#getting-a-live-sentiment)

Include the following parameters along with 1,2, and 3 above.

4. **format**

    Set to 'avg'
5. **duration**

    Period over which to average in seconds.

The response will be an average over the last period of all the message sentiment values. This will be expressed as a single number eg. 5.324. Note: it can take up to 1 minute before any new message's sentiment will be calculated.

Wordpress Setup
---------------

[](#wordpress-setup)

1. Install the ‘Header and Footer’ plugin.
2. Go into ‘Settings-&gt;Header and Footer’, and enter the two sections from . The main block should be entered into the ‘SECTION INJECTION’ section, and the ‘comment holder’ div should be entered into the ‘BEFORE THE CLOSING TAG (FOOTER)’ section.
3. Any link’s address (i.e. the ‘href’) on the page can now start with ‘#comment-open-‘, followed by the forum name and it will open a popup.

For more details see

Server Options
==============

[](#server-options)

Staging: To ensure you are set to staging, set the 'usingStaging' param to 'true'.

To test the web domain, use the following small PHP script:

```

```

**warningDiskUsage**: After this certain percentage (0-100) of the current disk space is used, we provide an external service, such as Nagios, with the ability to provide a warning that the server is nearing it's disk capacity. It does this by creating a folder in the main directory /images/im/capacity/ and putting a file 'within-disk-capacity-warning.html' into this folder. If the file is visible externally, the server's drive space is normal, but if this file is not visible (and therefore returns a 404 http error message, typically) then the server's disk space is beyond this threshold and is nearing it's capacity. Ver &gt;= 2.8.4

**warningCPUUsage**: After this certain percentage (0-100) of the CPU load is used, we provide an external service, such as Nagios, with the ability to provide a warning that the server is nearing it's capacity of CPU usage. It does this by creating a folder in the main directory /images/im/capacity/ and putting a file 'within-cpu-capacity-warning.html' into this folder. If the file is visible externally, the server's CPU is normal, but if this file is not visible (and therefore returns a 404 http error message, typically) then the server's CPU is beyond this threshold and is nearing it's capacity. Ver &gt;= 2.8.4

**db** **hosts**: there can be any number of db hosts, but some services do not allow multiple write hosts, and if this case the first one is the only write host, while the others are read. You can configure this with the 'singleWriteDb' option.

**db** **maxConcurrentUsers**: Caps the number of users at a certain number of concurrent connections, and does not try to open the forum if there are too many users, providing a warning to come back later. The actual number of users supported will be many more than this figure as they will not all be requesting from the database at once, and many will only be reading rather than writing, but this level roughly indicates a situation where everyone is typing at the same time. Ver &gt;= 2.8.1

**db** **warningConcurrentUsers**: After a certain number of concurrent connections (this number is usually less than maxConcurrentUsers), we provide an external service, such as Nagios, with the ability to provide a warning that the server is nearing it's capacity of concurrent users. It does this by creating a folder in the directory /images/im/capacity/ and putting a file 'within-db-capacity-warning.html' into this folder. If the file is visible externally, the server is within capacity, but if this file is not visible (and therefore returns a 404 http error message, typically) then the server is nearing it's capacity, and will shortly produce a warning to users that the forum has too many users. Ver &gt;= 2.8.4

**db** **singleWriteDb**: optional. 'true' for a single write database cluster, and 'false' for a multiple write database cluster. This option is only applicable if there is more than one database host. Ver &gt;= 1.8.9

**db** **scaleUp**: For different forums you can refer to completely different databases, to remove the heavy write usage in a multi-read/single write database server farm. This is an array of alternative db/hosts, which are used if a given regular expression is detected in the forum's name.

**db** **scaleUp** **labelRegExp**: This is a javascript/PHP regular expression that changes the database used for this forum. E.g. "^hello", would detect the forums 'hello\_there', 'hello\_anything' etc. Then the standard db details can be entered for this case i.e. 'name','hosts','user','pass','port','deleteDeletes','timezone','serviceHome'. You can also have different set of plugins with a unique 'plugins' array (Ver &gt;= 1.9.5).

(Ver &gt;= 2.9.0) You can optionally run the sentiment script on another database in your configuration file, for example for forums starting with "api1" by using:

```
sudo crontab -e
*/1 * * * * /usr/bin/nodejs /yourserverpath/node/sentiment.js -production -labelregexp ^api1

```

**db** **ssl**: Makes the connection to the database encrypted. Ver &gt;= 1.9.5

```
"ssl" : {
         	"use" : false,
         	"key" : "",
         	"cert" : "",
         	"cacert": "",
         	"capath": "",
         	"protocol": "",
         	"verify": true
         }

```

**db** **ssl** **use**: Set to 'true' to use SSL, or 'false' to ignore the SSL settings and transfer data to the database unencrypted. Ver &gt;= 1.9.5

**db** **ssl** **key**: The file path of the server's key file. Ver &gt;= 1.9.5

**db** **ssl** **cert**: The file path of the server's certificate file. Ver &gt;= 1.9.5

**db** **ssl** **cacert**: The file path of the CA Certificate file. Ver &gt;= 1.9.5

**db** **ssl** **capath**: The path to the folder that contains the CA Certificate file. Ver &gt;= 1.9.5

**db** **ssl** **protocol**: A list of the supported ssl protocols (separated by semi-colons). Ver &gt;= 1.9.5. Here are some common protocols:

```
DH-RSA-AES256-SHA:DH-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:DH-RSA-CAMELLIA256-SHA:DH-DSS-CAMELLIA256-SHA:ECDH-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-SHA384:ECDH-ECDSA-AES256-SHA384:ECDH-RSA-AES256-SHA:ECDH-ECDSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:CAMELLIA256-SHA:PSK-AES256-CBC-SHA:ECDHE-RSA-AES128-GCM-SHA256:
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:DH-DSS-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DH-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DH-RSA-AES128-SHA256:DH-DSS-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:DH-RSA-AES128-SHA:DH-DSS-AES128-SHA:DHE-RSA-SEED-SHA:DHE-DSS-SEED-SHA:DH-RSA-SEED-SHA:DH-DSS-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:
DHE-DSS-CAMELLIA128-SHA:DH-RSA-CAMELLIA128-SHA:DH-DSS-CAMELLIA128-SHA:ECDH-RSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-SHA256:ECDH-RSA-AES128-SHA:ECDH-ECDSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:SEED-SHA:CAMELLIA128-SHA:IDEA-CBC-SHA:PSK-AES128-CBC-SHA:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:
RC4-SHA:RC4-MD5:PSK-RC4-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DH-RSA-DES-CBC3-SHA:DH-DSS-DES-CBC3-SHA:ECDH-RSA-DES-CBC3-SHA:ECDH-ECDSA-DES-CBC3-SHA:DES-CBC3-SHA:PSK-3DES-EDE-CBC-SHA

```

**db** **ssl** **verify**: Whether to require verification of the certificates. We strongly recommend this is set to 'true'. 'false' requires PHP ver &gt;= 5.6. Ver &gt;= 1.9.5

**ips**: any number of PHP machines with the server software on it.

**webRoot**: Web path including http/https of the server. Don't include trailing slash.

**fileRoot**: Local file system server's file path. Don't include trailing slash.

**serviceHome**: The homepage of the service as a URL. This is used particularly after resetting a password.

**serverTimezone**: Change this to the location of the physical server eg. Pacific/Auckland

**delayFeeds**: Delays any API or feed download access for this number of seconds. The default is 1200 seconds or 20 minutes.

**titleReplace** **regex** **replaceWith**: To create an automatic visual title for a forum based off the forum's actual database name, you should add in any regular expression replacements. This should be an array of { regex, replaceWith } objects, which are processed sequentially on the forum's database name. For example, xyz.atomjump.com pages are given a forum database name ajps\_Xyz . The regex to replace the "ajps\_" part of this to create a title "Xyz" you should should use { "regex": "/ajps\_(.+)/", "replaceWith": "$1" } Where $1 is the entry in (.+). Note: you should include the /expression/ around your expressions, and can optionally include case insensitive modifiers, e.g. /expression/i. More information on the supported expressions is available at . You can switch automatic titles on or off with 'showAutomaticTitle' below.

**showAutomaticTitle** can be 'true' or 'false' depending on whether you wish to auto-generate titles for the forum headers. You can also modify the title using the 'titleReplace' options above.

**deleteDeletes**: Set to true by default, this means any user action to delete a message removes it completely from the database. If for your records you are required to keep hidden messages, set to false.

**loadbalancer**: Required for a production setup - any number of machines. Can be blank in a staging setup.

**phpPath**: Path to externally run any parallel PHP processes. Ver &gt;= 0.5.5

**chatInnerJSFilename**: Path from the server that refers to the server-side Javascript. E.g. "/js/chat-inner-1.3.29.js". This will override the system default, if the file exists, but otherwise the default version is used, which is specified at the top of the search-secure.php script.

**logoutPort**: Depreciated ver 0.6.3. Port which a logout is supported on. Default 1444. Use in an ssh situation, whereby this is a non-ssh port. Ver &gt;= 0.5.5, ver &lt;= 0.6.2

**adminMachineUser**: once your server has been set up, and you have saved your first user (yourself typically), find this user in the interface Advanced settings, and write this into the config. This user is allowed to set forum passwords and limit the subscribers for a particular forum.

**analytics** **use**: Can be 'none'. Include a 'url' entry. The 'image' field is currently only needed for retrieving unique backgrounds for subdomains of atomjump.com.

**social** **use**: Can be 'none' or 'all'. 'none' switches off all social media interaction, while 'all' enables all of them.

**social** **twitter**: optional. Retrieves tweets from twitter related to this subdomain, and allows for replying to the tweets (posts a message via twitter).

**readPort**: optional. The port to put the plugin 'loop-server-fast' daemon on, if it is different to 3277, see . Ver &gt;= 0.5.22.

**readURL**: optional. The full URL including ports that the plugin 'loop-server-fast' daemon is on, see , if this is different to the standard URL followed by 'readPort'. Note: if you use a non-standard port, some machines behind proxy servers, particularly corporates, or some public PCs may have the address filtered out. One approach here, at a slight loss of speed, is to use the standard port 80 for http and 443 for https, and ProxyPass in Apache. Ver &gt;= 1.5.5.

**httpsKey**: optional. If you are serving from an https address, you will need this local file path, for the plugin 'loop-server-fast', see . See also 'httpsCert', which is needed too. Ver &gt;= 0.5.22

**httpsCert**: optional. If you are serving from an https address, you will need this local file path, for the plugin 'loop-server-fast', see . See also 'httpsKey', which is needed too. Ver &gt;= 0.5.22

**uploads** **use**: This can be one of 'none', 'same', 'generic', 'amazonAWS'. 'none' means uploads are switched off. 'same' means the upload stays on the same server in the '/images/im/' folder. 'generic' means uploads.genericUploadURL should be set to a remote URL, which the image file will be uploaded to via a POST request. 'amazonAWS' refers to the use of an Amazon S3 AWS bucket for remote storage. You will need an Amazon 'accessKey', 'secretKey' and 'imageURL', in this case.

Note: You should make sure your server provides a caching response to image files, or Safari will continue to refresh the images every 5 seconds.

**uploads** **hiRes** **width** (**height**): width in pixels of uploaded images, in their hi-res version. The low-res version is displayed to the whole group, and the hi-res version is only used when a user taps on that one photo.

**uploads** **lowRes** **width** (**height**): width in pixels of uploaded images, in their low-res version. The low-res version is displayed to the whole group, and the hi-res version is only used when a user taps on that one photo.

**uploads** **replaceHiResURLMatch**: set to a string in your uploaded images URL path that identifies that the photo is on your server, and not copied from a different server e.g. 'atomjump' would identify for "". Images which include this string, will show the hi-res uploaded version when clicked e.g. "[http://yourserver.com/atomjump/images/im/yourphoto\_HI.jpg](http://yourserver.com/atomjump/images/im/yourphoto_HI.jpg)".

**uploads** **imagesShare**: If there are multiple PHP nodes, this defines which port to write uploaded images to, so that they are shared between nodes. 'port' is a port such as 80, and 'https' is either true or false. 'checkCode' is a unique code to your server, which you should change, for security purposes, to allow access from your nodes, only, Ver &gt;= 2.5.7. If you are setting up an expandable cluster, you should also modify images/im/.htaccess and enter your subfolder path where it says CHANGE THIS BELOW, to provide a 'missing images' handler that allows expanding clusters, Ver &gt;= 2.5.7.

**uploads** **vendor** **amazonAWS**: optional. This is for S3 storage of uploaded images. You will need an Amazon 'accessKey', 'secretKey' and 'imageURL', in this case.

**email** **adminEmail**: Administrator's email address.

**email** **webmasterEmail**: The webmaster's email address.

**email** **noReplyEmail**: An email address for when you do not want a reply.

**email** **sending** **use**: This can be 'none', 'smtp' or 'mailgun'. 'none' means there are no emails sent as notifications. 'smtp' means a standard SMTP server is used, and you should enter the 'smtp' which is the host, 'user' which is the username, typically the email address, 'pass' which is the password, 'encryption' which can be 'tls', 'ssl' or left blank, and the 'port' which is the SMTP port number used. 'mailgun' means the Mailgun.com service is used and you will need a 'key' and 'url' from Mailgun.

For example, atomjump.com uses , who provide an excellent email sending service:

```
   "smtp": "mail.smtp2go.com",
   "user" : "...@atomjump.com",
   "pass": "...",
   "port": "2525"

```

**email** **sending** **vendor** **mailgun**: optional. You need a mailgun account which has about 10,000 free emails per month, but costs after that. You will need a 'key' and 'url' from Mailgun.

**sms** **use**: This can be 'none' or 'twilioSMS'. None switches off SMS.

**sms** **twilioSMS**: optional. Required for sending off SMSes via Twilio.

**sms** **USDollarsPerSMS**: for reporting purposes only. This is what is shown to users if they choose to use the SMS notifications. Since there is a cost to you for each SMS, you will likely set this slightly higher than the actual cost of an SMS, to account for fluctuations in price.

Changing language packs
=======================

[](#changing-language-packs)

Please see the /config/language-packs/README.md file for instructions on changing which languages are available to your users.

Plugins
=======

[](#plugins)

Plugins can be installed in the /plugins directory. See  for a list of plugins available.

Plugin API
----------

[](#plugin-api)

For a sample plugin called 'hide\_aargh':

/plugins/hide\_aargh/index.php

```
