diff --git a/README.md b/README.md
index 82beb43b..0636ebc2 100644
--- a/README.md
+++ b/README.md
@@ -26,9 +26,11 @@
-
+---
+
+
-[](https://github.com/mode-network/synth-subnet/blob/main/LICENSE)
+[][license]
@@ -43,11 +45,11 @@
- [1.4. Calculation of Leaderboard Score](#14-calculation-of-leaderboard-score)
- [1.5. Overall Purpose](#15-overall-purpose)
* [2. Usage](#-2-usage)
- - [2.1. Requirements](#21-requirements)
- - [2.2. Setup](#22-setup)
- - [2.3. Miners](#23-miners)
- - [2.4. Validators](#24-validators)
- - [2.5. Develop](#25-develop)
+ - [2.1. Miners](#21-miners)
+ - [2.1.1. Tutorial](#211-tutorial)
+ - [2.1.2. Reference](#212-reference)
+ - [2.2. Validators](#22-validators)
+ - [2.3. Develop](#23-develop)
* [3. License](#-3-license)
## đź” 1. Overview
@@ -109,7 +111,7 @@ The checking prompts sent to the miners will have the format:
Initially prompt parameters will always have the following values:
- **Start Time ($t_0$)**: 1 minute from the time of the request.
-- **Asset**: BTC, ETH
+- **Asset**: BTC, ETH, XAU
- **Time Increment ($\Delta t$)**: 5 minutes.
- **Time Horizon ($T$)**: 24 hours.
- **Number of Simulations ($N_{\text{sim}}$)**: 100.
@@ -254,96 +256,29 @@ The system creates a competitive environment through:
## 🪄 2. Usage
-### 2.1. Requirements
-
-* [Git](https://github.com/git-guides/install-git)
-* [Ubuntu v20.04+](https://ubuntu.com/download)
-
-
[Back to top ^][table-of-contents]
-
-### 2.2. Setup
-
-**Step 1: Clone the repository**
-
-```shell
-git clone https://github.com/mode-network/synth-subnet.git
-```
-
-**Step 2: Change directory to the project root**
-
-```shell
-cd ./synth-subnet
-```
-
-**Step 3: Add the required repositories**
-
-```shell
-sudo add-apt-repository ppa:deadsnakes/ppa
-```
-
-> ⚠️ **NOTE:** The [deadsnakes](https://github.com/deadsnakes) repository, while unofficial, it is hugely popular and used by many Python projects.
-
-**Step 4: Install Rust**
-
-```shell
-curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
-```
-
-**Step 5: Install the dependencies**
-
-```shell
-sudo apt update && \
- sudo apt install nodejs npm python3.10 pkg-config
-```
-
-**Step 6: Install [PM2](https://pm2.io/)**
-
-```shell
-sudo npm install pm2 -g
-```
-
-**Step 7: Install the Python environment**
-
-```shell
-sudo apt install python3.10-venv
-```
-
-**Step 8: Create a new Python environment**
-
-```shell
-python3.10 -m venv bt_venv
-```
-
-**Step 9: Activate and switch to the newly created Python virtual environment**
-
-```shell
-source bt_venv/bin/activate
-```
-
-This should activate the `bt_venv` environment and you should see the command line prefixed with `(bt_venv)`.
+### 2.1. Miners
-**Step 10: Install local Python dependencies**
+#### 2.1.1. Tutorial
-With the Python virtual environment active, install the Python dependencies:
-```shell
-pip install -r requirements.txt
-```
+Please refer to this miner [tutorial](./docs/miner_tutorial.md) for detailed instructions on getting a miner up and running.
[Back to top ^][table-of-contents]
-### 2.3. Miners
+#### 2.1.2. Reference
+
+Once you have your miner set up, you can check out the miner [reference](./docs/miner_reference.md).
-Please refer to this [guide](./docs/miner_guide.md) for detailed instructions on getting a miner up and running.
+> đź’ˇ **TIP:** Are you having issues? Check out the [FAQs](./docs/miner_reference.md#21-faqs) section of the miner [reference](./docs/miner_reference.md).
[Back to top ^][table-of-contents]
-### 2.4. Validators
+### 2.2. Validators
-Please refer to this [guide](./docs/validator_guide.md) for detailed instructions on getting a validator up and running.
+Please refer to this [guide](./docs/validator_guide.md) for more detailed instructions on getting a validator up and running.
[Back to top ^][table-of-contents]
-### 2.5 Develop
+### 2.3 Develop
```shell
pip install -r requirements-dev.txt
@@ -354,9 +289,10 @@ pre-commit install
## đź“„ 3. License
-Please refer to the [LICENSE](./LICENSE) file.
+Please refer to the [LICENSE][license] file.
[Back to top ^][table-of-contents]
+[license]: https://github.com/mode-network/synth-subnet/blob/main/LICENSE
[table-of-contents]: #table-of-contents
diff --git a/docs/images/banner_logo.svg b/docs/images/banner_logo.svg
index 40ccdbc4..a65b998e 100644
--- a/docs/images/banner_logo.svg
+++ b/docs/images/banner_logo.svg
@@ -1,7 +1,13 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/images/synth_diagram@1920x1080.png b/docs/images/synth_diagram@1920x1080.png
index acb2b42d..d6f4e67f 100644
Binary files a/docs/images/synth_diagram@1920x1080.png and b/docs/images/synth_diagram@1920x1080.png differ
diff --git a/docs/miner_guide.md b/docs/miner_reference.md
similarity index 74%
rename from docs/miner_guide.md
rename to docs/miner_reference.md
index 098059f2..5540b079 100644
--- a/docs/miner_guide.md
+++ b/docs/miner_reference.md
@@ -1,11 +1,9 @@
-# Miner Guide
+# Miner Reference
-### Table Of Contents
+### Table of contents
-* [1. Create a Wallet](#1-create-a-wallet)
-* [2. Run the Miner](#2-run-the-miner)
-* [3. Options](#3-options)
- - [3.1. Common Options](#31-common-options)
+* [1. Options](#1-options)
+ - [1.1. Common Options](#11-common-options)
- [`--axon.port INTEGER`](#--axonport-integer)
- [`--blacklist.allow_non_registered BOOLEAN`](#--blacklistallow_non_registered-boolean)
- [`--blacklist.force_validator_permit BOOLEAN`](#--blacklistforce_validator_permit-boolean)
@@ -23,88 +21,18 @@
- [`--neuron.vpermit_tao_limit INTEGER`](#--neuronvpermit_tao_limit-integer)
- [`--wallet.hotkey TEXT`](#--wallethotkey-text)
- [`--wallet.name TEXT`](#--walletname-text)
- - [3.2. Weights & Bases Options](#32-weights--bases-options)
+ - [1.2. Weights & Bases Options](#12-weights--bases-options)
- [`--wandb.enabled BOOLEAN`](#--wandbenabled-boolean)
- [`--wandb.entity TEXT`](#--wandbentity-text)
- [`--wandb.project_name TEXT`](#--wandbenabled-boolean)
-* [4. Appendix](#4-appendix)
- - [4.1. Useful Commands](#41-useful-commands)
- - [4.2. Running Multiple Miners](#42-running-multiple-miners)
- - [4.3. Troubleshooting](#43-troubleshooting)
+* [2. Appendix](#2-appendix)
+ - [2.1. FAQs](#21-faqs)
+ - [2.2. Useful Commands](#22-useful-commands)
+ - [2.3. Troubleshooting](#23-troubleshooting)
-## 1. Create a Wallet
+## 1. Options
-> đź’ˇ **TIP:** For a more extensive list of the Bittensor CLI commands see [here](https://docs.bittensor.com/btcli).
-
-**Step 1: Activate the Python virtual environment**
-
-If you haven't already, ensure you are running from the Python virtual environment:
-```shell
-source bt_venv/bin/activate
-```
-
-**Step 2: Create the cold/hot wallets**
-
-```shell
-btcli wallet create \
- --wallet.name miner \
- --wallet.hotkey default
-```
-
-> 🚨 **WARNING:** You must ensure your wallets have enough TAO (0.1 should be sufficient) to be start mining. For testnet, you can use the [`btcli wallet faucet`](https://docs.bittensor.com/btcli#btcli-wallet-faucet).
-
-**Step 3: Register wallet**
-
-Acquire a slot on the Bittensor subnet by registering the wallet:
-```shell
-btcli subnet register \
- --wallet.name miner \
- --wallet.hotkey default \
- --netuid 50
-```
-
-**Step 4: Verify wallet registration (optional)**
-
-Check the wallet has been registered:
-```shell
-btcli wallet overview \
- --wallet.name miner \
- --wallet.hotkey default
-```
-
-You can also check the network metagraph:
-```shell
-btcli subnet metagraph \
- --netuid 50
-```
-
-[Back to top ^][table-of-contents]
-
-## 2. Run the Miner
-
-**Step 1: Activate the Python virtual environment**
-
-```shell
-source bt_venv/bin/activate
-```
-
-**Step 2: Start PM2 with the miner config**
-
-```shell
-pm2 start miner.config.js
-```
-
-**Step 2: Check the miner is running (optional)**
-
-```shell
-pm2 list
-```
-
-[Back to top ^][table-of-contents]
-
-## 3. Options
-
-### 3.1. Common Options
+### 1.1. Common Options
#### `--axon.port INTEGER`
@@ -666,7 +594,7 @@ pm2 start miner.config.js -- --wallet.name miner
[Back to top ^][table-of-contents]
-### 3.2. Weights & Bases Options
+### 1.2. Weights & Bases Options
#### `--wandb.enabled BOOLEAN`
@@ -764,54 +692,105 @@ pm2 start miner.config.js -- --wandb.project_name template-miners
[Back to top ^][table-of-contents]
-## 4. Appendix
+## 2. Appendix
-### 4.1. Useful Commands
+### 2.1. FAQs
-| Command | Description |
-|------------------------------|-----------------------------|
-| `pm2 stop miner` | Stops the miner. |
-| `pm2 logs miner --lines 100` | View the logs of the miner. |
+#### 1. What is the best way for me to track my miner’s performance?
-[Back to top ^][table-of-contents]
+Visit the Synth Miner Dashboard: [https://miners.synthdata.co/](https://miners.synthdata.co/).
-### 4.2. Running Multiple Miners
+#### 2. How long do I have to wait for my new miner to get the first CRPS score?
-In order to run multiple miners on the same machine, you must ensure that you correctly edit the `miner.config.js` file to allow for multiple apps.
+Assuming your setup is correct, and you're submitting predictions, it takes approximately 25–27 hours for your first score to appear. This is because the CRPS is calculated based on the actual price 24 hours after the prediction.
-Each app **MUST** use a separate wallet (see [here](#1-create-a-wallet) for instructions on how to create a wallet) and it **MUST** use a different port for the `--axon.port` parameter in the start-up script.
+#### 3. What does it mean when I check [https://synth.mode.network/validation/miner?uid=](https://synth.mode.network/validation/miner?uid=) and see: `{"validated":false,"reason":"Number of time points is incorrect: expected 289, got 288","response_time":"4.07"}`?
-An example for a config using multiple miners:
+It means your submission has the wrong number of time points. You should be submitting exactly 289 points for that prompt.
-```js
-// miner.config.js
-module.exports = {
- apps: [
- {
- name: 'miner-1',
- interpreter: 'python3',
- script: './neurons/miner.py',
- args: '--netuid 247 --logging.debug --logging.trace --subtensor.network test --wallet.name miner_1 --wallet.hotkey default --axon.port 8091',
- env: {
- PYTHONPATH: '.'
- },
- },
- {
- name: 'miner-2',
- interpreter: 'python3',
- script: './neurons/miner.py',
- args: '--netuid 247 --logging.debug --logging.trace --subtensor.network test --wallet.name miner_2 --wallet.hotkey default --axon.port 8092',
- env: {
- PYTHONPATH: '.'
- },
- },
- ],
-};
+#### 4. Why does my miner keep getting a CRPS score of -1?
+
+Your miner will receive a CRPS score of -1 if the prediction is not in the correct format.
+
+#### 5. What is the correct format for subnet-prompted predictions?
+
+A prediction is considered valid if it meets all the following conditions:
+* Submitted before the timeout specified by the validator.
+* Contains the required number of simulation paths (num_simulations in the prompt).
+* Each path has the correct number of time points:
+```python
+expected_time_points = (time_length / time_increment) + 1
```
+* The first point of all paths matches the prompt’s start_time.
+* All timestamps are in ISO format, e.g., 2025-07-15T20:59:00+00:00.
+* Time intervals between points match time_increment exactly (in seconds).
+* All price values are of type int or float.
+
+You can find the validation function here:
+
+[response_validation.py#L35](https://github.com/mode-network/synth-subnet/blob/d694aa0bff3742498296809699c86e45b037289c/synth/validator/response_validation.py#L35)
+
+And an example of the prompt parameters here:
+
+[validator.py#L71](https://github.com/mode-network/synth-subnet/blob/44921d343e6f8ba770558018a28508796ce2a3ce/neurons/validator.py#L71)
+
+#### 6. Synth is predicting multiple assets. How does each asset prediction contribute to the smoothed score?
+
+Each asset—BTC, ETH, and XAU—contributes equally to the smoothed score. This means your miner must perform consistently well across all three. Future assets added to Synth will have the same weighting, unless noted otherwise.
+
+#### 7. I am getting fair CRPS scores but my reward weight is still zero. Why?
+
+Miner reward weights are determined by a softmax function over a smoothed average of your CRPS scores over the past 10 days, using a 5-day half-life. This is subject to future change.
+
+#### 8. How do I improve my miner performance?
+
+Synth regularly publishes detailed miner performance reviews highlighting the strategies of top-performing miners. These reviews can help you optimize your own models.
+
+Explore them here: [https://mirror.xyz/synthdata.eth](https://mirror.xyz/synthdata.eth)
+
+#### 9. Do I need to run multiple miners?
+
+If you're using the same model per asset, no—rewards will be the same. If you're using different models, then yes, it's encouraged to experiment and find what works best.
+
+#### 10. Is there a penalty for turning off my miner for a period of time?
+
+Yes. If your miner doesn’t submit a prediction for a prompt, that prompt scores 0. This lowers your moving average CRPS, which directly impacts your reward weight.
+
+#### 11. Could someone explain how trust values are calculated?
+
+Trust is computed based on the subnet's scoring system, outlined here: [https://docs.bittensor.com/emissions#trust](https://docs.bittensor.com/emissions#trust)
+
+It aggregates individual miner scores into a consensus-based weighting system, which determines reward distribution based on prediction quality.
+
+#### 12. How much time do miners have to respond to a prompt?
+
+Each prompt contains a start_time, which acts as the deadline for your response. You’ll always have at least 2 minutes from when the prompt is sent. We recommend submitting your response within 40 seconds.
+
+#### 13. Is Synth running on a testnet too?
+
+Yes. The testnet UID is 247, and it functions identically to mainnet.
+
+#### 14. Once I start a miner using the guide on GitHub, where do I change the code to run my own model?
+
+Modify this function:
+
+[simulations.py#L10](https://github.com/mode-network/synth-subnet/blob/13642c4c3287da52c602ac8c629b26a7cdc66628/synth/miner/simulations.py#L10)
+
+Take into account all prompt parameters except sigma, which you may ignore.
+
+
+[Back to top ^][table-of-contents]
+
+### 2.2. Useful Commands
+
+| Command | Description |
+|------------------------------|-----------------------------|
+| `pm2 stop miner` | Stops the miner. |
+| `pm2 logs miner --lines 100` | View the logs of the miner. |
[Back to top ^][table-of-contents]
-### 4.3. Troubleshooting
+### 2.3. Troubleshooting
#### `ModuleNotFoundError: No module named 'simulation'`
diff --git a/docs/miner_tutorial.md b/docs/miner_tutorial.md
new file mode 100644
index 00000000..f7616f87
--- /dev/null
+++ b/docs/miner_tutorial.md
@@ -0,0 +1,358 @@
+# Miner Tutorial
+
+### Table of contents
+
+* [1. Requirements](#1-requirements)
+* [2. TL;DR](#2-tldr)
+ - [2.1. Clone the code and implement your model](#21-clone-the-code-and-implement-your-model)
+ - [2.2. Check that your model generates a valid response](#22-check-that-your-model-generates-a-valid-response)
+ - [2.3. Get a VM and open port `8091`](#23-get-a-vm-and-open-port-8091)
+ - [2.4. Create or import a Bittensor wallet](#24-create-or-import-a-bittensor-wallet)
+ - [2.5. Launch your miner with PM2](#25-launch-your-miner-with-pm2)
+ - [2.6. Verify the port is open](#26-verify-the-port-is-open)
+ - [2.7. Track your miner performance](#27-track-your-miner-performance)
+ - [2.8. Check your prediction validation](#28-check-your-prediction-validation)
+ - [2.9. More information](#29-more-information)
+* [3. Getting started](#3-getting-started)
+ - [3.1. Open ports](#31-open-ports)
+ - [3.1.1. Check open ports](#311-check-open-ports)
+ - [3.1.2. Open using `ufw`](#312-open-using-ufw)
+ - [3.1.3. Test open port](#313-test-open-port)
+ - [3.2. Add ingress rules (optional)](#32-add-ingress-rules-optional)
+ - [3.3. Set up the miner](#33-set-up-the-miner)
+ - [3.3.1. Install dependencies](#331-install-dependencies)
+ - [3.3.2. Clone the repository](#332-clone-the-repository)
+ - [3.3.3. Set up & activate Python virtual environment](#333-set-up--activate-python-virtual-environment)
+ - [3.4. Create a wallet](#34-create-a-wallet)
+ - [3.4.1. Create the cold/hot wallets](#341-create-the-coldhot-wallets)
+ - [3.4.2. Register the wallet](#342-register-the-wallet)
+ - [3.4.3. Verify the wallet registration (optional)](#343-verify-the-wallet-registration-optional)
+ - [3.5. Run the miner](#35-run-the-miner)
+ - [3.5.1. Start the miner](#351-start-the-miner)
+ - [3.5.2. Check the miner is running (optional)](#352-check-the-miner-is-running-optional)
+
+### 1. Requirements
+
+* [Ubuntu v20.04+](https://ubuntu.com/download)
+
+## 2. TL;DR
+
+### 2.1. Clone the code and implement your model
+
+* Clone the Synth subnet repository.
+* Modify the implementation of this function to run your own model: [simulations.py#L10](https://github.com/mode-network/synth-subnet/blob/13642c4c3287da52c602ac8c629b26a7cdc66628/synth/miner/simulations.py#L10)
+* Use all parameters from the prompt **except** `sigma`, which you may ignore.
+
+### 2.2. Check that your model generates a valid response
+
+* Run this command to test your model locally:
+```shell
+python synth/miner/run.py
+```
+
+* If your format is correct, you’ll see the output:
+
+```text
+$ CORRECT
+```
+
+### 2.3. Get a VM and open port `8091`
+
+* Ensure port **8091** is open in your cloud provider's **ingress rules**.
+* Configure your VM's **firewall** to allow inbound traffic on this port.
+
+### 2.4. Create or import a Bittensor wallet
+
+* Use `btcli` to:
+ - Create or import a wallet.
+ - Add funds.
+ - Register your hotkey (this will purchase a UID).
+
+### 2.5. Launch your miner with PM2
+
+* Create a new file called `miner.local.config.js` using the config from this link: [miner.config.js#L1](https://github.com/mode-network/synth-subnet/blob/f231c7b9151de6382d11e8102ae70c6b3f1b1fc7/miner.config.js#L1)
+* Modify the wallet name and hotkey name as needed.
+* Start the miner with PM2:
+```shell
+pm2 start miner.local.config.js
+```
+
+### 2.6. Verify the port is open
+
+* Your port will only be accessible if:
+ - The miner is actively running.
+ - Port 8091 is open on the VM and network level.
+* You can verify using this tool: [https://www.yougetsignal.com/tools/open-ports](https://www.yougetsignal.com/tools/open-ports).
+
+### 2.7. Track your miner performance
+
+* View miner performance and stats on:
+ - [Taostats (Subnet 50)](https://taostats.io/subnets/50/chart)
+ - [Synth Miner Dashboard](https://miners.synthdata.co/)
+
+### 2.8. Check your prediction validation
+
+* View validation status of your last submission:
+
+```text
+https://api.synthdata.co/validation/miner?uid=
+```
+
+### 2.9. More information
+
+* Explore the full Synth API documentation: [https://api.synthdata.co](https://api.synthdata.co)
+
+## 3. Getting started
+
+### 3.1. Open ports
+
+To ensure a miner can successfully connect to the network, the port `8091` **MUST** be open.
+
+[Back to top ^][table-of-contents]
+
+#### 3.1.1. Check open ports
+
+Before the beginning, check what ports are open:
+
+```shell
+nmap localhost
+```
+
+which should output:
+
+```text
+$ nmap localhost
+
+Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-15 12:43 CEST
+Nmap scan report for localhost (127.0.0.1)
+Host is up (0.000079s latency).
+Not shown: 998 closed ports
+PORT STATE SERVICE
+22/tcp open ssh
+80/tcp open http
+631/tcp open ipp
+
+Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
+```
+
+> ⚠️ **NOTE**: You can install `nmap` via `sudo apt install nmap`.
+
+[Back to top ^][table-of-contents]
+
+#### 3.1.2. Open using `ufw`
+
+It is **RECOMMENDED** that `ufw` (Uncomplicated Firewall) is used to handle port connections.
+
+`ufw` is a minimal front-end for managing iptables rules. It allows you to easily open ports with simple commands
+
+First, enable `ufw` using:
+
+```shell
+sudo ufw enable
+```
+
+Next, allow incoming traffic on the correct port:
+
+```shell
+sudo ufw allow 8091
+```
+
+To ensure the port is accessible and the rule is active, execute:
+
+```shell
+sudo ufw status
+```
+
+which should output:
+
+```text
+$ sudo ufw status
+
+Status: active
+
+To Action From
+-- ------ ----
+8091 ALLOW Anywhere
+8091 (v6) ALLOW Anywhere (v6)
+```
+
+[Back to top ^][table-of-contents]
+
+#### 3.1.3. Test open port
+
+Using `nmap` you can check if the port is open using:
+
+```shell
+nmap -p 8091 localhost
+```
+
+which should output:
+
+```text
+$ nmap -p 8091 localhost
+
+Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-15 12:50 CEST
+Nmap scan report for localhost (127.0.0.1)
+Host is up (0.000073s latency).
+
+PORT STATE SERVICE
+8091/tcp open jamlink
+
+Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
+```
+
+[Back to top ^][table-of-contents]
+
+### 3.2. Add ingress rules (optional)
+
+If you have set up your miner on a remote server/VM using a cloud provider (GCP, AWS, Azure, e.t.c.), you will also need to add an ingress rule on port TCP/8091 to allow for incoming connections.
+
+Please refer to your cloud provider's documentation on adding ingress rules to your server.
+
+[Back to top ^][table-of-contents]
+
+### 3.3. Set up the miner
+
+#### 3.3.1. Install dependencies
+
+Install rust:
+
+```shell
+curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+```
+
+Add the required `apt` repositories:
+
+```shell
+sudo add-apt-repository ppa:deadsnakes/ppa
+```
+
+> ⚠️ **NOTE:** The [deadsnakes](https://github.com/deadsnakes) repository, while unofficial, it is hugely popular and used by many Python projects.
+
+
+Install Python and Node/npm:
+
+```shell
+sudo apt update && \
+ sudo apt install nodejs npm python3.10 python3.10-venv pkg-config
+```
+
+Install [PM2](https://pm2.io/) via npm:
+
+```shell
+sudo npm install pm2 -g
+```
+
+[Back to top ^][table-of-contents]
+
+#### 3.3.2. Clone the repository
+
+Clone the synth subnet repository:
+
+```shell
+git clone https://github.com/mode-network/synth-subnet.git
+```
+
+Change directory to the project root
+
+```shell
+cd ./synth-subnet
+```
+
+[Back to top ^][table-of-contents]
+
+#### 3.3.3. Set up & activate Python virtual environment
+
+Create a new Python virtual environment:
+
+```shell
+python3.10 -m venv bt_venv
+```
+
+Activate and switch to the newly created Python virtual environment:
+
+```shell
+source bt_venv/bin/activate
+```
+
+> ⚠️ **NOTE**: This should activate the `bt_venv` environment, and you will see the command line prefixed with `(bt_venv)`.
+
+Install local Python dependencies within the virtual environment:
+
+```shell
+pip install -r requirements.txt
+```
+
+[Back to top ^][table-of-contents]
+
+### 3.4. Create a wallet
+
+> đź’ˇ **TIP:** For a more extensive list of the Bittensor CLI commands see [here](https://docs.bittensor.com/btcli).
+
+### 3.4.1. Create the cold/hot wallets
+
+You will need to create the cold and hot wallets:
+
+```shell
+btcli wallet create \
+ --wallet.name miner \
+ --wallet.hotkey default
+```
+
+> 🚨 **WARNING:** You must ensure your wallets have enough TAO (0.25 should be enough) to be able to start mining. For testnet, check out the faucet on the Discord.
+
+[Back to top ^][table-of-contents]
+
+### 3.4.2. Register the wallet
+
+Next, register the wallets by acquiring a slot on the Bittensor subnet:
+```shell
+btcli subnet register \
+ --wallet.name miner \
+ --wallet.hotkey default \
+ --netuid 50
+```
+`
+[Back to top ^][table-of-contents]
+
+### 3.4.3. Verify the wallet registration (optional)
+
+You can verify the wallet registration by running:
+```shell
+btcli wallet overview \
+ --wallet.name miner \
+ --wallet.hotkey default
+```
+
+And, you can also check the network metagraph:
+```shell
+btcli subnet metagraph \
+ --netuid 50
+```
+
+[Back to top ^][table-of-contents]
+
+### 3.5. Run the miner
+
+#### 3.5.1. Start the miner
+
+Simply start PM2 with the miner config:
+
+```shell
+pm2 start miner.config.js
+```
+
+[Back to top ^][table-of-contents]
+
+#### 3.5.2. Check the miner is running (optional)
+
+You can check if the miner is running by using:
+
+```shell
+pm2 list
+```
+
+[Back to top ^][table-of-contents]
+
+
+[table-of-contents]: #table-of-contents
diff --git a/docs/validator_guide.md b/docs/validator_guide.md
index aee3a2fe..d890ad66 100644
--- a/docs/validator_guide.md
+++ b/docs/validator_guide.md
@@ -2,10 +2,12 @@
### Table Of Contents
-* [1. Create a Wallet](#1-create-a-wallet)
-* [2. Run the Validator](#2-run-the-validator)
-* [3. Options](#3-options)
- - [3.1. Common Options](#31-common-options)
+* [1. Requirements](#1-requirements)
+* [2. Setup](#2-setup)
+* [3. Create a Wallet](#3-create-a-wallet)
+* [4. Run the Validator](#4-run-the-validator)
+* [5. Options](#5-options)
+ - [5.1. Common Options](#51-common-options)
- [`--axon.port INTEGER`](#--axonport-integer)
- [`--ewma.cutoff_days INTEGER`](#--ewmacutoff_days-integer)
- [`--ewma.half_life_days FLOAT`](#--ewmahalf_life_days-float)
@@ -26,12 +28,87 @@
- [`--neuron.vpermit_tao_limit INTEGER`](#--neuronvpermit_tao_limit-integer)
- [`--wallet.hotkey TEXT`](#--wallethotkey-text)
- [`--wallet.name TEXT`](#--walletname-text)
- - [3.2. Logging Options](#32-logging-options)
+ - [5.2. Logging Options](#52-logging-options)
- [`--gcp.log_id_prefix TEXT`](#--gcplog_id_prefix-text)
-* [4. Appendix](#4-appendix)
- - [4.1. Useful Commands](#41-useful-commands)
+* [6. Appendix](#4-appendix)
+ - [6.1. Useful Commands](#41-useful-commands)
-## 1. Create a Wallet
+### 1. Requirements
+
+* [Git](https://github.com/git-guides/install-git)
+* [Ubuntu v20.04+](https://ubuntu.com/download)
+
+[Back to top ^][table-of-contents]
+
+### 2. Setup
+
+**Step 1: Clone the repository**
+
+```shell
+git clone https://github.com/mode-network/synth-subnet.git
+```
+
+**Step 2: Change directory to the project root**
+
+```shell
+cd ./synth-subnet
+```
+
+**Step 3: Add the required repositories**
+
+```shell
+sudo add-apt-repository ppa:deadsnakes/ppa
+```
+
+> ⚠️ **NOTE:** The [deadsnakes](https://github.com/deadsnakes) repository, while unofficial, it is hugely popular and used by many Python projects.
+
+**Step 4: Install Rust**
+
+```shell
+curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+```
+
+**Step 5: Install the dependencies**
+
+```shell
+sudo apt update && \
+ sudo apt install nodejs npm python3.10 pkg-config
+```
+
+**Step 6: Install [PM2](https://pm2.io/)**
+
+```shell
+sudo npm install pm2 -g
+```
+
+**Step 7: Install the Python environment**
+
+```shell
+sudo apt install python3.10-venv
+```
+
+**Step 8: Create a new Python environment**
+
+```shell
+python3.10 -m venv bt_venv
+```
+
+**Step 9: Activate and switch to the newly created Python virtual environment**
+
+```shell
+source bt_venv/bin/activate
+```
+
+This should activate the `bt_venv` environment and you should see the command line prefixed with `(bt_venv)`.
+
+**Step 10: Install local Python dependencies**
+
+With the Python virtual environment active, install the Python dependencies:
+```shell
+pip install -r requirements.txt
+```
+
+## 3. Create a Wallet
> đź’ˇ **TIP:** For a more extensive list of the Bittensor CLI commands see [here](https://docs.bittensor.com/btcli).
@@ -91,12 +168,12 @@ btcli subnet metagraph \
[Back to top ^][table-of-contents]
-## 2. Run the Validator
+## 4. Run the Validator
**Step 1: Database setup**
- Create a postgres database with the name "synth"
- Rename the ".env.example" in the root of the repo to ".env"
-- Update the DB_URL in ".env" file to correct postgres server IP, username and password
+- Update the `.env` file with your database credentials.
**Step 2: Activate the Python virtual environment**
@@ -123,9 +200,9 @@ pm2 list
[Back to top ^][table-of-contents]
-## 3. Options
+## 5. Options
-### 3.1. Common Options
+### 5.1. Common Options
#### `--axon.port INTEGER`
@@ -781,7 +858,7 @@ pm2 start validator.config.js -- --wallet.name validator
[Back to top ^][table-of-contents]
-### 3.2. Logging Options
+### 5.2. Logging Options
#### `--gcp.log_id_prefix TEXT`
@@ -813,9 +890,9 @@ pm2 start validator.config.js -- --gcp.log_id_prefix my_validator_name
[Back to top ^][table-of-contents]
-## 4. Appendix
+## 6. Appendix
-### 4.1. Useful Commands
+### 6.1. Useful Commands
| Command | Description |
|----------------------------------|---------------------------------|