\ No newline at end of file
diff --git a/docs/_sass/_default_colors.scss b/docs/_sass/_default_colors.scss
new file mode 100644
index 00000000..4227975a
--- /dev/null
+++ b/docs/_sass/_default_colors.scss
@@ -0,0 +1,16 @@
+$apple-blossom: #ac4142;
+$alto: #d0d0d0;
+$bouquet: #aa759f;
+$enigma-purple: #8900aa;
+$chelsea-cucumber: #90a959;
+$cod-grey: #151515;
+$conifer: #b5e853;
+$dove-grey: #666;
+$gallery: #eaeaea;
+$grey: #888;
+$gulf-stream: #75b5aa;
+$hippie-blue: #6a9fb5;
+$potters-clay: #8f5536;
+$rajah: #f4bf75;
+$raw-sienna: #d28445;
+$silver-chalice: #aaa;
diff --git a/docs/_sass/jekyll-theme-hacker.scss b/docs/_sass/jekyll-theme-hacker.scss
new file mode 100644
index 00000000..e02b5aad
--- /dev/null
+++ b/docs/_sass/jekyll-theme-hacker.scss
@@ -0,0 +1,326 @@
+@import "rouge-base16-dark";
+@import "default_colors";
+
+$body-background: $cod-grey !default;
+$body-foreground: $gallery !default;
+$header: $conifer !default;
+$blockquote-color: $silver-chalice !default;
+$blockquote-border: $dove-grey !default;
+
+body {
+ margin: 0;
+ padding: 0;
+ background: $body-background url("../images/bkg.png") 0 0;
+ color: $body-foreground;
+ font-size: 16px;
+ line-height: 1.5;
+ font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
+}
+
+/* General & 'Reset' Stuff */
+
+.container {
+ width: 90%;
+ /*max-width: 1000px;*/
+ margin: 0 auto;
+}
+
+section {
+ display: block;
+ margin: 0 0 20px 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin: 0 0 20px;
+}
+
+li {
+ line-height: 1.4 ;
+}
+
+/* Header,
+ header - container
+ h1 - project name
+ h2 - project description
+*/
+
+header {
+ background: rgba(0, 0, 0, 0.1);
+ width: 100%;
+ border-bottom: 1px dashed $conifer; //header;
+ padding: 20px 0;
+ margin: 0 0 40px 0;
+ text-align: center;
+}
+
+header h1 {
+ font-size: 30px;
+ line-height: 1.5;
+ margin: 0 0 0 -40px;
+ font-weight: bold;
+ font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
+ color: $conifer;//$header;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1),
+ 0 0 5px rgba(181, 232, 83, 0.1),
+ 0 0 10px rgba(181, 232, 83, 0.1);
+ letter-spacing: -1px;
+ -webkit-font-smoothing: antialiased;
+}
+
+header h1:before {
+ content: "./ ";
+ font-size: 24px;
+}
+
+header h2 {
+ font-size: 18px;
+ font-weight: 300;
+ color: #666;
+}
+
+header img {
+ padding: 0px;
+ margin: 0px;
+ max-width: 100%;
+}
+
+#downloads .btn {
+ display: inline-block;
+ text-align: center;
+ margin: 0;
+}
+
+/* Main Content
+*/
+.sidebar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 22rem;
+ height: 100%;
+ text-align: left;
+ border-right: 1px dashed $conifer; //header;
+ overflow-y: scroll;
+ display: block;
+ float: left;
+
+ .logo {
+ padding-top: 20px;
+ max-width: 100%;
+ }
+
+ ul {
+ padding-bottom: 0px;
+ }
+ ul li {
+ margin-bottom: 0px;
+ padding-top: 5px;
+ }
+}
+
+.main_area {
+ padding-left: 22em;
+ padding-top: 20px;
+}
+
+#main_content {
+
+ -webkit-font-smoothing: antialiased;
+}
+section img {
+ max-width: 100%
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: normal;
+ font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
+ color: $header;
+ letter-spacing: -0.03em;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1),
+ 0 0 5px rgba(181, 232, 83, 0.1),
+ 0 0 10px rgba(181, 232, 83, 0.1);
+}
+
+#main_content h1 {
+ font-size: 30px;
+}
+
+#main_content h2 {
+ font-size: 24px;
+}
+
+#main_content h3 {
+ font-size: 18px;
+}
+
+#main_content h4 {
+ font-size: 14px;
+}
+
+#main_content h5 {
+ font-size: 12px;
+ text-transform: uppercase;
+ margin: 0 0 5px 0;
+}
+
+#main_content h6 {
+ font-size: 12px;
+ text-transform: uppercase;
+ color: #999;
+ margin: 0 0 5px 0;
+}
+
+dt {
+ font-style: italic;
+ font-weight: bold;
+}
+
+ul {
+ padding-bottom: 5px;
+}
+
+ul li {
+ list-style-image:url('../images/bullet.png');
+ margin-bottom: 10px;
+ padding-top: 10px;
+}
+
+nav {
+ text-align: left;
+
+ ul {
+ list-style: none;
+ margin-left: 0;
+ padding-left: 0;
+ margin-top: 20;
+ margin-bottom: 0;
+ padding-bottom: 0;
+
+ li {
+ display: inline-block;
+ margin-left: 0.5em;
+ padding-right: 20px;
+
+ a {
+ color: $enigma-purple;
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: $bouquet;
+ }
+ }
+ }
+}
+
+
+blockquote {
+ color: $blockquote-color;
+ padding-left: 10px;
+ border-left: 1px dotted $blockquote-border;
+}
+
+pre {
+ background: rgba(0, 0, 0, 0.9);
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ padding: 10px;
+ font-size: 16px;
+ color: #b5e853;
+ border-radius: 2px;
+ text-wrap: normal;
+ overflow: auto;
+ overflow-y: hidden;
+}
+
+code.highlighter-rouge {
+ background: rgba(0,0,0,0.9);
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ padding: 0px 3px;
+ margin: 0px -3px;
+ color: #aa759f;
+ border-radius: 2px;
+}
+
+table {
+ width: 100%;
+ margin: 0 0 20px 0;
+}
+
+th {
+ text-align: left;
+ border-bottom: 1px dashed #b5e853;
+ padding: 5px 10px;
+}
+
+td {
+ padding: 5px 10px;
+}
+
+hr {
+ height: 0;
+ border: 0;
+ border-bottom: 1px dashed #b5e853;
+ color: #b5e853;
+}
+
+/* Buttons
+*/
+
+.btn {
+ display: inline-block;
+ background: -webkit-linear-gradient(top, rgba(40, 40, 40, 0.3), rgba(35, 35, 35, 0.3) 50%, rgba(10, 10, 10, 0.3) 50%, rgba(0, 0, 0, 0.3));
+ padding: 8px 18px;
+ border-radius: 50px;
+ border: 2px solid rgba(0, 0, 0, 0.7);
+ border-bottom: 2px solid rgba(0, 0, 0, 0.7);
+ border-top: 2px solid rgba(0, 0, 0, 1);
+ color: rgba(255, 255, 255, 0.8);
+ font-family: Helvetica, Arial, sans-serif;
+ font-weight: bold;
+ font-size: 13px;
+ text-decoration: none;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.75);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
+}
+
+.btn:hover {
+ background: -webkit-linear-gradient(top, rgba(40, 40, 40, 0.6), rgba(35, 35, 35, 0.6) 50%, rgba(10, 10, 10, 0.8) 50%, rgba(0, 0, 0, 0.8));
+}
+
+.btn .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ margin: 1px 8px 0 0;
+ float: left;
+}
+
+.btn-github .icon {
+ opacity: 0.6;
+ background: url("../images/blacktocat.png") 0 0 no-repeat;
+}
+
+/* Links
+ a, a:hover, a:visited
+*/
+
+a {
+ color: #63c0f5;
+ text-shadow: 0 0 5px rgba(104, 182, 255, 0.5);
+}
+
+/* Clearfix */
+
+.cf:before, .cf:after {
+ content:"";
+ display:table;
+}
+
+.cf:after {
+ clear:both;
+}
+
+.cf {
+ zoom:1;
+}
diff --git a/docs/_sass/rouge-base16-dark.scss b/docs/_sass/rouge-base16-dark.scss
new file mode 100644
index 00000000..7f839e96
--- /dev/null
+++ b/docs/_sass/rouge-base16-dark.scss
@@ -0,0 +1,87 @@
+/*
+ generated by rouge http://rouge.jneen.net/
+ original base16 by Chris Kempson (https://github.com/chriskempson/base16)
+*/
+
+@import "default_colors";
+
+.highlight {
+
+ $plaintext: $alto !default;
+ $string: $chelsea-cucumber !default;
+ $literal: $chelsea-cucumber !default;
+ $keyword: $bouquet !default;
+ $error-foreground: $cod-grey !default;
+ $error-background: $apple-blossom !default;
+ $comment: $grey !default;
+ $preprocessor: $rajah !default;
+ $name-space: $rajah !default;
+ $name-attribute: $hippie-blue !default;
+ $operator: $rajah !default;
+ $keyword-type: $raw-sienna !default;
+ $regex: $gulf-stream !default;
+ $string-escape: $potters-clay !default;
+ $deleted: $apple-blossom !default;
+ $header: $hippie-blue !default;
+
+ color: $plaintext;
+
+ table td { padding: 5px; }
+ table pre { margin: 0; }
+ .w {
+ color: $plaintext;
+ }
+ .err {
+ color: $error-foreground;
+ background-color: $error-background;
+ }
+ .c, .cd, .cm, .c1, .cs {
+ color: $comment;
+ }
+ .cp {
+ color: $preprocessor;
+ }
+ .o, .ow {
+ color: $operator;
+ }
+ .p, .pi {
+ color: $plaintext;
+ }
+ .gi {
+ color: $string;
+ }
+ .gd {
+ color: $deleted;
+ }
+ .gh {
+ color: $header;
+ font-weight: bold;
+ }
+ .k, .kn, .kp, .kr, .kv {
+ color: $keyword;
+ }
+ .kc, .kt, .kd {
+ color: $keyword-type;
+ }
+ .s, .sb, .sc, .sd, .s2, .sh, .sx, .s1 {
+ color: $string;
+ }
+ .sr {
+ color: $regex;
+ }
+ .si, .se {
+ color: $string-escape;
+ }
+ .nt, .nn, .nc, .no{
+ color: $name-space;
+ }
+ .na {
+ color: $name-attribute;
+ }
+ .m, .mf, .mh, .mi, .il, .mo, .mb, .mx {
+ color: $literal;
+ }
+ .ss {
+ color: $string;
+ }
+}
diff --git a/docs/about.md b/docs/about.md
deleted file mode 100644
index 50656011..00000000
--- a/docs/about.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# About ENiGMA½
-
-## High Level Feature Overview
- * Multi platform: Anywhere [Node.js](https://nodejs.org/) runs likely works (known to work under Linux, FreeBSD, OpenBSD, OS X and Windows)
- * Unlimited multi node support (for all those BBS "callers"!)
- * **Highly** customizable via [HJSON](http://hjson.org/) based configuration, menus, and themes in addition to JavaScript based mods
- * MCI support for lightbars, toggles, input areas, and so on plus many other other bells and whistles
- * Telnet & **SSH** access built in. Additional servers are easy to implement
- * [CP437](http://www.ascii-codes.com/) and UTF-8 output
- * [SyncTerm](http://syncterm.bbsdev.net/) style font and baud emulation support. Display PC/DOS and Amiga style artwork as it's intended! In general, ANSI-BBS / [cterm.txt](http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/src/conio/cterm.txt?content-type=text%2Fplain&revision=HEAD) / [bansi.txt](http://www.bbsdocumentary.com/library/PROGRAMS/GRAPHICS/ANSI/bansi.txt) are followed for expected BBS behavior
- * [SAUCE](http://www.acid.org/info/sauce/sauce.htm) support
- * Renegade style pipe color codes
- * [SQLite](http://sqlite.org/) storage of users, message areas, and so on
- * Strong [PBKDF2](https://en.wikipedia.org/wiki/PBKDF2) backed password encryption
- * [Door support](doors.md) including common dropfile formats for legacy DOS doors. Built in [BBSLink](http://bbslink.net/), and [DoorParty](http://forums.throwbackbbs.com/) support!
- * [Bunyan](https://github.com/trentm/node-bunyan) logging
- * [Message networks](msg_networks.md) with FidoNet Type Network (FTN) + BinkleyTerm Style Outbound (BSO) message import/export
- * [Gazelle](https://github.com/WhatCD/Gazelle) inspirted File Bases including fast fully indexed full text search (FTS), #tags, and HTTP(S) temporary download URLs using a built in [web server](web_server.md). Legacy X/Y/Z modem also supported!
- * Upload processor supporting [FILE_ID.DIZ](https://en.wikipedia.org/wiki/FILE_ID.DIZ) and [NFO](https://en.wikipedia.org/wiki/.nfo) extraction, year estimation, and more!
\ No newline at end of file
diff --git a/docs/art/general.md b/docs/art/general.md
new file mode 100644
index 00000000..c43d915c
--- /dev/null
+++ b/docs/art/general.md
@@ -0,0 +1,6 @@
+---
+layout: page
+title: General
+---
+General art lives in the `art/general` directory. 'General' art is ANSI you want to stay consistent across themes,
+such as a welcome ANSI or a rotation of logoff ANSIs.
diff --git a/docs/art/mci.md b/docs/art/mci.md
new file mode 100644
index 00000000..4befc411
--- /dev/null
+++ b/docs/art/mci.md
@@ -0,0 +1,135 @@
+---
+layout: page
+title: MCI Codes
+---
+ENiGMA½ supports a variety of MCI codes. Some **predefined** codes produce information about the current user, system,
+or other statistics while others are used to instantiate a **View**. MCI codes are two characters in length and are
+prefixed with a percent (%) symbol. Some MCI codes have additional options that may be set directly from the code itself
+while others -- and more advanced options -- are controlled via the current theme. Standard (non-focus) and focus colors
+are set by placing duplicate codes back to back in art files.
+
+## Predefined MCI Codes
+There are many predefined MCI codes that can be used anywhere on the system (placed in any art file). More are added all
+the time so also check out [core/predefined_mci.js](https://github.com/NuSkooler/enigma-bbs/blob/master/core/mci_view_factory.js)
+for a full listing. Many codes attempt to pay homage to Oblivion/2,
+iNiQUiTY, etc.
+
+| Code | Description |
+|------|--------------|
+| `BN` | Board Name |
+| `VL` | Version *label*, e.g. "ENiGMA½ v0.0.3-alpha" |
+| `VN` | Version *number*, eg.. "0.0.3-alpha" |
+| `SN` | SysOp username |
+| `SR` | SysOp real name |
+| `SL` | SysOp location |
+| `SA` | SysOp affiliations |
+| `SS` | SysOp sex |
+| `SE` | SysOp email address |
+| `UN` | Current user's username |
+| `UI` | Current user's user ID |
+| `UG` | Current user's group membership(s) |
+| `UR` | Current user's real name |
+| `LO` | Current user's location |
+| `UA` | Current user's age |
+| `BD` | Current user's birthdate (using theme date format) |
+| `US` | Current user's sex |
+| `UE` | Current user's email address |
+| `UW` | Current user's web address |
+| `UF` | Current user's affiliations |
+| `UT` | Current user's *theme ID* (e.g. "luciano_blocktronics") |
+| `UC` | Current user's login/call count |
+| `ND` | Current user's connected node number |
+| `IP` | Current user's IP address |
+| `ST` | Current user's connected server name (e.g. "Telnet" or "SSH") |
+| `FN` | Current user's active file base filter name |
+| `DN` | Current user's number of downloads |
+| `DK` | Current user's download amount (formatted to appropriate bytes/megs/etc.) |
+| `UP` | Current user's number of uploads |
+| `UK` | Current user's upload amount (formatted to appropriate bytes/megs/etc.) |
+| `NR` | Current user's upload/download ratio |
+| `KR` | Current user's upload/download *bytes* ratio |
+| `MS` | Current user's account creation date (using theme date format) |
+| `PS` | Current user's post count |
+| `PC` | Current user's post/call ratio |
+| `MD` | Current user's status/viewing menu/activity |
+| `MA` | Current user's active message area name |
+| `MC` | Current user's active message conference name |
+| `ML` | Current user's active message area description |
+| `CM` | Current user's active message conference description |
+| `SH` | Current user's term height |
+| `SW` | Current user's term width |
+| `DT` | Current date (using theme date format) |
+| `CT` | Current time (using theme time format) |
+| `OS` | System OS (Linux, Windows, etc.) |
+| `OA` | System architecture (x86, x86_64, arm, etc.) |
+| `SC` | System CPU model |
+| `NV` | System underlying Node.js version |
+| `AN` | Current active node count |
+| `TC` | Total login/calls to system |
+| `RR` | Displays a random rumor |
+| `SD` | Total downloads, system wide |
+| `SO` | Total downloaded amount, system wide (formatted to appropriate bytes/megs/etc.) |
+| `SU` | Total uploads, system wide |
+| `SP` | Total uploaded amount, system wide (formatted to appropriate bytes/megs/etc.) |
+
+A special `XY` MCI code may also be utilized for placement identification when creating menus.
+
+
+## Views
+A **View** is a control placed on a **form** that can display variable data or collect input. One example of a View is
+a Vertical Menu (`%VM`): Old-school BBSers may recognize this as a lightbar menu.
+
+| Code | Name | Description |
+|------|----------------------|------------------|
+| `TL` | Text Label | Displays text |
+| `ET` | Edit Text | Collect user input |
+| `ME` | Masked Edit Text | Collect user input using a *mask* |
+| `MT` | Multi Line Text Edit | Multi line edit control |
+| `BT` | Button | A button |
+| `VM` | Vertical Menu | A vertical menu aka a vertical lightbar |
+| `HM` | Horizontal Menu | A horizontal menu aka a horizontal lightbar |
+| `SM` | Spinner Menu | A spinner input control |
+| `TM` | Toggle Menu | A toggle menu commonly used for Yes/No style input |
+| `KE` | Key Entry | A *single* key input control |
+
+
+Peek at [/core/mci_view_factory.js](https://github.com/NuSkooler/enigma-bbs/blob/master/core/mci_view_factory.js) to
+see additional information.
+
+
+## Properties & Theming
+Predefined MCI codes and other Views can have properties set via `menu.hjson` and further *themed* via `theme.hjson`.
+
+### Common Properties
+
+| Property | Description |
+|-------------|--------------|
+| `textStyle` | Sets the standard (non-focus) text style. See **Text Styles** below |
+| `focusTextStyle` | Sets focus text style. See **Text Styles** below. |
+| `itemSpacing` | Used to separate items in menus such as Vertical Menu and Horizontal Menu Views. |
+| `height` | Sets the height of views such as menus that may be > 1 character in height |
+| `width` | Sets the width of a view |
+| `focus` | If set to `true`, establishes initial focus |
+| `text` | (initial) text of a view |
+| `submit` | If set to `true` any `accept` action upon this view will submit the encompassing **form** |
+
+These are just a few of the properties set on various views. *Use the source Luke*, as well as taking a look at the default
+`menu.hjson` and `theme.hjson` files!
+
+
+### Text Styles
+
+Standard style types available for `textStyle` and `focusTextStyle`:
+
+| Style | Description |
+|----------|--------------|
+| `normal` | Leaves text as-is. This is the default. |
+| `upper` | ENIGMA BULLETIN BOARD SOFTWARE |
+| `lower` | enigma bulletin board software |
+| `title` | Enigma Bulletin Board Software |
+| `first lower` | eNIGMA bULLETIN bOARD sOFTWARE |
+| `small vowels` | eNiGMa BuLLeTiN BoaRD SoFTWaRe |
+| `big vowels` | EniGMa bUllEtIn bOArd sOftwArE |
+| `small i` | ENiGMA BULLETiN BOARD SOFTWARE |
+| `mixed` | EnIGma BUlLEtIn BoaRd SOfTWarE (randomly assigned) |
+| `l33t` | 3n1gm4 bull371n b04rd 50f7w4r3 |
\ No newline at end of file
diff --git a/docs/art/themes.md b/docs/art/themes.md
new file mode 100644
index 00000000..37631454
--- /dev/null
+++ b/docs/art/themes.md
@@ -0,0 +1,25 @@
+---
+layout: page
+title: Themes
+---
+:warning: ***IMPORTANT!*** It is recommended you don't make any customisations to the included
+`luciano_blocktronics' theme. Create your own and make changes to that instead:
+
+1. Copy `/art/themes/luciano_blocktronics` to `art/themes/your_board_theme`
+2. Update the `info` block at the top of the theme.hjson file:
+
+ info: {
+ name: Awesome Theme
+ author: Cool Artist
+ group: Sick Group
+ enabled: true
+ }
+
+3. Specify it in the `defaults` section of `config.hjson`. The name supplied should match the name of the
+directory you created in step 1:
+
+ ```hjson
+ defaults: {
+ theme: your_board_theme
+ }
+ ```
diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss
new file mode 100644
index 00000000..5f1392bd
--- /dev/null
+++ b/docs/assets/css/style.scss
@@ -0,0 +1,4 @@
+---
+---
+
+@import 'jekyll-theme-hacker';
diff --git a/docs/assets/images/bkg.png b/docs/assets/images/bkg.png
new file mode 100644
index 00000000..d10e5caf
Binary files /dev/null and b/docs/assets/images/bkg.png differ
diff --git a/docs/assets/images/bullet.png b/docs/assets/images/bullet.png
new file mode 100644
index 00000000..c8f8de1a
Binary files /dev/null and b/docs/assets/images/bullet.png differ
diff --git a/docs/assets/images/enigma-logo.png b/docs/assets/images/enigma-logo.png
new file mode 100644
index 00000000..94f652ae
Binary files /dev/null and b/docs/assets/images/enigma-logo.png differ
diff --git a/docs/archive.md b/docs/configuration/archivers.md
similarity index 98%
rename from docs/archive.md
rename to docs/configuration/archivers.md
index 68453098..26755162 100644
--- a/docs/archive.md
+++ b/docs/configuration/archivers.md
@@ -1,4 +1,7 @@
-# File Archives & Archivers
+---
+layout: page
+title: Archivers
+---
ENiGMA½ can detect and process various archive formats such as zip and arj for a variety of tasks from file upload processing to EchoMail bundle compress/decompression. The `archives` section of `config.hjson` is used to override defaults, add new handlers, and so on.
## Archivers
diff --git a/docs/config.md b/docs/configuration/config-hjson.md
similarity index 85%
rename from docs/config.md
rename to docs/configuration/config-hjson.md
index 98a6730f..10ca119d 100644
--- a/docs/config.md
+++ b/docs/configuration/config-hjson.md
@@ -1,6 +1,7 @@
-# Configuration
-Configuration files in ENiGMA½ are simple UTF-8 encoded [HJSON](http://hjson.org/) files. HJSON is just like JSON but simplified and much more resilient to human error.
-
+---
+layout: page
+title: config.hjson
+---
## System Configuration
The main system configuration file, `config.hjson` both overrides defaults and provides additional configuration such as message areas. The default path is `/enigma-bbs-install-path/config/config.hjson` though you can override the `config.hjson` location with the `--config` parameter when invoking `main.js`. Values found in `core/config.js` may be overridden by simply providing the object members you wish replace.
@@ -31,12 +32,6 @@ general: {
While not everything that is available in your `config.hjson` file can be found defaulted in `core/config.js`, a lot is. [Poke around and see what you can find](https://github.com/NuSkooler/enigma-bbs/blob/master/core/config.js)!
-### Specific Areas of Interest
-* [Message Conferences](msg_conf_area.md)
-* [Message Networks](msg_networks.md)
-* [File Base](file_base.md)
-* [File Archives & Archivers](archives.md)
-* [Web Server](web_server.md)
### A Sample Configuration
Below is a **sample** `config.hjson` illustrating various (but certainly not all!) elements that can be configured / tweaked.
@@ -125,9 +120,3 @@ Below is a **sample** `config.hjson` illustrating various (but certainly not all
}
}
```
-
-## See Also
-* [Modding](modding.md)
-* [Doors](doors.md)
-* [MCI Codes](mci.md)
-* [Menu System docs](menu_system.md)
diff --git a/docs/configuration/creating-config.md b/docs/configuration/creating-config.md
new file mode 100644
index 00000000..c8495f1c
--- /dev/null
+++ b/docs/configuration/creating-config.md
@@ -0,0 +1,27 @@
+---
+layout: page
+title: Creating Initial Config Files
+---
+Configuration files in ENiGMA½ are simple UTF-8 encoded [HJSON](http://hjson.org/) files. HJSON is just
+like JSON but simplified and much more resilient to human error.
+
+## config.hjson
+Your initial configuration skeleton can be created using the `oputil.js` command line utility. From your
+enigma-bbs root directory:
+```
+./oputil.js config new
+```
+
+You will be asked a series of questions to create an initial configuration.
+
+## menu.hjson and prompt.hjson
+
+Create your own copy of `/config/menu.hjson` and `/config/prompt.hjson`, and specify it in the
+`general` section of `config.hjson`:
+
+````hjson
+general: {
+ menuFile: my-menu.hjson
+ promptFile: my-prompt.hjson
+}
+````
\ No newline at end of file
diff --git a/docs/configuration/directory-structure.md b/docs/configuration/directory-structure.md
new file mode 100644
index 00000000..f27878c7
--- /dev/null
+++ b/docs/configuration/directory-structure.md
@@ -0,0 +1,20 @@
+---
+layout: page
+title: Directory Structure
+---
+All paths mentioned here are relative to the ENiGMA½ checkout directory.
+
+| Directory | Description |
+|---------------------|-----------------------------------------------------------------------------------------------------------|
+| `/art/general` | Non-theme art - welcome ANSI, logoff ANSI, etc. See [General Art](/art/general).
+| `/art/themes` | Theme art. Themes should be in their own subdirectory and contain a theme.hjson. See [Themes](/art/themes).
+| `/config` | config.hjson, [menu.hjson](/configuration/menu-hjson) and prompt.hjson storage. Also default path for SSL certs and public/private keys
+| `/db` | All ENiGMA½ databases in Sqlite3 format
+| `/docs` | These docs ;-)
+| `/dropfiles` | Dropfiles created for [local doors](/modding/local-doors)
+| `/logs` | Logs. See [Monitoring Logs](/troubleshooting/monitoring-logs)
+| `/misc` | Stuff with no other home; reset password templates, common password lists, other random bits
+| `/mods` | User mods. See [Modding](/modding/existing-mods)
+| `/node_modules` | External libraries required by ENiGMA½, installed when you run `npm install`
+| `/util` | Various tools used in running/debugging ENiGMA½
+| `/www` | ENiGMA½'s built in webserver root directory
\ No newline at end of file
diff --git a/docs/configuration/editing-hjson.md b/docs/configuration/editing-hjson.md
new file mode 100644
index 00000000..fde61290
--- /dev/null
+++ b/docs/configuration/editing-hjson.md
@@ -0,0 +1,16 @@
+---
+layout: page
+title: Editing Hjson
+---
+Hjson is a syntax extension to JSON. It's NOT a proposal to replace JSON or to incorporate it into the JSON spec itself.
+It's intended to be used like a user interface for humans, to read and edit before passing the JSON data to the machine.
+
+You can find more info at the [Hjson.org website](http://hjson.org/).
+
+## Editor Plugins
+### Visual Studio Code
+
+[Visual Studio Code](https://code.visualstudio.com/) has a nice Hjson extension that can be installed from
+within the IDE. It provides syntax highlighting to make it clear when you've made a syntax mistake within
+a config file.
+
diff --git a/docs/configuration/menu-hjson.md b/docs/configuration/menu-hjson.md
new file mode 100644
index 00000000..3596e95a
--- /dev/null
+++ b/docs/configuration/menu-hjson.md
@@ -0,0 +1,101 @@
+---
+layout: page
+title: menu.hjson
+---
+:warning: ***IMPORTANT!*** Before making any customisations, create your own copy of `/config/menu.hjson`, and specify it in the
+`general` section of `config.hjson`:
+
+````hjson
+general: {
+ menuFile: my-menu.hjson
+}
+````
+This document and others will refer to `menu.hjson`. This should be seen as an alias to `yourboardname.hjson`
+
+## The Basics
+Like all configuration within ENiGMA½, menu configuration is done in [HJSON](https://hjson.org/) format.
+
+Entries in `menu.hjson` are objects defining a menu. A menu in this sense is something the user can see
+or visit. Examples include but are not limited to:
+
+* Classical Main, Messages, and File menus
+* Art file display
+* Module driven menus such as door launchers
+
+
+Each entry in `menu.hjson` defines an object that represents a menu. These objects live within the `menus`
+parent object. Each object's *key* is a menu name you can reference within other menus in the system.
+
+## Example
+Let's look a couple basic menu entries:
+
+```hjson
+telnetConnected: {
+ art: CONNECT
+ next: matrix
+ options: { nextTimeout: 1500 }
+}
+```
+
+The above entry `telnetConnected` is set as the Telnet server's first menu entry (set by `firstMenu` in
+the Telnet server's config).
+
+An art pattern of `CONNECT` is set telling the system to look for `CONNECT.*` where `` represents
+a optional integer in art files to cause randomness, e.g. `CONNECT1.ANS`, `CONNECT2.ANS`, and so on. If
+desired, you can also be explicit by supplying a full filename with an extention such as `CONNECT.ANS`.
+
+The entry `next` sets up the next menu, by name, in the stack (`matrix`) that we'll go to after
+`telnetConnected`.
+
+Finally, an `options` object may contain various common options for menus. In this case, `nextTimeout`
+tells the system to proceed to the `next` entry automatically after 1500ms.
+
+Now let's look at `matrix`, the `next` entry from `telnetConnected`:
+
+```hjson
+matrix: {
+ art: matrix
+ desc: Login Matrix
+ form: {
+ 0: {
+ VM: {
+ mci: {
+ VM1: {
+ submit: true
+ focus: true
+ items: [ "login", "apply", "log off" ]
+ argName: matrixSubmit
+ }
+ }
+ submit: {
+ *: [
+ {
+ value: { matrixSubmit: 0 }
+ action: @menu:login
+ }
+ {
+ value: { matrixSubmit: 1 },
+ action: @menu:newUserApplication
+ }
+ {
+ value: { matrixSubmit: 2 },
+ action: @menu:logoff
+ }
+ ]
+ }
+ }
+ }
+ }
+}
+```
+
+In the above entry, you'll notice `form`. This defines a form(s) object. In this case, a single form
+by ID of `0`. The system is then told to use a block only when the resulting art provides a `VM`
+(*VerticalMenuView*) MCI entry. `VM1` is then setup to `submit` and start focused via `focus: true`
+as well as have some menu entries ("login", "apply", ...) defined. We provide an `argName` for this
+action as `matrixSubmit`.
+
+The `submit` object tells the system to attempt to apply provided match entries from any view ID (`*`).
+ Upon submit, the first match will be executed. For example, if the user selects "login", the first entry
+ with a value of `{ matrixSubmit: 0 }` will match causing `action` of `@menu:login` to be executed (go
+ to `login` menu).
diff --git a/docs/configuration/sysop-setup.md b/docs/configuration/sysop-setup.md
new file mode 100644
index 00000000..b8c4beb6
--- /dev/null
+++ b/docs/configuration/sysop-setup.md
@@ -0,0 +1,6 @@
+---
+layout: page
+title: SysOp Setup
+---
+SySop privileges will be granted to the first user to log into a fresh ENiGMA½ installation.
+
diff --git a/docs/file_base.md b/docs/file_base.md
deleted file mode 100644
index 893a93de..00000000
--- a/docs/file_base.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# File Bases
-Starting with version 0.0.4-alpha, ENiGMA½ has support for File Bases! Documentation below covers setup of file area(s), but first some information on what to expect:
-
-## A Different Approach
-ENiGMA½ has strayed away from the old familure setup here and instead takes a more modern approach:
-* [Gazelle](https://whatcd.github.io/Gazelle/) inspired system for searching & browsing files
-* No File Conferences (just areas!)
-* File Areas are still around but should generally be used less. Instead, files can have one or more tags. Think things like `dos.retro`, `pc.warez`, `games`, etc.
-* Temporary web (http:// or https://) download links in additional to standard X/Y/Z protocol support
-* Users can star rate files & search/filter by ratings
-* Concept of user defined filters
-
-## Other bells and whistles
-* A given area can span one to many physical storage locations
-* Upload processor can extract and use `FILE_ID.DIZ`/`DESC.SDI`, for standard descriptions as well as `README.TXT`, `*.NFO`, and so on for longer descriptions
-* Upload processor also attempts release year estimation by scanning prementioned description file(s)
-* Fast indexed Full Text Search (FTS)
-* Duplicates validated by SHA-256
-
-## Configuration
-Like many things in ENiGMA½, configuration of file base(s) is handled via `config.hjson` -- specifically in the `fileBase` section.
-
-```hjson
-fileBase: {
- areaStoragePrefix: /path/to/somewhere/
-
- storageTags: {
- /* ... */
- }
-
- areas: {
- /* ... */
- }
-}
-```
-
-(Take a look at `core/config.js` for additional keys that may be overridden)
-
-### Storage tags
-**Storage Tags** define paths to a physical (file) storage location that can later be referenced in a file *Area* entry. Each entry may be either a fully qualified path or a relative path. Relative paths are relative to the value set by the `areaStoragePrefix` key. Below is an example defining a both a relative and fully qualified path each attached to a storage tag:
-
-```hjson
-storageTags: {
- retro_pc: "retro_pc" // relative
- retro_pc_bbs: "retro_pc/bbs" // still relative!
- bbs_stuff: "/path/to/bbs_stuff_storage" // fully qualified
-}
-```
-
-### Areas
-File base **Areas** are configured using the `fileBase::areas` configuration block in `config.hjson`. Each entry within `areas` must contain a `name`, `desc`, and `storageTags`. Remember that in ENiGMA½ while areas are important, they should generally be used less than in tradditional BBS software. It is recommended to favor the use of more **tags** over more areas.
-
-Example areas section:
-```hjson
-areas: {
- retro_pc: {
- name: Retro PC
- desc: Oldschool PC/DOS
- storageTags: [ "retro_pc", "retro_pc_bbs" ]
- acs: {
- write: GM[users] /* optional, see ACS below */
- }
- }
-}
-```
-
-#### ACS
-If no `acs` block is supplied, the following defaults apply to an area:
-* `read` (list, download, etc.): `GM[users]`
-* `write` (upload): `GM[sysops]`
-
-To override read and/or write ACS, supply a valid `acs` member.
-
-#### Uploads
-Note that `storageTags` may contain *1:n* storage tag references. **Uploads in a particular area are stored in the first storage tag path**.
-
-## Web Access
-Temporary web HTTP(S) URLs can be used to download files using the built in web server. Temporary links expire after `fileBase::web::expireMinutes`. The full URL given to users is built using `contentServers::web::domain` and will default to HTTPS (http://) if enabled with a fallback to HTTP. The end result is users are given a temporary web link that may look something like this: `https://xibalba.l33t.codes:44512/f/h7JK`
-
-See [Web Server](web_server.md) for more information.
-
-## oputil
-The `oputil.js` +op utilty `fb` command has tools for managing file bases. For example, to import existing files found within **all** storage locations tied to an area and set tags `tag1` and `tag2` to each import:
-
-```bash
-oputil.js fb scan some_area --tags tag1,tag2
-```
-
-See `oputil.js fb --help` for additional information.
\ No newline at end of file
diff --git a/docs/filebase/acs.md b/docs/filebase/acs.md
new file mode 100644
index 00000000..50527928
--- /dev/null
+++ b/docs/filebase/acs.md
@@ -0,0 +1,25 @@
+---
+layout: page
+title: ACS
+---
+
+If no `acs` block is supplied in a file area definition, the following defaults apply to an area:
+* `read` (list, download, etc.): `GM[users]`
+* `write` (upload): `GM[sysops]`
+
+To override read and/or write ACS, supply a valid `acs` member.
+
+## Example File Area Config with ACS
+
+```hjson
+areas: {
+ retro_pc: {
+ name: Retro PC
+ desc: Oldschool PC/DOS
+ storageTags: [ "retro_pc", "retro_pc_bbs" ]
+ acs: {
+ write: GM[users]
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/filebase/first-file-area.md b/docs/filebase/first-file-area.md
new file mode 100644
index 00000000..58d4a5c1
--- /dev/null
+++ b/docs/filebase/first-file-area.md
@@ -0,0 +1,71 @@
+---
+layout: page
+title: Configuring a File Base
+---
+## ENiGMA½ File Base Key Concepts
+Like many things in ENiGMA½, configuration of file base(s) is handled via `config.hjson` -- specifically
+in the `fileBase` section. First, there are a couple of concepts you should understand.
+
+
+### Storage tags
+
+**Storage Tags** define paths to a physical (file) storage locations that are referenced in a
+file *Area* entry. Each entry may be either a fully qualified path or a relative path. Relative paths
+are relative to the value set by the `areaStoragePrefix` key (defaults to ` ENiGMA½ // HTTPS://GITHUB.COM/NUSKOOLER/ENIGMA-BBS <*> /__/
+
+-------------------------------------------------------------------------------
+
+System started!
+```
+Grab your favourite telnet client, connect to localhost:8888 and test out your installation.
+
+## Points of Interest
+
+* The default port for Telnet is 8888 and 8889 for SSH.
+ * Note that on *nix systems port such as telnet/23 are privileged (e.g. require root). See
+ [this SO article](http://stackoverflow.com/questions/16573668/best-practices-when-running-node-js-with-port-80-ubuntu-linode) for some tips on using these ports on your system if desired.
+* The first user you create when logging in will be automatically be added to the `sysops` group.
+
+## Telnet Software
+
+If you don't have any telnet software, these are compatible with ENiGMA½:
+
+* [SyncTERM](http://syncterm.bbsdev.net/)
+* [EtherTerm](https://github.com/M-griffin/EtherTerm)
+* [NetRunner](http://mysticbbs.com/downloads.html)
\ No newline at end of file
diff --git a/docs/mci.md b/docs/mci.md
deleted file mode 100644
index 61ffee04..00000000
--- a/docs/mci.md
+++ /dev/null
@@ -1,113 +0,0 @@
-# MCI Codes
-
-## Introduction
-ENiGMA½ supports a variety of MCI codes. Some **predefined** codes produce information about the current user, system, or other statistics while others are used to instanciate a **View**. MCI codes are two characters in length and are prefixed with a percent (%) symbol. Some MCI codes have additional options that may be set directly from the code itself while others -- and more advanced options -- are controlled via the current theme. Standard (non-focus) and focus colors are set by placing duplicate codes back to back in art files.
-
-## Views
-A **View** is a control placed on a **form** that can display variable data or collect input. One example of a View is a Vertical Menu (`%VM`): Oldschool BBSers may recognize this as a lightbar menu.
-
-### Available Views
-* Text Label (`TL`): Displays text
-* Edit Text (`ET`): Collect user input
-* Masked Edit Text (`ME`): Collect user input using a *mask*
-* Multi Line Text Edit (`MT`): Multi line edit control
-* Button (`BT`): A button
-* Vertical Menu (`VM`): A vertical menu aka a vertical lightbar
-* Horizontal Menu (`HM`): A horizontal menu aka a horizontal lightbar
-* Spinner Menu (`SM`): A spinner input control
-* Toggle Menu (`TM`): A toggle menu commonly used for Yes/No style input
-* Key Entry (`KE`): A *single* key input control
-
-(Peek at `core/mci_view_factory.js` to see additional information on these)
-
-## Predefined
-There are many predefined MCI codes that can be used anywhere on the system (placed in any art file). More are added all the time so also check out `core/predefined_mci.js` for a full listing. Many codes attempt to pay homage to Oblivion/2, iNiQUiTY, etc.
-
-* `BN`: Board Name
-* `VL`: Version *label*, e.g. "ENiGMA½ v0.0.3-alpha"
-* `VN`: Version *number*, eg.. "0.0.3-alpha"
-* `SN`: SysOp username
-* `SR`: SysOp real name
-* `SL`: SysOp location
-* `SA`: SysOp affiliations
-* `SS`: SysOp sex
-* `SE`: SysOp email address
-* `UN`: Current user's username
-* `UI`: Current user's user ID
-* `UG`: Current user's group membership(s)
-* `UR`: Current user's real name
-* `LO`: Current user's location
-* `UA`: Current user's age
-* `BD`: Current user's birthdate (using theme date format)
-* `US`: Current user's sex
-* `UE`: Current user's email address
-* `UW`: Current user's web address
-* `UF`: Current user's affiliations
-* `UT`: Current user's *theme ID* (e.g. "luciano_blocktronics")
-* `UC`: Current user's login/call count
-* `ND`: Current user's connected node number
-* `IP`: Current user's IP address
-* `ST`: Current user's connected server name (e.g. "Telnet" or "SSH")
-* `FN`: Current user's active file base filter name
-* `DN`: Current user's number of downloads
-* `DK`: Current user's download amount (formatted to appropriate bytes/megs/etc.)
-* `UP`: Current user's number of uploads
-* `UK`: Current user's upload amount (formatted to appropriate bytes/megs/etc.)
-* `NR`: Current user's upload/download ratio
-* `KR`: Current user's upload/download *bytes* ratio
-* `MS`: Current user's account creation date (using theme date format)
-* `PS`: Current user's post count
-* `PC`: Current user's post/call ratio
-* `MD`: Current user's status/viewing menu/activity
-* `MA`: Current user's active message area name
-* `MC`: Current user's active message conference name
-* `ML`: Current user's active message area description
-* `CM`: Current user's active message conference description
-* `SH`: Current user's term height
-* `SW`: Current user's term width
-* `DT`: Current date (using theme date format)
-* `CT`: Current time (using theme time format)
-* `OS`: System OS (Linux, Windows, etc.)
-* `OA`: System architecture (x86, x86_64, arm, etc.)
-* `SC`: System CPU model
-* `NV`: System underlying Node.js version
-* `AN`: Current active node count
-* `TC`: Total login/calls to system
-* `RR`: Displays a random rumor
-* `SD`: Total downloads, system wide
-* `SO`: Total downloaded amount, system wide (formatted to appropriate bytes/megs/etc.)
-* `SU`: Total uploads, system wide
-* `SP`: Total uploaded amount, system wide (formatted to appropriate bytes/megs/etc.)
-
-
-A special `XY` MCI code may also be utilized for placement identification when creating menus.
-
-## Properties & Theming
-Predefined MCI codes and other Views can have properties set via `menu.hjson` and further *themed* via `theme.hjson`.
-
-### Common Properties
-* `textStyle`: Sets the standard (non-focus) text style. See **Text Styles** below
-* `focusTextStyle`: Sets focus text style. See **Text Styles** below.
-* `itemSpacing`: Used to separate items in menus such as Vertical Menu and Horizontal Menu Views.
-* `height`: Sets the height of views such as menus that may be > 1 character in height
-* `width`: Sets the width of a view
-* `focus`: If set to `true`, establishes initial focus
-* `text`: (initial) text of a view
-* `submit`: If set to `true` any `accept` action upon this view will submit the encompassing **form**
-
-These are just a few of the properties set on various views. *Use the source Luke*, as well as taking a look at the default `menu.hjson` and `theme.hjson` files!
-
-
-#### Text Styles
-Standard style types available for `textStyle` and `focusTextStyle`:
-
-* `normal`: Leaves text as-is. This is the default.
-* `upper`: ENIGMA BULLETIN BOARD SOFTWARE
-* `lower`: enigma bulletin board software
-* `title`: Enigma Bulletin Board Software
-* `first lower`: eNIGMA bULLETIN bOARD sOFTWARE
-* `small vowels`: eNiGMa BuLLeTiN BoaRD SoFTWaRe
-* `big vowels`: EniGMa bUllEtIn bOArd sOftwArE
-* `small i`: ENiGMA BULLETiN BOARD SOFTWARE
-* `mixed`: EnIGma BUlLEtIn BoaRd SOfTWarE (randomly assigned)
-* `l33t`: 3n1gm4 bull371n b04rd 50f7w4r3
\ No newline at end of file
diff --git a/docs/menu_system.md b/docs/menu_system.md
deleted file mode 100644
index aef51199..00000000
--- a/docs/menu_system.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# Menu System
-ENiGMA½'s menu system is highly flexible and moddable. The possibilities are almost endless!
-
-This document and others will refer to `menu.hjson`. This should be seen as an alias to `yourboardname.hjson` (or whatever you reference in `config.hjson` using the `menuFile` property — see below). By modifying your `menu.hjson` you will be able to create a custom experience unique to your board.
-
-The default `menu.hjson` file lives within the `config` directory. It is **highly recommended** to specify another file by setting the `menuFile` property in your `config.hjson` file:
-```hjson
-general: {
- /* Can also specify a full path */
- menuFile: yourboardname.hjson
-}
-```
-
-You can start by copying the default `mods/menu.hjson` to `yourboardname.hjson`.
-
-## The Basics
-Like all configuration within ENiGMA½, menu configuration is done in [HJSON](https://hjson.org/) format.
-
-Entries in `menu.hjson` are objects defining a menu. A menu in this sense is something the user can see or visit. Examples include but are not limited to:
-* Classical Main, Messages, and File menus
-* Art file display
-* Module driven menus such as door launchers
-
-
-Each entry in `menu.hjson` defines an object that represents a menu. These objects live within the `menus` parent object. Each object's *key* is a menu name you can reference within other menus in the system.
-
-## Example
-Let's look a couple basic menu entries:
-
-```hjson
-telnetConnected: {
- art: CONNECT
- next: matrix
- options: { nextTimeout: 1500 }
-}
-```
-
-The above entry `telnetConnected` is set as the Telnet server's first menu entry (set by `firstMenu` in the Telnet server's config).
-
-An art pattern of `CONNECT` is set telling the system to look for `CONNECT.*` where `` represents a optional integer in art files to cause randomness, e.g. `CONNECT1.ANS`, `CONNECT2.ANS`, and so on. If desired, you can also be explicit by supplying a full filename with an extention such as `CONNECT.ANS`.
-
-The entry `next` sets up the next menu, by name, in the stack (`matrix`) that we'll go to after `telnetConnected`.
-
-Finally, an `options` object may contain various common options for menus. In this case, `nextTimeout` tells the system to proceed to the `next` entry automatically after 1500ms.
-
-Now let's look at `matrix`, the `next` entry from `telnetConnected`:
-```hjson
-matrix: {
- art: matrix
- desc: Login Matrix
- form: {
- 0: {
- VM: {
- mci: {
- VM1: {
- submit: true
- focus: true
- items: [ "login", "apply", "log off" ]
- argName: matrixSubmit
- }
- }
- submit: {
- *: [
- {
- value: { matrixSubmit: 0 }
- action: @menu:login
- }
- {
- value: { matrixSubmit: 1 },
- action: @menu:newUserApplication
- }
- {
- value: { matrixSubmit: 2 },
- action: @menu:logoff
- }
- ]
- }
- }
- }
- }
-}
-```
-
-In the above entry, you'll notice `form`. This defines a form(s) object. In this case, a single form by ID of `0`. The system is then told to use a block only when the resulting art provides a `VM` (*VerticalMenuView*) MCI entry. `VM1` is then setup to `submit` and start focused via `focus: true` as well as have some menu entries ("login", "apply", ...) defined. We provide an `argName` for this action as `matrixSubmit`.
-
-The `submit` object tells the system to attempt to apply provided match entries from any view ID (`*`). Upon submit, the first match will be executed. For example, if the user selects "login", the first entry with a value of `{ matrixSubmit: 0 }` will match causing `action` of `@menu:login` to be executed (go to `login` menu).
diff --git a/docs/messageareas/bso-import-export.md b/docs/messageareas/bso-import-export.md
new file mode 100644
index 00000000..49e533d8
--- /dev/null
+++ b/docs/messageareas/bso-import-export.md
@@ -0,0 +1,74 @@
+---
+layout: page
+title: BSO Import / Export
+---
+The scanner/tosser module `ftn_bso` provides **B**inkley **S**tyle **O**utbound (BSO) import/toss and
+scan/export of messages EchoMail and NetMail messages. Configuration is supplied in `config.hjson`
+under `scannerTossers::ftn_bso`.
+
+| Config Item | Required | Description |
+|-------------------------|----------|---------------------------------------------------------------------------------|
+| `defaultZone` | :+1: | Sets the default BSO outbound zone
+| `defaultNetwork` | :-1: | Sets the default network name from `messageNetworks.ftn.networks`. **Required if more than one network is defined**.
+| `paths` | :-1: | Override default paths set by the system. This section may contain `outbound`, `inbound`, and `secInbound`.
+| `packetTargetByteSize` | :-1: | Overrides the system *target* packet (.pkt) size of 512000 bytes (512k)
+| `bundleTargetByteSize` | :-1: | Overrides the system *target* ArcMail bundle size of 2048000 bytes (2M)
+| `schedule` | :+1: | See Scheduling
+| `nodes` | :+1: | See Nodes
+
+## Scheduling
+Schedules can be defined for importing and exporting via `import` and `export` under `schedule`.
+Each entry is allowed a "free form" text and/or special indicators for immediate export or watch
+file triggers.
+
+ * `@immediate`: A message will be immediately exported if this trigger is defined in a schedule. Only used for `export`.
+ * `@watch:/path/to/file`: This trigger watches the path specified for changes and will trigger an import or export when such events occur. Only used for `import`.
+ * Free form text can be things like `at 5:00 pm` or `every 2 hours`.
+
+See [Later text parsing documentation](http://bunkat.github.io/later/parsers.html#text) for more information.
+
+### Example Configuration
+
+```hjson
+{
+ scannerTossers: {
+ ftn_bso: {
+ schedule: {
+ import: every 1 hours or @watch:/path/to/watchfile.ext
+ export: every 1 hours or @immediate
+ }
+ }
+ }
+}
+```
+
+## Nodes
+The `nodes` section defines how to export messages for one or more uplinks.
+
+A node entry starts with a FTN style address (up to 5D) **as a key** in `config.hjson`. This key may
+contain wildcard(s) for net/zone/node/point/domain.
+
+| Config Item | Required | Description |
+|------------------|----------|---------------------------------------------------------------------------------|
+| `packetType` | :-1: | `2`, `2.2`, or `2+`. Defaults to `2+` for modern mailer compatiability |
+| `packetPassword` | :-1: | Password for the packet |
+| `encoding` | :-1: | Encoding to use for message bodies; Defaults to `utf-8` |
+| `archiveType` | :-1: | Specifies the archive type for ArcMail bundles. Must be a valid archiver name such as `zip` (See archiver configuration) |
+
+**Example**:
+```hjson
+{
+ scannerTossers: {
+ ftn_bso: {
+ nodes: {
+ "46:*": {
+ packetType: 2+
+ packetPassword: mypass
+ encoding: cp437
+ archiveType: zip
+ }
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/messageareas/configuring-a-message-area.md b/docs/messageareas/configuring-a-message-area.md
new file mode 100644
index 00000000..5ba396ea
--- /dev/null
+++ b/docs/messageareas/configuring-a-message-area.md
@@ -0,0 +1,65 @@
+---
+layout: page
+title: Configuring a Message Area
+---
+**Message Conferences** and **Areas** allow for grouping of message base topics.
+
+## Message Conferences
+Message Conferences are the top level container for 1:n Message Areas via the `messageConferences` section
+in `config.hjson`. Common message conferences may include a local conference and one or more conferences
+each dedicated to a particular message network such as FsxNet, AgoraNet, etc.
+
+Each conference is represented by a entry under `messageConferences`. **The areas key is the conferences tag**.
+
+| Config Item | Required | Description |
+|-------------|----------|---------------------------------------------------------------------------------|
+| `name` | :+1: | Friendly conference name |
+| `desc` | :+1: | Friendly conference description |
+| `sort` | :-1: | If supplied, provides a key used for sorting |
+| `default` | :-1: | Specify `true` to make this the default conference (e.g. assigned to new users) |
+| `areas` | :+1: | Container of 1:n areas described below |
+
+### Example
+
+```hjson
+{
+ messageConferences: {
+ local: {
+ name: Local
+ desc: Local discussion
+ sort: 1
+ default: true
+ }
+ }
+}
+```
+
+## Message Areas
+Message Areas are topic specific containers for messages that live within a particular conference. #
+**The area's key is its area tag**. For example, "General Discussion" may live under a Local conference
+while an AgoraNet conference may contain "BBS Discussion".
+
+| Config Item | Required | Description |
+|-------------|----------|---------------------------------------------------------------------------------|
+| `name` | :+1: | Friendly area name |
+| `desc` | :+1: | Friendly area discription |
+| `sort` | :-1: | If supplied, provides a key used for sorting |
+| `default` | :-1: | Specify `true` to make this the default area (e.g. assigned to new users) |
+
+### Example
+
+```hjson
+messageConferences: {
+ local: {
+ // ... see above ...
+ areas: {
+ enigma_dev: { // Area tag - required elsewhere!
+ name: ENiGMA 1/2 Development
+ desc: ENiGMA 1/2 discussion!
+ sort: 1
+ default: true
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/messageareas/message-networks.md b/docs/messageareas/message-networks.md
new file mode 100644
index 00000000..bb98b0b7
--- /dev/null
+++ b/docs/messageareas/message-networks.md
@@ -0,0 +1,67 @@
+---
+layout: page
+title: Message Networks
+---
+Configuring message networks in ENiGMA½ requires three specific pieces of config - the network and your
+assigned address on it, the message areas (echos) of the network you wish to map to ENiGMA½ message areas,
+then the schedule and routes to send mail packets on the network.
+
+## FTN Networks
+
+FTN networks are configured under the `messageNetworks::ftn` section of `config.hjson`.
+
+The `networks` section contains a sub section for each network you wish you join your board to.
+Each entry's key name is referenced elsewhere in `config.hjson` for FTN oriented configurations.
+
+### Example Configuration
+
+```hjson
+{
+ messageNetworks: {
+ ftn: {
+ networks: {
+ agoranet: {
+ localAddress: "46:3/102"
+ }
+ fsxnet: {
+ localAddress: "21:4/333"
+ }
+ }
+ }
+ }
+}
+```
+
+## Message Areas
+
+The `areas` section describes a mapping of local **area tags** configured in your `messageConferences` (see
+[Configuring a Message Area][/messageareas/configuring-a-message-area]) to a message network (described
+above), a FTN specific area tag, and remote uplink address(s).
+
+This section can be thought of similar to the *AREAS.BBS* file used by other BBS packages.
+
+When ENiGMA½ imports messages, they will be placed in the local area that matches key under `areas`.
+
+| Config Item | Required | Description |
+|-------------|----------|----------------------------------------------------------|
+| `network` | :+1: | Associated network from the `networks` section above |
+| `tag` | :+1: | FTN area tag |
+| `uplinks` | :+1: | An array of FTN address uplink(s) for this network |
+
+### Example Configuration
+
+```hjson
+{
+ messageNetworks: {
+ ftn: {
+ areas: {
+ agoranet_bbs: { // tag found within messageConferences
+ network: agoranet
+ tag: AGN_BBS
+ uplinks: "46:1/100"
+ }
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/messageareas/netmail.md b/docs/messageareas/netmail.md
new file mode 100644
index 00000000..3e947e68
--- /dev/null
+++ b/docs/messageareas/netmail.md
@@ -0,0 +1,38 @@
+---
+layout: page
+title: Netmail
+---
+ENiGMA support import and export of Netmail from the Private Mail area. `RiPuk @ 21:1/136` and
+`RiPuk <21:1/136>` 'To' address formats are supported.
+
+## Netmail Routing
+
+A configuration block must be added to the `scannerTossers::ftn_bso` `config.hjson` section to tell the
+ENiGMA½ tosser where to route netmail.
+
+The following configuration would tell ENiGMA½ to route all netmail addressed to 21:* through 21:1/100,
+and all 46:* netmail through 46:1/100:
+
+````hjson
+
+scannerTossers: {
+
+ /* other scannerTosser config removed for clarity */
+
+ ftn_bso: {
+ netMail: {
+ routes: {
+ "21:*" : {
+ address: "21:1/100"
+ network: fsxnet
+ }
+ "46:*" : {
+ address: "46:1/100"
+ network: agoranet
+ }
+ }
+ }
+ }
+}
+````
+The `network` tag must match the networks defined in `messageNetworks::ftn::networks` within `config.hjson`.
\ No newline at end of file
diff --git a/docs/modding.md b/docs/modding.md
deleted file mode 100644
index 609729b4..00000000
--- a/docs/modding.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Modding
-
-## General Configuraiton
-See [Configuration](config.md)
-
-## Menus
-See [Menu System](menu_system.md)
-
-## Theming
-Take a look at how the default `luciano_blocktronics` theme found under `art/themes` works!
-
-TODO document me!
-
-## Add-On Modules
-See [Mods](mods.md)
\ No newline at end of file
diff --git a/docs/modding/door-servers.md b/docs/modding/door-servers.md
new file mode 100644
index 00000000..5deaf89b
--- /dev/null
+++ b/docs/modding/door-servers.md
@@ -0,0 +1,61 @@
+---
+layout: page
+title: Door Servers
+---
+## The bbs_link Module
+Native support for [BBSLink](http://www.bbslink.net/) doors is provided via the `bbs_link` module.
+
+Configuration for a BBSLink door is straight forward. Take a look at the following example for launching Tradewars 2002:
+
+```hjson
+doorTradeWars2002BBSLink: {
+ desc: Playing TW 2002 (BBSLink)
+ module: bbs_link
+ config: {
+ sysCode: XXXXXXXX
+ authCode: XXXXXXXX
+ schemeCode: XXXXXXXX
+ door: tw
+ }
+}
+
+```
+
+Fill in your credentials in `sysCode`, `authCode`, and `schemeCode` and that's it!
+
+## The door_party Module
+The module `door_party` provides native support for [DoorParty!](http://www.throwbackbbs.com/) Configuration is quite easy:
+
+```hjson
+doorParty: {
+ desc: Using DoorParty!
+ module: door_party
+ config: {
+ username: XXXXXXXX
+ password: XXXXXXXX
+ bbsTag: XX
+ }
+}
+```
+
+Fill in `username`, `password`, and `bbsTag` with credentials provided to you and you should be in business!
+
+## The CombatNet Module
+The `combatnet` module provides native support for [CombatNet](http://combatnet.us/). Add the following to your menu config:
+
+````hjson
+combatNet: {
+ desc: Using CombatNet
+ module: combatnet
+ config: {
+ bbsTag: CBNxxx
+ password: XXXXXXXXX
+ }
+}
+````
+Update `bbsTag` (in the format CBNxxx) and `password` with the details provided when you register, then
+you should be ready to rock!
+
+## The Exodus Module
+
+TBC
\ No newline at end of file
diff --git a/docs/modding/existing-mods.md b/docs/modding/existing-mods.md
new file mode 100644
index 00000000..af1b2b74
--- /dev/null
+++ b/docs/modding/existing-mods.md
@@ -0,0 +1,11 @@
+---
+layout: page
+title: Existing Mods
+---
+| Name | Author | Description |
+|-----------------------------|-------------|-------------|
+| Married Bob Fetch Event | NuSkooler | An event for fetching the latest Married Bob ANSI's for display on you board. ACiDic release [ACD-MB4E.ZIP](https://l33t.codes/outgoing/ACD/ACD-MB4E.ZIP). Can also be [found on GitHub](https://github.com/NuSkooler/enigma-bbs-married_bob_evt) |
+| Latest Files Announcement | NuSkooler | An event for posting the latest file arrivals of your board to message areas such as FTN style networks. ACiDic release [ACD-LFA1.ZIP](https://l33t.codes/outgoing/ACD/ACD-LFA1.ZIP). Also [found on GitHub](https://github.com/NuSkooler/enigma-bbs-latest_files_announce_evt) |
+| Message Post Event | NuSkooler | An event for posting messages/ads to networks. ACiDic release [ACD-MP4E.ZIP](https://l33t.codes/outgoing/ACD/ACD-MP4E.ZIP) |
+
+See also [ACiDic BBS Mods by NuSkooler](https://l33t.codes/acidic-mods-by-myself/)
\ No newline at end of file
diff --git a/docs/doors.md b/docs/modding/local-doors.md
similarity index 76%
rename from docs/doors.md
rename to docs/modding/local-doors.md
index 5f72d761..b9620748 100644
--- a/docs/doors.md
+++ b/docs/modding/local-doors.md
@@ -1,8 +1,7 @@
-# Doors
-ENiGMA½ supports a variety of methods for interacting with doors — not limited to:
-* `abracadabra` module: Standard in/out (stdio) capture or temporary socket server that can be used with [DOSEMU](http://www.dosemu.org/), [DOSBox](http://www.dosbox.com/), [QEMU](http://wiki.qemu.org/Main_Page), etc.
-* `bbs_link` module for interaction with [BBSLink](http://www.bbslink.net/)
-
+---
+layout: page
+title: Local Doors
+---
## The abracadabra Module
The `abracadabra` module provides a generic and flexible solution for many door types. Through this module you can execute native processes & scripts directly, and process I/O through stdio or a temporary TCP server.
@@ -133,7 +132,7 @@ Note the `qemu-system-i386` line. We're telling QEMU to launch and use localtime
For doors that do not *require* a FOSSIL driver, it is recommended to not load or use one unless you are having issues.
-#### Step 4: Create a menu entry
+#### Step 3: Create a menu entry
Finally we can create a `menu.hjson` entry using the `abracadabra` module:
```hjson
doorLORD: {
@@ -155,70 +154,15 @@ doorLORD: {
}
```
-
-## The bbs_link Module
-Native support for [BBSLink](http://www.bbslink.net/) doors is provided via the `bbs_link` module.
-
-Configuration for a BBSLink door is straight forward. Take a look at the following example for launching Tradewars 2002:
-
-```hjson
-doorTradeWars2002BBSLink: {
- desc: Playing TW 2002 (BBSLink)
- module: bbs_link
- config: {
- sysCode: XXXXXXXX
- authCode: XXXXXXXX
- schemeCode: XXXXXXXX
- door: tw
- }
-}
-
-```
-
-Fill in your credentials in `sysCode`, `authCode`, and `schemeCode` and that's it!
-
-## The door_party Module
-The module `door_party` provides native support for [DoorParty!](http://www.throwbackbbs.com/) Configuration is quite easy:
-
-```hjson
-doorParty: {
- desc: Using DoorParty!
- module: door_party
- config: {
- username: XXXXXXXX
- password: XXXXXXXX
- bbsTag: XX
- }
-}
-```
-
-Fill in `username`, `password`, and `bbsTag` with credentials provided to you and you should be in business!
-
-## The CombatNet Module
-The `combatnet` module provides native support for [CombatNet](http://combatnet.us/). Add the following to your menu config:
-
-````hjson
-combatNet: {
- desc: Using CombatNet
- module: combatnet
- config: {
- bbsTag: CBNxxx
- password: XXXXXXXXX
- }
-}
-````
-Update `bbsTag` (in the format CBNxxx) and `password` with the details provided when you register, then
-you should be ready to rock!
-
-# Resources
+## Resources
### DOSBox
* Custom DOSBox builds http://home.arcor.de/h-a-l-9000/
-## Door Downloads & Support Sites
-### General
+### Door Downloads & Support Sites
+#### General
* http://bbsfiles.com/
* http://bbstorrents.bbses.info/
-### L.O.R.D.
+#### L.O.R.D.
* http://lord.lordlegacy.com/
\ No newline at end of file
diff --git a/docs/mods.md b/docs/mods.md
deleted file mode 100644
index f73a3fc6..00000000
--- a/docs/mods.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Mods
-Custom mods should be added to `/enigma-install-path/mods`.
-
-## Existing Mods
-* **Married Bob Fetch Event**: An event for fetching the latest Married Bob ANSI's for display on you board. ACiDic release [ACD-MB4E.ZIP](https://l33t.codes/outgoing/ACD/ACD-MB4E.ZIP). Can also be [found on GitHub](https://github.com/NuSkooler/enigma-bbs-married_bob_evt)
-* **Latest Files Announcement**: An event for posting the latest file arrivals of your board to message areas such as FTN style networks. ACiDic release [ACD-LFA1.ZIP](https://l33t.codes/outgoing/ACD/ACD-LFA1.ZIP) Also [found on GitHub](https://github.com/NuSkooler/enigma-bbs-latest_files_announce_evt)
-* **Message Post Event**: An event for posting messages/ads to networks. ACiDic release [ACD-MP4E.ZIP](https://l33t.codes/outgoing/ACD/ACD-MP4E.ZIP)
-
-See also [ACiDic BBS Mods by Myself](https://l33t.codes/acidic-mods-by-myself/)
\ No newline at end of file
diff --git a/docs/msg_conf_area.md b/docs/msg_conf_area.md
deleted file mode 100644
index 05c11441..00000000
--- a/docs/msg_conf_area.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Message Conferences & Areas
-**Message Conferences** and **Areas** allow for grouping of message base topics.
-
-## Message Conferences
-Message Conferences are the top level container for 1:n Message Areas via the `messageConferences` section in `config.hjson`. Common message conferences may include a local conference and one or more conferences each dedicated to a particular message network such as FidoNet, AgoraNet, etc.
-
-Each conference is represented by a entry under `messageConferences`. **The areas key is the conferences tag**.
-
-**Members**:
-* `name` (required): Friendly conference name
-* `desc` (required): Friendly conference description
-* `sort` (optional): If supplied, provides a key used for sorting
-* `default` (optional): Specify `true` to make this the default conference (e.g. assigned to new users)
-* `areas`: Container of 1:n areas described below
-
-**Example**:
-```hjson
-{
- messageConferences: {
- local: {
- name: Local
- desc: Local discussion
- sort: 1
- default: true
- }
- }
-}
-```
-
-## Message Areas
-Message Areas are topic specific containers for messages that live within a particular conference. **The areas key is it's areas tag**. For example, "General Discussion" may live under a Local conference while an AgoraNet conference may contain "BBS Discussion".
-
-**Members**:
-* `name` (required): Friendly area name
-* `desc` (required): Friendly area discription
-* `sort` (optional): If supplied, provides a key used for sorting
-* `default` (optional): Specify `true` to make this the default area (e.g. assigned to new users)
-
-**Example**:
-```hjson
-messageConferences: {
- local: {
- // ... see above ...
- areas: {
- local_enigma_dev: {
- name: ENiGMA 1/2 Development
- desc: Discussion related to features and development of ENiGMA 1/2!
- sort: 1
- default: true
- }
- }
- }
-}
-```
-
-## Message Networks
-ENiGMA½ has the ability to network with other systems via [Message Networks](msg_networks.md). Message **area tags** (described above) are utilized to map foreign areas with locally defined areas.
\ No newline at end of file
diff --git a/docs/msg_networks.md b/docs/msg_networks.md
deleted file mode 100644
index 11fa9202..00000000
--- a/docs/msg_networks.md
+++ /dev/null
@@ -1,196 +0,0 @@
-# Message Networks
-Message networks are configured in `messageNetworks` section of `config.hjson`. Each network type has it's own sub section such as `ftn` for FidoNet Technology Network (FTN) style networks. Message Networks tie directly with [Message Areas](msg_conf_area.md) that are also defined in `config.hjson`.
-
-**Members**:
- * `ftn`: Configure FTN networks (described below)
- * `originLine` (optional): Overrwrite the default origin line for networks that support it. For example: `originLine: Xibalba - xibalba.l33t.codes:44510`
-
-## FidoNet Technology Network (FTN)
-FTN networks are configured under the `messageNetworks.ftn` section of `config.hjson`.
-
-### Networks
-The `networks` section contains a sub section for network(s) you wish you join your board with. Each entry's key name can be referenced elsewhere in `config.hjson` for FTN oriented configurations.
-
-**Members**:
- * `localAddress` (required): FTN address of **your local system**
-
-**Example**:
-```hjson
-{
- messageNetworks: {
- ftn: {
- networks: {
- agoranet: {
- localAddress: "46:3/102"
- }
- }
- }
- }
-}
-```
-
-### Areas
-The `areas` section describes a mapping of local **area tags** found in your `messageConferences` to a message network (from `networks` described previously), a FTN specific area tag, and remote uplink address(s). This section can be thought of similar to the *AREAS.BBS* file used by other BBS packages (In fact you can import AREAS.BBS using `oputil.js`!)
-
-When importing, messages will be placed in the local area that matches key under `areas`.
-
-**Members**:
- * `network` (required): Associated network from the `networks` section
- * `tag` (required): FTN area tag
- * `uplinks`: An array of FTN address uplink(s) for this network
-
-**Example**:
-```hjson
-{
- messageNetworks: {
- ftn: {
- areas: {
- agoranet_bbs: { /* found within messageConferences */
- network: agoranet
- tag: AGN_BBS
- uplinks: "46:1/100"
- }
- }
- }
- }
-}
-```
-
-### BSO Import / Export
-The scanner/tosser module `ftn_bso` provides **B**inkley **S**tyle **O**utbound (BSO) import/toss & scan/export of messages EchoMail and NetMail messages. Configuration is supplied in `config.hjson` under `scannerTossers.ftn_bso`.
-
-**Members**:
- * `defaultZone` (required): Sets the default BSO outbound zone
- * `defaultNetwork` (optional): Sets the default network name from `messageNetworks.ftn.networks`. **Required if more than one network is defined**.
- * `paths` (optional): Override default paths set by the system. This section may contain `outbound`, `inbound`, and `secInbound`.
- * `packetTargetByteSize` (optional): Overrides the system *target* packet (.pkt) size of 512000 bytes (512k)
- * `bundleTargetByteSize` (optional): Overrides the system *target* ArcMail bundle size of 2048000 bytes (2M)
- * `schedule` (required): See Scheduling
- * `nodes` (required): See Nodes
-
-#### Nodes
-The `nodes` section defines how to export messages for one or more uplinks.
-
-A node entry starts with a FTN style address (up to 5D) **as a key** in `config.hjson`. This key may contain wildcard(s) for net/zone/node/point/domain.
-
-**Members**:
- * `packetType` (optional): `2`, `2.2`, or `2+`. Defaults to `2+` for modern mailer compatiability
- * `packetPassword` (optional): Password for the packet
- * `encoding` (optional): Encoding to use for message bodies; Defaults to `utf-8`
- * `archiveType` (optional): Specifies the archive type for ArcMail bundles. Must be a valid archiver name such as `zip` (See archiver configuration)
-
-**Example**:
-```hjson
-{
- scannerTossers: {
- ftn_bso: {
- nodes: {
- "46:*": {
- packetType: 2+
- packetPassword: mypass
- encoding: cp437
- archiveType: zip
- }
- }
- }
- }
-}
-```
-
-#### TIC Support
-ENiGMA½ supports TIC files. This is handled by mapping TIC areas to local file areas.
-
-Under a given node (like the one configured above), TIC configuration may be supplied:
-
-```hjson
-{
- scannerTossers: {
- ftn_bso: {
- nodes: {
- "46:*": {
- packetType: 2+
- packetPassword: mypass
- encoding: cp437
- archiveType: zip
- tic: {
- password: TESTY-TEST
- uploadBy: Agoranet TIC
- allowReplace: true
- }
- }
- }
- }
- }
-}
-```
-
-You then need to configure the mapping between TIC areas you want to carry, and the file
-base area for them to be tossed to. Start by creating a storage tag and file base, if you haven't
-already:
-
-````hjson
-fileBase: {
- areaStoragePrefix: /home/bbs/file_areas/
-
- storageTags: {
- msg_network: "msg_network"
- }
-
- areas: {
- msgNetworks: {
- name: Message Networks
- desc: Message networks news & info
- storageTags: [
- "msg_network"
- ]
- }
- }
-}
-
-````
-and then create the mapping between the TIC area and the file area created:
-
-````hjson
-ticAreas: {
- agn_node: {
- areaTag: msgNetworks
- hashTags: agoranet,nodelist
- storageTag: msg_network
- }
-
- agn_info: {
- areaTag: msgNetworks
- hashTags: agoranet,infopack
- storageTag: msg_network
- }
-}
-
-````
-Multiple TIC areas can be mapped to a single file base area.
-
-
-#### Scheduling
-Schedules can be defined for importing and exporting via `import` and `export` under `schedule`. Each entry is allowed a "free form" text and/or special indicators for immediate export or watch file triggers.
-
- * `@immediate`: A message will be immediately exported if this trigger is defined in a schedule. Only used for `export`.
- * `@watch:/path/to/file`: This trigger watches the path specified for changes and will trigger an import or export when such events occur. Only used for `import`.
- * Free form text can be things like `at 5:00 pm` or `every 2 hours`.
-
-See [Later text parsing documentation](http://bunkat.github.io/later/parsers.html#text) for more information.
-
-**Example**:
-```hjson
-{
- scannerTossers: {
- ftn_bso: {
- schedule: {
- import: every 1 hours or @watch:/path/to/watchfile.ext
- export: every 1 hours or @immediate
- }
- }
- }
-}
-```
-
-## More Information
-* [ENiGMA 1/2 + Binkd on CentOS 7](https://www.l33t.codes/enigma-12-binkd-on-centos-7/)
\ No newline at end of file
diff --git a/docs/oputil/index.md b/docs/oputil/index.md
new file mode 100644
index 00000000..b23a7362
--- /dev/null
+++ b/docs/oputil/index.md
@@ -0,0 +1,17 @@
+---
+layout: page
+title: oputil
+---
+
+oputil is the ENiGMA½ command line utility for maintaining users, file areas and message areas, as well as
+generating your initial ENiGMA½ config.
+
+## File areas
+The `oputil.js` +op utilty `fb` command has tools for managing file bases. For example, to import existing
+files found within **all** storage locations tied to an area and set tags `tag1` and `tag2` to each import:
+
+```bash
+oputil.js fb scan some_area --tags tag1,tag2
+```
+
+See `oputil.js fb --help` for additional information.
\ No newline at end of file
diff --git a/docs/servers/ssh.md b/docs/servers/ssh.md
new file mode 100644
index 00000000..ca0b62ec
--- /dev/null
+++ b/docs/servers/ssh.md
@@ -0,0 +1,36 @@
+---
+layout: page
+title: SSH Server
+---
+## Generate a SSH Private Key
+
+To utilize the SSH server, an SSH Private Key will need generated. From the ENiGMA installation directory:
+
+```bash
+openssl genrsa -des3 -out ./config/ssh_private_key.pem 2048
+```
+
+You then need to enable the SSH server in your `config.hjson`:
+
+```hjson
+{
+ loginServers: {
+ ssh: {
+ enabled: true
+ port: 8889
+ privateKeyPass: YOUR_PK_PASS
+ }
+ }
+}
+```
+
+### SSH Server Options
+
+| Option | Description
+|---------------------|--------------------------------------------------------------------------------------|
+| `privateKeyPem` | Path to private key file
+| `privateKeyPass` | Password to private key file
+| `firstMenu` | First menu an SSH connected user is presented with
+| `firstMenuNewUser` | Menu presented to user when logging in with `users::newUserNames` in your config.hjson (defaults to `new` and `apply`)
+| `enabled` | Enable/disable SSH server
+| `port` | Configure a custom port for the SSH server
diff --git a/docs/servers/telnet.md b/docs/servers/telnet.md
new file mode 100644
index 00000000..155e6726
--- /dev/null
+++ b/docs/servers/telnet.md
@@ -0,0 +1,4 @@
+---
+layout: page
+title: Telnet Server
+---
\ No newline at end of file
diff --git a/docs/web_server.md b/docs/servers/web-server.md
similarity index 82%
rename from docs/web_server.md
rename to docs/servers/web-server.md
index 1f87cd80..816c28a2 100644
--- a/docs/web_server.md
+++ b/docs/servers/web-server.md
@@ -1,6 +1,10 @@
-# Web Server
+---
+layout: page
+title: Web Server
+---
ENiGMA½ comes with a built in *content server* for supporting both HTTP and HTTPS. Currently the
-[File Bases](file_base.md) registers routes for file downloads, and static files can also be served for your BBS. Other features will likely come in the future or you can easily write your own!
+[File Bases](file_base.md) registers routes for file downloads, and static files can also be served
+for your BBS. Other features will likely come in the future or you can easily write your own!
## Configuration
By default the web server is not enabled. To enable it, you will need to at a minimum configure two keys in
@@ -40,6 +44,9 @@ contentServers: {
}
```
+If no certificate paths are supplied, ENiGMA½ will assume the defaults of `/config/https_cert.pem` and
+`/config/https_cert_key.pem` accordingly.
+
### Static Routes
Static files live relative to the `contentServers::web::staticRoot` path which defaults to `enigma-bbs/www`.
diff --git a/docs/vtx_web_client.md b/docs/servers/websocket.md
similarity index 96%
rename from docs/vtx_web_client.md
rename to docs/servers/websocket.md
index 99c45f93..30614006 100644
--- a/docs/vtx_web_client.md
+++ b/docs/servers/websocket.md
@@ -1,3 +1,7 @@
+---
+layout: page
+title: Web Socket / Web Interface Server
+---
# VTX Web Client
ENiGMA supports the VTX websocket client for connecting to your BBS from a web page. Example usage can be found at
[Xibalba](https://l33t.codes/vtx/xibalba.html) and [fORCE9](https://bbs.force9.org/vtx/force9.html).
@@ -82,6 +86,6 @@ webserver, and unpack it to a temporary directory.
otherwise.
9. If you navigate to http://your-hostname.here/vtx.html, you should see a splash screen like the following:
- ![VTXClient](images/vtxclient.png "VTXClient")
+ ![VTXClient](../images/vtxclient.png "VTXClient")
\ No newline at end of file
diff --git a/docs/troubleshooting/monitoring-logs.md b/docs/troubleshooting/monitoring-logs.md
new file mode 100644
index 00000000..7c04cb40
--- /dev/null
+++ b/docs/troubleshooting/monitoring-logs.md
@@ -0,0 +1,15 @@
+---
+layout: page
+title: Monitoring Logs
+---
+ENiGMA½ does not produce much to stdout. Logs are produced by Bunyan which outputs each entry as a
+JSON object.
+
+Start by installing bunyan and making it available on your path:
+
+ npm install bunyan -g
+
+To tail logs in a colorized and pretty format, issue the following command:
+
+ tail -F /path/to/enigma-bbs/logs/enigma-bbs.log | bunyan
+