summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/configuration-config-file.md154
-rw-r--r--docs/configuration-env-vars.md256
-rw-r--r--docs/dev/getting-started.md57
-rw-r--r--docs/dev/ot.md14
-rw-r--r--docs/dev/webpack.md9
-rw-r--r--docs/guides/auth/github.md31
-rw-r--r--docs/guides/auth/gitlab-self-hosted.md14
-rw-r--r--docs/guides/auth/keycloak.md50
-rw-r--r--docs/guides/auth/ldap-AD.md1
-rw-r--r--docs/guides/auth/mattermost-self-hosted.md32
-rw-r--r--docs/guides/auth/nextcloud.md10
-rw-r--r--docs/guides/auth/oauth.md12
-rw-r--r--docs/guides/auth/saml-onelogin.md52
-rw-r--r--docs/guides/auth/saml.md68
-rw-r--r--docs/guides/auth/twitter.md42
-rw-r--r--docs/guides/migrate-etherpad.md10
-rw-r--r--docs/guides/migrations-and-breaking-changes.md56
-rw-r--r--docs/guides/minio-image-upload.md24
-rw-r--r--docs/guides/providing-terms.md9
-rw-r--r--docs/guides/s3-image-upload.md19
-rw-r--r--docs/history.md40
-rw-r--r--docs/images/CodiMD-1.3.2-features.pngbin0 -> 81971 bytes
-rw-r--r--docs/images/auth/application-page.png (renamed from docs/guides/images/auth/application-page.png)bin123152 -> 123152 bytes
-rw-r--r--docs/images/auth/create-oauth-app.png (renamed from docs/guides/images/auth/create-oauth-app.png)bin27920 -> 27920 bytes
-rw-r--r--docs/images/auth/create-twitter-app.png (renamed from docs/guides/images/auth/create-twitter-app.png)bin115406 -> 115406 bytes
-rw-r--r--docs/images/auth/gitlab-application-details.png (renamed from docs/guides/images/auth/gitlab-application-details.png)bin30378 -> 30378 bytes
-rw-r--r--docs/images/auth/gitlab-new-application.png (renamed from docs/guides/images/auth/gitlab-new-application.png)bin45457 -> 45457 bytes
-rw-r--r--docs/images/auth/gitlab-sign-in.png (renamed from docs/guides/images/auth/gitlab-sign-in.png)bin5590 -> 5590 bytes
-rw-r--r--docs/images/auth/mattermost-enable-oauth2.png (renamed from docs/guides/images/auth/mattermost-enable-oauth2.png)bin26034 -> 26034 bytes
-rw-r--r--docs/images/auth/mattermost-oauth-app-add.png (renamed from docs/guides/images/auth/mattermost-oauth-app-add.png)bin21443 -> 21443 bytes
-rw-r--r--docs/images/auth/mattermost-oauth-app-done.png (renamed from docs/guides/images/auth/mattermost-oauth-app-done.png)bin31767 -> 31767 bytes
-rw-r--r--docs/images/auth/mattermost-oauth-app-form.png (renamed from docs/guides/images/auth/mattermost-oauth-app-form.png)bin62160 -> 62160 bytes
-rw-r--r--docs/images/auth/nextcloud-oauth2-1-settings.png (renamed from docs/guides/images/auth/nextcloud-oauth2-1-settings.png)bin47047 -> 47047 bytes
-rw-r--r--docs/images/auth/nextcloud-oauth2-2-client-add.png (renamed from docs/guides/images/auth/nextcloud-oauth2-2-client-add.png)bin11684 -> 11684 bytes
-rw-r--r--docs/images/auth/nextcloud-oauth2-3-clientid-secret.png (renamed from docs/guides/images/auth/nextcloud-oauth2-3-clientid-secret.png)bin13428 -> 13428 bytes
-rw-r--r--docs/images/auth/onelogin-add-app.png (renamed from docs/guides/images/auth/onelogin-add-app.png)bin40519 -> 40519 bytes
-rw-r--r--docs/images/auth/onelogin-copy-idp-metadata.png (renamed from docs/guides/images/auth/onelogin-copy-idp-metadata.png)bin239493 -> 239493 bytes
-rw-r--r--docs/images/auth/onelogin-edit-app-name.png (renamed from docs/guides/images/auth/onelogin-edit-app-name.png)bin122369 -> 122369 bytes
-rw-r--r--docs/images/auth/onelogin-edit-sp-metadata.png (renamed from docs/guides/images/auth/onelogin-edit-sp-metadata.png)bin184470 -> 184470 bytes
-rw-r--r--docs/images/auth/onelogin-select-template.png (renamed from docs/guides/images/auth/onelogin-select-template.png)bin73244 -> 73244 bytes
-rw-r--r--docs/images/auth/onelogin-use-dashboard.png (renamed from docs/guides/images/auth/onelogin-use-dashboard.png)bin27216 -> 27216 bytes
-rw-r--r--docs/images/auth/register-oauth-application-form.png (renamed from docs/guides/images/auth/register-oauth-application-form.png)bin61453 -> 61453 bytes
-rw-r--r--docs/images/auth/register-twitter-application.png (renamed from docs/guides/images/auth/register-twitter-application.png)bin202414 -> 202414 bytes
-rw-r--r--docs/images/auth/twitter-app-confirmation.png (renamed from docs/guides/images/auth/twitter-app-confirmation.png)bin191064 -> 191064 bytes
-rw-r--r--docs/images/auth/twitter-app-keys.png (renamed from docs/guides/images/auth/twitter-app-keys.png)bin162703 -> 162703 bytes
-rw-r--r--docs/images/minio-image-upload/create-bucket.png (renamed from docs/guides/images/minio-image-upload/create-bucket.png)bin15207 -> 15207 bytes
-rw-r--r--docs/images/minio-image-upload/create-policy.png (renamed from docs/guides/images/minio-image-upload/create-policy.png)bin21156 -> 21156 bytes
-rw-r--r--docs/images/minio-image-upload/default-view.png (renamed from docs/guides/images/minio-image-upload/default-view.png)bin13061 -> 13061 bytes
-rw-r--r--docs/images/minio-image-upload/docker-logs.png (renamed from docs/guides/images/minio-image-upload/docker-logs.png)bin73263 -> 73263 bytes
-rw-r--r--docs/images/minio-image-upload/open-edit-policy.png (renamed from docs/guides/images/minio-image-upload/open-edit-policy.png)bin17514 -> 17514 bytes
-rw-r--r--docs/images/s3-image-upload/bucket-policy-editor.png (renamed from docs/guides/images/s3-image-upload/bucket-policy-editor.png)bin54641 -> 54641 bytes
-rw-r--r--docs/images/s3-image-upload/bucket-property.png (renamed from docs/guides/images/s3-image-upload/bucket-property.png)bin71762 -> 71762 bytes
-rw-r--r--docs/images/s3-image-upload/create-bucket.png (renamed from docs/guides/images/s3-image-upload/create-bucket.png)bin70260 -> 70260 bytes
-rw-r--r--docs/images/s3-image-upload/custom-policy.png (renamed from docs/guides/images/s3-image-upload/custom-policy.png)bin55804 -> 55804 bytes
-rw-r--r--docs/images/s3-image-upload/iam-user.png (renamed from docs/guides/images/s3-image-upload/iam-user.png)bin91526 -> 91526 bytes
-rw-r--r--docs/images/s3-image-upload/review-policy.png (renamed from docs/guides/images/s3-image-upload/review-policy.png)bin100067 -> 100067 bytes
-rw-r--r--docs/legal/developer-certificate-of-origin.txt35
-rw-r--r--docs/setup/cloudron.md6
-rw-r--r--docs/setup/docker-linuxserver.md14
-rw-r--r--docs/setup/docker.md23
-rw-r--r--docs/setup/heroku.md7
-rw-r--r--docs/setup/kubernetes.md6
-rw-r--r--docs/setup/manual-setup.md39
-rw-r--r--docs/slide-options.md161
64 files changed, 1090 insertions, 161 deletions
diff --git a/docs/configuration-config-file.md b/docs/configuration-config-file.md
new file mode 100644
index 00000000..b233cebe
--- /dev/null
+++ b/docs/configuration-config-file.md
@@ -0,0 +1,154 @@
+Configuration Using Config file
+===
+
+You can choose to configure CodiMD with either a config file or with
+[environment variables](configuration-env-vars.md). The config file is processed
+in [`lib/config/index.js`](../lib/config/index.js) - so this is the first
+place to look if anything is missing not obvious from this document. The
+default values are defined in [`lib/config/default.js`](../lib/config/default.js),
+in case you wonder if you even need to override it.
+
+Environment variables take precedence over configurations from the config files.
+To get started, it is a good idea to take the `config.json.example` and copy it
+to `config.json` before filling in your own details.
+
+
+## Node.JS
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `debug` | `true` or `false` | set debug mode, show more logs |
+
+
+## CodiMD basics
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `allowPDFExport` | `true` | Whether or not PDF export is offered. |
+| `db` | `{ "dialect": "sqlite", "storage": "./db.codimd.sqlite" }` | set the db configs, [see more here](http://sequelize.readthedocs.org/en/latest/api/sequelize/) |
+| `dbURL` | `mysql://localhost:3306/database` | set the db URL; if set, then db config (below) won't be applied |
+| `forbiddenNoteIDs` | `['robots.txt']` | disallow creation of notes, even if `allowFreeUrl` is `true` |
+| `loglevel` | `info` | Defines what kind of logs are provided to stdout. |
+| `imageUploadType` | `imgur`, `s3`, `minio`, `azure`, `lutim` or `filesystem`(default) | Where to upload images. For S3, see our Image Upload Guides for [S3](guides/s3-image-upload.md) or [Minio](guides/minio-image-upload.md)|
+| `sourceURL` | `https://github.com/codimd/server/tree/<current commit>` | Provides the link to the source code of CodiMD on the entry page (Please, make sure you change this when you run a modified version) |
+| `staticCacheTime` | `1 * 24 * 60 * 60 * 1000` | static file cache time |
+| `tooBusyLag` | `70` | CPU time for one eventloop tick until node throttles connections. (milliseconds) |
+| `heartbeatInterval` | `5000` | socket.io heartbeat interval |
+| `heartbeatTimeout` | `10000` | socket.io heartbeat timeout |
+| `documentMaxLength` | `100000` | note max length |
+
+
+## CodiMD paths stuff
+
+these are rarely used for various reasons.
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `defaultNotePath` | `./public/default.md` | default note file path<sup>1</sup>, empty notes will be created with this template. |
+| `dhParamPath` | `./cert/dhparam.pem` | SSL dhparam path<sup>1</sup> (only need when you set `useSSL`) |
+| `sslCAPath` | `['./cert/COMODORSAAddTrustCA.crt']` | SSL ca chain<sup>1</sup> (only need when you set `useSSL`) |
+| `sslCertPath` | `./cert/codimd_io.crt` | SSL cert path<sup>1</sup> (only need when you set `useSSL`) |
+| `sslKeyPath` | `./cert/client.key` | SSL key path<sup>1</sup> (only need when you set `useSSL`) |
+| `tmpPath` | `./tmp/` | temp directory path<sup>1</sup> |
+| `docsPath` | `./public/docs` | docs directory path<sup>1</sup> |
+| `viewPath` | `./public/views` | template directory path<sup>1</sup> |
+| `uploadsPath` | `./public/uploads` | uploads directory<sup>1</sup> - needs to be persistent when you use imageUploadType `filesystem` |
+
+
+## CodiMD Location
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `domain` | `localhost` | domain name |
+| `urlPath` | `codimd` | sub URL path, like `www.example.com/<urlpath>` |
+| `host` | `localhost` | interface/ip to listen on |
+| `port` | `80` | port to listen on |
+| `path` | `/var/run/codimd.sock` | path to UNIX domain socket to listen on (if specified, `host` and `port` are ignored) |
+| `protocolUseSSL` | `true` or `false` | set to use SSL protocol for resources path (only applied when domain is set) |
+| `useSSL` | `true` or `false` | set to use SSL server (if `true`, will auto turn on `protocolUseSSL`) |
+| `urlAddPort` | `true` or `false` | set to add port on callback URL (ports `80` or `443` won't be applied) (only applied when domain is set) |
+| `allowOrigin` | `['localhost']` | domain name whitelist |
+
+
+## CSP and HSTS
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `hsts` | `{"enable": true, "maxAgeSeconds": 31536000, "includeSubdomains": true, "preload": true}` | [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) options to use with HTTPS (default is the example value, max age is a year) |
+| `csp` | `{"enable": true, "directives": {"scriptSrc": "trustworthy-scripts.example.com"}, "upgradeInsecureRequests": "auto", "addDefaults": true}` | Configures [Content Security Policy](https://helmetjs.github.io/docs/csp/). Directives are passed to Helmet - see [their documentation](https://helmetjs.github.io/docs/csp/) for more information on the format. Some defaults are added to the configured values so that the application doesn't break. To disable this behaviour, set `addDefaults` to `false`. Further, if `usecdn` is on, some CDN locations are allowed too. By default (`auto`), insecure (HTTP) requests are upgraded to HTTPS via CSP if `useSSL` is on. To change this behaviour, set `upgradeInsecureRequests` to either `true` or `false`. |
+
+## Privacy and External Requests
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `allowGravatar` | `true` or `false` | set to `false` to disable gravatar as profile picture source on your instance |
+| `useCDN` | `true` or `false` | set to use CDN resources or not (default is `true`) |
+
+## Users and Privileges
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `allowAnonymous` | `true` or `false` | set to allow anonymous usage (default is `true`) |
+| `allowAnonymousEdits` | `true` or `false` | if `allowAnonymous` is `true`: allow users to select `freely` permission, allowing guests to edit existing notes (default is `false`) |
+| `allowFreeURL` | `true` or `false` | set to allow new note creation by accessing a nonexistent note URL |
+| `defaultPermission` | `freely`, `editable`, `limited`, `locked`, `protected` or `private` | set notes default permission (only applied on signed users) |
+| `sessionName` | `connect.sid` | cookie session name |
+| `sessionLife` | `14 * 24 * 60 * 60 * 1000` | cookie session life |
+| `sessionSecret` | `secret` | cookie session secret | If none is set, one will randomly generated on each startup, meaning all your users will be logged out. |
+
+
+## Login methods
+
+Most of these have never been documented for the config.json, feel free to expand these
+
+### Email (local account)
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `email` | `true` or `false` | set to allow email signin |
+| `allowEmailRegister` | `true` or `false` | set to allow email register (only applied when email is set, default is `true`. Note `bin/manage_users` might help you if registration is `false`.) |
+
+### Dropbox Login
+### Facebook Login
+### GitHub Login
+### GitLab Login
+### Google Login
+### LDAP Login
+### Mattermost Login
+### OAuth2 Login
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `oauth2` | `{baseURL: ..., userProfileURL: ..., userProfileUsernameAttr: ..., userProfileDisplayNameAttr: ..., userProfileEmailAttr: ..., tokenURL: ..., authorizationURL: ..., clientID: ..., clientSecret: ...}` | An object detailing your OAuth2 provider. Refer to the [Mattermost](guides/auth/mattermost-self-hosted.md) or [Nextcloud](guides/auth/nextcloud.md) examples for more details!|
+
+### SAML Login
+### Twitter Login
+
+
+## Upload Storage
+
+Most of these have never been documented for the config.json, feel free to expand these
+
+
+### Amazon S3
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `s3` | `{ "accessKeyId": "YOUR_S3_ACCESS_KEY_ID", "secretAccessKey": "YOUR_S3_ACCESS_KEY", "region": "YOUR_S3_REGION" }` | When `imageuploadtype` be set to `s3`, you would also need to setup this key, check our [S3 Image Upload Guide](guides/s3-image-upload.md) |
+| `s3bucket` | `YOUR_S3_BUCKET_NAME` | bucket name when `imageUploadType` is set to `s3` or `minio` |
+
+### Azure Blob Storage
+### imgur
+### Minio
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+| `minio` | `{ "accessKey": "YOUR_MINIO_ACCESS_KEY", "secretKey": "YOUR_MINIO_SECRET_KEY", "endpoint": "YOUR_MINIO_HOST", port: 9000, secure: true }` | When `imageUploadType` is set to `minio`, you need to set this key. Also check out our [Minio Image Upload Guide](guides/minio-image-upload.md) |
+
+### Lutim
+
+| variables | example values | description |
+| --------- | ------ | ----------- |
+|`lutim`| `{"url": "YOUR_LUTIM_URL"}`| When `imageUploadType` is set to `lutim`, you can setup the lutim url|
+
+<sup>1</sup>: relative paths are based on CodiMD's base directory
diff --git a/docs/configuration-env-vars.md b/docs/configuration-env-vars.md
new file mode 100644
index 00000000..bc0eac99
--- /dev/null
+++ b/docs/configuration-env-vars.md
@@ -0,0 +1,256 @@
+Configuration Using Environment variables
+===
+
+You can choose to configure CodiMD with either a
+[config file](configuration-config-file.md) or with environment variables.
+Environment variables are processed in
+[`lib/config/environment.js`](../lib/config/environment.js) - so this is the first
+place to look if anything is missing not obvious from this document. The
+default values are defined in [`lib/config/default.js`](../lib/config/default.js),
+in case you wonder if you even need to override it.
+
+Environment variables take precedence over configurations from the config files.
+They generally start with `CMD_` for our own options, but we also list
+node-specific options you can configure this way.
+
+
+## Node.JS
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `NODE_ENV` | `production` or `development` | set current environment (will apply corresponding settings in the `config.json`) |
+| `DEBUG` | `true` or `false` | set debug mode; show more logs |
+
+
+## CodiMD basics
+
+defaultNotePath can't be set from env-vars
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_ALLOW_PDF_EXPORT` | `true` or `false` | Enable or disable PDF exports |
+| `CMD_CONFIG_FILE` | `/path/to/config.json` | optional override for the path to CodiMD's config file |
+| `CMD_DB_URL` | `mysql://localhost:3306/database` | set the database URL |
+| `CMD_LOGLEVEL` | `info`, `debug` ... | Defines what kind of logs are provided to stdout. |
+| `CMD_FORBIDDEN_NOTE_IDS` | `'robots.txt'` | disallow creation of notes, even if `CMD_ALLOW_FREEURL` is `true` |
+| `CMD_IMAGE_UPLOAD_TYPE` | `imgur`, `s3`, `minio`, `lutim` or `filesystem` | Where to upload images. For S3, see our Image Upload Guides for [S3](guides/s3-image-upload.md) or [Minio](guides/minio-image-upload.md), also there's a whole section on their respective env vars below. |
+| `CMD_SOURCE_URL` | `https://github.com/codimd/server/tree/<current commit>` | Provides the link to the source code of CodiMD on the entry page (Please, make sure you change this when you run a modified version) |
+| `CMD_TOOBUSY_LAG` | `70` | CPU time for one eventloop tick until node throttles connections. (milliseconds) |
+
+
+## CodiMD Location
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_DOMAIN` | `codimd.org` | domain name |
+| `CMD_URL_PATH` | `codimd` | If CodiMD is run from a subdirectory like `www.example.com/<urlpath>` |
+| `CMD_HOST` | `localhost` | interface/ip to listen on |
+| `CMD_PORT` | `80` | port to listen on |
+| `CMD_PATH` | `/var/run/codimd.sock` | path to UNIX domain socket to listen on (if specified, `CMD_HOST` and `CMD_PORT` are ignored) |
+| `CMD_PROTOCOL_USESSL` | `true` or `false` | set to use SSL protocol for resources path (only applied when domain is set) |
+| `CMD_URL_ADDPORT` | `true` or `false` | set to add port on callback URL (ports `80` or `443` won't be applied) (only applied when domain is set) |
+| `CMD_ALLOW_ORIGIN` | `localhost, codimd.org` | domain name whitelist (use comma to separate) |
+
+
+## CSP and HSTS
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_CSP_ENABLE` | `true` | whether to enable Content Security Policy (directives cannot be configured with environment variables) |
+| `CMD_CSP_REPORTURI` | `https://<someid>.report-uri.com/r/d/csp/enforce` | Allows to add a URL for CSP reports in case of violations |
+| `CMD_HSTS_ENABLE` | ` true` | set to enable [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) if HTTPS is also enabled (default is ` true`) |
+| `CMD_HSTS_INCLUDE_SUBDOMAINS` | `true` | set to include subdomains in HSTS (default is `true`) |
+| `CMD_HSTS_MAX_AGE` | `31536000` | max duration in seconds to tell clients to keep HSTS status (default is a year) |
+| `CMD_HSTS_PRELOAD` | `true` | whether to allow preloading of the site's HSTS status (e.g. into browsers) |
+
+
+## Privacy and External Requests
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_ALLOW_GRAVATAR` | `true` or `false` | set to `false` to disable gravatar as profile picture source on your instance |
+| `CMD_USECDN` | `true` or `false` | set to use CDN resources or not|
+
+
+## Users and Privileges
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_ALLOW_ANONYMOUS` | `true` or `false` | set to allow anonymous usage (default is `true`) |
+| `CMD_ALLOW_ANONYMOUS_EDITS` | `true` or `false` | if `allowAnonymous` is `true`, allow users to select `freely` permission, allowing guests to edit existing notes (default is `false`) |
+| `CMD_ALLOW_FREEURL` | `true` or `false` | set to allow new note creation by accessing a nonexistent note URL |
+| `CMD_DEFAULT_PERMISSION` | `freely`, `editable`, `limited`, `locked` or `private` | set notes default permission (only applied on signed users) |
+| `CMD_SESSION_LIFE` | `1209600000` | Session life time. (milliseconds) |
+| `CMD_SESSION_SECRET` | no example | Secret used to sign the session cookie. If none is set, one will randomly generated on each startup, meaning all your users will be logged out. |
+
+
+## Login methods
+
+### Email (local account)
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_EMAIL` | `true` or `false` | set to allow email signin |
+| `CMD_ALLOW_EMAIL_REGISTER` | `true` or `false` | set to allow email register (only applied when email is set, default is `true`. Note `bin/manage_users` might help you if registration is `false`.) |
+
+
+### Dropbox Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_DROPBOX_CLIENTID` | no example | Dropbox API client id |
+| `CMD_DROPBOX_CLIENTSECRET` | no example | Dropbox API client secret |
+
+
+### Facebook Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_FACEBOOK_CLIENTID` | no example | Facebook API client id |
+| `CMD_FACEBOOK_CLIENTSECRET` | no example | Facebook API client secret |
+
+
+### GitHub Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_GITHUB_CLIENTID` | no example | GitHub API client id |
+| `CMD_GITHUB_CLIENTSECRET` | no example | GitHub API client secret |
+
+
+### GitLab Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_GITLAB_SCOPE` | `read_user` or `api` | GitLab API requested scope (default is `api`) (GitLab snippet import/export need `api` scope) |
+| `CMD_GITLAB_BASEURL` | no example | GitLab authentication endpoint, set to use other endpoint than GitLab.com (optional) |
+| `CMD_GITLAB_CLIENTID` | no example | GitLab API client id |
+| `CMD_GITLAB_CLIENTSECRET` | no example | GitLab API client secret |
+| `CMD_GITLAB_VERSION` | no example | GitLab API version (v3 or v4) |
+
+
+### Google Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_GOOGLE_CLIENTID` | no example | Google API client id |
+| `CMD_GOOGLE_CLIENTSECRET` | no example | Google API client secret |
+
+
+### LDAP Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_LDAP_URL` | `ldap://example.com` | URL of LDAP server |
+| `CMD_LDAP_BINDDN` | no example | bindDn for LDAP access |
+| `CMD_LDAP_BINDCREDENTIALS` | no example | bindCredentials for LDAP access |
+| `CMD_LDAP_SEARCHBASE` | `o=users,dc=example,dc=com` | LDAP directory to begin search from |
+| `CMD_LDAP_SEARCHFILTER` | `(uid={{username}})` | LDAP filter to search with |
+| `CMD_LDAP_SEARCHATTRIBUTES` | `displayName, mail` | LDAP attributes to search with (use comma to separate) |
+| `CMD_LDAP_USERIDFIELD` | `uidNumber` or `uid` or `sAMAccountName` | The LDAP field which is used uniquely identify a user on CodiMD |
+| `CMD_LDAP_USERNAMEFIELD` | Fallback to userid | The LDAP field which is used as the username on CodiMD |
+| `CMD_LDAP_TLS_CA` | `server-cert.pem, root.pem` | Root CA for LDAP TLS in PEM format (use comma to separate) |
+| `CMD_LDAP_PROVIDERNAME` | `My institution` | Optional name to be displayed at login form indicating the LDAP provider |
+
+
+### Mattermost Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_MATTERMOST_BASEURL` | no example | Mattermost authentication endpoint for versions below 5.0. For Mattermost version 5.0 and above, see [guide](guides/auth/mattermost-self-hosted.md). |
+| `CMD_MATTERMOST_CLIENTID` | no example | Mattermost API client id |
+| `CMD_MATTERMOST_CLIENTSECRET` | no example | Mattermost API client secret |
+
+
+### OAuth2 Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_OAUTH2_USER_PROFILE_URL` | `https://example.com` | where retrieve information about a user after succesful login. Needs to output JSON. (no default value) Refer to the [Mattermost](guides/auth/mattermost-self-hosted.md) or [Nextcloud](guides/auth/nextcloud.md) examples for more details on all of the `CMD_OAUTH2...` options. |
+| `CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR` | `name` | where to find the username in the JSON from the user profile URL. (no default value)|
+| `CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR` | `display-name` | where to find the display-name in the JSON from the user profile URL. (no default value) |
+| `CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR` | `email` | where to find the email address in the JSON from the user profile URL. (no default value) |
+| `CMD_OAUTH2_TOKEN_URL` | `https://example.com` | sometimes called token endpoint, please refer to the documentation of your OAuth2 provider (no default value) |
+| `CMD_OAUTH2_AUTHORIZATION_URL` | `https://example.com` | authorization URL of your provider, please refer to the documentation of your OAuth2 provider (no default value) |
+| `CMD_OAUTH2_CLIENT_ID` | `afae02fckafd...` | you will get this from your OAuth2 provider when you register CodiMD as OAuth2-client, (no default value) |
+| `CMD_OAUTH2_CLIENT_SECRET` | `afae02fckafd...` | you will get this from your OAuth2 provider when you register CodiMD as OAuth2-client, (no default value) |
+| `CMD_OAUTH2_PROVIDERNAME` | `My institution` | Optional name to be displayed at login form indicating the oAuth2 provider |
+
+
+### SAML Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_SAML_IDPSSOURL` | `https://idp.example.com/sso` | authentication endpoint of IdP. for details, see [guide](guides/auth/saml-onelogin.md). |
+| `CMD_SAML_IDPCERT` | `/path/to/cert.pem` | certificate file path of IdP in PEM format |
+| `CMD_SAML_ISSUER` | no example | identity of the service provider (optional, default: serverurl)" |
+| `CMD_SAML_DISABLEREQUESTEDAUTHNCONTEXT` | `true` or `false` | true to allow any authentication method, false restricts to password authentication (PasswordProtectedTransport) method (default: false) |
+| `CMD_SAML_IDENTIFIERFORMAT` | no example | name identifier format (optional, default: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`) |
+| `CMD_SAML_GROUPATTRIBUTE` | `memberOf` | attribute name for group list (optional) |
+| `CMD_SAML_REQUIREDGROUPS` | `codimd-users` | group names that allowed (use vertical bar to separate) (optional) |
+| `CMD_SAML_EXTERNALGROUPS` | `Temporary-staff` | group names that not allowed (use vertical bar to separate) (optional) |
+| `CMD_SAML_ATTRIBUTE_ID` | `sAMAccountName` | attribute map for `id` (optional, default: NameID of SAML response) |
+| `CMD_SAML_ATTRIBUTE_USERNAME` | `mailNickname` | attribute map for `username` (optional, default: NameID of SAML response) |
+| `CMD_SAML_ATTRIBUTE_EMAIL` | `mail` | attribute map for `email` (optional, default: NameID of SAML response if `CMD_SAML_IDENTIFIERFORMAT` is default) |
+
+
+### Twitter Login
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_TWITTER_CONSUMERKEY` | no example | Twitter API consumer key |
+| `CMD_TWITTER_CONSUMERSECRET` | no example | Twitter API consumer secret |
+
+
+## Upload Storage
+
+These are only relevant when they are also configured in sync with their
+`CMD_IMAGE_UPLOAD_TYPE`. Also keep in mind, that `filesystem` is available, so
+you don't have to use either of these.
+
+
+### Amazon S3
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_S3_ACCESS_KEY_ID` | no example | AWS access key id |
+| `CMD_S3_SECRET_ACCESS_KEY` | no example | AWS secret key |
+| `CMD_S3_REGION` | `ap-northeast-1` | AWS S3 region |
+| `CMD_S3_BUCKET` | no example | AWS S3 bucket name |
+
+
+### Azure Blob Storage
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_AZURE_CONNECTION_STRING` | no example | Azure Blob Storage connection string |
+| `CMD_AZURE_CONTAINER` | no example | Azure Blob Storage container name (automatically created if non existent) |
+
+
+### imgur
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_IMGUR_CLIENTID` | no example | Imgur API client id |
+
+
+### Minio
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_MINIO_ACCESS_KEY` | no example | Minio access key |
+| `CMD_MINIO_SECRET_KEY` | no example | Minio secret key |
+| `CMD_MINIO_ENDPOINT` | `minio.example.org` | Address of your Minio endpoint/instance |
+| `CMD_MINIO_PORT` | `9000` | Port that is used for your Minio instance |
+| `CMD_MINIO_SECURE` | `true` | If set to `true` HTTPS is used for Minio |
+
+
+### Lutim
+
+| variable | example value | description |
+| -------- | ------------- | ----------- |
+| `CMD_LUTIM_URL` | `https://framapic.org/` | When `CMD_IMAGE_UPLOAD_TYPE` is set to `lutim`, you can setup the lutim url |
+
+**Note:** *Due to the rename process we renamed all `HMD_`-prefix variables to be `CMD_`-prefixed. The old ones continue to work.*
+
+**Note:** *relative paths are based on CodiMD's base directory*
diff --git a/docs/dev/getting-started.md b/docs/dev/getting-started.md
new file mode 100644
index 00000000..07524971
--- /dev/null
+++ b/docs/dev/getting-started.md
@@ -0,0 +1,57 @@
+Developer Notes
+===
+
+## Preparing for running the code
+
+**Notice:** *There's [specialised instructions for docker](../setup/docker.md) or [heroku](../setup/heroku.md), if you prefer running code this way!*
+
+1. Clone the repository with `git clone https://github.com/codimd/server.git codimd-server`
+ (cloning is the preferred way, but you can also download and unzip a release)
+2. Enter the directory and run `bin/setup`, which will install npm dependencies
+ and create configs. The setup script is written in Bash, you would need bash
+ as a prerequisite.
+3. Setup the [config file](../configuration-config-file.md) or set up
+ [environment variables](../configuration-env-vars.md).
+
+
+## Running the Code
+
+Now that everything is in place, we can start CodiMD:
+
+4. `npm run build` will build the frontend bundle. It uses webpack to do that.
+5. Run the server with `node app.js`
+
+
+## Running the Code with Auto-Reload
+
+The commands above are fine for production, but you're a developer and surely
+you want to change things. You would need to restart both commands whenever you
+change something. Luckily, you can run these commands that will automatically
+rebuild the frontend or restart the server if necessary.
+
+The commands will stay active in your terminal, so you will need multiple tabs
+to run both at the same time.
+
+4. Use `npm run dev` if you want webpack to continuously rebuild the frontend
+ code.
+5. To auto-reload the server, the easiest method is to install [nodemon](https://www.npmjs.com/package/nodemon)
+ and run `nodemon --watch app.js --watch lib --watch locales app.js`.
+
+
+## Structure
+
+The repository contains two parts: a server (backend) and a client (frontend).
+most of the server code is in `/lib` and most of the client code is in `public`.
+
+```text
+codimd-server/
+├── docs/ --- documentation
+├── lib/ --- server code
+├── test/ --- test suite
+└── public/ --- client code
+ ├── css/ --- css styles
+ ├── docs/ --- default documents
+ ├── js/ --- js scripts
+ ├── vendor/ --- vendor includes
+ └── views/ --- view templates
+```
diff --git a/docs/dev/ot.md b/docs/dev/ot.md
new file mode 100644
index 00000000..924be693
--- /dev/null
+++ b/docs/dev/ot.md
@@ -0,0 +1,14 @@
+Operational Transformation
+===
+
+From 0.3.2, we started supporting operational transformation.
+It makes concurrent editing safe and will not break up other users' operations.
+Additionally, now can show other clients' selections.
+
+See more at [https://operational-transformation.github.io/](https://operational-transformation.github.io/)
+
+And even more in this 2010 article series:
+
+* https://drive.googleblog.com/2010/09/whats-different-about-new-google-docs_21.html
+* https://drive.googleblog.com/2010/09/whats-different-about-new-google-docs_22.html
+* https://drive.googleblog.com/2010/09/whats-different-about-new-google-docs.html
diff --git a/docs/dev/webpack.md b/docs/dev/webpack.md
index 7b391f3a..b05fd1d3 100644
--- a/docs/dev/webpack.md
+++ b/docs/dev/webpack.md
@@ -1,4 +1,11 @@
-# Webpack Docs
+Webpack
+===
+
+Webpack is a JavaScript build system for frontend code. You can find out all
+about it on [the webpack website](https://webpack.js.org/).
+
+Here's how we're using it:
+
## `webpack.common.js`
This file contains all common definition for chunks and plugins, that are needed by the whole app.
diff --git a/docs/guides/auth/github.md b/docs/guides/auth/github.md
index d6a1095e..d16b486f 100644
--- a/docs/guides/auth/github.md
+++ b/docs/guides/auth/github.md
@@ -1,27 +1,24 @@
Authentication guide - GitHub
===
-***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
+**Note:** *This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
1. Sign-in or sign-up for a GitHub account
2. Navigate to developer settings in your GitHub account [here](https://github.com/settings/developers) and select the "OAuth Apps" tab
-3. Click on the **New OAuth App** button, to create a new OAuth App:
+3. Click on the **New OAuth App** button, to create a new OAuth App:
+ ![create-oauth-app](../../images/auth/create-oauth-app.png)
-![create-oauth-app](../images/auth/create-oauth-app.png)
+4. Fill out the new OAuth application registration form, and click **Register Application**
+ ![register-oauth-application-form](../../images/auth/register-oauth-application-form.png)
-4. Fill out the new OAuth application registration form, and click **Register Application**
+ **Note:** *The callback URL is <your-codimd-url>/auth/github/callback*
-![register-oauth-application-form](../images/auth/register-oauth-application-form.png)
-
-*Note: The callback URL is <your-hackmd-url>/auth/github/callback*
-
-5. After successfully registering the application, you'll receive the Client ID and Client Secret for the application
-
-![application-page](../images/auth/application-page.png)
+5. After successfully registering the application, you'll receive the Client ID and Client Secret for the application
+ ![application-page](../../images/auth/application-page.png)
6. Add the Client ID and Client Secret to your config.json file or pass them as environment variables
- * config.json:
- ````javascript
+ * `config.json`:
+ ```js
{
"production": {
"github": {
@@ -30,9 +27,9 @@ Authentication guide - GitHub
}
}
}
- ````
+ ```
* environment variables:
- ````
- HMD_GITHUB_CLIENTID=3747d30eaccXXXXXXXXX
- HMD_GITHUB_CLIENTSECRET=2a8e682948eee0c580XXXXXXXXXXXXXXXXXXXXXX
+ ```sh
+ CMD_GITHUB_CLIENTID=3747d30eaccXXXXXXXXX
+ CMD_GITHUB_CLIENTSECRET=2a8e682948eee0c580XXXXXXXXXXXXXXXXXXXXXX
````
diff --git a/docs/guides/auth/gitlab-self-hosted.md b/docs/guides/auth/gitlab-self-hosted.md
index 60f62616..ea1ad6bd 100644
--- a/docs/guides/auth/gitlab-self-hosted.md
+++ b/docs/guides/auth/gitlab-self-hosted.md
@@ -1,24 +1,24 @@
-# GitLab (self-hosted)
+GitLab (self-hosted)
===
-***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
+**Note:** *This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
1. Sign in to your GitLab
2. Navigate to the application management page at `https://your.gitlab.domain/admin/applications` (admin permissions required)
3. Click **New application** to create a new application and fill out the registration form:
-![New GitLab application](../images/auth/gitlab-new-application.png)
+![New GitLab application](../../images/auth/gitlab-new-application.png)
4. Click **Submit**
5. In the list of applications select **HackMD**. Leave that site open to copy the application ID and secret in the next step.
-![Application: HackMD](../images/auth/gitlab-application-details.png)
+![Application: HackMD](../../images/auth/gitlab-application-details.png)
6. In the `docker-compose.yml` add the following environment variables to `app:` `environment:`
```
-- HMD_DOMAIN=your.hackmd.domain
+- HMD_DOMAIN=your.codimd.domain
- HMD_URL_ADDPORT=443
- HMD_PROTOCOL_USESSL=true
- HMD_GITLAB_BASEURL=https://your.gitlab.domain
@@ -27,6 +27,6 @@
```
7. Run `docker-compose up -d` to apply your settings.
-8. Sign in to your HackMD using your GitLab ID:
+8. Sign in to your CodiMD using your GitLab ID:
-![Sign in via GitLab](../images/auth/gitlab-sign-in.png)
+![Sign in via GitLab](../../images/auth/gitlab-sign-in.png)
diff --git a/docs/guides/auth/keycloak.md b/docs/guides/auth/keycloak.md
new file mode 100644
index 00000000..437e01bf
--- /dev/null
+++ b/docs/guides/auth/keycloak.md
@@ -0,0 +1,50 @@
+Keycloak/Red Hat SSO (self-hosted)
+===
+
+## Prerequisites
+
+This guide assumes you have run and configured Keycloak. If you'd like to meet this prerequisite quickly, it can be achieved by running a `jboss/keycloak` container and attaching it to your network. Set the environment variables KEYCLOAK_USER and `KEYCLOAK_PASSWORD`, and expose port 8080.
+
+Where HTTPS is specified throughout, use HTTP instead. You may also have to specify the exposed port, 8080.
+
+## Steps
+
+1. Sign in to the administration portal for your Keycloak instance at https://keycloak.example.com/auth/admin/master/console
+
+You may note that a separate realm is specified throughout this tutorial. It is best practice not to use the master realm, as it normally contains the realm-management client that federates access using the policies and permissions you can create.
+
+2. Navigate to the client management page at `https://keycloak.example.com/auth/admin/master/console/#/realms/your-realm/clients` (admin permissions required)
+3. Click **Create** to create a new client and fill out the registration form. You should set the Root URL to the fully qualified public URL of your CodiMD instance.
+4. Click **Save**
+5. Set the **Access Type** of the client to `confidential`. This will make your client require a client secret upon authentication.
+
+---
+
+### Additional steps to circumvent generic OAuth2 issue:
+
+1. Select Client Scopes from the sidebar, and begin to create a new client scope using the Create button.
+2. Ensure that the **Name** field is set to `id`.
+3. Create a new mapper under the Mappers tab. This should reference the User Property `id`. `Claim JSON Type` should be String and all switches below should be enabled. Save the mapper.
+4. Go to the client you set up in the previous steps using the Clients page, then choose the Client Scopes tab. Apply the scope you've created. This should mitigate errors as seen in [codimd/server#56](https://github.com/codimd/server/issues/56), as the `/userinfo` endpoint should now bring back the user's ID under the `id` key as well as `sub`.
+
+---
+
+6. In the `docker-compose.yml` add the following environment variables to `app:` `environment:`
+
+```
+CMD_OAUTH2_USER_PROFILE_URL=https://keycloak.example.com/auth/realms/your-realm/protocol/openid-connect/userinfo
+CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR=preferred_username
+CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR=name
+CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR=email
+CMD_OAUTH2_TOKEN_URL=https://keycloak.example.com/auth/realms/your-realm/protocol/openid-connect/token
+CMD_OAUTH2_AUTHORIZATION_URL=https://keycloak.example.com/auth/realms/your-realm/protocol/openid-connect/auth
+CMD_OAUTH2_CLIENT_ID=<your client ID>
+CMD_OAUTH2_CLIENT_SECRET=<your client secret, which you can find under the Credentials tab for your client>
+CMD_OAUTH2_PROVIDERNAME=Keycloak
+CMD_DOMAIN=<codimd.example.com>
+CMD_PROTOCOL_USESSL=true
+CMD_URL_ADDPORT=false
+```
+
+7. Run `docker-compose up -d` to apply your settings.
+8. Sign in to your CodiMD using your Keycloak ID
diff --git a/docs/guides/auth/ldap-AD.md b/docs/guides/auth/ldap-AD.md
index 77521db3..e74121f1 100644
--- a/docs/guides/auth/ldap-AD.md
+++ b/docs/guides/auth/ldap-AD.md
@@ -1,7 +1,6 @@
AD LDAP auth
===
-
To setup your CodiMD instance with Active Directory you need the following configs:
```
diff --git a/docs/guides/auth/mattermost-self-hosted.md b/docs/guides/auth/mattermost-self-hosted.md
index 631aabd3..d8280399 100644
--- a/docs/guides/auth/mattermost-self-hosted.md
+++ b/docs/guides/auth/mattermost-self-hosted.md
@@ -1,33 +1,29 @@
Authentication guide - Mattermost (self-hosted)
===
-*Note: The Mattermost setup portion of this document is just a quick guide. See the [official documentation](https://docs.mattermost.com/developer/oauth-2-0-applications.html) for more details.*
+**Note:** *The Mattermost setup portion of this document is just a quick guide. See the [official documentation](https://docs.mattermost.com/developer/oauth-2-0-applications.html) for more details.*
This guide uses the generic OAuth2 module for compatibility with Mattermost version 5.0 and above.
1. Sign-in with an administrator account to your Mattermost instance
-2. Make sure **OAuth 2.0 Service Provider** is enabled in the Main Menu (menu button next to your username in the top left corner) --> System Console --> Custom Integrations menu, which you can find at `https://your.mattermost.domain/admin_console/integrations/custom`
-
-![mattermost-enable-oauth2](../images/auth/mattermost-enable-oauth2.png)
+2. Make sure **OAuth 2.0 Service Provider** is enabled in the Main Menu (menu button next to your username in the top left corner) --> System Console --> Custom Integrations menu, which you can find at `https://your.mattermost.domain/admin_console/integrations/custom`
+ ![mattermost-enable-oauth2](../../images/auth/mattermost-enable-oauth2.png)
3. Navigate to the OAuth integration settings through Main Menu --> Integrations --> OAuth 2.0 Applications, at `https://your.mattermost.domain/yourteam/integrations/oauth2-apps`
-4. Click on the **Add OAuth 2.0 Application** button to add a new OAuth application
-
-![mattermost-oauth-app-add](../images/auth/mattermost-oauth-app-add.png)
+4. Click on the **Add OAuth 2.0 Application** button to add a new OAuth application
+ ![mattermost-oauth-app-add](../../images/auth/mattermost-oauth-app-add.png)
-5. Fill out the form and click **Save**
-
-![mattermost-oauth-app-form](../images/auth/mattermost-oauth-app-form.png)
+5. Fill out the form and click **Save**
+ ![mattermost-oauth-app-form](../../images/auth/mattermost-oauth-app-form.png)
*Note: The callback URL is \<your-codimd-url\>/auth/oauth2/callback*
-6. After saving the application, you'll receive the Client ID and Client Secret
-
-![mattermost-oauth-app-done](../images/auth/mattermost-oauth-app-done.png)
+6. After saving the application, you'll receive the Client ID and Client Secret
+ ![mattermost-oauth-app-done](../../images/auth/mattermost-oauth-app-done.png)
7. Add the Client ID and Client Secret to your config.json file or pass them as environment variables
- * config.json:
- ````javascript
+ * `config.json`:
+ ```javascript
{
"production": {
"oauth2": {
@@ -43,9 +39,9 @@ This guide uses the generic OAuth2 module for compatibility with Mattermost vers
}
}
}
- ````
+ ```
* environment variables:
- ````
+ ```sh
CMD_OAUTH2_BASEURL=https://your.mattermost.domain
CMD_OAUTH2_USER_PROFILE_URL=https://your.mattermost.domain/api/v4/users/me
CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR=id
@@ -55,4 +51,4 @@ This guide uses the generic OAuth2 module for compatibility with Mattermost vers
CMD_OAUTH2_AUTHORIZATION_URL=https://your.mattermost.domain/oauth/authorize
CMD_OAUTH2_CLIENT_ID=ii4p1u3jz7dXXXXXXXXXXXXXXX
CMD_OAUTH2_CLIENT_SECRET=mqzzx6fydbXXXXXXXXXXXXXXXX
- ````
+ ```
diff --git a/docs/guides/auth/nextcloud.md b/docs/guides/auth/nextcloud.md
index 108772dd..3bf86d31 100644
--- a/docs/guides/auth/nextcloud.md
+++ b/docs/guides/auth/nextcloud.md
@@ -9,15 +9,15 @@ This guide uses the generic OAuth2 module for compatibility with Nextcloud 13 an
2. Navigate to the OAuth integration settings: Profile Icon (top right) --> Settings
Then choose Security Settings from the *Administration* part of the list - Don't confuse this with Personal Security Settings, where you would change your personal password!
- At the top there's OAuth 2.0-Clients.
- ![Where to find OAuth2 in Nextcloud](../images/auth/nextcloud-oauth2-1-settings.png)
+ At the top there's OAuth 2.0-Clients.
+ ![Where to find OAuth2 in Nextcloud](../../images/auth/nextcloud-oauth2-1-settings.png)
-3. Add your CodiMD instance by giving it a *name* (perhaps CodiMD, but could be anything) and a *Redirection-URI*. The Redirection-URI will be `\<your-codimd-url\>/auth/oauth2/callback`. Click <kbd>Add</kbd>.
- ![Adding a client to Nextcloud](../images/auth/nextcloud-oauth2-2-client-add.png)
+3. Add your CodiMD instance by giving it a *name* (perhaps CodiMD, but could be anything) and a *Redirection-URI*. The Redirection-URI will be `\<your-codimd-url\>/auth/oauth2/callback`. Click <kbd>Add</kbd>.
+ ![Adding a client to Nextcloud](../../images/auth/nextcloud-oauth2-2-client-add.png)
4. You'll now see a line containing a *client identifier* and a *Secret*.
- ![Successfully added OAuth2-client](../images/auth/nextcloud-oauth2-3-clientid-secret.png)
+ ![Successfully added OAuth2-client](../../images/auth/nextcloud-oauth2-3-clientid-secret.png)
5. That's it for Nextcloud, the rest is configured in your CodiMD `config.json` or via the `CMD_` environment variables!
diff --git a/docs/guides/auth/oauth.md b/docs/guides/auth/oauth.md
new file mode 100644
index 00000000..46314e26
--- /dev/null
+++ b/docs/guides/auth/oauth.md
@@ -0,0 +1,12 @@
+# OAuth general information
+
+| service | callback URL (after the server URL) |
+| ------- | --------- |
+| facebook | `/auth/facebook/callback` |
+| twitter | `/auth/twitter/callback` |
+| github | `/auth/github/callback` |
+| gitlab | `/auth/gitlab/callback` |
+| mattermost | `/auth/mattermost/callback` |
+| dropbox | `/auth/dropbox/callback` |
+| google | `/auth/google/callback` |
+| saml | `/auth/saml/callback` |
diff --git a/docs/guides/auth/saml-onelogin.md b/docs/guides/auth/saml-onelogin.md
index 02a5ffac..785e36ba 100644
--- a/docs/guides/auth/saml-onelogin.md
+++ b/docs/guides/auth/saml-onelogin.md
@@ -1,40 +1,35 @@
Authentication guide - SAML (OneLogin)
===
-***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
+**Note:** *This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
1. Sign-in or sign-up for an OneLogin account. (available free trial for 2 weeks)
2. Go to the administration page.
-3. Select the **APPS** menu and click on the **Add Apps**.
+3. Select the **APPS** menu and click on the **Add Apps**.
+ ![onelogin-add-app](../../images/auth/onelogin-add-app.png)
-![onelogin-add-app](../images/auth/onelogin-add-app.png)
+4. Find "SAML Test Connector (SP)" for template of settings and select it.
+ ![onelogin-select-template](../../images/auth/onelogin-select-template.png)
-4. Find "SAML Test Connector (SP)" for template of settings and select it.
-
-![onelogin-select-template](../images/auth/onelogin-select-template.png)
-
-5. Edit display name and icons for OneLogin dashboard as you want, and click **SAVE**.
-
-![onelogin-edit-app-name](../images/auth/onelogin-edit-app-name.png)
+5. Edit display name and icons for OneLogin dashboard as you want, and click **SAVE**.
+ ![onelogin-edit-app-name](../../images/auth/onelogin-edit-app-name.png)
6. After that other tabs will appear, click the **Configuration**, and fill out the below items, and click **SAVE**.
- * RelayState: The base URL of your hackmd, which is issuer. (last slash is not needed)
- * ACS (Consumer) URL Validator: The callback URL of your hackmd. (serverurl + /auth/saml/callback)
+ * RelayState: The base URL of your CodiMD, which is issuer. (last slash is not needed)
+ * ACS (Consumer) URL Validator: The callback URL of your CodiMD. (serverurl + /auth/saml/callback)
* ACS (Consumer) URL: same as above.
- * Login URL: login URL(SAML requester) of your hackmd. (serverurl + /auth/saml)
-
-![onelogin-edit-sp-metadata](../images/auth/onelogin-edit-sp-metadata.png)
+ * Login URL: login URL(SAML requester) of your CopiMD. (serverurl + /auth/saml)
+ ![onelogin-edit-sp-metadata](../../images/auth/onelogin-edit-sp-metadata.png)
7. The registration is completed. Next, click **SSO** and copy or download the items below.
* X.509 Certificate: Click **View Details** and **DOWNLOAD** or copy the content of certificate ....(A)
- * SAML 2.0 Endpoint (HTTP): Copy the URL ....(B)
-
-![onelogin-copy-idp-metadata](../images/auth/onelogin-copy-idp-metadata.png)
+ * SAML 2.0 Endpoint (HTTP): Copy the URL ....(B)
+ ![onelogin-copy-idp-metadata](../../images/auth/onelogin-copy-idp-metadata.png)
-8. In your hackmd server, create IdP certificate file from (A)
+8. In your CodiMD server, create IdP certificate file from (A)
9. Add the IdP URL (B) and the Idp certificate file path to your config.json file or pass them as environment variables.
- * config.json:
- ````javascript
+ * `config.json`:
+ ```javascript
{
"production": {
"saml": {
@@ -43,12 +38,11 @@ Authentication guide - SAML (OneLogin)
}
}
}
- ````
+ ```
* environment variables
- ````
- HMD_SAML_IDPSSOURL=https://*******.onelogin.com/trust/saml2/http-post/sso/******
- HMD_SAML_IDPCERT=/path/to/idp_cert.pem
- ````
-10. Try sign-in with SAML from your hackmd sign-in button or OneLogin dashboard (like the screenshot below).
-
-![onelogin-use-dashboard](../images/auth/onelogin-use-dashboard.png)
+ ```sh
+ CMD_SAML_IDPSSOURL=https://*******.onelogin.com/trust/saml2/http-post/sso/******
+ CMD_SAML_IDPCERT=/path/to/idp_cert.pem
+ ```
+10. Try sign-in with SAML from your CodiMD sign-in button or OneLogin dashboard (like the screenshot below).
+ ![onelogin-use-dashboard](../../images/auth/onelogin-use-dashboard.png)
diff --git a/docs/guides/auth/saml.md b/docs/guides/auth/saml.md
index 97ac9d3c..3a64f5f7 100644
--- a/docs/guides/auth/saml.md
+++ b/docs/guides/auth/saml.md
@@ -1,44 +1,44 @@
Authentication guide - SAML
===
-***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
+**Note:** *This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
The basic procedure is the same as the case of OneLogin which is mentioned in [OneLogin-Guide](./saml-onelogin.md). If you want to match your IdP, you can use more configurations as below.
-* If your IdP accepts metadata XML of the service provider to ease configuraion, use this url to download metadata XML.
+* If your IdP accepts metadata XML of the service provider to ease configuration, use this url to download metadata XML.
* {{your-serverurl}}/auth/saml/metadata
- * _Note: If not accessable from IdP, download to local once and upload to IdP._
+ * _Note: If not accessible from IdP, download to local once and upload to IdP._
* Change the value of `issuer`, `identifierFormat` to match your IdP.
- * `issuer`: A unique id to identify the application to the IdP, which is the base URL of your HackMD as default
+ * `issuer`: A unique id to identify the application to the IdP, which is the base URL of your CodiMD as default
* `identifierFormat`: A format of unique id to identify the user of IdP, which is the format based on email address as default. It is recommend that you use as below.
* urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress (default)
* urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
- * config.json:
- ````javascript
+ * `config.json`:
+ ```javascript
{
"production": {
"saml": {
/* omitted */
- "issuer": "myhackmd"
+ "issuer": "mycodimd"
"identifierFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
}
}
}
- ````
+ ```
* environment variables
- ````
- HMD_SAML_ISSUER=myhackmd
- HMD_SAML_IDENTIFIERFORMAT=urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
- ````
+ ```
+ CMD_SAML_ISSUER=mycodimd
+ CMD_SAML_IDENTIFIERFORMAT=urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
+ ```
* Change mapping of attribute names to customize the displaying user name and email address to match your IdP.
* `attribute`: A dictionary to map attribute names
- * `attribute.id`: A primary key of user table for your HackMD
- * `attribute.username`: Attribute name of displaying user name on HackMD
+ * `attribute.id`: A primary key of user table for your CodiMD
+ * `attribute.username`: Attribute name of displaying user name on CodiMD
* `attribute.email`: Attribute name of email address, which will be also used for Gravatar
* _Note: Default value of all attributes is NameID of SAML response, which is email address if `identifierFormat` is default._
- * config.json:
- ````javascript
+ * `config.json`:
+ ```javascript
{
"production": {
"saml": {
@@ -51,35 +51,35 @@ The basic procedure is the same as the case of OneLogin which is mentioned in [O
}
}
}
- ````
+ ```
* environment variables
- ````
- HMD_SAML_ATTRIBUTE_ID=sAMAccountName
- HMD_SAML_ATTRIBUTE_USERNAME=nickName
- HMD_SAML_ATTRIBUTE_EMAIL=mail
- ````
+ ```sh
+ CMD_SAML_ATTRIBUTE_ID=sAMAccountName
+ CMD_SAML_ATTRIBUTE_USERNAME=nickName
+ CMD_SAML_ATTRIBUTE_EMAIL=mail
+ ```
-* If you want to controll permission by group membership, add group attribute name and required group (allowed) or external group (not allowed).
+* If you want to control permission by group membership, add group attribute name and required group (allowed) or external group (not allowed).
* `groupAttribute`: An attribute name of group membership
- * `requiredGroups`: Group names array for allowed access to HackMD. Use vertical bar to separate for environment variables.
- * `externalGroups`: Group names array for not allowed access to HackMD. Use vertical bar to separate for environment variables.
+ * `requiredGroups`: Group names array for allowed access to CodiMD. Use vertical bar to separate for environment variables.
+ * `externalGroups`: Group names array for not allowed access to CodiMD. Use vertical bar to separate for environment variables.
* _Note: Evaluates `externalGroups` first_
- * config.json:
- ````javascript
+ * `config.json`:
+ ```javascript
{
"production": {
"saml": {
/* omitted */
"groupAttribute": "memberOf",
- "requiredGroups": [ "hackmd-users", "board-members" ],
+ "requiredGroups": [ "codimd-users", "board-members" ],
"externalGroups": [ "temporary-staff" ]
}
}
}
- ````
+ ```
* environment variables
- ````
- HMD_SAML_GROUPATTRIBUTE=memberOf
- HMD_SAML_REQUIREDGROUPS=hackmd-users|board-members
- HMD_SAML_EXTERNALGROUPS=temporary-staff
- ````
+ ```sh
+ CMD_SAML_GROUPATTRIBUTE=memberOf
+ CMD_SAML_REQUIREDGROUPS=codimd-users|board-members
+ CMD_SAML_EXTERNALGROUPS=temporary-staff
+ ```
diff --git a/docs/guides/auth/twitter.md b/docs/guides/auth/twitter.md
index 1b96288f..1973515c 100644
--- a/docs/guides/auth/twitter.md
+++ b/docs/guides/auth/twitter.md
@@ -1,33 +1,29 @@
Authentication guide - Twitter
===
-***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
+**Note:** *This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
1. Sign-in or sign-up for a Twitter account
2. Go to the Twitter Application management page [here](https://apps.twitter.com/)
-3. Click on the **Create New App** button to create a new Twitter app:
+3. Click on the **Create New App** button to create a new Twitter app:
+ ![create-twitter-app](../../images/auth/create-twitter-app.png)
-![create-twitter-app](../images/auth/create-twitter-app.png)
+4. Fill out the create application form, check the developer agreement box, and click **Create Your Twitter Application**
+ ![register-twitter-application](../../images/auth/register-twitter-application.png)
-4. Fill out the create application form, check the developer agreement box, and click **Create Your Twitter Application**
+ *Note: you may have to register your phone number with Twitter to create a Twitter application*
-![register-twitter-application](../images/auth/register-twitter-application.png)
+ To do this Click your profile icon --> Settings and privacy --> Mobile --> Select Country/region --> Enter phone number --> Click Continue
-*Note: you may have to register your phone number with Twitter to create a Twitter application*
+5. After you receive confirmation that the Twitter application was created, click **Keys and Access Tokens**
+ ![twitter-app-confirmation](../../images/auth/twitter-app-confirmation.png)
-To do this Click your profile icon --> Settings and privacy --> Mobile --> Select Country/region --> Enter phone number --> Click Continue
+6. Obtain your Twitter Consumer Key and Consumer Secret
+ ![twitter-app-keys](../../images/auth/twitter-app-keys.png)
-5. After you receive confirmation that the Twitter application was created, click **Keys and Access Tokens**
-
-![twitter-app-confirmation](../images/auth/twitter-app-confirmation.png)
-
-6. Obtain your Twitter Consumer Key and Consumer Secret
-
-![twitter-app-keys](../images/auth/twitter-app-keys.png)
-
-7. Add your Consumer Key and Consumer Secret to your config.json file or pass them as environment variables:
- * config.json:
- ````javascript
+7. Add your Consumer Key and Consumer Secret to your `config.json` file or pass them as environment variables:
+ * `config.json`:
+ ```javascript
{
"production": {
"twitter": {
@@ -36,9 +32,9 @@ To do this Click your profile icon --> Settings and privacy --> Mobile --> Sele
}
}
}
- ````
+ ```
* environment variables:
- ````
- HMD_TWITTER_CONSUMERKEY=esTCJFXXXXXXXXXXXXXXXXXXX
- HMD_TWITTER_CONSUMERSECRET=zpCs4tU86pRVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- ````
+ ```sh
+ CMD_TWITTER_CONSUMERKEY=esTCJFXXXXXXXXXXXXXXXXXXX
+ CMD_TWITTER_CONSUMERSECRET=zpCs4tU86pRVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+ ```
diff --git a/docs/guides/migrate-etherpad.md b/docs/guides/migrate-etherpad.md
index c3783c89..914a240d 100644
--- a/docs/guides/migrate-etherpad.md
+++ b/docs/guides/migrate-etherpad.md
@@ -12,7 +12,7 @@ require some creativity to work properly in your case. When I wrote this guide,
[Etherpad 1.7.0] and [CodiMD 1.2.1]. Good luck!
[Etherpad 1.7.0]: https://github.com/ether/etherpad-lite/tree/1.7.0
-[CodiMD 1.2.1]: https://github.com/hackmdio/codimd/tree/1.2.1
+[CodiMD 1.2.1]: https://github.com/codimd/server/tree/1.2.1
## 0. Requirements
@@ -21,7 +21,7 @@ require some creativity to work properly in your case. When I wrote this guide,
- running CodiMD server
- [codimd-cli]
-[codimd-cli]: https://github.com/hackmdio/codimd-cli/blob/master/bin/codimd
+[codimd-cli]: https://github.com/codimd/cli/blob/master/bin/codimd
## 1. Retrieve the list of pads
@@ -56,8 +56,8 @@ configuration settings `ETHERPAD_SERVER` and `CODIMD_SERVER`.
# Description: Migrate pads from etherpad to codimd
# Author: Daan Sprenkels <hello@dsprenkels.com>
-# This script uses the codimd command line script[1] to import a list of pads from
-# [1]: https://github.com/hackmdio/codimd-cli/blob/master/bin/codimd
+# This script uses the codimd command line script[1] to import a list of pads from
+# [1]: https://github.com/codimd/cli/blob/master/bin/codimd
# The base url to where etherpad is hosted
ETHERPAD_SERVER="https://etherpad.example.com"
@@ -80,7 +80,7 @@ for PAD_NAME in $1; do
# Download the pad
PAD_FILE="$(mktemp)"
curl "$ETHERPAD_SERVER/p/$PAD_NAME/export/txt" >"$PAD_FILE"
-
+
# Import the pad into codimd
OUTPUT="$(./codimd import "$PAD_FILE")"
echo "$PAD_NAME -> $OUTPUT" >>"$REDIRECTS_FILE"
diff --git a/docs/guides/migrations-and-breaking-changes.md b/docs/guides/migrations-and-breaking-changes.md
new file mode 100644
index 00000000..ef65db1c
--- /dev/null
+++ b/docs/guides/migrations-and-breaking-changes.md
@@ -0,0 +1,56 @@
+Migrations and Notable Changes
+===
+
+## Migrating to 1.4.0
+
+We dropped support for node 6 with this version. If you have any trouble running this version, please double check that you are running at least node 8!
+
+## Migrating to 1.3.2
+
+This is not a breaking change, but to stay up to date with the community
+repository, you may need to update a few urls. This is not a breaking change.
+
+See more at [issue #10](https://github.com/codimd/server/issues/10)
+
+**Native setup using git:**
+
+Change the upstream remote using `git remote set-url origin https://github.com/codimd/server.git`.
+
+**Docker:**
+
+When you use our [container repository](https://github.com/codimd/container)
+(which was previously `codimd-container`) all you can simply run `git pull` and
+your `docker-compose.yml` will be updated.
+
+When you setup things yourself, make sure you use the new image:
+[`quay.io/codimd/server`](https://quay.io/repository/codimd/server?tab=tags).
+
+**Heroku:**
+
+All you need to do is [disconnect GitHub](https://devcenter.heroku.com/articles/github-integration#disconnecting-from-github)
+and [reconnect it](https://devcenter.heroku.com/articles/github-integration#enabling-github-integration)
+with this new repository.
+
+Or you can use our Heroku button and redeploy your instance and link the old
+database again.
+
+## Migrating to 1.1.0
+
+We deprecated the older lower case config style and moved on to camel case style. Please have a look at the current `config.json.example` and check the warnings on startup.
+
+*Notice: This is not a breaking change right now but will be in the future*
+
+## Migrating to 0.5.0
+
+[migration-to-0.5.0 migration tool](https://github.com/hackmdio/migration-to-0.5.0)
+
+We don't use LZString to compress socket.io data and DB data after version 0.5.0.
+Please run the migration tool if you're upgrading from the old version.
+
+## Migrating to 0.4.0
+
+[migration-to-0.4.0 migration tool](https://github.com/hackmdio/migration-to-0.4.0)
+
+We've dropped MongoDB after version 0.4.0.
+So here is the migration tool for you to transfer the old DB data to the new DB.
+This tool is also used for official service.
diff --git a/docs/guides/minio-image-upload.md b/docs/guides/minio-image-upload.md
index 7f5796ca..258b0d90 100644
--- a/docs/guides/minio-image-upload.md
+++ b/docs/guides/minio-image-upload.md
@@ -1,7 +1,7 @@
Minio Guide for CodiMD
===
-***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
+**Note:** *This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
1. First of all you need to setup Minio itself.
@@ -9,7 +9,7 @@ Minio Guide for CodiMD
production setup.
For checking it out and development purposes a non-persistent setup is enough:
- ```console
+ ```sh
docker run --name test-minio --rm -d -p 9000:9000 minio/minio server /data
```
@@ -18,29 +18,29 @@ Minio Guide for CodiMD
2. Next step is to get the credentials form the container:
- ```
+ ```sh
docker logs test-minio
```
- ![docker logs](images/minio-image-upload/docker-logs.png)
+ ![docker logs](../images/minio-image-upload/docker-logs.png)
3. Open http://localhost:9000 and login with the shown credentials.
- ![minio default view](images/minio-image-upload/default-view.png)
+ ![minio default view](../images/minio-image-upload/default-view.png)
-4. Create a bucket for HackMD
+4. Create a bucket for CodiMD
- ![minio create bucket](images/minio-image-upload/create-bucket.png)
+ ![minio create bucket](../images/minio-image-upload/create-bucket.png)
5. Add a policy for the prefix `uploads` and make it read-only.
- ![minio edit policy](images/minio-image-upload/open-edit-policy.png)
+ ![minio edit policy](../images/minio-image-upload/open-edit-policy.png)
*Open policy editor*
- ![minio policy adding](images/minio-image-upload/create-policy.png)
+ ![minio policy adding](../images/minio-image-upload/create-policy.png)
*Add policy for uploads*
-6. Set credentials and configs for Minio in HackMD's `config.json`
+6. Set credentials and configs for Minio in CodiMD's `config.json`
```JSON
"minio": {
@@ -58,7 +58,7 @@ Minio Guide for CodiMD
7. Set bucket name
```JSON
- "s3bucket": "hackmd"
+ "s3bucket": "codimd"
```
8. Set upload type.
@@ -79,7 +79,7 @@ Minio Guide for CodiMD
"port": 9000,
"secure": false
},
- "s3bucket": "hackmd",
+ "s3bucket": "codimd",
"imageuploadtype": "minio"
}
```
diff --git a/docs/guides/providing-terms.md b/docs/guides/providing-terms.md
index 1e580df9..73de2b37 100644
--- a/docs/guides/providing-terms.md
+++ b/docs/guides/providing-terms.md
@@ -15,3 +15,12 @@ To add a privacy policy you can use the same technique as for the terms of use.
See our example file `./public/docs/privacy.md.example` container some useful hints for writing your own privacy policy.
As with the terms of use, a link to the privacy notices will show up in the area where the release notes are provided on the index page.
+
+Setup your imprint
+===
+
+To add an imprint you can use the same technique as for the terms of use. The main difference is that the document is called `imprint.md`.
+
+It has to be provided under `./public/docs/` and will be automatically turned into a CodiMD document. It will also automatically updated as soon as you change the document on disk.
+
+As with the terms of use, a link to the imprint will show up in the area where the release notes are provided on the index page.
diff --git a/docs/guides/s3-image-upload.md b/docs/guides/s3-image-upload.md
index dc5e420d..7ca8dd12 100644
--- a/docs/guides/s3-image-upload.md
+++ b/docs/guides/s3-image-upload.md
@@ -1,18 +1,19 @@
-# Guide - Setup CodiMD S3 image upload
+Guide - Setup CodiMD S3 image upload
+===
-***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
+**Note:** *This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
1. Go to [AWS S3 console](https://console.aws.amazon.com/s3/home) and create a new bucket.
- ![create-bucket](images/s3-image-upload/create-bucket.png)
+ ![create-bucket](../images/s3-image-upload/create-bucket.png)
2. Click on bucket, select **Properties** on the side panel, and find **Permission** section. Click **Edit bucket policy**.
- ![bucket-property](images/s3-image-upload/bucket-property.png)
+ ![bucket-property](../images/s3-image-upload/bucket-property.png)
3. Enter the following policy, replace `bucket_name` with your bucket name:
- ![bucket-policy-editor](images/s3-image-upload/bucket-policy-editor.png)
+ ![bucket-policy-editor](../images/s3-image-upload/bucket-policy-editor.png)
```json
{
@@ -32,15 +33,15 @@
5. Enter user page, select **Permission** tab, look at **Inline Policies** section, and click **Create User Policy**
- ![iam-user](images/s3-image-upload/iam-user.png)
+ ![iam-user](../images/s3-image-upload/iam-user.png)
6. Select **Custom Policy**
- ![custom-policy](images/s3-image-upload/custom-policy.png)
+ ![custom-policy](../images/s3-image-upload/custom-policy.png)
7. Enter the following policy, replace `bucket_name` with your bucket name:
- ![review-policy](images/s3-image-upload/review-policy.png)
+ ![review-policy](../images/s3-image-upload/review-policy.png)
```json
{
@@ -76,7 +77,7 @@
}
```
-9. In additional to edit `config.json` directly, you could also try [environment variable](https://github.com/hackmdio/hackmd#environment-variables-will-overwrite-other-server-configs).
+9. In additional to edit `config.json` directly, you could also try [environment variables](../configuration-env-vars.md).
## Related Tools
diff --git a/docs/history.md b/docs/history.md
new file mode 100644
index 00000000..cd12a369
--- /dev/null
+++ b/docs/history.md
@@ -0,0 +1,40 @@
+History of CodiMD
+===
+
+## It started with HackMD
+
+HackMD is the origin of this project, which was mostly developed by Max Wu and
+Yukai Huang. Originally, this was open source under MIT license, but was
+[relicensed in October 2017 to be AGPLv3](https://github.com/hackmdio/codimd/pull/578).
+At the same time, [hackmd.io](https://hackmd.io) was founded to offer a
+commercial version of HackMD.
+
+The AGPLv3-version was developed and released by the community, this was for a
+while referred to as "HackMD community edition".
+
+*For more on the splitting of the projects, please refer to [A note to our community (2017-10-11)](https://hackmd.io/c/community-news/https%3A%2F%2Fhackmd.io%2Fs%2Fr1_4j9_hZ).*
+
+
+## HackMD CE became CodiMD
+
+In June 2018, CodiMD was renamed from its former name "HackMD" and continued to
+be developed under AGPLv3 by the community. We decided to change the name to
+break the confusion between HackMD (enterprise offering) and CodiMD (community
+project), as people mistook it for an open core development model.
+
+*For the whole renaming story, see the [issue where the renaming was discussed](https://github.com/hackmdio/hackmd/issues/720).*
+
+
+## CodiMD went independent
+
+In March 2019, a discussion over licensing, governance and the future of CodiMD
+lead to the formation of a distinct GitHub organization. Up to that point, the
+community project resided in the organization of hackmdio but was for the most
+part self-organized.
+
+During that debate, we did not reach an agreement that would have allowed us to
+move the repository, so we simply forked it. We still welcome the HackMD team
+as part of our community, especially since a large portion of this code base
+originated with them.
+
+*For the debate that lead to this step, please refer to the [governance debate](https://github.com/hackmdio/hackmd/issues/1170) and [the announcement of the new repository](https://github.com/codimd/server/issues/10).*
diff --git a/docs/images/CodiMD-1.3.2-features.png b/docs/images/CodiMD-1.3.2-features.png
new file mode 100644
index 00000000..952efe30
--- /dev/null
+++ b/docs/images/CodiMD-1.3.2-features.png
Binary files differ
diff --git a/docs/guides/images/auth/application-page.png b/docs/images/auth/application-page.png
index a57da017..a57da017 100644
--- a/docs/guides/images/auth/application-page.png
+++ b/docs/images/auth/application-page.png
Binary files differ
diff --git a/docs/guides/images/auth/create-oauth-app.png b/docs/images/auth/create-oauth-app.png
index 07d0b511..07d0b511 100644
--- a/docs/guides/images/auth/create-oauth-app.png
+++ b/docs/images/auth/create-oauth-app.png
Binary files differ
diff --git a/docs/guides/images/auth/create-twitter-app.png b/docs/images/auth/create-twitter-app.png
index c555464e..c555464e 100644
--- a/docs/guides/images/auth/create-twitter-app.png
+++ b/docs/images/auth/create-twitter-app.png
Binary files differ
diff --git a/docs/guides/images/auth/gitlab-application-details.png b/docs/images/auth/gitlab-application-details.png
index 6e042886..6e042886 100644
--- a/docs/guides/images/auth/gitlab-application-details.png
+++ b/docs/images/auth/gitlab-application-details.png
Binary files differ
diff --git a/docs/guides/images/auth/gitlab-new-application.png b/docs/images/auth/gitlab-new-application.png
index be9e4446..be9e4446 100644
--- a/docs/guides/images/auth/gitlab-new-application.png
+++ b/docs/images/auth/gitlab-new-application.png
Binary files differ
diff --git a/docs/guides/images/auth/gitlab-sign-in.png b/docs/images/auth/gitlab-sign-in.png
index 27aaf6dd..27aaf6dd 100644
--- a/docs/guides/images/auth/gitlab-sign-in.png
+++ b/docs/images/auth/gitlab-sign-in.png
Binary files differ
diff --git a/docs/guides/images/auth/mattermost-enable-oauth2.png b/docs/images/auth/mattermost-enable-oauth2.png
index af5cdbe2..af5cdbe2 100644
--- a/docs/guides/images/auth/mattermost-enable-oauth2.png
+++ b/docs/images/auth/mattermost-enable-oauth2.png
Binary files differ
diff --git a/docs/guides/images/auth/mattermost-oauth-app-add.png b/docs/images/auth/mattermost-oauth-app-add.png
index 4a8cdfa7..4a8cdfa7 100644
--- a/docs/guides/images/auth/mattermost-oauth-app-add.png
+++ b/docs/images/auth/mattermost-oauth-app-add.png
Binary files differ
diff --git a/docs/guides/images/auth/mattermost-oauth-app-done.png b/docs/images/auth/mattermost-oauth-app-done.png
index fcf1beaf..fcf1beaf 100644
--- a/docs/guides/images/auth/mattermost-oauth-app-done.png
+++ b/docs/images/auth/mattermost-oauth-app-done.png
Binary files differ
diff --git a/docs/guides/images/auth/mattermost-oauth-app-form.png b/docs/images/auth/mattermost-oauth-app-form.png
index 215947bf..215947bf 100644
--- a/docs/guides/images/auth/mattermost-oauth-app-form.png
+++ b/docs/images/auth/mattermost-oauth-app-form.png
Binary files differ
diff --git a/docs/guides/images/auth/nextcloud-oauth2-1-settings.png b/docs/images/auth/nextcloud-oauth2-1-settings.png
index 82652a54..82652a54 100644
--- a/docs/guides/images/auth/nextcloud-oauth2-1-settings.png
+++ b/docs/images/auth/nextcloud-oauth2-1-settings.png
Binary files differ
diff --git a/docs/guides/images/auth/nextcloud-oauth2-2-client-add.png b/docs/images/auth/nextcloud-oauth2-2-client-add.png
index 7909fa62..7909fa62 100644
--- a/docs/guides/images/auth/nextcloud-oauth2-2-client-add.png
+++ b/docs/images/auth/nextcloud-oauth2-2-client-add.png
Binary files differ
diff --git a/docs/guides/images/auth/nextcloud-oauth2-3-clientid-secret.png b/docs/images/auth/nextcloud-oauth2-3-clientid-secret.png
index b05513d1..b05513d1 100644
--- a/docs/guides/images/auth/nextcloud-oauth2-3-clientid-secret.png
+++ b/docs/images/auth/nextcloud-oauth2-3-clientid-secret.png
Binary files differ
diff --git a/docs/guides/images/auth/onelogin-add-app.png b/docs/images/auth/onelogin-add-app.png
index 356bb852..356bb852 100644
--- a/docs/guides/images/auth/onelogin-add-app.png
+++ b/docs/images/auth/onelogin-add-app.png
Binary files differ
diff --git a/docs/guides/images/auth/onelogin-copy-idp-metadata.png b/docs/images/auth/onelogin-copy-idp-metadata.png
index 7185f537..7185f537 100644
--- a/docs/guides/images/auth/onelogin-copy-idp-metadata.png
+++ b/docs/images/auth/onelogin-copy-idp-metadata.png
Binary files differ
diff --git a/docs/guides/images/auth/onelogin-edit-app-name.png b/docs/images/auth/onelogin-edit-app-name.png
index 634d1916..634d1916 100644
--- a/docs/guides/images/auth/onelogin-edit-app-name.png
+++ b/docs/images/auth/onelogin-edit-app-name.png
Binary files differ
diff --git a/docs/guides/images/auth/onelogin-edit-sp-metadata.png b/docs/images/auth/onelogin-edit-sp-metadata.png
index 111580b1..111580b1 100644
--- a/docs/guides/images/auth/onelogin-edit-sp-metadata.png
+++ b/docs/images/auth/onelogin-edit-sp-metadata.png
Binary files differ
diff --git a/docs/guides/images/auth/onelogin-select-template.png b/docs/images/auth/onelogin-select-template.png
index 13401816..13401816 100644
--- a/docs/guides/images/auth/onelogin-select-template.png
+++ b/docs/images/auth/onelogin-select-template.png
Binary files differ
diff --git a/docs/guides/images/auth/onelogin-use-dashboard.png b/docs/images/auth/onelogin-use-dashboard.png
index ea9038ff..ea9038ff 100644
--- a/docs/guides/images/auth/onelogin-use-dashboard.png
+++ b/docs/images/auth/onelogin-use-dashboard.png
Binary files differ
diff --git a/docs/guides/images/auth/register-oauth-application-form.png b/docs/images/auth/register-oauth-application-form.png
index bd27fd70..bd27fd70 100644
--- a/docs/guides/images/auth/register-oauth-application-form.png
+++ b/docs/images/auth/register-oauth-application-form.png
Binary files differ
diff --git a/docs/guides/images/auth/register-twitter-application.png b/docs/images/auth/register-twitter-application.png
index 442eb680..442eb680 100644
--- a/docs/guides/images/auth/register-twitter-application.png
+++ b/docs/images/auth/register-twitter-application.png
Binary files differ
diff --git a/docs/guides/images/auth/twitter-app-confirmation.png b/docs/images/auth/twitter-app-confirmation.png
index e24e9d56..e24e9d56 100644
--- a/docs/guides/images/auth/twitter-app-confirmation.png
+++ b/docs/images/auth/twitter-app-confirmation.png
Binary files differ
diff --git a/docs/guides/images/auth/twitter-app-keys.png b/docs/images/auth/twitter-app-keys.png
index e13be110..e13be110 100644
--- a/docs/guides/images/auth/twitter-app-keys.png
+++ b/docs/images/auth/twitter-app-keys.png
Binary files differ
diff --git a/docs/guides/images/minio-image-upload/create-bucket.png b/docs/images/minio-image-upload/create-bucket.png
index ccfb6715..ccfb6715 100644
--- a/docs/guides/images/minio-image-upload/create-bucket.png
+++ b/docs/images/minio-image-upload/create-bucket.png
Binary files differ
diff --git a/docs/guides/images/minio-image-upload/create-policy.png b/docs/images/minio-image-upload/create-policy.png
index f9cbd3bf..f9cbd3bf 100644
--- a/docs/guides/images/minio-image-upload/create-policy.png
+++ b/docs/images/minio-image-upload/create-policy.png
Binary files differ
diff --git a/docs/guides/images/minio-image-upload/default-view.png b/docs/images/minio-image-upload/default-view.png
index fadb50a4..fadb50a4 100644
--- a/docs/guides/images/minio-image-upload/default-view.png
+++ b/docs/images/minio-image-upload/default-view.png
Binary files differ
diff --git a/docs/guides/images/minio-image-upload/docker-logs.png b/docs/images/minio-image-upload/docker-logs.png
index a25f349a..a25f349a 100644
--- a/docs/guides/images/minio-image-upload/docker-logs.png
+++ b/docs/images/minio-image-upload/docker-logs.png
Binary files differ
diff --git a/docs/guides/images/minio-image-upload/open-edit-policy.png b/docs/images/minio-image-upload/open-edit-policy.png
index 1dac7bea..1dac7bea 100644
--- a/docs/guides/images/minio-image-upload/open-edit-policy.png
+++ b/docs/images/minio-image-upload/open-edit-policy.png
Binary files differ
diff --git a/docs/guides/images/s3-image-upload/bucket-policy-editor.png b/docs/images/s3-image-upload/bucket-policy-editor.png
index d5f4427f..d5f4427f 100644
--- a/docs/guides/images/s3-image-upload/bucket-policy-editor.png
+++ b/docs/images/s3-image-upload/bucket-policy-editor.png
Binary files differ
diff --git a/docs/guides/images/s3-image-upload/bucket-property.png b/docs/images/s3-image-upload/bucket-property.png
index 9f4dc828..9f4dc828 100644
--- a/docs/guides/images/s3-image-upload/bucket-property.png
+++ b/docs/images/s3-image-upload/bucket-property.png
Binary files differ
diff --git a/docs/guides/images/s3-image-upload/create-bucket.png b/docs/images/s3-image-upload/create-bucket.png
index 925f0926..925f0926 100644
--- a/docs/guides/images/s3-image-upload/create-bucket.png
+++ b/docs/images/s3-image-upload/create-bucket.png
Binary files differ
diff --git a/docs/guides/images/s3-image-upload/custom-policy.png b/docs/images/s3-image-upload/custom-policy.png
index 01c570cd..01c570cd 100644
--- a/docs/guides/images/s3-image-upload/custom-policy.png
+++ b/docs/images/s3-image-upload/custom-policy.png
Binary files differ
diff --git a/docs/guides/images/s3-image-upload/iam-user.png b/docs/images/s3-image-upload/iam-user.png
index b26be122..b26be122 100644
--- a/docs/guides/images/s3-image-upload/iam-user.png
+++ b/docs/images/s3-image-upload/iam-user.png
Binary files differ
diff --git a/docs/guides/images/s3-image-upload/review-policy.png b/docs/images/s3-image-upload/review-policy.png
index 7173788a..7173788a 100644
--- a/docs/guides/images/s3-image-upload/review-policy.png
+++ b/docs/images/s3-image-upload/review-policy.png
Binary files differ
diff --git a/docs/legal/developer-certificate-of-origin.txt b/docs/legal/developer-certificate-of-origin.txt
new file mode 100644
index 00000000..a6bbb984
--- /dev/null
+++ b/docs/legal/developer-certificate-of-origin.txt
@@ -0,0 +1,35 @@
+Developer Certificate of Origin
+Version 1.1
+
+Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
+660 York Street, Suite 102,
+San Francisco, CA 94110 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+(a) The contribution was created in whole or in part by me and I
+ have the right to submit it under the open source license
+ indicated in the file; or
+
+(b) The contribution is based upon previous work that, to the best
+ of my knowledge, is covered under an appropriate open source
+ license and I have the right under that license to submit that
+ work with modifications, whether created in whole or in part
+ by me, under the same open source license (unless I am
+ permitted to submit under a different license), as indicated
+ in the file; or
+
+(c) The contribution was provided directly to me by some other
+ person who certified (a), (b) or (c) and I have not modified
+ it.
+
+(d) I understand and agree that this project and the contribution
+ are public and that a record of the contribution (including all
+ personal information I submit with it, including my sign-off) is
+ maintained indefinitely and may be redistributed consistent with
+ this project or the open source license(s) involved.
diff --git a/docs/setup/cloudron.md b/docs/setup/cloudron.md
new file mode 100644
index 00000000..aa707dc4
--- /dev/null
+++ b/docs/setup/cloudron.md
@@ -0,0 +1,6 @@
+Cloudron
+===
+
+Install CodiMD on [Cloudron](https://cloudron.io):
+
+[![Install](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=io.hackmd.cloudronapp)
diff --git a/docs/setup/docker-linuxserver.md b/docs/setup/docker-linuxserver.md
new file mode 100644
index 00000000..f99176e8
--- /dev/null
+++ b/docs/setup/docker-linuxserver.md
@@ -0,0 +1,14 @@
+LinuxServer.io CodiMD Image
+===
+[![LinuxServer.io Discord](https://img.shields.io/discord/354974912613449730.svg?logo=discord&label=LSIO%20Discord&style=flat-square)](https://discord.gg/YWrKVTn)[![container version badge](https://images.microbadger.com/badges/version/linuxserver/codimd.svg)](https://microbadger.com/images/linuxserver/codimd "Get your own version badge on microbadger.com")[![container image size badge](https://images.microbadger.com/badges/image/linuxserver/codimd.svg)](https://microbadger.com/images/linuxserver/codimd "Get your own version badge on microbadger.com")![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/codimd.svg)![Docker Stars](https://img.shields.io/docker/stars/linuxserver/codimd.svg)[![Build Status](https://ci.linuxserver.io/buildStatus/icon?job=Docker-Pipeline-Builders/docker-codimd/master)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-codimd/job/master/)[![LinuxServer.io CI summary](https://lsio-ci.ams3.digitaloceanspaces.com/linuxserver/codimd/latest/badge.svg)](https://lsio-ci.ams3.digitaloceanspaces.com/linuxserver/codimd/latest/index.html)
+
+[LinuxServer.io](https://linuxserver.io) have created an Ubuntu-based multi-arch container image for x86-64, arm64 and armhf which supports PDF export from all architectures using [PhantomJS](https://phantomjs.org/).
+
+- It supports all the environment variables detailed in the [configuration documentation](../configuration-env-vars.md) to modify it according to your needs.
+
+- It gets rebuilt on new releases from CodiMD and also weekly if necessary to update any other package changes in the underlying container, making it easy to keep your CodiMD instance up to date.
+
+- It also details how to easily [utilize Docker networking to reverse proxy](https://github.com/linuxserver/docker-codimd/#application-setup) CodiMD using their [LetsEncrypt docker image](https://github.com/linuxserver/docker-letsencrypt)
+
+In order to contribute check the LinuxServer.io [GitHub repository](https://github.com/linuxserver/docker-codimd/) for CodiMD.
+And to find all tags and versions of the image, check the [Docker Hub repository](https://hub.docker.com/r/linuxserver/codimd).
diff --git a/docs/setup/docker.md b/docs/setup/docker.md
new file mode 100644
index 00000000..0268727c
--- /dev/null
+++ b/docs/setup/docker.md
@@ -0,0 +1,23 @@
+CodiMD Docker Image
+===
+
+[![Try in PWD](https://cdn.rawgit.com/play-with-docker/stacks/cff22438/assets/images/button.png)](http://play-with-docker.com?stack=https://github.com/codimd/container/raw/master/docker-compose.yml&stack_name=codimd)
+
+
+**Debian-based version:**
+
+[![Docker Repository on Quay](https://quay.io/repository/codimd/server/status "Docker Repository on Quay")](https://quay.io/repository/codimd/server)
+
+
+**Alpine-based version:**
+
+[![Docker Repository on Quay](https://quay.io/repository/codimd/server/status "Docker Repository on Quay")](https://quay.io/repository/codimd/server)
+
+The easiest way to setup CodiMD using docker are using the following three commands:
+
+```sh
+git clone https://github.com/codimd/container.git codimd-container
+cd codimd-container
+docker-compose up
+```
+Read more about it in the [container repository](https://github.com/codimd/container).
diff --git a/docs/setup/heroku.md b/docs/setup/heroku.md
new file mode 100644
index 00000000..9dc3bb3a
--- /dev/null
+++ b/docs/setup/heroku.md
@@ -0,0 +1,7 @@
+Heroku Deployment
+===
+
+You can quickly setup a sample Heroku CodiMD application by clicking the button
+below.
+
+[![Deploy on Heroku](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/codimd/server/tree/master)
diff --git a/docs/setup/kubernetes.md b/docs/setup/kubernetes.md
new file mode 100644
index 00000000..db596851
--- /dev/null
+++ b/docs/setup/kubernetes.md
@@ -0,0 +1,6 @@
+Kubernetes
+===
+
+To install use `helm install stable/hackmd`.
+
+For all further details, please check out the offical CodiMD [K8s helm chart](https://github.com/kubernetes/charts/tree/master/stable/hackmd).
diff --git a/docs/setup/manual-setup.md b/docs/setup/manual-setup.md
new file mode 100644
index 00000000..e15e624a
--- /dev/null
+++ b/docs/setup/manual-setup.md
@@ -0,0 +1,39 @@
+Manual Installation
+===
+
+## Requirements on your server
+
+- Node.js 8.5 or up
+- Database (PostgreSQL, MySQL, MariaDB, SQLite, MSSQL) use charset `utf8`
+- npm (and its dependencies, [node-gyp](https://github.com/nodejs/node-gyp#installation))
+- yarn
+- Bash (for the setup script)
+- For **building** CodiMD we recommend to use a machine with at least **2GB** RAM
+
+
+## Instructions
+
+1. Check if you meet the [requirements at the top of this document](#requirements-on-your-server).
+2. Clone this repository (preferred) or download a release and unzip it.
+3. Enter the directory and type `bin/setup`, which will install npm dependencies and create configs.
+4. Setup the configs, see more below
+5. Setup environment variables which will overwrite the configs
+6. Build front-end bundle by `npm run build` (use `npm run dev` if you are in development)
+7. Modify the file named `.sequelizerc`, change the value of the variable `url` with your db connection string
+ For example: `postgres://username:password@localhost:5432/codimd`
+8. It is recommended to start your server manually once: `npm start --production`, this way it's easier to see warnings or errors that might occur (leave out `--production` for development).
+9. Run the server as you like (node, forever, pm2, SystemD, Init-Scripts)
+
+
+## How to upgrade your installation
+
+If you are upgrading CodiMD from an older version, follow these steps:
+
+1. Check if you meet the [requirements at the top of this document](#requirements-on-your-server).
+2. Verify which version you were running before and take a look at [migrations and breaking changes](../guides/migrations-and-breaking-changes.md) to see if additional steps, or configuration changes are necessary!
+3. Fully stop your old CodiMD server.
+4. `git pull` or unzip a new release in the directory.
+5. Run `bin/setup`. This will take care of installing dependencies. It is safe to run on an existing installation.
+6. Build front-end bundle by `npm run build` (use `npm run dev` if you are in development).
+7. It is recommended to start your server manually once: `npm start --production`, this way it's easier to see warnings or errors that might occur (leave out `--production` for development).
+8. You can now restart the CodiMD server!
diff --git a/docs/slide-options.md b/docs/slide-options.md
new file mode 100644
index 00000000..d1277831
--- /dev/null
+++ b/docs/slide-options.md
@@ -0,0 +1,161 @@
+Slide Separators
+===
+
+If you're getting started with reveal.js slides, there are a few things you need to know.
+
+There are two types of slides, those that transition horizontally and those that transition vertically (subslides).
+
+The following separators are used for each in the CodiMD syntax:
+```
+# First Slide
+
+---
+
+# Next slide
+
+----
+
+## Subslide
+```
+as you can see, horizontal transitions are separated by `---` and vertical transitions by `----`
+
+## Basic YAML header
+It's possible to customise the slide options using the YAML header in the slide markdown.
+
+eg:
+```
+---
+title: Example Slide
+tags: presentation
+slideOptions:
+ theme: solarized
+ transition: 'fade'
+ # parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'
+---
+```
+make sure to have two spaces only at the start of the listed slide options.
+
+you can comment out options with a `#`
+
+### Some other options
+```
+# Display controls in the bottom right corner
+controls: true
+
+# Display a presentation progress bar
+progress: true
+
+# Set default timing of 2 minutes per slide
+defaultTiming: 120
+
+# Display the page number of the current slide
+slideNumber: false
+
+# Push each slide change to the browser history
+history: false
+
+# Enable keyboard shortcuts for navigation
+keyboard: true
+
+# Enable the slide overview mode
+overview: true
+
+# Vertical centering of slides
+center: true
+
+# Enables touch navigation on devices with touch input
+touch: true
+
+# Loop the presentation
+loop: false
+
+# Change the presentation direction to be RTL
+rtl: false
+
+# Randomizes the order of slides each time the presentation loads
+shuffle: false
+
+# Turns fragments on and off globally
+fragments: true
+
+# Flags if the presentation is running in an embedded mode,
+# i.e. contained within a limited portion of the screen
+embedded: false
+
+# Flags if we should show a help overlay when the questionmark
+# key is pressed
+help: true
+
+# Flags if speaker notes should be visible to all viewers
+showNotes: false
+
+# Global override for autolaying embedded media (video/audio/iframe)
+# - null: Media will only autoplay if data-autoplay is present
+# - true: All media will autoplay, regardless of individual setting
+# - false: No media will autoplay, regardless of individual setting
+autoPlayMedia: null
+
+# Number of milliseconds between automatically proceeding to the
+# next slide, disabled when set to 0, this value can be overwritten
+# by using a data-autoslide attribute on your slides
+autoSlide: 0
+
+# Stop auto-sliding after user input
+autoSlideStoppable: true
+
+# Use this method for navigation when auto-sliding
+autoSlideMethod: Reveal.navigateNext
+
+# Enable slide navigation via mouse wheel
+mouseWheel: false
+
+# Hides the address bar on mobile devices
+hideAddressBar: true
+
+# Opens links in an iframe preview overlay
+previewLinks: false
+
+# Transition style
+transition: 'slide'
+# none/fade/slide/convex/concave/zoom
+
+# Transition speed
+transitionSpeed: 'default'
+# default/fast/slow
+
+# Transition style for full page slide backgrounds
+backgroundTransition: 'fade'
+# none/fade/slide/convex/concave/zoom
+
+# Number of slides away from the current that are visible
+viewDistance: 3
+
+# Parallax background image
+parallaxBackgroundImage: ''
+# e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
+
+# Parallax background size
+parallaxBackgroundSize: ''
+# CSS syntax, e.g. "2100px 900px"
+
+# Number of pixels to move the parallax background per slide
+# - Calculated automatically unless specified
+# - Set to 0 to disable movement along an axis
+parallaxBackgroundHorizontal: null
+parallaxBackgroundVertical: null
+
+# The display mode that will be used to show slides
+display: 'block'
+```
+
+## Customising individual slides
+
+custom background image:
+```
+---
+
+<!-- .slide: data-background="https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg" -->
+#### testslide
+
+---
+```