diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..a4eee53
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,17 @@
+# Matrix Client
+MATRIX_HOST=http://localhost:8008
+MATRIX_ADMIN_TOKEN=secret
+
+# PostgreSQL
+POSTGRES_USER=synapse_user
+POSTGRES_PASSWORD=secretpassword
+POSTGRES_DB=synapse
+# https://www.postgresql.org/docs/current/app-initdb.html
+POSTGRES_INITDB_ARGS='--no-locale --encoding=UTF8'
+
+# Synapse
+SYNAPSE_SERVER_NAME=matrix.localhost
+SYNAPSE_REPORT_STATS=yes
+SYNAPSE_ENABLE_REGISTRATION=yes
+SYNAPSE_NO_TLS=true
+SYNAPSE_USER_DIR_SEARCH_ALL_USERS=true
diff --git a/.gitignore b/.gitignore
index 6985cf1..d673cb1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,12 @@ Cargo.lock
# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb
+
+# Development
+/docker/*
+!/docker/.gitkeep
+!/docker/postgre
+.env
+
+# System Specific
+.DS_Store
diff --git a/Justfile b/Justfile
new file mode 100644
index 0000000..ab74a98
--- /dev/null
+++ b/Justfile
@@ -0,0 +1,29 @@
+set positional-arguments
+
+# Lists all available commands
+default:
+ just --list
+
+# Creates the `.env` file if it doesn't exist
+dotenv:
+ cp -n .env.example .env || true
+
+# Generates the synapse configuration file and saves it
+gen_synapse_conf: dotenv
+ docker run -it --rm \
+ -v ./docker/synapse:/data \
+ --env-file .env \
+ matrixdotorg/synapse:v1.96.1 generate
+
+# Runs backend dependency services
+backend: dotenv
+ docker compose up --build
+
+# Stops backend dependency services
+stop:
+ docker compose down
+
+# Removes oll Docker related config, volumes and containers for this project
+clear: stop
+ docker compose rm --all --force --volumes --stop
+ docker volume rm commune_synapse_database || true
diff --git a/README.md b/README.md
index bf84f02..e31545b 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,51 @@
-# commune
-Commune Server
+
+
commune
+
+ Commune Server
+
+
+
+## Development
+
+### Requirements
+
+- [Docker](https://www.docker.com/get-started/)
+- [Justfile](https://github.com/casey/just)
+- [Rust](https://rustup.rs)
+
+### Getting Started
+
+1. Generate `Synapse` server configuration
+
+```bash
+just gen_synapse_conf
+```
+
+2. Run Synapse Server (and other containerized services) using Docker Compose
+via:
+
+```bash
+just backend
+```
+
+**When you are ready**
+
+Teardown services using `just stop`. If you want to perform a complete cleanup
+use `just clear`.
+
+> **Warning** `just clear` will remove all containers and images.
+
+### Application Layout
+
+
+
+
Application Layout Overview
+
+
+The client, any HTTP Client, comunicates with the Commune Server which may or
+may not communicate with Matrix's server _Synapse_ which runs along with its
+database in a Docker container.
+
+## License
+
+This project is licensed under the Apache License Version 2.0
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..fce631b
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,28 @@
+version: '3'
+
+services:
+ synapse_database:
+ image: 'postgres:16'
+ ports:
+ - '5432:5432'
+ volumes:
+ - synapse_database:/var/lib/postgresql/data
+ env_file:
+ - .env
+ restart: always
+
+ synapse:
+ image: 'matrixdotorg/synapse:v1.96.1'
+ ports:
+ - '8008:8008'
+ - '8448:8448'
+ volumes:
+ - ./docker/synapse:/data
+ env_file:
+ - .env
+ restart: always
+ depends_on:
+ - synapse_database
+
+volumes:
+ synapse_database:
diff --git a/docker/.gitkeep b/docker/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/docs/diagrams/diagram.excalidraw b/docs/diagrams/diagram.excalidraw
new file mode 100644
index 0000000..eaa5793
--- /dev/null
+++ b/docs/diagrams/diagram.excalidraw
@@ -0,0 +1,475 @@
+{
+ "type": "excalidraw",
+ "version": 2,
+ "source": "https://excalidraw.com",
+ "elements": [
+ {
+ "id": "RYL6z1yNI4ryhDrjxemyL",
+ "type": "rectangle",
+ "x": 364,
+ "y": 272,
+ "width": 130,
+ "height": 119,
+ "angle": 0,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#a5d8ff",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 0,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "seed": 1352799417,
+ "version": 94,
+ "versionNonce": 297889623,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "NwNRXHacaPiTQKk-sS3iv"
+ },
+ {
+ "id": "jR76iIplo4TVvNKZBH6vT",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1700421911263,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "NwNRXHacaPiTQKk-sS3iv",
+ "type": "text",
+ "x": 393.84375,
+ "y": 319.5,
+ "width": 70.3125,
+ "height": 24,
+ "angle": 0,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#ffec99",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "seed": 683172535,
+ "version": 80,
+ "versionNonce": 581421529,
+ "isDeleted": false,
+ "boundElements": null,
+ "updated": 1700421905506,
+ "link": null,
+ "locked": false,
+ "text": "Client",
+ "fontSize": 20,
+ "fontFamily": 3,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "baseline": 19,
+ "containerId": "RYL6z1yNI4ryhDrjxemyL",
+ "originalText": "Client",
+ "lineHeight": 1.2
+ },
+ {
+ "type": "rectangle",
+ "version": 207,
+ "versionNonce": 145190007,
+ "isDeleted": false,
+ "id": "igO3c0IESW8ZSDcllatP-",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 0,
+ "opacity": 100,
+ "angle": 0,
+ "x": 582,
+ "y": 269.5,
+ "strokeColor": "#2f9e44",
+ "backgroundColor": "#b2f2bb",
+ "width": 130,
+ "height": 119,
+ "seed": 2026968473,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "E1cQEf95N_pZWvm755-z4"
+ },
+ {
+ "id": "jR76iIplo4TVvNKZBH6vT",
+ "type": "arrow"
+ },
+ {
+ "id": "I--VThaGzeWEpMH77IyuH",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1700421911263,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 206,
+ "versionNonce": 648226489,
+ "isDeleted": false,
+ "id": "E1cQEf95N_pZWvm755-z4",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 605.984375,
+ "y": 305,
+ "strokeColor": "#2f9e44",
+ "backgroundColor": "#ffec99",
+ "width": 82.03125,
+ "height": 48,
+ "seed": 815919225,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1700421905506,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "Commune\nServer",
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "igO3c0IESW8ZSDcllatP-",
+ "originalText": "Commune\nServer",
+ "lineHeight": 1.2,
+ "baseline": 43
+ },
+ {
+ "id": "jR76iIplo4TVvNKZBH6vT",
+ "type": "arrow",
+ "x": 495,
+ "y": 328.38774886792805,
+ "width": 86,
+ "height": 0.220972375229735,
+ "angle": 0,
+ "strokeColor": "#fa5252",
+ "backgroundColor": "#a5d8ff",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 0,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "seed": 1227684473,
+ "version": 56,
+ "versionNonce": 1745929623,
+ "isDeleted": false,
+ "boundElements": null,
+ "updated": 1700421911263,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 86,
+ -0.220972375229735
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "RYL6z1yNI4ryhDrjxemyL",
+ "focus": -0.04931816566337021,
+ "gap": 1
+ },
+ "endBinding": {
+ "elementId": "igO3c0IESW8ZSDcllatP-",
+ "focus": 0.016806722689075442,
+ "gap": 1
+ },
+ "startArrowhead": null,
+ "endArrowhead": "triangle"
+ },
+ {
+ "id": "BBin9aP3kMIsghlY9Q3Xb",
+ "type": "rectangle",
+ "x": 803,
+ "y": 235,
+ "width": 305,
+ "height": 200,
+ "angle": 0,
+ "strokeColor": "#868e96",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dashed",
+ "roughness": 0,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1920549721,
+ "version": 263,
+ "versionNonce": 2133981879,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "I--VThaGzeWEpMH77IyuH",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1700421911263,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "mxgPLlWP_Rswux186mo6F",
+ "type": "image",
+ "x": 906,
+ "y": 149,
+ "width": 85,
+ "height": 85,
+ "angle": 0,
+ "strokeColor": "transparent",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dashed",
+ "roughness": 0,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "seed": 1091137593,
+ "version": 301,
+ "versionNonce": 1118800855,
+ "isDeleted": false,
+ "boundElements": null,
+ "updated": 1700421911263,
+ "link": null,
+ "locked": false,
+ "status": "saved",
+ "fileId": "674c6c1c00fa6878a440ca4cb9c65ee6ce0b9d51",
+ "scale": [
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "4N7vb2roINeGhvAK-EnUr",
+ "type": "rectangle",
+ "x": 831,
+ "y": 278,
+ "width": 114,
+ "height": 108,
+ "angle": 0,
+ "strokeColor": "#6741d9",
+ "backgroundColor": "#d0bfff",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 0,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "seed": 717291801,
+ "version": 341,
+ "versionNonce": 513669367,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "4YZ1HMXFK8M48eFnDMR4v"
+ }
+ ],
+ "updated": 1700421911263,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "4YZ1HMXFK8M48eFnDMR4v",
+ "type": "text",
+ "x": 846.984375,
+ "y": 308,
+ "width": 82.03125,
+ "height": 48,
+ "angle": 0,
+ "strokeColor": "#6741d9",
+ "backgroundColor": "#d0bfff",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "seed": 1393907641,
+ "version": 262,
+ "versionNonce": 1356851097,
+ "isDeleted": false,
+ "boundElements": null,
+ "updated": 1700421905507,
+ "link": null,
+ "locked": false,
+ "text": "Matrix\nSynapse",
+ "fontSize": 20,
+ "fontFamily": 3,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "baseline": 43,
+ "containerId": "4N7vb2roINeGhvAK-EnUr",
+ "originalText": "Matrix\nSynapse",
+ "lineHeight": 1.2
+ },
+ {
+ "type": "rectangle",
+ "version": 494,
+ "versionNonce": 142721559,
+ "isDeleted": false,
+ "id": "9lVssKY2uk0fr5TCbd5kT",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 0,
+ "opacity": 100,
+ "angle": 0,
+ "x": 969,
+ "y": 277,
+ "strokeColor": "#6741d9",
+ "backgroundColor": "#d0bfff",
+ "width": 114,
+ "height": 108,
+ "seed": 487814649,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "QJwL5UFm3QWsAGT_IMZZG"
+ }
+ ],
+ "updated": 1700421911263,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 431,
+ "versionNonce": 462523513,
+ "isDeleted": false,
+ "id": "QJwL5UFm3QWsAGT_IMZZG",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 979.125,
+ "y": 321.4,
+ "strokeColor": "#6741d9",
+ "backgroundColor": "#d0bfff",
+ "width": 93.75,
+ "height": 19.2,
+ "seed": 1463634583,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1700421905508,
+ "link": null,
+ "locked": false,
+ "fontSize": 16,
+ "fontFamily": 3,
+ "text": "PostgreSQL",
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "9lVssKY2uk0fr5TCbd5kT",
+ "originalText": "PostgreSQL",
+ "lineHeight": 1.2,
+ "baseline": 15
+ },
+ {
+ "type": "arrow",
+ "version": 257,
+ "versionNonce": 1364158263,
+ "isDeleted": false,
+ "id": "I--VThaGzeWEpMH77IyuH",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 0,
+ "opacity": 100,
+ "angle": 0,
+ "x": 714,
+ "y": 329.467361039966,
+ "strokeColor": "#e8590c",
+ "backgroundColor": "#a5d8ff",
+ "width": 86,
+ "height": 0.2401904503404353,
+ "seed": 184831705,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1700421911263,
+ "link": null,
+ "locked": false,
+ "startBinding": {
+ "elementId": "igO3c0IESW8ZSDcllatP-",
+ "gap": 2,
+ "focus": 0.010959919320073687
+ },
+ "endBinding": {
+ "elementId": "BBin9aP3kMIsghlY9Q3Xb",
+ "gap": 3,
+ "focus": 0.06180802042331033
+ },
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": "triangle",
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 86,
+ -0.2401904503404353
+ ]
+ ]
+ }
+ ],
+ "appState": {
+ "gridSize": null,
+ "viewBackgroundColor": "#ffffff"
+ },
+ "files": {
+ "674c6c1c00fa6878a440ca4cb9c65ee6ce0b9d51": {
+ "mimeType": "image/png",
+ "id": "674c6c1c00fa6878a440ca4cb9c65ee6ce0b9d51",
+ "dataURL": "data:image/png;base64,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",
+ "created": 1700421758712,
+ "lastRetrieved": 1700421758712
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/diagrams/diagram.png b/docs/diagrams/diagram.png
new file mode 100644
index 0000000..bb027bd
Binary files /dev/null and b/docs/diagrams/diagram.png differ