-Telodendria is an extremely powerful, yet lightweight and portable
+**Telodendria** is an extremely powerful, yet lightweight and portable
chat server designed to be easy to install and configure. Powered by
the [Matrix](https://matrix.org) protocol, Telodendria empowers
everyone to run their own chat server on ordinary hardware, including
@@ -12,7 +11,7 @@ hosting a complicated, high-maintenance homeserver or joining an
existing homeserver for privacy or other reasons, then Telodendria
might be for you.
-> **Note:** Telodendria still in development. See [Status](#status).
+!!!! **Note:** Telodendria still in development. See **Status** below.
## What is Matrix?
@@ -64,12 +63,13 @@ incredibly outdated. Telodendria, on the other hand, aims to be stable.
It should *just work* for long periods of time between upgrades, and
you should never feel like Telodendria is going to change significantly
between upgrades.
+- **Well-Documented:** Telodendria places as much emphasis on documentation as on code, which means you can be sure that the documentation will always remain up-to-date, accurate, and most importantly, reasonably exhaustive.
-[Read Technical Rationale →](docs/dev/rationale.md)
+[Read Technical Rationale →](https://git.telodendria.io/Telodendria/Telodendria/src/branch/master/docs/dev/rationale.md)
## Get Started
-Check out the [Documentation](docs/README.md) to get started with
+Check out the [Documentation](https://git.telodendria.io/Telodendria/telodendria/src/branch/master/docs/README.md) to get started with
Telodendria.
## Status
@@ -79,13 +79,13 @@ not yet deliver on all of its promises. Currently, Telodendria is not
ready for end-users yet. While it features very basic user
authentication, it does not actually work as a chat server yet.
-We are hoping to ship Telodendria `v0.4.0` by May of 2024. This
+We are hoping to ship Telodendria `v1.7.0-alpha4` by January of 2025. This
release should be usable for communication between **local users**
only. Additional features, including federation with other Matrix
homeservers will be added in future releases.
-You can help speed up development by [sponsoring](#sponsorship)
-Telodendria or [getting involved](docs/CONTRIBUTING.md).
+You can help speed up development by **sponsoring**
+Telodendria or [getting involved](https://git.telodendria.io/Telodendria/Telodendria/src/branch/master/docs/CONTRIBUTING.md).
## Sponsorship
@@ -96,7 +96,7 @@ Telodendria's long-term success, please consider sponsoring the
project.
You can make a recurring donation to Telodendria using
-[LiberaPay](https://bancino.net/Telodendria/donate). You can also make
+[LiberaPay](https://liberapay.com/Telodendria/donate). You can also make
one-time donations using
[Stripe](https://donate.stripe.com/8wM29AfF5bRJc48eUU). If you would
like to make a recurring donation larger than that allowed by
@@ -108,7 +108,7 @@ LiberaPay, please contact Jordan Bancino over Matrix at
While there are no set sponsorship tiers at this time, sponsoring
Telodendria is a mutually beneficial relationship. Depending on the
amount you donate, you can get your name, logo, and website links
-on the [Sponsors](docs/SPONSORS.md) page, the project `README`, or the
+on the [Sponsors](../sponsors) page, the project `README`, or the
main website.
## License
@@ -116,7 +116,7 @@ main website.
All of the code and documentation for Telodendria is licensed under a
modified MIT license. The MIT license is an extremely permissive
license that has very few restrictions. Please consult the
-[`LICENSE.txt`](LICENSE.txt) file for the actual license text. It is
+[`LICENSE.txt`](https://git.telodendria.io/Telodendria/Telodendria/src/branch/master/LICENSE.txt) file for the actual license text. It is
important to note that the Telodendria license text differs from the
original MIT license in the following ways:
@@ -133,4 +133,3 @@ to use the logo in any way as long as it represents or links to the
official project. If Telodendria is forked, the logo must be removed
completely from the project, and optionally replaced by a different
one.
-
diff --git a/Schema/Filter.json b/Schema/Filter.json
index ee6a233..20f8f0a 100644
--- a/Schema/Filter.json
+++ b/Schema/Filter.json
@@ -1,4 +1,5 @@
{
+ "guard": "TELODENDRIA_SCHEMA_FILTER_H",
"header": "Schema\/Filter.h",
"types": {
"FilterRoom": {
@@ -116,6 +117,5 @@
},
"type": "struct"
}
- },
- "guard": "TELODENDRIA_SCHEMA_FILTER_H"
+ }
}
diff --git a/Schema/LoginRequest.json b/Schema/LoginRequest.json
new file mode 100644
index 0000000..b93dcc5
--- /dev/null
+++ b/Schema/LoginRequest.json
@@ -0,0 +1,38 @@
+{
+ "header": "Schema\/LoginRequest.h",
+ "types": {
+ "LoginRequestType": {
+ "fields": {
+ "m.login.password": { "name": "REQUEST_TYPE_PASSWORD" }
+ },
+ "type": "enum"
+ },
+ "LoginRequestUserIdentifier": {
+ "fields": {
+ "type": { "type": "string" },
+ "user": { "type": "string" }
+ },
+ "type": "struct"
+ },
+ "LoginRequest": {
+ "fields": {
+ "type": { "type": "LoginRequestType" },
+
+ "identifier": { "type": "object" },
+
+ "password": { "type": "string" },
+ "address": { "type": "string" },
+ "user": { "type": "string" },
+ "device_id": { "type": "string" },
+ "initial_device_display_name": { "type": "string" },
+ "medium": { "type": "string" },
+ "token": { "type": "string" },
+
+ "refresh_token": { "type": "boolean" }
+ },
+ "type": "struct"
+ }
+ },
+ "guard": "TELODENDRIA_SCHEMA_LOGIN_REQUEST_H"
+}
+
diff --git a/Schema/RegToken.json b/Schema/RegToken.json
new file mode 100644
index 0000000..2cb56ff
--- /dev/null
+++ b/Schema/RegToken.json
@@ -0,0 +1,49 @@
+{
+ "guard": "TELODENDRIA_SCHEMA_REGTOKEN_H",
+ "header": "Schema\/RegToken.h",
+ "include": [
+ "Cytoplasm\/Db.h"
+ ],
+ "types": {
+ "Db *": {
+ "type": "extern"
+ },
+ "DbRef *": {
+ "type": "extern"
+ },
+ "RegTokenInfo": {
+ "fields": {
+ "db": {
+ "type": "Db *",
+ "ignore": true
+ },
+ "ref": {
+ "type": "DbRef *",
+ "ignore": true
+ },
+ "name": {
+ "type": "string"
+ },
+ "created_by": {
+ "type": "string"
+ },
+ "created_on": {
+ "type": "integer"
+ },
+ "expires_on": {
+ "type": "integer"
+ },
+ "used": {
+ "type": "integer"
+ },
+ "uses": {
+ "type": "integer"
+ },
+ "grants": {
+ "type": "array"
+ }
+ },
+ "type": "struct"
+ }
+ }
+}
\ No newline at end of file
diff --git a/Schema/Registration.json b/Schema/Registration.json
new file mode 100644
index 0000000..f9db09c
--- /dev/null
+++ b/Schema/Registration.json
@@ -0,0 +1,17 @@
+{
+ "header": "Schema\/Registration.h",
+ "types": {
+ "RegistrationRequest": {
+ "fields": {
+ "username": { "type": "string" },
+ "password": { "type": "string" },
+ "device_id": { "type": "string" },
+ "inhibit_login": { "type": "boolean" },
+ "initial_device_display_name": { "type": "string" },
+ "refresh_token": { "type": "boolean" }
+ },
+ "type": "struct"
+ }
+ },
+ "guard": "TELODENDRIA_SCHEMA_REGISTRATION_H"
+}
diff --git a/Schema/RequestToken.json b/Schema/RequestToken.json
new file mode 100644
index 0000000..1f05393
--- /dev/null
+++ b/Schema/RequestToken.json
@@ -0,0 +1,21 @@
+{
+ "header": "Schema\/RequestToken.h",
+ "types": {
+ "RequestToken": {
+ "fields": {
+ "client_secret": { "type": "string" },
+ "send_attempt": { "type": "integer" },
+ "next_link": { "type": "string" },
+ "id_access_token": { "type": "string" },
+ "id_server": { "type": "string" },
+
+ "email": { "type": "string" },
+
+ "country": { "type": "string" },
+ "phone_number": { "type": "string" }
+ },
+ "type": "struct"
+ }
+ },
+ "guard": "TELODENDRIA_SCHEMA_REQUESTTOKEN_H"
+}
diff --git a/configure b/configure
index 2dc0aec..70e0aad 100755
--- a/configure
+++ b/configure
@@ -14,12 +14,12 @@ INCLUDE="src/include"
TOOLS="tools/src"
SCHEMA="Schema"
-CFLAGS="-Wall -Wextra -pedantic -std=c89 -O3 -pipe -D_DEFAULT_SOURCE -I${INCLUDE}"
+CFLAGS="-Wall -Wextra -pedantic -std=c89 -O3 -pipe -D_DEFAULT_SOURCE -I${INCLUDE} -I${BUILD}"
LIBS="-lm -pthread -lCytoplasm"
# Set default args for all platforms
-SCRIPT_ARGS="--prefix=/usr/local --enable-ld-extra --bin-name=telodendria --version=0.4.0 --static $@"
+SCRIPT_ARGS="--cc=cc --prefix=/usr/local --enable-ld-extra --bin-name=telodendria --version=1.7.0-alpha4 --static $@"
echo "Processing options..."
echo "Ran with arguments: $SCRIPT_ARGS"
@@ -27,6 +27,9 @@ echo "Ran with arguments: $SCRIPT_ARGS"
# Process all arguments
for arg in $SCRIPT_ARGS; do
case "$arg" in
+ --cc=*)
+ CC=$(echo "$arg" | cut -d '=' -f 2-)
+ ;;
--prefix=*)
PREFIX=$(echo "$arg" | cut -d '=' -f 2-)
;;
@@ -60,7 +63,7 @@ for arg in $SCRIPT_ARGS; do
STATIC=""
;;
*)
- echo "Invalid argument: $1"
+ echo "Invalid argument: $arg"
exit 1
;;
esac
@@ -112,8 +115,8 @@ compile_obj() {
src="$1"
obj="$2"
- pref=$(cc -I${INCLUDE} -MM -MT "${obj}" "${src}")
- echo "$pref $(collect ${SCHEMA}/ .json .h ${INCLUDE}/Schema/ print_obj)"
+ pref=$(${CC} -I${INCLUDE} -I${BUILD} -MM -MT "${obj}" "${src}")
+ echo "$pref $(collect ${SCHEMA}/ .json .h ${BUILD}/Schema/ print_obj)"
echo "${TAB}@mkdir -p $(dirname ${obj})"
echo "${TAB}\$(CC) \$(CFLAGS) -fPIC -c -o \"${obj}\" \"${src}\""
}
@@ -153,13 +156,19 @@ compile_schema() {
src="$1"
out="$2"
- echo "${INCLUDE}/Schema/${out}.h:"
- echo "${TAB}@mkdir -p ${INCLUDE}/Schema ${SRC}/Schema"
- echo "${TAB}j2s -s \"${src}\" -h \"${INCLUDE}/Schema/${out}.h\" -c \"${SRC}/Schema/${out}.c\""
+ obj="${BUILD}/Schema/${out}.o"
- echo "${SRC}/Schema/${out}.c:"
- echo "${TAB}@mkdir -p ${INCLUDE}/Schema ${SRC}/Schema"
- echo "${TAB}j2s -s \"${src}\" -h \"${INCLUDE}/Schema/${out}.h\" -c \"${SRC}/Schema/${out}.c\""
+ echo "${BUILD}/Schema/${out}.h:"
+ echo "${TAB}@mkdir -p ${BUILD}/Schema"
+ echo "${TAB}j2s -s \"${src}\" -h \"${BUILD}/Schema/${out}.h\" -c \"${BUILD}/Schema/${out}.c\""
+
+ echo "${BUILD}/Schema/${out}.c:"
+ echo "${TAB}@mkdir -p ${BUILD}/Schema"
+ echo "${TAB}j2s -s \"${src}\" -h \"${BUILD}/Schema/${out}.h\" -c \"${BUILD}/Schema/${out}.c\""
+
+ echo "${obj}: ${src} ${BUILD}/Schema/${out}.c"
+ echo "${TAB}@mkdir -p ${BUILD}/Schema"
+ echo "${TAB}\$(CC) \$(CFLAGS) -fPIC -c -o \"${obj}\" \"${BUILD}/Schema/${out}.c\""
}
install_out() {
@@ -185,22 +194,16 @@ uninstall_out() {
echo "Generating Makefile..."
-OBJS=$(collect ${SRC}/ .c .o ${BUILD}/ print_obj)
+OBJS="$(collect ${SRC}/ .c .o ${BUILD}/ print_obj) $(collect ${SCHEMA}/ .json .o ${BUILD}/Schema/ print_obj)"
TAB=$(printf '\t')
-# If objects don't include the schema (this is the first configure),
-# then include them manually.
-if ! echo "${OBJS}" | grep "Schema" > /dev/null; then
- OBJS="${OBJS} $(collect ${SCHEMA}/ .json .o ${BUILD}/Schema/ print_obj)"
-fi
-
cat << EOF > Makefile
.POSIX:
# Generated by '$0' on $(date).
# This file should generally not be manually edited.
-CC = cc
+CC = ${CC}
PREFIX = ${PREFIX}
CFLAGS = ${CFLAGS}
LDFLAGS = ${LDFLAGS}
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index b9b7a3a..6f62558 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -5,12 +5,22 @@ It is intended to be updated with every commit that makes a user-facing change w
reporting in the change log. As such, it changes frequently between releases. Final
change log entries are published as [Releases](releases).
-## v0.4.0
+## v1.7.0-alpha4
**Not Released Yet.**
-This release brings filters, rooms, and events! The core of the Matrix protocol architecture
-is not in place.
+This release brings filters, rooms, and events! The core of the Matrix
+protocol architecture is now in place.
+
+Note that the versioning scheme has changed from `v0.X.0` to
+`v1.7.0-alphaX`. This is so that Telodendria releases correspond to the
+Matrix specification that they implement, in accordance with
+[this blog post](https://telodendria.io/blog/on-matrixs-release-cadence-and-state-resolution-v1).
+This versioning scheme change does not indicate a drastic leap forward
+in Telodendria's development—the `-alpha4` suffix indicates that
+this is the 4th pre-release, with the target being a stable `v1.7.0`.
+Note also that we still have a *long* way to go before we reach that
+stable release.
### Matrix Specification
@@ -21,19 +31,30 @@ The following endpoints were added:
### Bug Fixes & General Improvements
-- Fixed a double-free in `RouteUserProfile()` that would cause errors with certain
-Matrix clients. (#35)
+- Fixed a double-free in `RouteUserProfile()` that would cause errors
+with certain Matrix clients. (#35)
- Improved compatibility with NetBSD on various platforms.
-- Moved [Cytoplasm](/Telodendria/Cytoplasm) to its own repository.
-- Use a `configure` script and `make` to build Telodendria instead of custom scripts.
+- Moved [Cytoplasm](/Telodendria/Cytoplasm) to its own repository. It
+will now be maintained separately and have its own releases as well.
+- Use a `configure` script and `make` to build Telodendria instead of
+custom scripts.
+- Greatly simplified some endpoint code by using Cytoplasm's `j2s` for
+parsing request bodies.
### New Features
-- Implemented `/_telodendria/admin/v1/deactivate/[localpart]` for admins to be able to
-deactivate users.
-- Moved all administrator API endpoints to `/_telodendria/admin/v1`, because later revisions
-of the administrator API may break clients, so we want a way to give those breaking revisions
-new endpoints.
+- Moved all administrator API endpoints to `/_telodendria/admin/v1`,
+because later revisions of the administrator API may break clients, so
+we want a way to give those breaking revisions new endpoints.
+- Implemented `/_telodendria/admin/v1/deactivate/[localpart]` for admins
+to be able to deactivate users.
+- Added a **PUT** option to `/_telodendria/admin/v1/config` that gives
+the ability to change only a subset of the configuration.
+- Implemented the following APIs for managing registration tokens:
+ - **GET** `/_telodendria/admin/tokens`
+ - **GET** `/_telodendria/admin/tokens/[token]`
+ - **POST** `/_telodendria/admin/tokens`
+ - **DELETE** `/_telodendria/admin/tokens/[token]`
## v0.3.0
diff --git a/docs/user/admin/README.md b/docs/user/admin/README.md
index 827ef10..dc62647 100644
--- a/docs/user/admin/README.md
+++ b/docs/user/admin/README.md
@@ -19,6 +19,7 @@ request.
- [Configuration](config.md)
- [Server Statistics](stats.md)
- [Process Control](proc.md)
+- [Registration Tokens](tokens.md)
## API Conventions
diff --git a/docs/user/admin/config.md b/docs/user/admin/config.md
index 0466403..6c18a03 100644
--- a/docs/user/admin/config.md
+++ b/docs/user/admin/config.md
@@ -4,11 +4,11 @@ As mentioned in [Setup](../setup.md), Telodendria's configuration is
intended to be managed via the configuration API. Consult the
[Configuration](../config.md) document for a complete list of supported
configuration options. This document simply describes the API used to
-update the configuration.
+update the configuration described in that document.
## API Endpoints
-### **GET** `/_telodendria/admin/config`
+### **GET** `/_telodendria/admin/v1/config`
Retrieve the current configuration.
@@ -20,7 +20,7 @@ Retrieve the current configuration.
|---------------|-------------|
| 200 | The current configuration was successfully retrieved.|
-### **POST** `/_telodendria/admin/config`
+### **POST** `/_telodendria/admin/v1/config`
Installs a new configuration. This endpoint validates the request body,
ensuring it is a proper configuration, then it replaces the existing
@@ -40,3 +40,23 @@ configuration with the new one.
|-------|------|-------------|
| `restart_required` | `Boolean` | Whether or not the process needs to be restarted to finish applying the configuration. If this is `true`, then the restart endpoint should be used at a convenient time to apply the configuration.
+### **PUT** `/_telodendria/admin/v1/config`
+
+Update the currently installed configuration instead of completely replacing it. This endpoint
+validates the request body, merges it on top of the current configuration, validates the resulting
+configuration, then updates it in the database. This is useful when only one or two properties
+in the configuration needs to be changed.
+
+| Requires Token | Rate Limited |
+|----------------|--------------|
+| Yes | Yes |
+
+| Response Code | Description |
+|---------------|-------------|
+| 200 | The new configuration was successfully installed.|
+
+#### 200 Response Format
+
+| Field | Type | Description |
+|-------|------|-------------|
+| `restart_required` | `Boolean` | Whether or not the process needs to be restarted to finish applying the configuration. If this is `true`, then the restart endpoint should be used at a convenient time to apply the configuration.
diff --git a/docs/user/admin/privileges.md b/docs/user/admin/privileges.md
index 8bbf143..9a8da06 100644
--- a/docs/user/admin/privileges.md
+++ b/docs/user/admin/privileges.md
@@ -41,7 +41,7 @@ this privilege level.
The following API endpoints are implemented for managing privileges.
-### **GET** `/_telodendria/admin/privileges/[localpart]`
+### **GET** `/_telodendria/admin/v1/privileges/[localpart]`
Retrieve the permissions for a user. If the localpart is omitted, then
retrieve the privileges for the user that owns the access token being
@@ -62,7 +62,7 @@ used. Note that the owner of the access token must have the
|-------|------|-------------|
| `privileges` | `Array` | An array of privileges, as described above. The privileges are encoded as JSON strings.|
-### **POST** `/_telodendria/admin/privileges/[localpart]`
+### **POST** `/_telodendria/admin/v1/privileges/[localpart]`
Update the privileges of a local user by replacing the privileges array
with the one specified in the request. Like the **GET** version of this
@@ -89,7 +89,7 @@ owns the access token.
|-------|------|-------------|
| `privileges` | `Array` | An array of privileges, as described above. The privileges are encoded as JSON strings.|
-### **PUT** `/_telodendria/admin/privileges/[localpart]`
+### **PUT** `/_telodendria/admin/v1/privileges/[localpart]`
Update the privileges of a local user by adding the privileges
specified in the request to the users existing privileges.
@@ -114,7 +114,7 @@ specified in the request to the users existing privileges.
|-------|------|-------------|
| `privileges` | `Array` | An array of privileges, as described above. The privileges are encoded as JSON strings.|
-### **DELETE** `/_telodendria/admin/privileges/[localpart]`
+### **DELETE** `/_telodendria/admin/v1/privileges/[localpart]`
Update the privileges of a local user by removing the privileges
specified in the request from the user's existing privileges.
diff --git a/docs/user/admin/proc.md b/docs/user/admin/proc.md
index 4db33ec..e4ad3d0 100644
--- a/docs/user/admin/proc.md
+++ b/docs/user/admin/proc.md
@@ -5,7 +5,7 @@ administrator to manage the Telodendria process itself.
## API Endpoints
-### **POST** `/_telodendria/admin/restart`
+### **POST** `/_telodendria/admin/v1/restart`
Restart the Telodendria daemon cleanly. This endpoint will respond
immediately after signaling to the daemon that it should be restarted
@@ -26,7 +26,7 @@ starts over.
On success, this endpoint simply returns an empty JSON object.
-### **POST** `/_telodendria/admin/shutdown`
+### **POST** `/_telodendria/admin/v1/shutdown`
Shut down the Telodendria process cleanly. This endpoint will respond
immediately after signalling to the daemon that it should be shut
diff --git a/docs/user/admin/stats.md b/docs/user/admin/stats.md
index bbebb7f..dc951a8 100644
--- a/docs/user/admin/stats.md
+++ b/docs/user/admin/stats.md
@@ -5,7 +5,7 @@ information about how the server process is performing.
## API Endpoints
-### **GET** `/_telodendria/admin/stats`
+### **GET** `/_telodendria/admin/v1/stats`
Retrieve basic statistics about the currently running Telodendria
process.
diff --git a/docs/user/admin/tokens.md b/docs/user/admin/tokens.md
new file mode 100644
index 0000000..18baf01
--- /dev/null
+++ b/docs/user/admin/tokens.md
@@ -0,0 +1,106 @@
+# Administrator API: Registration Tokens
+
+Telodendria implements registration tokens as specified by the Matrix
+specification. These tokens can be used for registration using the
+`m.login.registration_token` login type. This API provides a Telodendria
+administrator with a mechanism for generating and managing these tokens,
+which allows controlled registration on the homeserver.
+
+It is generally safer than completely open registration to use
+registration tokens that either expire after a short period of time, or
+have a limited number of uses.
+
+## Registration Token
+
+A registration token is represented by the following `RegToken` JSON
+object:
+
+| Field | Type | Description |
+|-------|------|-------------|
+| `name` | `String` | The token identifier; what is used when registering. |
+| `created_by` | `String` | The localpart of the user that created this token. |
+| `created_on` | `Integer` | A timestamp of when the token was created. |
+| `expires_on` | `Integer` | An expiration stamp, or 0 if the token never expires. |
+| `used` | `Integer` | The number of times the token has been used. |
+| `uses` | `Integer` | The total number of allowed uses, or -1 for unlimited. |
+| `grants` | `[String]` | An array of privileges to grant users that register with this token as described in [Privileges](privileges.md). |
+
+All endpoints in this API will operate on some variation of this
+structure. The remaining number of uses can be computed by performing
+the subtraction: `uses - used`. `used` should never be greater than
+`uses` or less than `0`.
+
+Example:
+
+```json
+{
+ "name": "q34jgapo8uq34hg",
+ "created_by": "admin",
+ "created_on": 1699467640000,
+ "expires_on": 0,
+ "used": 3,
+ "uses": 5
+}
+```
+
+## API Endpoints
+
+### **GET** `/_telodendria/admin/v1/tokens`
+
+Get a list of all registration tokens and information about them.
+
+#### 200 Response Format
+
+| Field | Type | Description |
+|-------|------|-------------|
+| `tokens` | `[RegToken]` | An array of registration tokens. |
+
+### **GET** `/_telodendria/admin/v1/tokens/[name]`
+
+Get information about the specified registration token.
+
+#### Request Parameters
+
+| Field | Type | Description |
+|-------|------|-------------|
+| `name` | `String` | The name of the token, as it would be used to register a user. |
+
+#### 200 Response Format
+
+This endpoint returns a `RegToken` object that represents the server's
+record of the registration token.
+
+### **POST** `/_telodendria/admin/v1/tokens`
+
+Create a new registration token.
+
+#### Request Format
+
+This endpoint accepts a `RegToken` object, as described above. If no
+`name` is provided, one will be randomly generated. Note that the fields
+`created_by`, `created_on`, and `used` are ignored and set by the server
+when this request is made. All other fields may be set by the request
+body.
+
+#### 200 Response Format
+
+If the creation of the registration token was successful, a `RegToken`
+that represents the server's record of it is returned.
+
+### **DELETE** `/_telodendria/admin/v1/tokens/[name]`
+
+Delete the specified registration token. It will no longer be usable for
+the registration of users. Any users that have completed the
+`m.login.registration_token` step but have not yet created their account
+should still be able to do so until their user-interactive auth session
+expires.
+
+#### Request Parameters
+
+| Field | Type | Description |
+|-------|------|-------------|
+| `name` | `String` | The name of the token, as it would be used to register a user. |
+
+#### 200 Response Format
+
+On success, this endpoint returns an empty JSON object.
\ No newline at end of file
diff --git a/site/index.html b/site/index.html
deleted file mode 100644
index 5d62447..0000000
--- a/site/index.html
+++ /dev/null
@@ -1,138 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Telodendria | A Matrix Homeserver written in ANSI C.
-
-
-
-
Telodendria
-
-Tel-ə-'den-drē-ə: The terminal aborizations of an axon.
-
-
-Telodendria is an open source Matrix homeserver implementation written from
-scratch in ANSI C and designed to be lightweight and simple, yet
-functional.
-
-
-Note:Telodendria is under heavy development and is not
-yet ready for use.
-Please see the Project Status
-for information about the project state, and use the links below to help fund development.
-
-
Donate
-
-If you would like to donate to this project, you can do so with the
-following links:
-
-If you would like to do a recurring donation larger than what's allowed
-by LiberaPay, please contact me directly on Matrix at @jordan:bancino.net.
-
-
Download
-
-Telodendria is distributed as source tarballs, in true Unix
-fashion. If you want, you can verify the checksum of your download,
-and check the signature. To check the signature, you'll need
-signify, and the signify public key:
-
-telodendria-signify.pub.
-
-See the change log for
-release notes. If you are looking for older Telodendria versions, you
-can find them here.
-
-
-If your operating system has an official package or port of
-Telodendria, you should prefer to use that instead of manually
-downloading the source and building it. Consult your operating system's
-manual for how to install packages, as well as the official repository,
-to see if a package is available. If your operating system's
-package or port is too out of date for your tastes, please contact
-the package's maintainers to notify them, or offer to update the
-package yourself.
-
-
-If your operating system does not have a package or port of
-Telodendria, please consult the
-porting(7) page for guidelines
-related to packaging Telodendria for your system.
-
-
Documentation
-
-Telodendria's documentation is distributed with the source
-code as man pages, which contain all of the information
-on what Telodendria is, what its goals are, how to build the source,
-configure it, as well as contribute to the project. The man
-pages are also available online for convenience:
-
-
User Documentation:
-${USER_DOCS}
-
-
-Developer Documentation:
-
-This documentation is intended primarily for developers. It details all
-of the internal workings of Telodendria.
-