1. Preparing
Review the requirements
Choose how you will run the node
2. Installing the Node
Fortytwo App
Fortytwo Container
Fortytwo CLI
- macOS
- Windows
- Linux (Ubuntu/Debian)
3. Operating Your Node
The node will remain fully operational until it is stopped by the user, the application is closed by the user or the system restarts. You can minimize or close the application window, switch to other applications – the node will continue running in the background and will be available in system tray.Updating Your Node
Fortytwo App updates automatically. Sometimes the user might be asked to restart the application to install the most recent updates.If you face issues with the updates, you can manually check the current version of።‖ Fortytwo App on the Changelog page, and then manually download and reinstall the app using the current version links:You can find your current app version in the About window.macOS: Updating from Versions 0.2.1 and Earlier
Unwrap for details
Unwrap for details
- You can safely enter your password and click “Always Allow” to avoid future prompts
- Or you can delete the previous data and restore your profile in the new version as described below:
Steps for macOS users to reset the app data
Steps for macOS users to reset the app data
Export your private key
- Right click on the Fortytwo App icon in the Menu Bar.
- Select
Account>Export Private Key. - Select destination and confirm.
Delete the old app
Delete the files left from the old app
~/Fortytwo
/users/{username}/Fortytwo
Delete the old record
security delete-generic-password -s "Fortytwo Safe Storage" || true
Install the latest version of the Fortytwo App
Launch the App
hardware
Nvidia graphic card(s) on Windows or Linux
CPU on x86_64 architecture
software
Installed NVIDIA Container Toolkit
Installed Docker
Installed Git
Get the repository
Fortytwo Inference Node Setup
Cloning the Repository from GitHub
Cloning the Repository from GitHub
- Windows
- Linux (Ubuntu/Debian)
Install Git .
cd command, or run the following command to continue installation in the default location in your home directory:New-Item -Path "$HOME\FortytwoContainer" -ItemType Directory -Force; Set-Location "$HOME\FortytwoContainer"
git clone https://github.com/Fortytwo-Network/fortytwo-inference-node-setup
cd fortytwo-inference-node-setup
cd command, or run the following command to continue installation in the default location in your home directory:mkdir -p ~/FortytwoContainer && cd ~/FortytwoContainer
git clone https://github.com/Fortytwo-Network/fortytwo-inference-node-setup
cd fortytwo-inference-node-setup
Get the private key of your Web3 account
For example: if you intend to run 8 nodes on 8×GPU rig at the same time, you will need 8 private keys.
Wallet and Account Management
A. Create a new Web3 account with an activation code
A. Create a new Web3 account with an activation code
- Create a new account
make get-drop PRIVATE_KEY_PATH=$PATH_TO_SAVED_KEY CODE=$ACTIVATION_CODE
$PATH_TO_SAVED_KEY — The path where the file with your private key will be generated.- Make sure that the defined path exists.
- If
.account_private_keyalready exists in this locaiton, it will be ovewritten.
$ACTIVATION_CODE — Your activation code. It can only be used once.When executed, a new private key named .account_private_key will be generated at the defined path.- Get your private key address.
.account_private_key file is a hidden file by default. Reveal it. Text inside it is your private key.Platform-specific notes on how to reveal hidden files
Platform-specific notes on how to reveal hidden files
- macOS
- Windows
- Open the folder in Finder.
- Press
Command + Shift + .to toggle hidden file visibility.
- Open File Explorer.
- Select the View tab from the top menu.
- Click Show → Hidden items.
- Hidden files and folders (including
.account_private_key) will now be visible.
B. Connect the existing Web3 account with an activation code
B. Connect the existing Web3 account with an activation code
- Connect your wallet to the program
make get-drop WALLET=$PUBLIC_WALLET_ADDRESS CODE=$ACTIVATION_CODE
$PUBLIC_WALLET_ADDRESS — Your Web3 EVM-compatible account’s public address.$ACTIVATION_CODE — Your activation code. It can be used only once.This command will add the wallet you defined to the gas compensation program.- Get your private key address.
C. Migrate to Fortytwo Container from an already existing node
C. Migrate to Fortytwo Container from an already existing node
D. Fund an existing Web3 account on your own
D. Fund an existing Web3 account on your own
- One node per machine
- Multi-node setup on a single machine
Setup the `.env` file
.env file from the .env.example reference file and update the environment variables:cp .env.example .env
.env file and specify unique credentials for the node:FT_ACCOUNT_PRIVATE_KEY— Unique Web3 account private keyFT_CAPSULE_LLM_HF_REPOandFT_CAPSULE_LLM_HF_MODEL_NAME— Unique model credentials
Unwrap for .env setup example
Unwrap for .env setup example
# protocol
FT_ACCOUNT_PRIVATE_KEY=$YOUR-UNIQUE-PRIVATE-KEY
FT_NODE_LISTENER_PORT=42042
# capsule
FT_CAPSULE_HTTP_HOST="0.0.0.0"
FT_CAPSULE_HTTP_PORT=42442
FT_CAPSULE_LLM_HF_REPO=Fortytwo-Network/Strand-Rust-Coder-14B-v1-GGUF
FT_CAPSULE_LLM_HF_MODEL_NAME=Fortytwo_Strand-Rust-Coder-14B-v1-Q4_K_M.gguf
INPUT_MODEL_CACHE=./model_cache
Pre-download the model
Use this command to download a model:
make download-llm LLM_HF_REPO=$REPO-ID LLM_HF_MODEL_NAME=$MODEL-ID
make download-llm LLM_HF_REPO=Fortytwo-Network/Strand-Rust-Coder-14B-v1-GGUF LLM_HF_MODEL_NAME=Fortytwo_Strand-Rust-Coder-14B-v1-Q4_K_M.gguf
Launching the Node
If restarting your node after relaunching the terminal/OS, don’t forget that the following should be executed from the node repository folder, where your.env and docker-compose.yml are located.Update the repository
git pull command:git pull
Launch Docker
Build the Docker Compose services
docker compose build
Run the services in the background
docker compose up -d
.env file is not pre-downloaded, then your node will download it at startup.In that case Capsule module might report “unhealthy” status if the download is too big. Note that it is not a bug with your setup.
Technically, your Capsule is still downloading the model and will start when it is ready. However, in this case, you will have to manually observe when your capsule will launch inside the Docker application, watch for the
fortytwo-capsule container, then start the fortytwo-protocol container from inside the Docker application.The easiest way to not catch this behavior right now is to pre-download the models from step #4.How to Make Sure it Works?
If everything went successfully, after launch, you can verify that the nodes are running correctly with:docker ps
fortytwo-inference-node-setup process running.If you unwrap it, you can see the logging of the node running successfully with two containers:fortytwo-capsule— Capsule reports on the model loading and performing. Starts first.fortytwo-protocol— Protocol reports on the network. Protocol starts only after Capsule is all set and ready.
View Logs
docker compose logs -f -t --tail 100
Change
--tail option to another value if required.Export Logs
- macOS
- Windows
- Linux (Ubuntu/Debian)
MACOS IS CURRENTLY NOT SUPPORTEDdocker compose logs -t > "ft_node_logs_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
docker compose logs -t > "ft_node_logs_$(date +'%Y%m%d_%H%M%S').txt"
Setup the `.env` files
.env file. Since we want to run 3 nodes, we will be creating 3 environment files from the .env.example reference file and update the environment variables:cp .env.example .env.strand-rust-coder
cp .env.example .env.vibethinker
cp .env.example .env.qwen
.env file and specify the unique credentials for each node:FT_ACCOUNT_PRIVATE_KEY— Unique Web3 account private keyFT_NODE_LISTENER_PORT— Unique portFT_CAPSULE_LLM_HF_REPOandFT_CAPSULE_LLM_HF_MODEL_NAME— Unique model credentials
.env.strand-rust-coder
.env.strand-rust-coder
# protocol
FT_ACCOUNT_PRIVATE_KEY=$YOUR-FIRST-UNIQUE-PRIVATE-KEY
FT_NODE_LISTENER_PORT=42042
# capsule
FT_CAPSULE_HTTP_HOST="0.0.0.0"
FT_CAPSULE_HTTP_PORT=42442
FT_CAPSULE_LLM_HF_REPO=Fortytwo-Network/Strand-Rust-Coder-14B-v1-GGUF
FT_CAPSULE_LLM_HF_MODEL_NAME=Fortytwo_Strand-Rust-Coder-14B-v1-Q4_K_M.gguf
INPUT_MODEL_CACHE=./model_cache
.env.vibethinker
.env.vibethinker
# protocol
FT_ACCOUNT_PRIVATE_KEY=$YOUR-SECOND-UNIQUE-PRIVATE-KEY
FT_NODE_LISTENER_PORT=42043
# capsule
FT_CAPSULE_HTTP_HOST="0.0.0.0"
FT_CAPSULE_HTTP_PORT=42442
FT_CAPSULE_LLM_HF_REPO=mradermacher/VibeThinker-1.5B-GGUF
FT_CAPSULE_LLM_HF_MODEL_NAME=VibeThinker-1.5B.Q4_K_M.gguf
INPUT_MODEL_CACHE=./model_cache
.env.qwen
.env.qwen
# protocol
FT_ACCOUNT_PRIVATE_KEY=$YOUR-THIRD-UNIQUE-PRIVATE-KEY
FT_NODE_LISTENER_PORT=42044
# capsule
FT_CAPSULE_HTTP_HOST="0.0.0.0"
FT_CAPSULE_HTTP_PORT=42442
FT_CAPSULE_LLM_HF_REPO=unsloth/Qwen3-1.7B-GGUF
FT_CAPSULE_LLM_HF_MODEL_NAME=Qwen3-1.7B-Q4_K_M.gguf
INPUT_MODEL_CACHE=./model_cache
Pre-download models
Use this command to download a model:
make download-llm LLM_HF_REPO=$REPO-ID LLM_HF_MODEL_NAME=$MODEL-ID
make download-llm LLM_HF_REPO=Fortytwo-Network/Strand-Rust-Coder-14B-v1-GGUF LLM_HF_MODEL_NAME=Fortytwo_Strand-Rust-Coder-14B-v1-Q4_K_M.gguf
make download-llm LLM_HF_REPO=mradermacher/VibeThinker-1.5B-GGUF LLM_HF_MODEL_NAME=VibeThinker-1.5B.Q4_K_M.gguf
make download-llm LLM_HF_REPO=unsloth/Qwen3-1.7B-GGUF LLM_HF_MODEL_NAME=Qwen3-1.7B-Q4_K_M.gguf
Create Docker Compose files
docker-compose.yml reference:cp docker-compose.yml docker-compose-strand-rust-coder.yml
cp docker-compose.yml docker-compose-vibethinker.yml
cp docker-compose.yml docker-compose-qwen.yml
Plan the GPU usage
nvidia-smi
- For Fortytwo_Strand-Rust-Coder — Use GPU #1 and #2
- For VibeThinker — Use GPU #0
- For Qwen3 — Use GPU #3
GPU order doesn’t matter here.
nvidia-smi output should be as follows:+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.195.03 Driver Version: 570.195.03 CUDA Version: 12.8 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA A10G Off | 00000000:00:1B.0 Off | 0 |
| 0% 29C P0 58W / 300W | 0MiB / 23028MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
| 1 NVIDIA A10G Off | 00000000:00:1C.0 Off | 0 |
| 0% 28C P0 56W / 300W | 0MiB / 23028MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
| 2 NVIDIA A10G Off | 00000000:00:1D.0 Off | 0 |
| 0% 28C P0 58W / 300W | 0MiB / 23028MiB | 3% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
| 3 NVIDIA A10G Off | 00000000:00:1E.0 Off | 0 |
| 0% 28C P0 56W / 300W | 0MiB / 23028MiB | 2% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
Assign GPUs to Each Node
docker-compose-strand-rust-coder.yml
docker-compose-strand-rust-coder.yml
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['1', '2'] # Assign to GPUs 1 and 2
capabilities:
- gpu
docker-compose-vibethinker.yml
docker-compose-vibethinker.yml
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['0'] # Assign to GPU 0
capabilities:
- gpu
docker-compose-qwen.yml
docker-compose-qwen.yml
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['3'] # Assign to GPU 3
capabilities:
- gpu
device_ids: ['all'] will assign all available GPUs for that node.Launching the Node
If you are restarting your node after relaunching the terminal/OS, don’t forget that the following should be executed from the node repository folder, where your.env and custom docker compose .yml files are located.Update the repository
git pull command:git pull
Launch Docker
Build the Docker Compose services
docker compose build
Run the services in the background
docker compose -f docker-compose-strand-rust-coder.yml --env-file .env.strand-rust-coder -p strand-rust-coder up -d
docker compose -f docker-compose-vibethinker.yml --env-file .env.vibethinker -p vibethinker up -d
docker compose -f docker-compose-qwen.yml --env-file .env.qwen -p qwen up -d
In that case, the Capsule module might report “unhealthy” status if the download is too big. Note that it is not an issue with your setup.
Technically, your Capsule is still downloading the model and will start when it is ready. However, in this case, you will have to manually observe when your capsule launches inside the Docker application, watch for the
fortytwo-capsule container, then start the fortytwo-protocol container from inside the Docker application.The easiest way to avoid this behavior at the moment is to pre-download the models from step #4.How to Make Sure it Works?
After launch, you can verify that the nodes are running correctly with this command:docker ps
strand-rust-coder, vibethinker, and qwen processes running.If you unwrap each one of them, you can see the logging of the node running successfully with two containers:-
fortytwo-capsule— Capsule reports on the model loading and performance. Starts first. -
fortytwo-protocol— Protocol reports on the network. Protocol starts only after Capsule is set and ready.
View Logs
docker compose logs -f -t --tail 100
Change
--tail option to another value if required.If you only want to see the logs of a particular process, replace docker-compose-name.yml with that process’s name.docker compose -f docker-compose-name.yml logs -f -t --tail 100
Export Logs
- macOS
- Windows
- Linux (Ubuntu/Debian)
MACOS IS CURRENTLY NOT SUPPORTEDdocker compose logs -t > "ft_node_logs_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
docker compose logs -t > "ft_node_logs_$(date +'%Y%m%d_%H%M%S').txt"
docker-compose-name.yml with that process’s name.- macOS
- Windows
- Linux (Ubuntu/Debian)
MACOS IS CURRENTLY NOT SUPPORTEDdocker compose -f docker-compose-name.yml logs -t > "ft_node_logs_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
docker compose -f docker-compose-name.yml logs -t > "ft_node_logs_$(date +'%Y%m%d_%H%M%S').txt"
3. Operating Your Node
The node will remain fully operational until it is terminated by the user or the system restarts.Updating Your Node
The node components update automatically every time it is launched and while operational.However, you need to manually update the repository to get the latest environment updates.At every start, execture the following command.git pull
⊡ Fortytwo Container update available, stop your node, run the git pull command, and then restart the node. These commands will let you compare your current version to remote version:git fetch
git log -1 origin/main --format="Remote: %h %ci"
git log -1 --format="Local: %h %ci"
Stopping Your Node
To stop a running container, either stop it from the Docker interface, or execute the following command from the folder where thedocker-compose.yml is located:docker compose down
docker-compose-name.yml with that process’s name.docker compose -f docker-compose-name.yml down
- macOS
- Windows
- Linux (Ubuntu/Debian)
cd command, or run the following command to continue installation in the default location in your home directory:mkdir -p ~/FortytwoCLI && cd ~/FortytwoCLI
curl -L -o fortytwo-console-app.zip https://github.com/Fortytwo-Network/fortytwo-console-app/archive/refs/heads/main.zip
unzip fortytwo-console-app.zip -d . && rm fortytwo-console-app.zip
cd fortytwo-console-app-main
chmod +x macos.sh && ./macos.sh
cd command, or run the following command to continue installation in the default location in your home directory:New-Item -Path "$HOME\FortytwoCLI" -ItemType Directory -Force; Set-Location "$HOME\FortytwoCLI"
Invoke-WebRequest -Uri "https://github.com/Fortytwo-Network/fortytwo-console-app/archive/refs/heads/main.zip" -OutFile "fortytwo-console-app.zip"
Expand-Archive -Path fortytwo-console-app.zip -DestinationPath . -Force; Remove-Item -Path fortytwo-console-app.zip
cd fortytwo-console-app-main
Unblock-File -Path .\windows.ps1
powershell -ExecutionPolicy Bypass -File .\windows.ps1
cd command, or run the following command to continue installation in the default location in your home directory:mkdir -p ~/FortytwoCLI && cd ~/FortytwoCLI
curl -L -o fortytwo-console-app.zip https://github.com/Fortytwo-Network/fortytwo-console-app/archive/refs/heads/main.zip
unzip fortytwo-console-app.zip
cd fortytwo-console-app-main
chmod +x linux.sh && ./linux.sh
3. Operating Your Node
The node will remain fully operational until it is terminated by the user or the system restarts. You can minimize the terminal window or switch to other applications – the node will continue running in the background.Updating Your Node
Fortytwo node automatically updates every time it is launched. When you start the node, it checks for the latest available version and installs any updates before running.If you face issues with the updates, you can manually check the current version of>_ Fortytwo CLI on the Changelog page, and then manually download and reinstall the app.You can find your current version under ◰ Setup script — version validation when lauhcing the CLI script.Stopping Your Node
Press Ctrl+C in the terminal window to terminate the node process.Restarting Fortytwo Node
Fortytwo to FortytwoCLI. If you’ve installed your Fortytwo CLI before this date, your default path will differ. To access the folder, look for Fortytwo instead of FortytwoCLI.- macOS
- Windows
- Linux (Ubuntu/Debian)
cd ~/FortytwoCLI/fortytwo-console-app-main
./macos.sh
Set-Location "$HOME\FortytwoCLI\fortytwo-console-app-main"
powershell -ExecutionPolicy Bypass -File .\windows.ps1
cd ~/FortytwoCLI/fortytwo-console-app-main
./linux.sh