diff --git a/testnet/generate.sh b/testnet/generate.sh
new file mode 100644
index 0000000..42ce5d2
--- /dev/null
+++ b/testnet/generate.sh
@@ -0,0 +1,16 @@
+# Codex Testnet - Generate
+
+# Variables
+set -a
+BASE_SCRIPT="https://get.codex.storage/generate.sh"
+SCRIPT_URL="https://get.codex.storage/testnet/generate.sh"
+set +a
+
+# Help
+if [[ $1 == *"help"* ]] ; then
+ curl -s "${BASE_SCRIPT}" | bash -s -- help
+ exit 0
+fi
+
+# Generate
+curl -s "${BASE_SCRIPT}" | bash
diff --git a/testnet/index.html b/testnet/index.html
new file mode 100644
index 0000000..76d4415
--- /dev/null
+++ b/testnet/index.html
@@ -0,0 +1,44 @@
+
+
+
+ Join Codex Testnet
+
+
+
+
+
+ Join Codex Testnet - Linux, macOS and Windows (msys2)
+
+
+
+
+ # Install Codex
+
+
+ curl -s https://get.codex.storage/testnet/install.sh | bash
+
+
+
+
+ # Generate key
+
+
+ curl -s https://get.codex.storage/testnet/generate.sh | bash
+
+
+
+
+ # Run Codex
+
+
+ curl -s https://get.codex.storage/testnet/generate.sh | bash
+
+
+
diff --git a/testnet/install.sh b/testnet/install.sh
new file mode 100644
index 0000000..b423966
--- /dev/null
+++ b/testnet/install.sh
@@ -0,0 +1,17 @@
+# Codex Testnet - Install
+
+# Variables
+set -a
+BASE_SCRIPT="https://get.codex.storage/install.sh"
+SCRIPT_URL="https://get.codex.storage/testnet/install.sh"
+INSTALL_DIR="${INSTALL_DIR:-.}"
+set +a
+
+# Help
+if [[ $1 == *"help"* ]] ; then
+ curl -s "${BASE_SCRIPT}" | bash -s -- help
+ exit 0
+fi
+
+# Install
+curl -s "${BASE_SCRIPT}" | bash
diff --git a/testnet/run.sh b/testnet/run.sh
new file mode 100644
index 0000000..5e7aa5d
--- /dev/null
+++ b/testnet/run.sh
@@ -0,0 +1,26 @@
+# Codex Testnet - Run
+
+# Variables
+set -a
+BASE_SCRIPT="https://get.codex.storage/run.sh"
+SCRIPT_URL="https://get.codex.storage/testnet/run.sh"
+CODEX_BINARY="${CODEX_BINARY:-./codex}"
+bootstrap_nodes=(
+ --bootstrap-node=spr:CiUIAhIhAiJvIcA_ZwPZ9ugVKDbmqwhJZaig5zKyLiuaicRcCGqLEgIDARo8CicAJQgCEiECIm8hwD9nA9n26BUoNuarCEllqKDnMrIuK5qJxFwIaosQ3d6esAYaCwoJBJ_f8zKRAnU6KkYwRAIgM0MvWNJL296kJ9gWvfatfmVvT-A7O2s8Mxp8l9c8EW0CIC-h-H-jBVSgFjg3Eny2u33qF7BDnWFzo7fGfZ7_qc9P
+ --bootstrap-node=spr:CiUIAhIhAyUvcPkKoGE7-gh84RmKIPHJPdsX5Ugm_IHVJgF-Mmu_EgIDARo8CicAJQgCEiEDJS9w-QqgYTv6CHzhGYog8ck92xflSCb8gdUmAX4ya78QoemesAYaCwoJBES39Q2RAnVOKkYwRAIgLi3rouyaZFS_Uilx8k99ySdQCP1tsmLR21tDb9p8LcgCIG30o5YnEooQ1n6tgm9fCT7s53k6XlxyeSkD_uIO9mb3
+ --bootstrap-node=spr:CiUIAhIhA6_j28xa--PvvOUxH10wKEm9feXEKJIK3Z9JQ5xXgSD9EgIDARo8CicAJQgCEiEDr-PbzFr74--85TEfXTAoSb195cQokgrdn0lDnFeBIP0QzOGesAYaCwoJBK6Kf1-RAnVEKkcwRQIhAPUH5nQrqG4OW86JQWphdSdnPA98ErQ0hL9OZH9a4e5kAiBBZmUl9KnhSOiDgU3_hvjXrXZXoMxhGuZ92_rk30sNDA
+ --bootstrap-node=spr:CiUIAhIhA7E4DEMer8nUOIUSaNPA4z6x0n9Xaknd28Cfw9S2-cCeEgIDARo8CicAJQgCEiEDsTgMQx6vydQ4hRJo08DjPrHSf1dqSd3bwJ_D1Lb5wJ4Qt_CesAYaCwoJBEDhWZORAnVYKkYwRAIgFNzhnftocLlVHJl1onuhbSUM7MysXPV6dawHAA0DZNsCIDRVu9gnPTH5UkcRXLtt7MLHCo4-DL-RCMyTcMxYBXL0
+ --bootstrap-node=spr:CiUIAhIhAzZn3JmJab46BNjadVnLNQKbhnN3eYxwqpteKYY32SbOEgIDARo8CicAJQgCEiEDNmfcmYlpvjoE2Np1Wcs1ApuGc3d5jHCqm14phjfZJs4QrvWesAYaCwoJBKpA-TaRAnViKkcwRQIhANuMmZDD2c25xzTbKSirEpkZYoxbq-FU_lpI0K0e4mIVAiBfQX4yR47h1LCnHznXgDs6xx5DLO5q3lUcicqUeaqGeg
+ --bootstrap-node=spr:CiUIAhIhAgybmRwboqDdUJjeZrzh43sn5mp8jt6ENIb08tLn4x01EgIDARo8CicAJQgCEiECDJuZHBuioN1QmN5mvOHjeyfmanyO3oQ0hvTy0ufjHTUQh4ifsAYaCwoJBI_0zSiRAnVsKkcwRQIhAJCb_z0E3RsnQrEePdJzMSQrmn_ooHv6mbw1DOh5IbVNAiBbBJrWR8eBV6ftzMd6ofa5khNA2h88OBhMqHCIzSjCeA
+ --bootstrap-node=spr:CiUIAhIhAntGLadpfuBCD9XXfiN_43-V3L5VWgFCXxg4a8uhDdnYEgIDARo8CicAJQgCEiECe0Ytp2l-4EIP1dd-I3_jf5XcvlVaAUJfGDhry6EN2dgQsIufsAYaCwoJBNEmoCiRAnV2KkYwRAIgXO3bzd5VF8jLZG8r7dcLJ_FnQBYp1BcxrOvovEa40acCIDhQ14eJRoPwJ6GKgqOkXdaFAsoszl-HIRzYcXKeb7D9
+)
+set +a
+
+# Help
+if [[ $1 == *"help"* ]] ; then
+ curl -s "${BASE_SCRIPT}" | bash -s -- help
+ exit 0
+fi
+
+# Run
+curl -s "${BASE_SCRIPT}" | bash -s -- ${bootstrap_nodes[@]} $@