diff --git a/docs/build/.gitbook.yaml b/docs/build/.gitbook.yaml
new file mode 100644
index 0000000000..253e89b1e5
--- /dev/null
+++ b/docs/build/.gitbook.yaml
@@ -0,0 +1,36 @@
+root: ./
+
+redirects:
+ guides-and-tutorials/hello-stacks-quickstart-tutorial: README.md
+ guides-and-tutorials/clarity-crash-course: clarity-crash-course.md
+
+ # bitcoin-integration redirects
+ guides-and-tutorials/bitcoin-integration/sending-bitcoin-with-leather-wallet: bitcoin-integration/sending-bitcoin-with-leather.md
+ guides-and-tutorials/bitcoin-integration/parsing-a-bitcoin-transaction: bitcoin-integration/parsing-a-bitcoin-transaction.md
+ guides-and-tutorials/bitcoin-integration/verifying-a-bitcoin-transaction: bitcoin-integration/verifying-a-bitcoin-transaction.md
+
+ # create-tokens redirects
+ guides-and-tutorials/tokens/creating-a-nft: create-tokens/creating-a-nft.md
+ guides-and-tutorials/tokens/creating-a-fungible-token: create-tokens/creating-a-ft.md
+
+ # build-a-frontend redirects
+ guides-and-tutorials/frontend/authentication-with-stacks.js: build-a-frontend/authentication-with-stacks.js.md
+ guides-and-tutorials/frontend/post-conditions-with-stacks.js: build-a-frontend/post-conditions-with-stacks.js.md
+ guides-and-tutorials/frontend/sending-transactions-with-stacks.js: build-a-frontend/sending-transactions-with-stacks.js.md
+
+ # testing-smart-contracts redirects
+ guides-and-tutorials/testing-smart-contracts/fuzz-testing: testing-smart-contracts/fuzz-testing.md
+
+ # sbtc redirects
+ guides-and-tutorials/sbtc/best-practices-for-running-an-sbtc-signer: sbtc/best-practices-for-running-an-sbtc-signer.md
+ guides-and-tutorials/sbtc/earn-sbtc-rewards: sbtc/how-to-earn-sbtc-rewards.md
+ guides-and-tutorials/sbtc/how-to-run-sbtc-signer: sbtc/how-to-run-sbtc-signer.md
+ guides-and-tutorials/sbtc/how-to-use-the-sbtc-bridge: sbtc/how-to-use-the-sbtc-bridge.md
+ guides-and-tutorials/sbtc/sbtc-builder-quickstart: sbtc/sbtc-builder-quickstart.md
+
+ # oracles redirects
+ guides-and-tutorials/oracles: price-oracles.md
+
+ # misc.-guides redirects
+ guides-and-tutorials/build-a-borrowing-and-lending-protocol: misc.-guides/build-a-borrowing-and-lending-protocol.md
+ guides-and-tutorials/community-tutorials: misc.-guides/community-tutorials.md
diff --git a/docs/build/.gitbook/assets/Frame 316125324.jpg b/docs/build/.gitbook/assets/Frame 316125324.jpg
new file mode 100644
index 0000000000..8964e1069c
Binary files /dev/null and b/docs/build/.gitbook/assets/Frame 316125324.jpg differ
diff --git a/docs/build/.gitbook/assets/Frame 316126251.jpg b/docs/build/.gitbook/assets/Frame 316126251.jpg
new file mode 100644
index 0000000000..ecaaf0c522
Binary files /dev/null and b/docs/build/.gitbook/assets/Frame 316126251.jpg differ
diff --git a/docs/build/.gitbook/assets/GcHiZWjXgAA21Kf.jpeg b/docs/build/.gitbook/assets/GcHiZWjXgAA21Kf.jpeg
new file mode 100644
index 0000000000..0209b9426a
Binary files /dev/null and b/docs/build/.gitbook/assets/GcHiZWjXgAA21Kf.jpeg differ
diff --git a/docs/build/.gitbook/assets/Group 316124778 (1).png b/docs/build/.gitbook/assets/Group 316124778 (1).png
new file mode 100644
index 0000000000..5bfe3c487a
Binary files /dev/null and b/docs/build/.gitbook/assets/Group 316124778 (1).png differ
diff --git a/docs/build/.gitbook/assets/Group 316124778 (2).png b/docs/build/.gitbook/assets/Group 316124778 (2).png
new file mode 100644
index 0000000000..9b806f1b58
Binary files /dev/null and b/docs/build/.gitbook/assets/Group 316124778 (2).png differ
diff --git a/docs/build/.gitbook/assets/Group 316124778 (3).png b/docs/build/.gitbook/assets/Group 316124778 (3).png
new file mode 100644
index 0000000000..3319d3c070
Binary files /dev/null and b/docs/build/.gitbook/assets/Group 316124778 (3).png differ
diff --git a/docs/build/.gitbook/assets/Group 316124778 (4).png b/docs/build/.gitbook/assets/Group 316124778 (4).png
new file mode 100644
index 0000000000..86eb052ce8
Binary files /dev/null and b/docs/build/.gitbook/assets/Group 316124778 (4).png differ
diff --git a/docs/build/.gitbook/assets/image (1).png b/docs/build/.gitbook/assets/image (1).png
new file mode 100644
index 0000000000..90ba3f571b
Binary files /dev/null and b/docs/build/.gitbook/assets/image (1).png differ
diff --git a/docs/build/.gitbook/assets/image (10).png b/docs/build/.gitbook/assets/image (10).png
new file mode 100644
index 0000000000..8177a76839
Binary files /dev/null and b/docs/build/.gitbook/assets/image (10).png differ
diff --git a/docs/build/.gitbook/assets/image (11).png b/docs/build/.gitbook/assets/image (11).png
new file mode 100644
index 0000000000..ac78447329
Binary files /dev/null and b/docs/build/.gitbook/assets/image (11).png differ
diff --git a/docs/build/.gitbook/assets/image (12).png b/docs/build/.gitbook/assets/image (12).png
new file mode 100644
index 0000000000..9210b58c1a
Binary files /dev/null and b/docs/build/.gitbook/assets/image (12).png differ
diff --git a/docs/build/.gitbook/assets/image (13).png b/docs/build/.gitbook/assets/image (13).png
new file mode 100644
index 0000000000..715ec833fe
Binary files /dev/null and b/docs/build/.gitbook/assets/image (13).png differ
diff --git a/docs/build/.gitbook/assets/image (14).png b/docs/build/.gitbook/assets/image (14).png
new file mode 100644
index 0000000000..514951c8b0
Binary files /dev/null and b/docs/build/.gitbook/assets/image (14).png differ
diff --git a/docs/build/.gitbook/assets/image (2).png b/docs/build/.gitbook/assets/image (2).png
new file mode 100644
index 0000000000..1c637648c3
Binary files /dev/null and b/docs/build/.gitbook/assets/image (2).png differ
diff --git a/docs/build/.gitbook/assets/image (3).png b/docs/build/.gitbook/assets/image (3).png
new file mode 100644
index 0000000000..461e4360ca
Binary files /dev/null and b/docs/build/.gitbook/assets/image (3).png differ
diff --git a/docs/build/.gitbook/assets/image (4).png b/docs/build/.gitbook/assets/image (4).png
new file mode 100644
index 0000000000..445dd9848d
Binary files /dev/null and b/docs/build/.gitbook/assets/image (4).png differ
diff --git a/docs/build/.gitbook/assets/image (5).png b/docs/build/.gitbook/assets/image (5).png
new file mode 100644
index 0000000000..ce90bce016
Binary files /dev/null and b/docs/build/.gitbook/assets/image (5).png differ
diff --git a/docs/build/.gitbook/assets/image (6).png b/docs/build/.gitbook/assets/image (6).png
new file mode 100644
index 0000000000..850b421678
Binary files /dev/null and b/docs/build/.gitbook/assets/image (6).png differ
diff --git a/docs/build/.gitbook/assets/image (7).png b/docs/build/.gitbook/assets/image (7).png
new file mode 100644
index 0000000000..35bf7c4f53
Binary files /dev/null and b/docs/build/.gitbook/assets/image (7).png differ
diff --git a/docs/build/.gitbook/assets/image (8).png b/docs/build/.gitbook/assets/image (8).png
new file mode 100644
index 0000000000..c866b0dc8e
Binary files /dev/null and b/docs/build/.gitbook/assets/image (8).png differ
diff --git a/docs/build/.gitbook/assets/image (9).png b/docs/build/.gitbook/assets/image (9).png
new file mode 100644
index 0000000000..8f6083d420
Binary files /dev/null and b/docs/build/.gitbook/assets/image (9).png differ
diff --git a/docs/build/.gitbook/assets/image 11.png b/docs/build/.gitbook/assets/image 11.png
new file mode 100644
index 0000000000..01595e7d39
Binary files /dev/null and b/docs/build/.gitbook/assets/image 11.png differ
diff --git a/docs/build/.gitbook/assets/image 16.png b/docs/build/.gitbook/assets/image 16.png
new file mode 100644
index 0000000000..099e6b71c7
Binary files /dev/null and b/docs/build/.gitbook/assets/image 16.png differ
diff --git a/docs/build/.gitbook/assets/image 2.png b/docs/build/.gitbook/assets/image 2.png
new file mode 100644
index 0000000000..b9cb30d7a1
Binary files /dev/null and b/docs/build/.gitbook/assets/image 2.png differ
diff --git a/docs/build/.gitbook/assets/image 22.png b/docs/build/.gitbook/assets/image 22.png
new file mode 100644
index 0000000000..ff2615e114
Binary files /dev/null and b/docs/build/.gitbook/assets/image 22.png differ
diff --git a/docs/build/.gitbook/assets/image 3.png b/docs/build/.gitbook/assets/image 3.png
new file mode 100644
index 0000000000..6d0423b88b
Binary files /dev/null and b/docs/build/.gitbook/assets/image 3.png differ
diff --git a/docs/build/.gitbook/assets/image 4.png b/docs/build/.gitbook/assets/image 4.png
new file mode 100644
index 0000000000..3842a7c913
Binary files /dev/null and b/docs/build/.gitbook/assets/image 4.png differ
diff --git a/docs/build/.gitbook/assets/image 5.png b/docs/build/.gitbook/assets/image 5.png
new file mode 100644
index 0000000000..6edd5519d7
Binary files /dev/null and b/docs/build/.gitbook/assets/image 5.png differ
diff --git a/docs/build/.gitbook/assets/image 6.png b/docs/build/.gitbook/assets/image 6.png
new file mode 100644
index 0000000000..55f9302b83
Binary files /dev/null and b/docs/build/.gitbook/assets/image 6.png differ
diff --git a/docs/build/.gitbook/assets/image 7.png b/docs/build/.gitbook/assets/image 7.png
new file mode 100644
index 0000000000..26d2b2a603
Binary files /dev/null and b/docs/build/.gitbook/assets/image 7.png differ
diff --git a/docs/build/.gitbook/assets/image 8.png b/docs/build/.gitbook/assets/image 8.png
new file mode 100644
index 0000000000..1d60b4bce2
Binary files /dev/null and b/docs/build/.gitbook/assets/image 8.png differ
diff --git a/docs/build/.gitbook/assets/image.png b/docs/build/.gitbook/assets/image.png
new file mode 100644
index 0000000000..cc6def5437
Binary files /dev/null and b/docs/build/.gitbook/assets/image.png differ
diff --git a/docs/build/.gitbook/assets/stacks-devs-twitter-header.png b/docs/build/.gitbook/assets/stacks-devs-twitter-header.png
new file mode 100644
index 0000000000..5198600901
Binary files /dev/null and b/docs/build/.gitbook/assets/stacks-devs-twitter-header.png differ
diff --git a/docs/build/README.md b/docs/build/README.md
new file mode 100644
index 0000000000..2ca4918f66
--- /dev/null
+++ b/docs/build/README.md
@@ -0,0 +1,686 @@
+---
+cover: .gitbook/assets/stacks-devs-twitter-header.png
+coverY: 0
+---
+
+# Developer Quickstart
+
+
source: Hiro blog
+
+## Build Your First Stacks App in 30 Minutes
+
+Looking to see what building on Stacks is all about? You're in the right place.
+
+This tutorial will help you build a working Stacks application in just 30 minutes. You'll learn the essential tools and concepts needed to build decentralized applications on Stacks, the leading Bitcoin L2.
+
+What you'll build: A simple message board where users can post messages to the blockchain and read messages from others.
+
+What you'll learn:
+
+* How to write a Clarity smart contract
+* How to deploy contracts to Stacks testnet
+* How to connect a wallet to your app
+* How to interact with contracts from a frontend
+
+Prerequisites:
+
+* Basic familiarity with web development (HTML, CSS, JavaScript)
+* A modern web browser
+* 30 minutes of your time
+
+Let's get started!
+
+{% stepper %}
+{% step %}
+### Step 1: Set Up Your Wallet (5 minutes)
+
+First, you'll need a Stacks wallet to interact with the blockchain.
+
+#### Install Leather Wallet
+
+1. Visit [leather.io](https://leather.io/) and install the browser extension
+2. Create a new wallet or import an existing one
+3. **Important**: Switch to the **Testnet** network in your wallet settings
+4. Get testnet STX tokens from the [Stacks Testnet Faucet](https://explorer.hiro.so/sandbox/faucet?chain=testnet)
+
+{% hint style="info" %}
+Testnet STX tokens are free and used for testing. They have no real value but let you experiment with Stacks development without cost.
+{% endhint %}
+
+Your wallet is now ready for testnet development!
+
+{% hint style="info" %}
+You don't have to use Leather, two other wallets popular with Stacks users are [Xverse](https://xverse.app/) and [Asigna](https://asigna.io/) if you need a multisig.
+{% endhint %}
+{% endstep %}
+
+{% step %}
+### Step 2: Write Your First Clarity Contract (10 minutes)
+
+Clarity is Stacks' smart contract language, designed for safety and predictability. Let's write a simple message board contract.
+
+Clarity is inspired by LISP and uses a functional programming approach. Everything in Clarity is an expression wrapped in parentheses. This can be a bit overwhelming at first if you are used to languages like JavaScript or Solidity, but the learning curve is short and Clarity is a simple language to understand once you dive in and start using it.
+
+For a more detailed introduction, check out the [Clarity Crash Course](clarity-crash-course.md) in the docs.
+
+#### Write the Contract
+
+Open [Clarity Playground](https://play.hiro.so/) in your browser. This is an online IDE where you can write and test Clarity code without installing anything.
+
+Delete the existing code and replace it with this message board contract:
+
+```clarity
+;; Simple Message Board Contract
+;; This contract allows users to post and read messages
+
+;; Define a map to store messages
+;; Key: message ID (uint), Value: message content (string-utf8 280)
+(define-map messages uint (string-utf8 280))
+
+;; Define a map to store message authors
+(define-map message-authors uint principal)
+
+;; Counter for message IDs
+(define-data-var message-count uint u0)
+
+;; Public function to add a new message
+(define-public (add-message (content (string-utf8 280)))
+ (let ((id (+ (var-get message-count) u1)))
+ (map-set messages id content)
+ (map-set message-authors id tx-sender)
+ (var-set message-count id)
+ (ok id)))
+
+;; Read-only function to get a message by ID
+(define-read-only (get-message (id uint))
+ (map-get? messages id))
+
+;; Read-only function to get message author
+(define-read-only (get-message-author (id uint))
+ (map-get? message-authors id))
+
+;; Read-only function to get total message count
+(define-read-only (get-message-count)
+ (var-get message-count))
+
+;; Read-only function to get the last few messages
+(define-read-only (get-recent-messages (count uint))
+ (let ((total-count (var-get message-count)))
+ (if (> count total-count)
+ (map get-message (list u1 u2 u3 u4 u5))
+ (map get-message (list
+ (- total-count (- count u1))
+ (- total-count (- count u2))
+ (- total-count (- count u3))
+ (- total-count (- count u4))
+ (- total-count (- count u5)))))))
+```
+
+#### Test the Contract
+
+Click "Deploy", and go to the command line in the bottom right corner and try calling the functions.
+
+We are using the `contract-call?` method to call the functions in the contract that we just deployed within the playground.
+
+```clarity
+;; Test adding a message
+(contract-call? .contract-1 add-message u"Hello, Stacks!")
+
+;; Test reading the message
+(contract-call? .contract-1 get-message u1)
+
+;; Test getting the count
+(contract-call? .contract-1 get-message-count)
+```
+
+You should see the contract working in the evaluation panel on the right!
+
+#### Key Clarity Concepts Explained
+
+* `define-map`: creates a map / key-value store on-chain (like a simple table).
+* `define-data-var`: creates a single persistent variable (used for counters, settings).
+* `define-public`: public function that can modify blockchain state.
+* `define-read-only`: functions that can only read state and don't modify it.
+* `tx-sender`: automatically set to the address of whoever called the function (useful for authentication).
+* `let`: create local variables inside functions.
+* All public functions return a response type: `(ok value)` or `(err error)`.
+
+
+
+🔍 Deep Dive: Understanding the Contract Code (Optional)
+
+Want to understand exactly what each part of the contract is doing? Let's walk through every function and concept used in our message board contract. Links to the official documentation are included for each function, so you may dive deeper if you want.
+
+**How We Store Data on the Blockchain**
+
+We use `define-map` to create what's essentially a database table on the blockchain:
+
+```clarity
+(define-map messages uint (string-utf8 280))
+```
+
+We also create another map to track who wrote each message:
+
+```clarity
+(define-map message-authors uint principal)
+```
+
+We keep a message counter with:
+
+```clarity
+(define-data-var message-count uint u0)
+```
+
+**The Heart of Our Contract: Adding Messages**
+
+The primary state-changing function:
+
+```clarity
+(define-public (add-message (content (string-utf8 280)))
+ (let ((id (+ (var-get message-count) u1)))
+ (map-set messages id content)
+ (map-set message-authors id tx-sender)
+ (var-set message-count id)
+ (ok id)))
+```
+
+Key points:
+
+* `var-get` reads the message counter.
+* `+` uses prefix notation (LISP-style).
+* `map-set` stores the content and author.
+* `tx-sender` is the caller's address.
+* The function returns `(ok id)` on success.
+
+**Reading Messages Back**
+
+Example read-only function:
+
+```clarity
+(define-read-only (get-message (id uint))
+ (map-get? messages id))
+```
+
+`map-get?` returns `(some value)` or `none`, forcing explicit handling of missing data.
+
+Other read-only functions:
+
+```clarity
+(define-read-only (get-message-author (id uint))
+ (map-get? message-authors id))
+
+(define-read-only (get-message-count)
+ (var-get message-count))
+```
+
+**A More Complex Function: Getting Recent Messages**
+
+```clarity
+(define-read-only (get-recent-messages (count uint))
+ (let ((total-count (var-get message-count)))
+ (if (> count total-count)
+ (map get-message (list u1 u2 u3 u4 u5))
+ (map get-message (list
+ (- total-count (- count u1))
+ (- total-count (- count u2))
+ (- total-count (- count u3))
+ (- total-count (- count u4))
+ (- total-count (- count u5)))))))
+```
+
+This shows conditional logic (`if`), prefix operators, `map` to apply a function over a list, and list arithmetic to determine recent message IDs.
+
+**What Makes Clarity Special**
+
+* Response types: functions return `(ok value)` or `(err error)` and state changes are reverted on `err`.
+* Optional types: `map-get?` returns `some` or `none` instead of null.
+* Static analysis at deployment time prevents many runtime errors.
+* No recursion or unbounded loops (decidability), making execution costs predictable.
+* `tx-sender` vs `contract-caller` — be cautious about which you use for authorization.
+
+{% hint style="warning" %}
+**Important**: Be careful when using `tx-sender` vs `contract-caller` in your contracts. While `tx-sender` refers to the original transaction sender and remains constant throughout the entire transaction chain, `contract-caller` refers to the most recent principal in the transaction chain and can change with each internal function or contract call. This difference is crucial for security - malicious contracts can potentially exploit `tx-sender`'s persistent context to bypass admin checks if you're not careful. For simple contracts like our message board, `tx-sender` is appropriate, but for more complex authorization logic, consider whether you need the original sender or the immediate caller.
+
+For more details on this, check out [this excellent blog post](https://www.setzeus.com/public-blog-post/clarity-carefully-tx-sender) from Clarity developer [setzeus](https://x.com/setzeus).
+{% endhint %}
+
+Clarity's type safety and static analysis help catch issues at deploy time. This contract demonstrates common patterns: maps, data vars, public functions, read-only queries, tx-sender usage, and predictable response types.
+
+
+{% endstep %}
+
+{% step %}
+### Step 3: Deploy Your Contract (5 minutes)
+
+Now let's deploy your contract to the Stacks testnet so you can interact with it from a web application.
+
+#### Deploy via Stacks Explorer
+
+1. Visit the [Stacks Explorer Sandbox](https://explorer.hiro.so/sandbox/deploy?chain=testnet)
+2. Connect your Leather wallet (make sure you're on testnet)
+3. Paste your contract code into the editor
+4. Give your contract a name (e.g., "message-board") or just use the default generated name
+5. Click "Deploy Contract"
+6. Confirm the transaction in your wallet
+
+The deployment should only take a few seconds. Once complete, you'll see your contract address in the explorer. Here's [an example transaction](https://explorer.hiro.so/txid/0x3df7b597d1bbb3ce1598b1b0e28b7cbed38345fcf3fb33ae387165e13085e5d8?chain=testnet) deploying this contract.
+
+#### Test Your Deployed Contract
+
+1. In the explorer, find your deployed contract
+2. Scroll down a bit and click on "Available Functions" to view its functions
+3. Try calling `add-message` with a test message (you'll need to change the post conditions toggle to allow mode, there is a dedicated docs page talking about [Post Conditions](build-a-frontend/post-conditions-with-stacks.js.md) on Stacks)
+4. Call `get-message` with ID `u1` to read it back
+5. Call `get-message-count` to see the total
+
+Your contract is now live and functional on the blockchain!
+{% endstep %}
+
+{% step %}
+### Step 4: Build the Frontend (10 minutes)
+
+Let's create a simple web interface to interact with your contract.
+
+#### Set Up the Project
+
+Create a new React project:
+
+```bash
+npm create vite@latest my-message-board -- --template react
+cd my-message-board
+npm install
+```
+
+Install the Stacks.js libraries:
+
+```bash
+npm install @stacks/connect @stacks/transactions @stacks/network
+```
+
+#### Create the App Component
+
+Replace the contents of `src/App.jsx` with the following:
+
+{% hint style="info" %}
+Since this is a quickstart, we won't dive into a long explanation of exactly what this code is doing. We suggest going and checking out [Hiro's Docs](https://docs.hiro.so/stacks/stacks.js) in order to get a handle on how stacks.js works.
+{% endhint %}
+
+```jsx
+import { useState, useEffect } from "react";
+import { connect, disconnect, isConnected, request } from "@stacks/connect";
+import {
+ fetchCallReadOnlyFunction,
+ stringUtf8CV,
+ uintCV,
+} from "@stacks/transactions";
+import "./App.css";
+
+const network = "testnet";
+
+// Replace with your contract address
+const CONTRACT_ADDRESS = "YOUR_CONTRACT_ADDRESS_HERE";
+const CONTRACT_NAME = "message-board";
+
+function App() {
+ const [connected, setConnected] = useState(false);
+ const [messages, setMessages] = useState([]);
+ const [newMessage, setNewMessage] = useState("");
+ const [loading, setLoading] = useState(false);
+
+ useEffect(() => {
+ setConnected(isConnected());
+ if (isConnected()) {
+ loadMessages();
+ }
+ }, []);
+
+ // Check for connection changes
+ useEffect(() => {
+ const checkConnection = () => {
+ const connectionStatus = isConnected();
+ if (connectionStatus !== connected) {
+ setConnected(connectionStatus);
+ if (connectionStatus) {
+ loadMessages();
+ }
+ }
+ };
+
+ const intervalId = setInterval(checkConnection, 500);
+ return () => clearInterval(intervalId);
+ }, [connected]);
+
+ const connectWallet = async () => {
+ try {
+ await connect({
+ appDetails: {
+ name: "Message Board",
+ icon: window.location.origin + "/logo.svg",
+ },
+ onFinish: () => {
+ setConnected(true);
+ // Small delay to ensure connection is fully established
+ setTimeout(() => {
+ loadMessages();
+ }, 100);
+ },
+ });
+ } catch (error) {
+ console.error("Connection failed:", error);
+ }
+ };
+
+ const disconnectWallet = () => {
+ disconnect();
+ setConnected(false);
+ setMessages([]);
+ };
+
+ const loadMessages = async () => {
+ try {
+ // Get message count
+ const countResult = await fetchCallReadOnlyFunction({
+ contractAddress: CONTRACT_ADDRESS,
+ contractName: CONTRACT_NAME,
+ functionName: "get-message-count",
+ functionArgs: [],
+ network,
+ senderAddress: CONTRACT_ADDRESS,
+ });
+
+ const count = parseInt(countResult.value);
+
+ // Load recent messages
+ const messagePromises = [];
+ for (let i = Math.max(1, count - 4); i <= count; i++) {
+ messagePromises.push(
+ fetchCallReadOnlyFunction({
+ contractAddress: CONTRACT_ADDRESS,
+ contractName: CONTRACT_NAME,
+ functionName: "get-message",
+ functionArgs: [uintCV(i)],
+ network,
+ senderAddress: CONTRACT_ADDRESS,
+ })
+ );
+ }
+
+ const messageResults = await Promise.all(messagePromises);
+ const loadedMessages = messageResults
+ .map((result, index) => ({
+ id: count - messageResults.length + index + 1,
+ content: result.value.value,
+ }))
+ .filter((msg) => msg.content !== undefined);
+
+ setMessages(loadedMessages);
+ } catch (error) {
+ console.error("Error loading messages:", error);
+ }
+ };
+
+ const postMessage = async () => {
+ if (!newMessage.trim()) return;
+
+ setLoading(true);
+ try {
+ const result = await request("stx_callContract", {
+ contract: `${CONTRACT_ADDRESS}.${CONTRACT_NAME}`,
+ functionName: "add-message",
+ functionArgs: [stringUtf8CV(newMessage)],
+ network,
+ });
+
+ console.log("Transaction submitted:", result.txid);
+ setNewMessage("");
+
+ // Reload messages after a delay to allow the transaction to process
+ setTimeout(() => {
+ loadMessages();
+ setLoading(false);
+ }, 2000);
+ } catch (error) {
+ console.error("Error posting message:", error);
+ setLoading(false);
+ }
+ };
+
+ return (
+
+ setNewMessage(e.target.value)}
+ placeholder="What's on your mind?"
+ maxLength={280}
+ disabled={loading}
+ />
+
+
+
+
+
+
Recent Messages
+
+ {messages.length === 0 ? (
+
No messages yet. Be the first to post!
+ ) : (
+
+ {messages.map((message) => (
+
+ Message #{message.id}: {message.content}
+
+ ))}
+
+ )}
+
+
+ )}
+
+ );
+}
+
+export default App;
+```
+
+#### Add Basic Styling
+
+Update `src/App.css`:
+
+```css
+.App {
+ max-width: 800px;
+ width: 100%;
+ padding: 20px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
+ "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans",
+ "Helvetica Neue", sans-serif;
+}
+
+.App-header {
+ text-align: center;
+ margin-bottom: 40px;
+ padding: 20px;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ border-radius: 12px;
+ color: white;
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
+}
+
+.App-header h1 {
+ color: white;
+ margin-bottom: 20px;
+ font-size: 2.5rem;
+ font-weight: 700;
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.connect-button,
+.disconnect-button {
+ background-color: rgba(255, 255, 255, 0.2);
+ color: white;
+ border: 2px solid rgba(255, 255, 255, 0.3);
+ padding: 12px 28px;
+ border-radius: 8px;
+ cursor: pointer;
+ font-size: 16px;
+ font-weight: 600;
+ transition: all 0.3s ease;
+ backdrop-filter: blur(10px);
+}
+
+.connect-button:hover,
+.disconnect-button:hover {
+ background-color: rgba(255, 255, 255, 0.3);
+ border-color: rgba(255, 255, 255, 0.5);
+ transform: translateY(-2px);
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
+}
+
+.post-message {
+ margin-bottom: 40px;
+ padding: 20px;
+ border: 1px solid #e5e7eb;
+ border-radius: 8px;
+}
+
+.message-input {
+ display: flex;
+ gap: 10px;
+ margin-top: 10px;
+}
+
+.message-input input {
+ flex: 1;
+ padding: 10px;
+ border: 1px solid #d1d5db;
+ border-radius: 4px;
+ font-size: 16px;
+}
+
+.message-input button {
+ background-color: #10b981;
+ color: white;
+ border: none;
+ padding: 10px 20px;
+ border-radius: 4px;
+ cursor: pointer;
+}
+
+.message-input button:disabled {
+ background-color: #9ca3af;
+ cursor: not-allowed;
+}
+
+.messages {
+ padding: 20px;
+ border: 1px solid #e5e7eb;
+ border-radius: 8px;
+}
+
+.refresh-button {
+ background-color: #6b7280;
+ color: white;
+ border: none;
+ padding: 8px 16px;
+ border-radius: 4px;
+ cursor: pointer;
+ margin-bottom: 20px;
+}
+
+.messages ul {
+ list-style: none;
+ padding: 0;
+}
+
+.messages li {
+ padding: 10px;
+ border-bottom: 1px solid #e5e7eb;
+ margin-bottom: 10px;
+}
+
+.messages li:last-child {
+ border-bottom: none;
+}
+```
+
+#### Update the Contract Address
+
+1. Go back to the Stacks Explorer and find your deployed contract
+2. Copy the contract address (it looks like `ST1ABC...123.message-board`)
+3. Replace `YOUR_CONTRACT_ADDRESS_HERE` in the App.jsx file with your actual contract address and the contract name with the actual name
+
+#### Run Your App
+
+```bash
+npm run dev
+```
+
+Visit `http://localhost:5173` and you should see your message board app! Connect your wallet and try posting a message.
+{% endstep %}
+{% endstepper %}
+
+## Congratulations! 🎉
+
+You've just built your first Stacks application! Here's what you accomplished:
+
+* ✅ Wrote a Clarity smart contract with data storage and public functions
+* ✅ Deployed the contract to Stacks testnet
+* ✅ Built a React frontend that connects to a Stacks wallet
+* ✅ Integrated your frontend with your smart contract
+* ✅ Posted and read data from the blockchain
+
+## Next Steps
+
+Now that you have the basics down, here are some ways to continue your Stacks development journey:
+
+### Learn More About Clarity
+
+* [**Clarity Book**](https://book.clarity-lang.org/): Comprehensive guide to Clarity development
+* [**Clarity Reference**](https://docs.stacks.co/docs/clarity): Complete documentation of Clarity functions
+* [**Clarity Crash Course**](https://docs.stacks.co/docs/clarity-crash-course): Quick introduction to Clarity concepts
+
+### Explore Advanced Features
+
+* Error Handling: Learn about Clarity's `try!` and `unwrap!` functions
+* Access Control: Implement admin functions and permissions
+* Token Standards: Build fungible (SIP-010) and non-fungible (SIP-009) tokens
+
+### Development Tools
+
+* [**Clarinet**](https://github.com/hirosystems/clarinet): Local development environment for Clarity
+* [**Hiro Platform**](https://platform.hiro.so/): Hosted development environment
+* [**Stacks Explorer**](https://explorer.stacks.co/): View transactions and contracts on mainnet
+
+### Community Resources
+
+* [**Stacks Discord**](https://discord.gg/stacks): Connect with other developers
+* [**Stacks Forum**](https://forum.stacks.org/): Ask questions and share projects
+* [**Stacks GitHub**](https://github.com/stacks-network): Contribute to the ecosystem
+
diff --git a/docs/build/SUMMARY.md b/docs/build/SUMMARY.md
new file mode 100644
index 0000000000..9505654460
--- /dev/null
+++ b/docs/build/SUMMARY.md
@@ -0,0 +1,30 @@
+# Table of contents
+
+* [Developer Quickstart](README.md)
+* [Clarity Crash Course](clarity-crash-course.md)
+* [Bitcoin Integration](bitcoin-integration/README.md)
+ * [Sending Bitcoin with Leather](bitcoin-integration/sending-bitcoin-with-leather.md)
+ * [Verifying a Bitcoin Transaction](bitcoin-integration/verifying-a-bitcoin-transaction.md)
+ * [Parsing a Bitcoin Transaction](bitcoin-integration/parsing-a-bitcoin-transaction.md)
+* [Create Tokens](create-tokens/README.md)
+ * [Creating a NFT](create-tokens/creating-a-nft.md)
+ * [Creating a FT](create-tokens/creating-a-ft.md)
+* [Build a Frontend](build-a-frontend/README.md)
+ * [Post Conditions with Stacks.js](build-a-frontend/post-conditions-with-stacks.js.md)
+ * [Authentication with Stacks.js](build-a-frontend/authentication-with-stacks.js.md)
+ * [Sending Transactions with Stacks.js](build-a-frontend/sending-transactions-with-stacks.js.md)
+* [Testing Smart Contracts](testing-smart-contracts/README.md)
+ * [Fuzz Testing](testing-smart-contracts/fuzz-testing.md)
+* [sBTC](sbtc/README.md)
+ * [sBTC Builder Quickstart](sbtc/sbtc-builder-quickstart.md)
+ * [How to Run sBTC Signer](sbtc/how-to-run-sbtc-signer.md)
+ * [Best Practices for running an sBTC Signer](sbtc/best-practices-for-running-an-sbtc-signer.md)
+ * [How to Use the sBTC Bridge](sbtc/how-to-use-the-sbtc-bridge.md)
+ * [How to Use the sBTC Bridge with Fordefi](sbtc/how-to-use-the-sbtc-bridge-with-fordefi.md)
+ * [How to Earn sBTC Rewards](sbtc/how-to-earn-sbtc-rewards.md)
+* [Price Oracles](price-oracles.md)
+
+## Misc. Guides
+
+* [Build a Borrowing & Lending Protocol](misc.-guides/build-a-borrowing-and-lending-protocol.md)
+* [Community Tutorials](misc.-guides/community-tutorials.md)
diff --git a/docs/build/bitcoin-integration/README.md b/docs/build/bitcoin-integration/README.md
new file mode 100644
index 0000000000..17ee26dcbf
--- /dev/null
+++ b/docs/build/bitcoin-integration/README.md
@@ -0,0 +1,3 @@
+# Bitcoin Integration
+
+One of the unique features of the Stack chain and the Clarity language is that it allows for directly reading from the Bitcoin chain itself. These tutorials walk you through some different ways you can accomplish that.
diff --git a/docs/build/bitcoin-integration/parsing-a-bitcoin-transaction.md b/docs/build/bitcoin-integration/parsing-a-bitcoin-transaction.md
new file mode 100644
index 0000000000..892c9f853d
--- /dev/null
+++ b/docs/build/bitcoin-integration/parsing-a-bitcoin-transaction.md
@@ -0,0 +1,79 @@
+# Parsing a Bitcoin Transaction
+
+While we can verify that a transaction was mined using a library and Clarity's built-in functions (see the Verifying a transaction on the BTC chain docs), we can also parse a Bitcoin transaction using Clarity directly.
+
+This doesn't require access to the chain — all we need is the raw transaction hex.
+
+If you aren't familiar with how Bitcoin transactions are encoded in raw form, take a quick look at that. The short version is that all of the data from a Bitcoin transaction is encoded in hex form in a string of bytes; we can slice out pieces of that hex value to pull out all of our transaction data.
+
+The process to do this is relatively complex, but the Clarity-Bitcoin library provides a function called `parse-tx` that makes this simple. All we need to do is pass it a raw transaction hex and we get back the data of the transaction, including inputs and outputs.
+
+{% hint style="warning" %}
+Note that currently the library only supports legacy transactions. Work to support segwit and taproot transactions is underway.
+{% endhint %}
+
+You can view a deployed version of the library on the explorer: https://explorer.hiro.so/txid/0xd493b9ada8899be8773d3f55b21d300ef83ac5c0dd38c8a4dd52a295bd71d539?chain=mainnet
+
+And the GitHub repo here: https://github.com/friedger/clarity-bitcoin
+
+The `parse-tx` function looks like this:
+
+{% code title="parse-tx.clar" %}
+```clarity
+(define-read-only (parse-tx (tx (buff 1024)))
+ (let ((ctx { txbuff: tx, index: u0})
+ (parsed-version (try! (read-uint32 ctx)))
+ (parsed-txins (try! (read-txins (get ctx parsed-version))))
+ (parsed-txouts (try! (read-txouts (get ctx parsed-txins))))
+ (parsed-locktime (try! (read-uint32 (get ctx parsed-txouts)))))
+ (ok {version: (get uint32 parsed-version),
+ ins: (get txins parsed-txins),
+ outs: (get txouts parsed-txouts),
+ locktime: (get uint32 parsed-locktime)})))
+```
+{% endcode %}
+
+Example raw transaction hex (from a block explorer API like mempool):
+
+`0200000000010196277c04c986c1ad78c909287fd12dba2924324699a0232e0533f46a6a3916bb0100000000ffffffff026400000000000000160014274ae586ad2035efb4c25049c155f98310d7e106ca16440000000000160014599bcef6387256c6b019030c421b4a4d382fe2600247304402204d94a1e4047ca38a450177ccb6f88585ca147f1939df343d8ac5d962c5f35bb302206f7fa42c21c47ebccdc460393d35c5dfd3b6f0a26cf10fac23d3e6fab71835c20121020cb972a66e3fb1cdcc9efcad060b4457ebec534942700d4af1c0d82a33aa13f100000000`
+
+You can paste this into a raw transaction decoder like this one to inspect the decoded fields: https://live.blockcypher.com/btc/decodetx/
+
+If using stacks.js, pass the raw hex to your Clarity function as a buffer like this:
+
+{% code title="JavaScript (stacks.js)" %}
+```javascript
+bufferCV(Buffer.from(txRaw, "hex"));
+```
+{% endcode %}
+
+Where `txRaw` is a string containing the raw transaction hex. Passing that buffer into `parse-tx` returns the parsed transaction object with version, inputs (ins), outputs (outs), and locktime. You can then extract whatever fields you need from that returned data.
+
+{% stepper %}
+{% step %}
+### Get the raw transaction hex
+
+Obtain the raw transaction hex from a Bitcoin block explorer API (for example, mempool or blockcypher). This is a single hex string representing the entire transaction.
+{% endstep %}
+
+{% step %}
+### Pass the hex into Clarity-Bitcoin's parser
+
+Convert the hex string to a buffer and pass it to the `parse-tx` function (via your Stacks/Clarity call). In stacks.js:
+
+`bufferCV(Buffer.from(txRaw, "hex"));`
+{% endstep %}
+
+{% step %}
+### Use the parsed result
+
+`parse-tx` returns an object containing:
+
+* version
+* ins (transaction inputs)
+* outs (transaction outputs)
+* locktime
+
+Extract whatever fields you need from that returned object.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/build/bitcoin-integration/sending-bitcoin-with-leather.md b/docs/build/bitcoin-integration/sending-bitcoin-with-leather.md
new file mode 100644
index 0000000000..fa90d3aaba
--- /dev/null
+++ b/docs/build/bitcoin-integration/sending-bitcoin-with-leather.md
@@ -0,0 +1,56 @@
+# Sending Bitcoin with Leather
+
+
+
+Using Leather's web wallet, you can initiate a simple Bitcoin transaction from a JS app in a few lines of code.
+
+{% hint style="info" %}
+You must be authenticated with the Leather wallet for this to work. See the Authentication with Stacks.js tutorial for how to authenticate before using the API.
+{% endhint %}
+
+{% stepper %}
+{% step %}
+### Prepare the send call
+
+Use the `window.btc?.request("sendTransfer", ...)` API to initiate a transaction. Provide the destination address and the amount in satoshis.
+
+```javascript
+const sendBitcoin = async () => {
+ const resp = await window.btc?.request("sendTransfer", {
+ address: "tb1qya9wtp4dyq67ldxz2pyuz40esvgd0cgx9s3pjl", // replace with the recipient address
+ amount: "10000", // amount in satoshis
+ });
+
+ // Storing txid in local storage
+ // We'll get back the transaction ID, which we can then use as needed
+ if (typeof window !== "undefined") {
+ localStorage.setItem("txid", JSON.stringify(resp.result.txid));
+ }
+
+ // Optionally mark the transaction as pending and poll a Bitcoin API (e.g., mempool.space) to check confirmation status
+ localStorage.setItem("txStatus", "pending");
+};
+```
+{% endstep %}
+
+{% step %}
+### Hook up the UI
+
+Call the `sendBitcoin` function from your UI (for example, a button click).
+
+{% code title="Example component" %}
+```javascript
+
+```
+{% endcode %}
+{% endstep %}
+
+{% step %}
+### Next steps
+
+* To verify a transaction was mined, use the returned txid and query a Bitcoin explorer or API (for example, mempool.space).
+* See the "Verifying a transaction on the BTC chain" recipe for a more complete flow using the returned transaction ID as a starting point.
+
+
+{% endstep %}
+{% endstepper %}
diff --git a/docs/build/bitcoin-integration/verifying-a-bitcoin-transaction.md b/docs/build/bitcoin-integration/verifying-a-bitcoin-transaction.md
new file mode 100644
index 0000000000..2804d7e75d
--- /dev/null
+++ b/docs/build/bitcoin-integration/verifying-a-bitcoin-transaction.md
@@ -0,0 +1,221 @@
+# Verifying a Bitcoin Transaction
+
+One of the coolest things about Clarity is that it allows us to have visibility into the state of the Bitcoin blockchain. Since Stacks blocks are mined in lockstep with Bitcoin blocks, we can directly read the burnchain header info of each Bitcoin block using Clarity's built-in [`get-burn-block-info?`](https://docs.stacks.co/docs/clarity/language-functions#get-burn-block-info-clarity2) function.
+
+There are quite a few relatively complex things that need to happen to do this successfully, but a [clarity-bitcoin library](https://github.com/friedger/clarity-bitcoin/) exists to make the process a lot easier and handle some of the heavy lifting for us.
+
+Let's take a look at how to verify a Bitcoin transaction was mined using Clarity using the library. If you take a look at the `clarity-bitcoin.clar` file in the linked repo, you'll find a function called `was-tx-mined-compact`. That's what we'll be working with, and it looks like this:
+
+{% code title="clarity-bitcoin.clar" %}
+```clarity
+(define-read-only (was-tx-mined-compact (height uint) (tx (buff 1024)) (header (buff 80)) (proof { tx-index: uint, hashes: (list 14 (buff 32)), tree-depth: uint}))
+ (let ((block (unwrap! (parse-block-header header) (err ERR-BAD-HEADER))))
+ (was-tx-mined-internal height tx header (get merkle-root block) proof)))
+```
+{% endcode %}
+
+The transaction itself is relatively simple, but there's a lot happening within other private function calls. I encourage you to read the contract for yourself and trace what is happening, step-by-step, when we call this function.
+
+For now, we'll just go over how to actually call this function successfully.
+
+You can see that it takes a few pieces of information:
+
+* `(height uint)` the block height you are looking to verify the transaction within
+* `(tx (buff 1024))` the raw transaction hex of the transaction you are looking to verify
+* `(header (buff 80))` the block header of the block
+* `(proof { tx-index: uint, hashes: (list 14 (buff 32)), tree-depth: uint})` a merkle proof formatted as a tuple
+
+{% hint style="info" %}
+A Merkle proof is a compact way to prove that a transaction is included in a block in the Bitcoin blockchain. Here's how it works:
+{% endhint %}
+
+{% stepper %}
+{% step %}
+### How transactions are combined into the Merkle root
+
+Transactions in a block are hashed and paired, then the hashes of the pairs are hashed and paired, and so on until a single hash remains — this is called the Merkle root.
+{% endstep %}
+
+{% step %}
+### Merkle root in the block header
+
+The Merkle root is included in the block header. By providing the hashes that lead from a transaction's hash up to the Merkle root, along with the block header, one can prove that the transaction is included in that block.
+{% endstep %}
+
+{% step %}
+### Merkle proof (Merkle path)
+
+The hashes that connect a transaction to the Merkle root are called the Merkle proof or Merkle path. By providing the Merkle proof along with the transaction hash and block header, anyone can verify that the transaction is part of that block.
+{% endstep %}
+
+{% step %}
+### Efficient decentralized verification
+
+This allows for efficient decentralized verification of transactions without having to download the entire blockchain. One only needs the transaction hash, Merkle proof, and block header to verify.
+{% endstep %}
+{% endstepper %}
+
+Once we have this information, we can call into the `clarity-bitcoin.clar` contract and pass in this data. A common practice would be to get this data from a Bitcoin block explorer API like Mempool.space or Blockstream's esplora, parse it into the correct format for this helper, and then pass it to this function.
+
+We could do that directly via this contract if we just need a direct response on if the transaction was included or not, but more likely we would want to integrate this functionality into a Clarity contract of our own where we can `asserts!` that a transaction was mined before taking another action.
+
+Here's a basic example where we are calling [Blockstream's API](https://github.com/Blockstream/esplora/blob/master/API.md) using JavaScript, parsing the data into the right format, and then calling into our own `mint` function to only mint an NFT if the selected transaction was mined.
+
+We can get all the information we need with nothing but the transaction ID, which will usually be passed to us when we use a wallet like [Hiro's web wallet](https://hirowallet.gitbook.io/developers/bitcoin/sign-transactions/sending-bitcoin) to initiate the Bitcoin transaction.
+
+Let's go through the code we can use to implement this. For full context, this code is taken from the example [bitbadge](https://github.com/kenrogers/bitbadge) repo, which you can take a look at. For a complete step-by-step walkthrough of how to implement this, check out the [Bitcoin Primer](https://bitcoinprimer.dev/).
+
+Here's the mint function:
+
+{% code title="contract.clar" %}
+```clarity
+(define-public (mint (recipient principal) (height uint) (tx (buff 1024)) (header (buff 80)) (proof { tx-index: uint, hashes: (list 14 (buff 32)), tree-depth: uint}))
+ (let
+ (
+ (token-id (+ (var-get last-token-id) u1))
+ (tx-was-mined (try! (contract-call? .clarity-bitcoin was-tx-mined-compact height tx header proof)))
+ )
+ (asserts! (is-eq tx-sender contract-owner) err-owner-only)
+ (asserts! (is-eq tx-was-mined true) err-tx-not-mined)
+ (try! (nft-mint? bitbadge token-id recipient))
+ (var-set last-token-id token-id)
+ (ok token-id)
+ )
+)
+```
+{% endcode %}
+
+Note the `(asserts! (is-eq tx-was-mined true) err-tx-not-mined)` line. This is what is doing the heavy lifting.
+
+{% hint style="warning" %}
+Right now the clarity-bitcoin library only supports legacy transactions. Work is in-progress to add support for segwit, but until then we have to do a bit of work on the front end to strip the witness data from the raw transaction hex.
+{% endhint %}
+
+Here's the JavaScript code we can use to get the data we need.
+
+First we get the raw transaction and the merkle proof (we do this when we first get the transaction ID back).
+
+The `useEffect` here is so that we can check to see if the transaction was confirmed every 10 seconds before we get the rest of the information.
+
+{% code title="useEffect - poll transaction status" %}
+```javascript
+// Effect hook to check and see if the tx has been confirmed using blockstream API
+useEffect(() => {
+ const intervalId = setInterval(() => {
+ const txid = JSON.parse(localStorage.getItem("txid"));
+ if (txid) {
+ fetch(`https://blockstream.info/testnet/api/tx/${txid}/status`)
+ .then((response) => response.json())
+ .then(async (status) => {
+ // set txStatus in localStorage if it is confirmed, otherwise we want to leave it pending
+ if (status.confirmed) {
+ localStorage.setItem("txStatus", "confirmed");
+ // set the block details
+ const blockDetails = {
+ block_height: status.block_height,
+ block_hash: status.block_hash,
+ };
+ setBlockDetails(blockDetails);
+ localStorage.setItem("blockDetails", JSON.stringify(blockDetails));
+ // fetch and set the tx raw
+ const rawResponse = await fetch(
+ `https://blockstream.info/testnet/api/tx/${txid}/hex`
+ );
+ const txRaw = await rawResponse.text();
+ localStorage.setItem("txRaw", txRaw);
+ // fetch and set the merkle proof
+ const proofResponse = await fetch(
+ `https://blockstream.info/testnet/api/tx/${txid}/merkle-proof`
+ );
+ const txMerkleProof = await proofResponse.json();
+ localStorage.setItem(
+ "txMerkleProof",
+ JSON.stringify(txMerkleProof)
+ );
+ clearInterval(intervalId);
+ }
+ })
+ .catch((err) => console.error(err));
+ }
+ }, 10000);
+ return () => clearInterval(intervalId); // Clean up on component unmount
+}, []);
+```
+{% endcode %}
+
+Then we get and parse the rest of the data when we call the actual mint function.
+
+{% code title="mintBitbadge - prepare and call contract" %}
+```javascript
+// This function retrieves raw transaction and merkle proof from localStorage and calls the mint Clarity function
+const mintBitbadge = async () => {
+ // Retrieving rawTx and merkleProof from local storage
+ let txRaw = "";
+ let txMerkleProof = "";
+
+ if (typeof window !== "undefined") {
+ txRaw = removeWitnessData(localStorage.getItem("txRaw"));
+ txMerkleProof = JSON.parse(localStorage.getItem("txMerkleProof"));
+ }
+
+ // First we need to verify that the sender of this transaction is the same as the user that is signed in
+ if (!verifyCorrectSender()) {
+ console.log("wrong sender");
+ return false;
+ }
+
+ const blockHeight = blockDetails.block_height;
+
+ // Fetch the block hash
+ const blockHashResponse = await fetch(
+ `https://blockstream.info/testnet/api/block-height/${blockHeight}`
+ );
+ const blockHash = await blockHashResponse.text();
+
+ // Fetch the block header
+ const blockHeaderResponse = await fetch(
+ `https://blockstream.info/testnet/api/block/${blockHash}/header`
+ );
+ const blockHeaderHex = await blockHeaderResponse.text();
+
+ const txIndex = txMerkleProof.pos;
+ const hashes = txMerkleProof.merkle.map(
+ (hash) => bufferCV(hexToBytes(hash).reverse()) // lib needs reversed hashes
+ ); // Convert each hash to BufferCV and reverse it
+
+ const functionArgs = [
+ principalCV(userData.profile.stxAddress.testnet),
+ uintCV(blockHeight),
+ bufferCV(Buffer.from(txRaw, "hex")),
+ bufferCV(Buffer.from(blockHeaderHex, "hex")),
+ tupleCV({
+ "tx-index": uintCV(txIndex),
+ hashes: listCV(hashes),
+ "tree-depth": uintCV(txMerkleProof.merkle.length),
+ }),
+ ];
+
+ const contractAddress = "ST3QFME3CANQFQNR86TYVKQYCFT7QX4PRXM1V9W6H"; // Replace with your contract address
+ const contractName = "bitbadge-v3"; // Replace with your contract name
+ const functionName = "mint"; // Replace with your function name
+
+ const options = {
+ contractAddress,
+ contractName,
+ functionName,
+ functionArgs,
+ appDetails: {
+ name: "BitBadge",
+ icon: "https://freesvg.org/img/bitcoin.png",
+ },
+ onFinish: (data) => {
+ console.log(data);
+ },
+ };
+
+ await openContractCall(options);
+};
+```
+{% endcode %}
+
+That's the end-to-end flow: retrieve tx raw and merkle proof from Blockstream's API, adapt formats (strip witness data for legacy-only support, reverse hashes for the library), assemble the arguments, and call the Clarity contract function that verifies inclusion using the clarity-bitcoin helper.
diff --git a/docs/build/build-a-frontend/README.md b/docs/build/build-a-frontend/README.md
new file mode 100644
index 0000000000..e3a68f560c
--- /dev/null
+++ b/docs/build/build-a-frontend/README.md
@@ -0,0 +1,5 @@
+# Build a Frontend
+
+A major part of building full-stack Stacks applications is creating a UI with a solid user experience. One of your primary tools for this is Stacks.js, a JavaScript library built by Hiro that simplifies working with contracts and the chain.
+
+Hiro provides documentation to help you use Stacks.js to build a frontend for your Clarity contracts.
diff --git a/docs/build/build-a-frontend/authentication-with-stacks.js.md b/docs/build/build-a-frontend/authentication-with-stacks.js.md
new file mode 100644
index 0000000000..31a194f753
--- /dev/null
+++ b/docs/build/build-a-frontend/authentication-with-stacks.js.md
@@ -0,0 +1,101 @@
+# Authentication with Stacks.js
+
+Authenticating with a Stacks wallet is a common task when building Stacks dapps. Below is a React-based example (from the Hello Stacks tutorial) showing how to set up front-end authentication with Stacks.js and access user data in the UI.
+
+{% hint style="info" %}
+This example uses React, but the patterns can be adapted to other front-end frameworks.
+{% endhint %}
+
+## Install
+
+{% code title="Install with yarn" %}
+```bash
+yarn add @stacks/connect
+```
+{% endcode %}
+
+## Stacks.js Code (React)
+
+This example implements the authentication flow and loads user data when the user signs in.
+
+{% code title="App.jsx" %}
+```javascript
+import {
+ AppConfig,
+ UserSession,
+ AuthDetails,
+ showConnect,
+} from "@stacks/connect";
+import { useState, useEffect } from "react";
+
+function App() {
+ const [message, setMessage] = useState("");
+ const [transactionId, setTransactionId] = useState("");
+ const [currentMessage, setCurrentMessage] = useState("");
+ const [userData, setUserData] = useState(undefined);
+
+ const appConfig = new AppConfig(["store_write"]);
+ const userSession = new UserSession({ appConfig });
+
+ const appDetails = {
+ name: "Hello Stacks",
+ icon: "https://freesvg.org/img/1541103084.png",
+ };
+
+ const connectWallet = () => {
+ showConnect({
+ appDetails,
+ onFinish: () => window.location.reload(),
+ userSession,
+ });
+ };
+
+ useEffect(() => {
+ if (userSession.isSignInPending()) {
+ userSession.handlePendingSignIn().then((userData) => {
+ setUserData(userData);
+ });
+ } else if (userSession.isUserSignedIn()) {
+ setUserData(userSession.loadUserData());
+ }
+ }, []);
+
+ return (
+
+
+
Hello Stacks
+
+ );
+}
+
+export default App;
+```
+{% endcode %}
+
+This is all the code needed to authenticate and access user data in the UI.
+
+## Example: Connect Wallet Button (conditional)
+
+Here is how you might render a Connect Wallet button only when there is no signed-in user:
+
+{% code title="Conditional Connect Button" %}
+```javascript
+{
+ !userData && (
+
+ );
+}
+```
+{% endcode %}
+
+When clicked, `connectWallet` calls `showConnect` from @stacks/connect, which opens the wallet for the user to sign in. After sign-in completes, the app reloads (via `onFinish`) and the `useEffect` code loads and stores the user data in state.
diff --git a/docs/build/build-a-frontend/post-conditions-with-stacks.js.md b/docs/build/build-a-frontend/post-conditions-with-stacks.js.md
new file mode 100644
index 0000000000..04eee406d4
--- /dev/null
+++ b/docs/build/build-a-frontend/post-conditions-with-stacks.js.md
@@ -0,0 +1,133 @@
+# Post Conditions with Stacks.js
+
+The content in this recipe has been pulled from the [tutorial on post conditions](https://dev.to/stacks/understanding-stacks-post-conditions-e65). Post conditions are an additional safety feature built into the Stacks chain itself that help to protect end users.
+
+Rather than being a function of Clarity smart contracts, they are implemented on the client side and meant to be an additional failsafe against malicious contracts.
+
+Put simply, post conditions are a set of conditions that must be met before a user's transaction will execute. The primary goal behind post conditions is to limit the amount of damage that can be done to a user's assets due to a bug, intentional or otherwise.
+
+So they are sent as part of the transaction when the user initiates it, meaning we need a frontend library to utilize them.
+
+Whenever you are transferring an asset (fungible or non-fungible) from one address to another, you should take advantage of post conditions.
+
+We're going to use [Stacks.js](https://github.com/hirosystems/stacks.js/tree/master/packages/transactions#post-conditions) to familiarize ourselves with them.
+
+### STX Post Condition
+
+```js
+import {
+ FungibleConditionCode,
+ makeStandardSTXPostCondition,
+ makeContractSTXPostCondition,
+} from "@stacks/transactions";
+
+// With a standard principal
+const postConditionAddress = "SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE";
+const postConditionCode = FungibleConditionCode.GreaterEqual;
+const postConditionAmount = 12345n;
+
+const standardSTXPostCondition = makeStandardSTXPostCondition(
+ postConditionAddress,
+ postConditionCode,
+ postConditionAmount
+);
+
+// With a contract principal
+const contractAddress = "SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X";
+const contractName = "test-contract";
+
+const contractSTXPostCondition = makeContractSTXPostCondition(
+ contractAddress,
+ contractName,
+ postConditionCode,
+ postConditionAmount
+);
+```
+
+### Fungible Token Post Condition
+
+```js
+import {
+ FungibleConditionCode,
+ createAssetInfo,
+ makeStandardFungiblePostCondition,
+} from "@stacks/transactions";
+
+// With a standard principal
+const postConditionAddress = "SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE";
+const postConditionCode = FungibleConditionCode.GreaterEqual;
+const postConditionAmount = 12345n;
+const assetAddress = "SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ";
+const assetContractName = "test-asset-contract";
+const fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName);
+
+const standardFungiblePostCondition = makeStandardFungiblePostCondition(
+ postConditionAddress,
+ postConditionCode,
+ postConditionAmount,
+ fungibleAssetInfo
+);
+
+// With a contract principal
+const contractAddress = "SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X";
+const contractName = "test-contract";
+const assetAddress = "SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ";
+const assetContractName = "test-asset-contract";
+const fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName);
+
+const contractFungiblePostCondition = makeContractFungiblePostCondition(
+ contractAddress,
+ contractName,
+ postConditionCode,
+ postConditionAmount,
+ fungibleAssetInfo
+);
+```
+
+### NFT Post Condition
+
+```js
+import {
+ NonFungibleConditionCode,
+ createAssetInfo,
+ makeStandardNonFungiblePostCondition,
+ makeContractNonFungiblePostCondition,
+ bufferCVFromString,
+} from "@stacks/transactions";
+
+// With a standard principal
+const postConditionAddress = "SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE";
+const postConditionCode = NonFungibleConditionCode.Owns;
+const assetAddress = "SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ";
+const assetContractName = "test-asset-contract";
+const assetName = "test-asset";
+const tokenAssetName = bufferCVFromString("test-token-asset");
+const nonFungibleAssetInfo = createAssetInfo(
+ assetAddress,
+ assetContractName,
+ assetName
+);
+
+const standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(
+ postConditionAddress,
+ postConditionCode,
+ nonFungibleAssetInfo,
+ tokenAssetName
+);
+
+// With a contract principal
+const contractAddress = "SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X";
+const contractName = "test-contract";
+
+const contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(
+ contractAddress,
+ contractName,
+ postConditionCode,
+ nonFungibleAssetInfo,
+ tokenAssetName
+);
+```
+
+### Sample App
+
+Here's a [sample application](https://github.com/kenrogers/fabulous-frogs) that utilizes post conditions on the front end to secure user assets.
diff --git a/docs/build/build-a-frontend/sending-transactions-with-stacks.js.md b/docs/build/build-a-frontend/sending-transactions-with-stacks.js.md
new file mode 100644
index 0000000000..a3bfe28cea
--- /dev/null
+++ b/docs/build/build-a-frontend/sending-transactions-with-stacks.js.md
@@ -0,0 +1,60 @@
+# Sending Transactions with Stacks.js
+
+Any Stacks dapp is going to require sending transactions at some point, so how do we do that? We use the `@stacks/transactions` package.
+
+Again, this particular snippet is pulled from our Hello Stacks tutorial.
+
+{% hint style="warning" %}
+When you send Stacks transactions, don't forget to utilize post conditions.
+{% endhint %}
+
+But first, you'll need to install the right NPM package.
+
+{% code title="Install" %}
+```bash
+yarn add @stacks/transactions
+```
+{% endcode %}
+
+### Stacks.js Frontend Code
+
+Assuming you are authenticated, you'll need to import from the `network` package to connect and import the right Clarity values to convert.
+
+You need to convert values from JS into the right format for Clarity values to ingest. You can view the complete list of types on the Stacks.js docs: https://stacks.js.org/modules/\_stacks\_transactions#constructing-clarity-values
+
+{% code title="Imports" %}
+```js
+import { StacksMocknet } from "@stacks/network";
+import { stringUtf8CV } from "@stacks/transactions";
+```
+{% endcode %}
+
+Let's assume we have a message that we need to send.
+
+```
+Hello this is something I need to say.
+```
+
+{% code title="Submitting a contract call" %}
+```js
+const submitMessage = async (e) => {
+ e.preventDefault();
+
+ const network = new StacksMocknet();
+
+ const options = {
+ contractAddress: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",
+ contractName: "hello-stacks",
+ functionName: "write-message",
+ functionArgs: [stringUtf8CV(message)],
+ network,
+ appDetails,
+ onFinish: ({ txId }) => console.log(txId),
+ };
+
+ await openContractCall(options);
+};
+```
+{% endcode %}
+
+For more details on the different types of transactions you can send, the Stacks.js docs have multiple examples: https://stacks.js.org/modules/\_stacks\_transactions
diff --git a/docs/build/clarity-crash-course.md b/docs/build/clarity-crash-course.md
new file mode 100644
index 0000000000..ce6a80f4f9
--- /dev/null
+++ b/docs/build/clarity-crash-course.md
@@ -0,0 +1,96 @@
+# Clarity Crash Course
+
+## Clarity Crash Course
+
+This is designed for people with some programming experience who are new to Clarity. You don't need prior smart contract development experience, but if you have experience with languages like Solidity, you'll pick this up quickly.
+
+Once you've familiarized yourself with the language, consider the book [Clarity of Mind](https://book.clarity-lang.org/title-page.html) or the course [Clarity Universe](https://clarity-lang.org/universe) to continue your learning.
+
+### Your First Clarity Smart Contract
+
+We're going to build a basic Clarity smart contract using [Clarity Tools](https://clarity.tools/code/new), so you won't have to install anything for this introduction. Visit that link and it will open up a new contract for you.
+
+Clarity Tools evaluates Clarity code in real-time — handy for experimenting and seeing immediate results.
+
+The initial example contains comments (two semicolons) and a public function declaration. Clarity's syntax is inspired by LISP: everything is an expression wrapped in parentheses. Function definitions, variable declarations, and parameters are lists inside lists. This makes Clarity concise and readable once you get used to it.
+
+{% stepper %}
+{% step %}
+### Understanding a simple expression
+
+We can think of some constructs as function calls. For example:
+
+* Call a function called `define-read-only` (a built-in function).
+* Pass it a parameter `hello`, which corresponds to the method signature.
+* Pass it a parameter `"Hello"`, which corresponds to the function body.
+
+You can refer to the [`define-read-only`](https://docs.stacks.co/docs/write-smart-contracts/clarity-language/language-functions#define-read-only) documentation for details.
+{% endstep %}
+
+{% step %}
+### Everything is an expression
+
+Clarity treats everything as expressions inside expressions. Function definitions are calls to built-in functions; the function body is an expression. This uniformity helps reasoning about programs in Clarity.
+{% endstep %}
+
+{% step %}
+### Use LISP-like nesting
+
+Expect nested parentheses and expressions. You’ll often read code as lists inside lists, where each parentheses-enclosed group represents a call or expression.
+{% endstep %}
+{% endstepper %}
+
+Let's expand on these ideas by creating a new function. Paste this into Clarity Tools:
+
+{% code title="contract.clar" %}
+```clarity
+(define-data-var count int 0)
+(define-public (add-number (number int))
+ (let
+ (
+ (current-count count)
+ )
+
+ (var-set count (+ 1 number))
+ (ok (var-get count))
+ )
+)
+
+
+(add-number 5)
+```
+{% endcode %}
+
+If you type that into Clarity Tools, you'll see the result printed is 6.
+
+#### What this code does
+
+* (define-data-var count int 0)\
+ Defines a persistent state variable `count` initialized to 0. This value is persisted on-chain when the contract is deployed.
+* Clarity is interpreted, not compiled. When the contract is deployed, top-level expressions run (so the data var initialization happens at deploy time).
+* (define-public (add-number (number int)) ...)\
+ Defines a public function `add-number` that takes a single parameter `number` of type `int`. Public functions can modify chain state and be called from outside the contract.
+
+{% hint style="info" %}
+In Clarity, there are public, private, and read-only functions:
+
+* public: can modify chain state and be called externally.
+* private: can modify state but only be called within the contract.
+* read-only: will fail if they attempt to modify state.
+{% endhint %}
+
+* (let ((current-count count)) ...)\
+ The `let` expression wraps multiple steps into a single expression (function bodies must evaluate to a single expression). It also declares local variables for use inside the function. Here `current-count` is a function-local variable set to `count`.
+* (var-set count (+ 1 number))\
+ Sets the persistent `count` to `1 + number`. The `+` is itself a function call with operands as parameters.
+* (ok (var-get count))\
+ Returns the new value of `count` wrapped in an `ok` response to indicate success.
+* (add-number 5)\
+ Calls the function with parameter 5 (this is how you can invoke the function in an interactive environment like Clarity Tools).
+
+This brief overview should get your feet wet with Clarity. For deeper learning, we recommend:
+
+* The [Clarity Book](https://book.clarity-lang.org/title-page.html)
+* [Clarity Universe](https://clarity-lang.org/universe)
+
+If you prefer jumping into reference material and examples, the Clarity docs contain guides and sample contracts to explore.
diff --git a/docs/build/create-tokens/README.md b/docs/build/create-tokens/README.md
new file mode 100644
index 0000000000..10dee17353
--- /dev/null
+++ b/docs/build/create-tokens/README.md
@@ -0,0 +1,3 @@
+# Create Tokens
+
+Rather than needing to work with external libraries, Clarity has built-in functions that make working with fungible and non-fungible tokens a breeze.
diff --git a/docs/build/create-tokens/creating-a-ft.md b/docs/build/create-tokens/creating-a-ft.md
new file mode 100644
index 0000000000..f51f809a64
--- /dev/null
+++ b/docs/build/create-tokens/creating-a-ft.md
@@ -0,0 +1,102 @@
+# Creating a FT
+
+
+
+Much the same as creating an NFT, Clarity also makes creating a fungible token (FT) trivial as well.
+
+The process and code are much the same.
+
+### Trait
+
+Just like with the NFT, it's a good idea to create a trait when you create a fungible token so that different tools and protocols can be confident in building interfaces for those tokens.
+
+Since FTs may be divisible, the [FT official mainnet deployment trait address](https://explorer.stacks.co/txid/0x99e01721e57adc2c24f7d371b9d302d581dba1d27250c7e25ea5f241af14c387?chain=mainnet) has additional functions.
+
+{% code title="sip-010-trait.clar" %}
+```clarity
+(define-trait sip-010-trait
+ (
+ ;; Transfer from the caller to a new principal
+ (transfer (uint principal principal (optional (buff 34))) (response bool uint))
+
+ ;; the human readable name of the token
+ (get-name () (response (string-ascii 32) uint))
+
+ ;; the ticker symbol, or empty if none
+ (get-symbol () (response (string-ascii 32) uint))
+
+ ;; the number of decimals used, e.g. 6 would mean 1_000_000 represents 1 token
+ (get-decimals () (response uint uint))
+
+ ;; the balance of the passed principal
+ (get-balance (principal) (response uint uint))
+
+ ;; the current total supply (which does not need to be a constant)
+ (get-total-supply () (response uint uint))
+
+ ;; an optional URI that represents metadata of this token
+ (get-token-uri () (response (optional (string-utf8 256)) uint))
+ )
+)
+```
+{% endcode %}
+
+Now let's see how we might implement this in Clarity, just like we would an NFT.
+
+### Clarity Code
+
+{% code title="fungible-token.clar" %}
+```clarity
+(impl-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)
+
+
+(define-constant contract-owner tx-sender)
+(define-constant err-owner-only (err u100))
+(define-constant err-not-token-owner (err u101))
+
+;; No maximum supply!
+(define-fungible-token clarity-coin)
+
+(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34))))
+ (begin
+ (asserts! (is-eq tx-sender sender) err-not-token-owner)
+ (try! (ft-transfer? clarity-coin amount sender recipient))
+ (match memo to-print (print to-print) 0x)
+ (ok true)
+ )
+)
+
+(define-read-only (get-name)
+ (ok "Clarity Coin")
+)
+
+(define-read-only (get-symbol)
+ (ok "CC")
+)
+
+(define-read-only (get-decimals)
+ (ok u6)
+)
+
+(define-read-only (get-balance (who principal))
+ (ok (ft-get-balance clarity-coin who))
+)
+
+(define-read-only (get-total-supply)
+ (ok (ft-get-supply clarity-coin))
+)
+
+
+(define-read-only (get-token-uri)
+ (ok none)
+)
+
+
+(define-public (mint (amount uint) (recipient principal))
+ (begin
+ (asserts! (is-eq tx-sender contract-owner) err-owner-only)
+ (ft-mint? clarity-coin amount recipient)
+ )
+)
+```
+{% endcode %}
diff --git a/docs/build/create-tokens/creating-a-nft.md b/docs/build/create-tokens/creating-a-nft.md
new file mode 100644
index 0000000000..b2c118550e
--- /dev/null
+++ b/docs/build/create-tokens/creating-a-nft.md
@@ -0,0 +1,92 @@
+# Creating a NFT
+
+
+
+{% hint style="info" %}
+For a more in-depth discussion of NFTs in Clarity and how to create them, check out the [NFTs chapter in the Clarity book](https://book.clarity-lang.org/ch10-01-sip009-nft-standard.html).
+{% endhint %}
+
+## Creating a NFT
+
+Clarity makes creating NFTs incredibly easy. With built-in functions for creating and working with the token, you can have an NFT created in less than 10 minutes of work.
+
+Let's see how.
+
+#### Trait
+
+The first thing we need when we create an NFT is a trait. A trait is an interface that allows us to create an NFT with a defined set of functions. Its primary purpose is to ensure that NFTs are composable and different tools know how to interact with them.
+
+By implementing a trait that the community agrees on, all protocols and products know how they can interact with an NFT.
+
+The official mainnet trait can be [found on the Stacks Explorer](https://explorer.stacks.co/txid/0x80eb693e5e2a9928094792080b7f6d69d66ea9cc881bc465e8d9c5c621bd4d07?chain=mainnet) and looks like this:
+
+{% code title="nft-trait.clar" %}
+```clarity
+(define-trait nft-trait
+ (
+ ;; Last token ID, limited to uint range
+ (get-last-token-id () (response uint uint))
+
+ ;; URI for metadata associated with the token
+ (get-token-uri (uint) (response (optional (string-ascii 256)) uint))
+
+ ;; Owner of a given token identifier
+ (get-owner (uint) (response (optional principal) uint))
+
+ ;; Transfer from the sender to a new principal
+ (transfer (uint principal principal) (response bool uint))
+ )
+)
+```
+{% endcode %}
+
+All we are doing here is defining the function signatures for functions we'll need to implement in our Clarity contract, which we can see a simple version of below.
+
+#### Clarity Code
+
+This is the Clarity code we need in order to create an NFT, with one additional function, `mint` that allows us to actually create a new NFT. This `mint` function is not needed to adhere to the trait.
+
+{% code title="amazing-aardvarks.clar" %}
+```clarity
+(impl-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait)
+
+(define-non-fungible-token amazing-aardvarks uint)
+
+(define-data-var last-token-id uint u0)
+
+(define-constant contract-owner tx-sender)
+(define-constant err-owner-only (err u100))
+(define-constant err-not-token-owner (err u101))
+
+(define-read-only (get-last-token-id)
+ (ok (var-get last-token-id))
+)
+
+(define-read-only (get-token-uri (token-id uint))
+ (ok none)
+)
+
+(define-read-only (get-owner (token-id uint))
+ (ok (nft-get-owner? amazing-aardvarks token-id))
+)
+
+(define-public (transfer (token-id uint) (sender principal) (recipient principal))
+ (begin
+ (asserts! (is-eq tx-sender sender) err-not-token-owner)
+ (nft-transfer? amazing-aardvarks token-id sender recipient)
+ )
+)
+
+(define-public (mint (recipient principal))
+ (let
+ (
+ (token-id (+ (var-get last-token-id) u1))
+ )
+ (asserts! (is-eq tx-sender contract-owner) err-owner-only)
+ (try! (nft-mint? amazing-aardvarks token-id recipient))
+ (var-set last-token-id token-id)
+ (ok token-id)
+ )
+)
+```
+{% endcode %}
diff --git a/docs/build/misc.-guides/build-a-borrowing-and-lending-protocol.md b/docs/build/misc.-guides/build-a-borrowing-and-lending-protocol.md
new file mode 100644
index 0000000000..1aa8dd4ded
--- /dev/null
+++ b/docs/build/misc.-guides/build-a-borrowing-and-lending-protocol.md
@@ -0,0 +1,11 @@
+# Build a Borrowing & Lending Protocol
+
+In this in-depth tutorial, you'll get a holistic overview of the entire Stacks development process by building a very simple borrowing and lending protocol called Lagoon.
+
+We'll utilize the Hiro Platform to quickly get our contract set up and written. In an upcoming version of this tutorial, we'll also be creating the frontend and tests for our contract.
+
+A written version is also in the works.
+
+We'll also dig into sBTC a bit, the upcoming decentralized BTC peg, and how you can begin experimenting with it now.
+
+{% embed url="https://www.youtube.com/watch?v=-JFZ60UGODY" %}
diff --git a/docs/build/misc.-guides/community-tutorials.md b/docs/build/misc.-guides/community-tutorials.md
new file mode 100644
index 0000000000..54448e5058
--- /dev/null
+++ b/docs/build/misc.-guides/community-tutorials.md
@@ -0,0 +1,27 @@
+# Community Tutorials
+
+
source: EasyA x Stacks hackathon at Harvard University [2024]
+
+These tutorials have been created by various developers of the Stacks community. Have a tutorial to suggest? View the [contribution guide](http://localhost:3000/docs/contribute/docs) to submit a PR with a new tutorial added.
+
+### Written Tutorials
+
+* [Create a server-side rendered Stacks app with Remix](https://micro-stacks.dev/guides/with-remix)
+* [Build a Stacks app with Next.js](https://micro-stacks.dev/guides/with-nextjs)
+* [Creating a Voting Contract](https://www.clearness.dev/01-voting-clarity-smart-contract/01-getting-started)
+* [Building an NFT with Stacks and Clarity](https://blog.developerdao.com/building-an-nft-with-stacks-and-clarity)
+* [Minting NFTs with QuickNode](https://www.quicknode.com/guides/web3-sdks/how-to-mint-nfts-on-the-stacks-blockchain)
+* [Order Book Contract Walkthrough](https://byzantion.hiro.so/)
+* [Build a DEX on Stacks](https://www.pointer.gg/tutorials/build-a-dex-with-stacks/56abb3a4-05c1-4608-b096-f82189e9f759)
+* [NFT Tutorial](https://docs.hiro.so/tutorials/clarity-nft)
+* [Billboard Tutorial](https://docs.hiro.so/tutorials/clarity-billboard)
+* [Integrating NFTs Into a Game](https://gamefi-stacks.gitbook.io/gamefistacks/tutorials/integrate-nfts-into-game)
+* [Building on Stacks](https://github.com/amoweolubusayo/stacks-clarinet-tutorial)
+
+### Video Tutorials
+
+* [Web3 for Bitcoin](https://www.crowdcast.io/e/web3-for-bitcoin/)
+
+### Other Resources
+
+There are also a great amount of both tutorials and developer tools in the [Awesome Stacks repo](https://github.com/friedger/awesome-stacks-chain#clarity-resources).
diff --git a/docs/build/price-oracles.md b/docs/build/price-oracles.md
new file mode 100644
index 0000000000..7c82fe19e2
--- /dev/null
+++ b/docs/build/price-oracles.md
@@ -0,0 +1,42 @@
+# Price Oracles
+
+
source: Hiro
+
+## Price‑Feed Oracles on Stacks
+
+Smart contracts written in **Clarity** run in a deterministic sandbox: they can read data in the Stacks and Bitcoin chainstate, but _nothing else_. Whenever your dApp needs the latest **BTC/USD**, **STX/BTC**, or any other market price, you’ll rely on an **oracle** to bring that data on‑chain in a verifiable way.
+
+This page explains why price‑feed oracles matter on Stacks and links to the specific oracle provider docs with instructions on how to integrate them.
+
+***
+
+### Why you need a price‑feed oracle
+
+Here are some possible scenarios where you might need an oracle.
+
+| On‑chain need | Typical Stacks use case | What the oracle supplies |
+| ------------------------------------ | ---------------------------------------------- | ----------------------------------- |
+| **Liquidations & collateral ratios** | Lending / borrowing protocols, margin trading | Signed price updated every N blocks |
+| **Stablecoin peg maintenance** | BTC‑backed or exogenous‑collateral stablecoins | Reference BTC/USD (or other) price |
+| **AMM curve calculations** | DEXs that tune fees or rebalance pools | Time‑weighted average price (TWAP) |
+| **Derivatives settlement** | Options, futures, or perpetual swaps | Final settlement price at expiry |
+
+{% hint style="info" %}
+Rule of thumb: if your contract’s math depends on a real‑time market price, you need a price‑feed oracle.
+{% endhint %}
+
+### Oracle Providers
+
+There are two oracle providers that Stacks builders commonly use for price data: Pyth and DIA.
+
+**Pyth**
+
+Pyth is a pull-based oracle. Trust Machines currently maintains the Pyth bridge. See the docs and Clarity contracts on Trust Machine's GitHub [repo](https://github.com/Trust-Machines/stacks-pyth-bridge) for the bridge. Check out the step-by-step guide from the Hiro blog:
+
+{% embed url="https://www.hiro.so/blog/using-real-time-price-data-in-clarity" %}
+
+**DIA**
+
+DIA is another oracle provider used by Stacks builders. See DIA's [guide](https://nexus.diadata.org/how-to-guides/fetch-price-data/chain-specific-guide/stacks) for how to use DIA oracles with Stacks. Check out the video tutorial to learn more on how DIA works for Clarity smart contracts:
+
+{% embed url="https://youtu.be/bhWQxHGpv2s?si=dWlBAEAuYtoQj2sC" %}
diff --git a/docs/build/sbtc/README.md b/docs/build/sbtc/README.md
new file mode 100644
index 0000000000..fff18bd7e8
--- /dev/null
+++ b/docs/build/sbtc/README.md
@@ -0,0 +1,7 @@
+# sBTC
+
+The guides in this section provide step-by-step instructions for interacting with sBTC, including operating as a signer and (coming soon) developer guides on how to interact with sBTC as an application developer.
+
+{% hint style="info" %}
+In order to run an sBTC signer you must be one of the [approved signers](https://github.com/stacks-network/sbtc/discussions/624) described in [SIP-028](https://github.com/andrerserrano/sips/blob/main/sips/sip-028/sip-028-sbtc_peg.md).
+{% endhint %}
diff --git a/docs/build/sbtc/best-practices-for-running-an-sbtc-signer.md b/docs/build/sbtc/best-practices-for-running-an-sbtc-signer.md
new file mode 100644
index 0000000000..d614a3b677
--- /dev/null
+++ b/docs/build/sbtc/best-practices-for-running-an-sbtc-signer.md
@@ -0,0 +1,121 @@
+# Best Practices for running an sBTC Signer
+
+The following best practices suggest how to create a resilient setup for running your sBTC Signer.
+
+## Protect your private key and have a cold-storage backup
+
+* Prevent unauthorised access to the sBTC Signer private key.
+* Keep an offline, secure backup of your sBTC Signer private key (e.g., hardware security modules or encrypted storage devices).
+
+## Backup your sBTC Signer PostgreSQL DB
+
+* Perform daily backups of the sBTC Signer PostgreSQL DB.
+* Periodically verify the integrity of backups (see steps below).
+
+### Verifying integrity of PostgreSQL DB backups
+
+{% stepper %}
+{% step %}
+### Import the backup
+
+Import the backup into a fresh PostgreSQL instance. The database alone is sufficient — you do not need to spin up a Stacks or Bitcoin node or the sBTC signer.
+{% endstep %}
+
+{% step %}
+### Run the verification query
+
+Execute the following query:
+
+{% code title="PostgreSQL" %}
+```
+```
+{% endcode %}
+
+```sql
+SELECT aggregate_key FROM sbtc_signer.dkg_shares
+WHERE dkg_shares_status = 'verified'
+ORDER BY created_at DESC;
+```
+
+This returns rows like:
+
+```sql
+ aggregate_key
+----------------------------------------------------------------------
+ \x03d8c4344861fc7590fd812c24884a3bfd9374d8ba865a787ff53c9060020aa967
+ \x03f898f8a6ddb86dd4608dd168355ec6135fe2839222240c01942e8e7e50dd4c89
+(2 rows)
+```
+
+The most recent `aggregate_key` is the first row.
+{% endstep %}
+
+{% step %}
+### Compare with the on-chain aggregate key
+
+Fetch the current aggregate pubkey from the sbtc-registry contract and compare it to the most recent `aggregate_key` from the DB query:
+
+```bash
+curl -s 'https://api.hiro.so/v2/contracts/call-read/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4/sbtc-registry/get-current-aggregate-pubkey' \
+ -H 'content-type: application/json' --data-raw '{"sender":"SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4","arguments":[]}' | jq .result
+```
+
+Example output:
+
+```
+"0x020000002103d8c4344861fc7590fd812c24884a3bfd9374d8ba865a787ff53c9060020aa967"
+```
+
+Discard the prefix `0x02000000210` (Clarity encoding). The remaining hex `3d8c4344861fc7590fd812c24884a3bfd9374d8ba865a787ff53c9060020aa967` should match the first row of the PostgreSQL query (excluding `\x0` which indicates hex encoding).
+{% endstep %}
+{% endstepper %}
+
+## Setup proper access control
+
+* Require hardware 2FA keys for access control (e.g., YubiKey) to connect through SSH, to authenticate to AWS, and for every other relevant action.
+* Follow the principle of least privilege: if you don’t need access, you don’t get access; if you get access, it expires after the action is taken.
+
+{% hint style="info" %}
+Optional, but strongly recommended: Implement a "4-eyes" process (require that any activity by an individual must be reviewed or approved by a second individual) to access critical resources (e.g., deploying a new version of the sBTC signer).
+{% endhint %}
+
+## Maintain a strict firewall configuration
+
+* Allow connections to your sBTC signer `listen_on` address (used for P2P communication).
+* Do not expose any non-essential service to the internet: use a DEFAULT DENY policy with explicit ALLOWs for necessary network traffic (such as sBTC signer P2P and SSH).
+
+## Maintain a robust secrets management program
+
+* Ensure all relevant secrets are safely managed and rotated (where possible), e.g., if someone leaves the team.
+
+## Monitor and observe your sBTC Signer
+
+* Retain at least 90 days of logs for the sBTC Signer, the Stacks node, and the Bitcoin node.
+* The sBTC signer can optionally expose Prometheus metrics (see `prometheus_exporter_endpoint` configuration option).
+
+{% hint style="info" %}
+You can use Prometheus metrics to monitor signer health. For example, see how Alloy can be configured to collect metrics on Grafana Cloud: ../running-a-signer/how-to-monitor-signer.md
+{% endhint %}
+
+## Provision dedicated downstream components
+
+* Run a dedicated Bitcoin node and Stacks node for your sBTC Signer.
+ * Ensure the nodes are provisioned with the minimum hardware requirements described here: https://docs.stacks.co/guides-and-tutorials/running-a-signer#minimum-system-requirements
+ * Nodes should be exclusively dedicated to serve the sBTC Signer. Avoid re-using them to serve other clients as that may negatively affect performance (no mock-signing, no Stacks API nodes).
+
+## Monitor new software releases
+
+* Stay up-to-date with new releases, patches, and security advisories for all used operating systems, software and packages.
+ * https://www.cve.org/ is a useful resource for popular software packages.
+ * Subscribe to security notifications from your vendors.
+ * Join relevant messaging channels as applicable (Discord, Slack, etc.).
+* Exercise vulnerability management for all packages.
+* Apply updates promptly, especially those addressing security vulnerabilities.
+* Use inventory and patch management software, if available.
+
+## Ensure redundancy in operations
+
+* Ensure that multiple, trusted system administrators can manage and maintain your sBTC Signer instance.
+* Where feasible, system administrators should span different time zones.
+* Document your operations procedures and ensure that relevant personnel have access to them.
+
diff --git a/docs/build/sbtc/how-to-earn-sbtc-rewards.md b/docs/build/sbtc/how-to-earn-sbtc-rewards.md
new file mode 100644
index 0000000000..683cd3ce37
--- /dev/null
+++ b/docs/build/sbtc/how-to-earn-sbtc-rewards.md
@@ -0,0 +1,37 @@
+# How to Earn sBTC Rewards
+
+As part of the launch of sBTC, you can enroll in the sBTC rewards program and earn real yield on your BTC, paid in sBTC.
+
+The rewards program is non-custodial — your sBTC remains in your wallet.
+
+There are only 3 steps to participate in the sBTC rewards.
+
+{% stepper %}
+{% step %}
+**Mint sBTC**
+
+To get started, first mint your sBTC by using the bridge at [app.stacks.co](https://sbtc.stacks.co/).
+{% endstep %}
+
+{% step %}
+**Connect your wallet**
+
+After your sBTC has been minted to your wallet, visit the rewards program site at [bitcoinismore.org](https://bitcoinismore.org/) and connect your wallet. Then click the "Earn Rewards" button.
+
+
+
+{% hint style="info" %}
+You may need to enable the sBTC token listing display in your wallet before it is visible. In Leather, you can do this by clicking "Manage Tokens" and toggling on sBTC.
+
+.png>)
+{% endhint %}
+{% endstep %}
+
+{% step %}
+**Enroll in the rewards program**
+
+Finally, execute a Stacks transaction using your connected wallet to enroll in the program. You will need enough STX to cover the transaction fee to enroll in the rewards program.
+
+
+{% endstep %}
+{% endstepper %}
diff --git a/docs/build/sbtc/how-to-run-sbtc-signer.md b/docs/build/sbtc/how-to-run-sbtc-signer.md
new file mode 100644
index 0000000000..baea1839c8
--- /dev/null
+++ b/docs/build/sbtc/how-to-run-sbtc-signer.md
@@ -0,0 +1,193 @@
+# How to Run sBTC Signer
+
+{% hint style="info" %}
+This documentation provides guidelines, best-practices and recommendations for running an sBTC Signer. Review it and adapt it to your infrastructure policy before deploying it.
+{% endhint %}
+
+{% hint style="warning" %}
+Each sBTC signer will control a set of signing shares used to sign transactions on both Bitcoin and Stacks.
+
+Such shares will be encrypted by using the `private_key` specified in the Signer's config and stored in the PostgreSQL database attached to each signer.
+
+It is of the utmost importance to follow the recommendations below.
+{% endhint %}
+
+{% stepper %}
+{% step %}
+### Prevent unauthorized access to signer infrastructure
+
+Prevent unauthorized access to the sBTC Signer infrastructure (the signer itself, its private key, and the associated PostgreSQL database).
+{% endstep %}
+
+{% step %}
+### Keep an offline, secure backup of the Signer private key
+
+Keep an offline, secure backup of the sBTC Signer private key.
+{% endstep %}
+
+{% step %}
+### Regularly backup PostgreSQL database
+
+Regularly backup the PostgreSQL database and store it in a secure location.
+{% endstep %}
+{% endstepper %}
+
+See [here](best-practices-for-running-an-sbtc-signer.md) for additional best practices to run an sBTC signer.
+
+## Minimum System Requirements
+
+Below are the **minimum required specs** to be able to run a sBTC signer.
+
+* 2 CPU
+* 4GB memory
+* 50GB storage
+
+Note that these are in _addition_ to the hardware requirements for running a Stacks node and Bitcoin node outlined in the [How to Run a Signer doc](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/run-a-signer).
+
+## Connection diagram
+
+
+
+## Configure your Bitcoin node
+
+### Minimum version
+
+You will need `bitcoind` version 25 or higher.
+
+### Settings
+
+Your Bitcoin node must include these settings for sBTC signer operation:
+
+* `txindex=1`: Transaction indexing must be enabled
+* `server=1`: RPC server must be enabled
+
+### RPC-Based Block Detection
+
+Starting with sBTC v1.1.0, the signer uses RPC polling instead of ZeroMQ for block detection.
+
+The signer connects to Bitcoin Core via RPC and polls for new bitcoin blocks. This process works as follows:
+
+{% stepper %}
+{% step %}
+### Bitcoin Core validates a new block
+
+Bitcoin Core validates a new block.
+{% endstep %}
+
+{% step %}
+### Signer detects the block via RPC polling
+
+Signer detects the block via RPC polling.
+{% endstep %}
+
+{% step %}
+### Signer processes relevant sBTC transactions
+
+Signer processes relevant sBTC transactions.
+{% endstep %}
+{% endstepper %}
+
+### Example
+
+```bash
+bitcoind \
+ -server \
+ -datadir=${BITCOIN_DATA} \
+ -rpcbind=0.0.0.0 \
+ -rpcuser=${BITCOIN_RPC_USERNAME} \
+ -rpcpassword=${BITCOIN_RPC_PASSWORD} \
+ -rpcport=${BITCOIN_RPC_PORT} \
+ -rpcallowip=0.0.0.0/0 \
+ -rpcallowip=::/0 \
+ -txindex
+```
+
+## Configure your Stacks node
+
+### Minimum version
+
+Please ensure your Stacks version is up-to-date (using the latest release).
+
+### Event observer
+
+You will need to add a _new_ event observer that relays information from the sBTC smart contracts to the sBTC signer:
+
+```toml
+[[events_observer]]
+endpoint = "sbtc-signer:8801"
+events_keys = [
+ "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-registry::print",
+]
+```
+
+### Reference configuration
+
+See [here](https://github.com/stacks-network/sbtc/blob/main/docker/mainnet/nodes/stacks/Config.toml.in).
+
+## Configure your sBTC Signer
+
+The signer configuration file (`signer-config.toml`) defines the signer's operation parameters. The configuration sections include:
+
+### Blocklist Client Settings
+
+```toml
+[blocklist_client]
+endpoint = "http://blocklist-client:3032"
+```
+
+### Bitcoin Connection Settings
+
+Defines how the signer connects to Bitcoin Core:
+
+```toml
+[bitcoin]
+rpc_endpoints = ["http://user:pass@your-bitcoin-node:8332"]
+
+# Note: block_hash_stream_endpoints are no longer used as of v1.1.0
+
+# The signer now uses RPC polling for block detection
+```
+
+### Core Signer Parameters
+
+Defines the signer's identity and network participation:
+
+```toml
+[signer]
+private_key = "your-private-key" # 32 or 33-byte hex format
+network = "mainnet"
+deployer = "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4"
+```
+
+### P2P Network Configuration
+
+Controls how the signer communicates with other network participants:
+
+```toml
+[signer.p2p]
+listen_on = ["tcp://0.0.0.0:4122"]
+```
+
+The signer operates on port 4122 by default and supports both TCP and QUIC protocols for peer communication. The signer will attempt QUIC connections first for improved performance, automatically falling back to TCP if QUIC is unavailable or blocked on the network.
+
+### Reference configuration
+
+See [here](https://github.com/stacks-network/sbtc/blob/main/docker/mainnet/sbtc-signer/signer-config.toml.in).
+
+## Set up your containers
+
+See [here](https://github.com/stacks-network/sbtc/blob/main/docker/mainnet/docker-compose.yml) for a Docker Compose including all the required components.
+
+{% hint style="warning" %}
+When deploying with Docker, always use [immutable image tags](https://docs.docker.com/reference/cli/docker/image/pull/#pull-an-image-by-digest-immutable-identifier) - the image digests are provided below. Verify the attestation of these images using this [guide](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations/using-artifact-attestations-to-establish-provenance-for-builds#verifying-artifact-attestations-with-the-github-cli).
+
+We publish our images on [GitHub Container Registry](https://github.com/stacks-sbtc/sbtc/pkgs/container/sbtc).
+{% endhint %}
+
+## Monitoring
+
+Monitoring Details TBD
+
+## Troubleshooting
+
+Troubleshooting Guide TBD
diff --git a/docs/build/sbtc/how-to-use-the-sbtc-bridge-with-fordefi.md b/docs/build/sbtc/how-to-use-the-sbtc-bridge-with-fordefi.md
new file mode 100644
index 0000000000..344037a335
--- /dev/null
+++ b/docs/build/sbtc/how-to-use-the-sbtc-bridge-with-fordefi.md
@@ -0,0 +1,130 @@
+# How to Use the sBTC Bridge with Fordefi
+
+{% hint style="warning" %}
+This guide is specifically for entities or teams that use [Fordefi](https://fordefi.com/) as it will demonstrate the flow for a multi-approval transaction policy setup. This assumes you have the Fordefi wallet setup with its browser extension and with its mobile app.
+{% endhint %}
+
+The sBTC Bridge is a web application allowing you to convert your BTC into sBTC on the Stacks chain. If you aren't familiar with sBTC, be sure to check out the [sBTC Conceptual Guide](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/sbtc) to understand how it works.
+
+{% hint style="danger" %}
+Ensure that you are using the bridge located at [sbtc.stacks.co](https://sbtc.stacks.co/). This is the only official sBTC bridge.
+{% endhint %}
+
+The sBTC Bridge has been designed to be as simple as possible to use. But specifically for this guide, a **2-of-2 approval transaction policy**, targeting Bitcoin transactions, has already been setup in the Fordefi UI. It is assumed you have a similar setup as this guide will walkthrough the different steps needed to take in such a scenario where multiple parties need to approve a transaction.
+
+If you need assistance in setting up such a transaction policy in Fordefi, check out their dedicated [docs](https://docs.fordefi.com/user-guide/policies).
+
+### Walkthrough for minting sBTC
+
+Here are the necessary steps to convert your BTC to sBTC using Fordefi:
+
+{% stepper %}
+{% step %}
+#### Confirm your BTC and STX vaults
+
+First, you'll need to make sure you have a vault for Bitcoin, and a separate vault for Stacks. Both of these vaults will be used later when connecting with the sBTC Bridge app.
+
+
A vault for native Bitcoin assets
+
+
A vault for native Stacks assets
+{% endstep %}
+
+{% step %}
+#### Connect your Fordefi wallet extension
+
+First, you'll need to connect your Fordefi wallet to the sBTC Bridge app.
+
+
Choose the option for Fordefi in the wallet selector modal
+{% endstep %}
+
+{% step %}
+#### Choose which Bitcoin and Stacks vault you want to use
+
+Next, the Fordefi extension will want you to select which Bitcoin vault, and then which Stacks vault you'd want to use. The reasoning for this is because you'll be needing to send a bitcoin transaction first from your Bitcoin vault, then you'll be receiving sBTC to your Stacks vault.
+
+
The selected Bitcoin vault needs to have at least the minimum required amount (0.001 BTC) of bitcoin to peg-in
+
+
When both vaults are selected, you'll be able to see both at the top of the Fordefi extension when connected
+{% endstep %}
+
+{% step %}
+#### Choose the amount of BTC to deposit
+
+After your wallet is connected, choose how much BTC you would like to convert to sBTC.
+
+{% hint style="info" %}
+There are two transaction fees required to mint your sBTC. The first is when they initiate the bitcoin deposit transaction within their wallet. The second is a fee used to consolidate the deposit UTXOs into the single Signer's UTXO. This separate transaction fee happens automatically and is set to a max of 80k sats. This is automatically deducted from your minted sBTC. This is not a Signer fee but a regular bitcoin transaction fee.
+{% endhint %}
+
+
+{% endstep %}
+
+{% step %}
+#### Choose the Stacks address to mint the sBTC to
+
+Next, enter the Stacks address you would like your sBTC minted to. This will just be the Stacks address associated with the Stacks vault that you selected earlier when connecting your Fordefi wallet extension.
+
+
Review the inputted STX address and then confirm
+{% endstep %}
+
+{% step %}
+#### Create initial BTC transfer
+
+Your Fordefi wallet extension will pop up prompting you to create the BTC transaction. This transaction is the initial peg-in transfer for your BTC to the sBTC Signers. Hit 'Create' after you confirm the transaction details and necessary approval details.
+
+{% hint style="info" %}
+If you have a transaction policy setup with certain approvals required, hitting 'Create' will not initiate the bitcoin transaction, it will simply store this unsigned transaction in your Fordefi wallet until all necessary approvals are met and then finally signed.
+{% endhint %}
+
+
You'll notice near the bottom of the Create Transaction view of the Fordefi extension is the required approval details. Be certain the other approvers are available to approve the transaction in a timely manner.
+
+
If you ever navigate back to your Fordefi web UI or extension UI, you'll notice this transaction will be marked as 'Pending approval'.
+{% endstep %}
+
+{% step %}
+#### Approve transaction by approvers
+
+Upon notice of transaction to approvers, each approver will need to approve transaction in their Fordefi mobile wallets before the completion of the final step, which is signing the transaction by the initiator.
+
+Each approver will need to pull up the pending transaction in their Fordefi mobile wallet and hit 'Approve'.
+
+
POV of approving transaction by approver
+{% endstep %}
+
+{% step %}
+#### Sign approved transaction
+
+Once all transaction policies are satisfied and approved, the initiator will need to officially sign the transaction in their Fordefi mobile wallet.
+
+This mobile signature action will then notify the sBTC Bridge app.
+
+
The initiator will need to hit 'Sign' once approvals and transaction details are confirmed
+{% endstep %}
+
+{% step %}
+#### Receive your sBTC
+
+Back in the sBTC Bridge app UI, you can monitor the status of your transaction to see when it has been completed, at which point you can see the sBTC in your Fordefi wallet. It will go through three stages:
+
+* Pending - Your [Bitcoin transaction](https://mempool.space/tx/6b5e63fbe4e4a4835dcf096ca2d2a8c112898692e28a4c5b38cb39e3e9837604) is processing
+* Minting - Your Bitcoin transaction has processed and the [sBTC signers are minting](https://explorer.hiro.so/txid/a9e232289d2c6e50150b034894182d341343e7064b27c8dccbd25ebca79b2947?chain=mainnet) your sBTC
+* Completed - Your sBTC has been minted to your wallet
+
+
The bitcoin and sBTC transactions will take some time to be completely processed by the Signers
+
+
Once both the bitcoin and sBTC mint transactions are confirmed, the sBTC Bridge app will show a 'Complete' status
+
+
You'll be able to see the results of these transactions in your Fordefi wallet
+{% endstep %}
+{% endstepper %}
+
+### Reclaiming BTC
+
+If your sBTC mint fails, you can reclaim your sBTC. You can do this via the bridge by visiting the reclaim page at https://sbtc.stacks.co/\/reclaim and replacing the bracketed text with your transaction ID as shown below:\
+[https://sbtc.stacks.co/8f37f750b6646f0a217121201967170bd3cfef5f2ebd4f30f359b5e9308470c4/reclaim](https://sbtc.stacks.co/8f37f750b6646f0a217121201967170bd3cfef5f2ebd4f30f359b5e9308470c4/reclaim)
+
+There is an intermediate step in between depositing BTC and the sBTC signers consolidating it into the single signer UTXO. If the transaction is not picked up by signers, you can reclaim it using this UI. Note there is a 'Lock Time' field on the Reclaim page. That indicates the amount of blocks that must have passed in order to reclaim your BTC.
+
+
+
+This initiates a Bitcoin transaction that will transfer your BTC back to you.
diff --git a/docs/build/sbtc/how-to-use-the-sbtc-bridge.md b/docs/build/sbtc/how-to-use-the-sbtc-bridge.md
new file mode 100644
index 0000000000..8356fe3d82
--- /dev/null
+++ b/docs/build/sbtc/how-to-use-the-sbtc-bridge.md
@@ -0,0 +1,83 @@
+# How to Use the sBTC Bridge
+
+The sBTC bridge is a web application allowing you to convert your BTC into sBTC on the Stacks chain.
+
+{% hint style="danger" %}
+Ensure that you are using the bridge located at [sbtc.stacks.co](https://sbtc.stacks.co/). This is the only official sBTC bridge.
+{% endhint %}
+
+If you aren't familiar with sBTC, be sure to check out the [sBTC Conceptual Guide](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/sbtc) to understand how it works.
+
+The bridge has been designed to be as simple as possible to use. In order to utilize sBTC, all you need to do is send a Bitcoin transaction using a supported wallet (like [Leather](https://leather.io/) or [Xverse](https://www.xverse.app/)).
+
+Below you'll find both a video and written walkthrough of using the bridge.
+
+### Video Walkthrough
+
+{% embed url="https://youtu.be/XZruuDgTo4k" %}
+
+### Written Walkthrough
+
+There are 5 simple steps to convert your BTC to sBTC.
+
+{% stepper %}
+{% step %}
+#### Connect your wallet
+
+First, you'll need to connect your wallet to the bridge UI. Currently Leather and Xverse are supported, with more on the way.
+
+
+{% endstep %}
+
+{% step %}
+#### Choose the amount to deposit
+
+After your wallet is connected, choose how much BTC you would like to convert to sBTC.
+
+
+
+{% hint style="info" %}
+There are two transaction fees required to mint your sBTC. The first is set by the user manually when they initiate the deposit transaction within their wallet. The second is a fee used to consolidate the deposit UTXOs into the single signer UTXO. This separate transaction fee happens automatically and is set to a max of 80k sats. This is automatically deducted from your minted sBTC. This is not a signer fee but a regular Bitcoin transaction fee.
+{% endhint %}
+{% endstep %}
+
+{% step %}
+#### Choose the Stacks address to mint to
+
+Next, enter the Stacks address you would like your sBTC minted to.
+
+
+{% endstep %}
+
+{% step %}
+#### Initiate the transaction
+
+After you choose your Stacks address, you'll use your connected wallet to transfer the BTC.
+
+
+{% endstep %}
+
+{% step %}
+#### Receive your sBTC
+
+In the UI, you can monitor the status of your transaction to see when it has been completed, at which point you can see the sBTC in your wallet. It will go through three stages:
+
+* Pending - Your Bitcoin transaction is processing
+* Minting - Your Bitcoin transaction has processed and the sBTC signers are minting your sBTC
+* Completed - Your sBTC has been minted to your wallet
+
+Note that you may need to enable the display of the sBTC token within your wallet by clicking on 'Manage Tokens' and enabling sBTC.
+
+
+{% endstep %}
+{% endstepper %}
+
+### Reclaiming BTC
+
+If your sBTC mint fails, you can reclaim your sBTC. You can do this via the bridge by visiting the reclaim page at https://sbtc.stacks.co/\/reclaim and replacing the bracketed text with your transaction ID, eg. [https://sbtc.stacks.co/8f37f750b6646f0a217121201967170bd3cfef5f2ebd4f30f359b5e9308470c4/reclaim](https://sbtc.stacks.co/8f37f750b6646f0a217121201967170bd3cfef5f2ebd4f30f359b5e9308470c4/reclaim)
+
+There is an intermediate step in between depositing BTC and the sBTC signers consolidating it into the single signer UTXO. If the transaction is not picked up by signers, you can reclaim it using this UI. Note there is a 'Lock Time' field on the Reclaim page. That indicates the amount of blocks that must have passed in order to reclaim your BTC.
+
+
+
+This initiates a Bitcoin transaction that will transfer your BTC back to you.
diff --git a/docs/build/sbtc/sbtc-builder-quickstart.md b/docs/build/sbtc/sbtc-builder-quickstart.md
new file mode 100644
index 0000000000..3379e627f0
--- /dev/null
+++ b/docs/build/sbtc/sbtc-builder-quickstart.md
@@ -0,0 +1,158 @@
+# sBTC Builder Quickstart
+
+
source: Hiro
+
+Get up and running with sBTC in 30 minutes or less. This guide covers the essentials for working with sBTC as a SIP-010 token in your smart contracts.
+
+### What is sBTC?
+
+sBTC is Bitcoin on Stacks. It's a SIP-010 fungible token that maintains a 1:1 peg with Bitcoin, enabling you to use Bitcoin in smart contracts and DeFi applications on the Stacks blockchain.
+
+Key points:
+
+* **1:1 Bitcoin peg**: 1 sBTC always equals 1 BTC
+* **SIP-010 token**: Works like any other fungible token on Stacks
+* **Programmable**: Use Bitcoin in smart contracts, DeFi protocols, and dApps
+
+### Quick Setup
+
+#### Prerequisites
+
+In order to get the most from this quickstart, you should familiarize yourself with Clarity, Clarinet, Stacks.js, and the Hiro Platform. These are the fundamental building blocks of building Stacks applications.
+
+* [Stacks Developer Quickstart](https://app.gitbook.com/o/hoh4mQXTl8NvI3cETroY/s/Zz9BLmTU9oydDpL3qiUh/) - For a quick holistic introduction to the Stacks development process, tools, and fundamentals
+* [Clarity Crash Course](../clarity-crash-course.md) - For a quick introduction to Clarity
+* [Clarinet Docs](https://docs.hiro.so/tools/clarinet)
+* [Stacks.js Docs](https://docs.hiro.so/reference/stacks.js)
+
+Choose your preferred development environment:
+
+#### Hiro Platform (Recommended)
+
+The fastest way to start building with sBTC is using the Hiro Platform's hosted devnet. The Platform integrates with your GitHub account. You can either import an existing project from GitHub or start with a Platform template and have it synced with your GitHub account.
+
+After you create the project in the Platform, you can clone it locally and work with the Platform's cloud devnet by connecting your API key as described in the template's README files. This will allow you to work on your code locally but let Platform handle the complexities of actually running the devnet.
+
+{% stepper %}
+{% step %}
+### Create an account
+
+Create an account at:\
+https://platform.hiro.so
+{% endstep %}
+
+{% step %}
+### Create or import a project
+
+* Select a template or import your own project from GitHub. There are several templates available to use as a starting point. Some have only smart contracts and some are full-stack dapp templates. Starting with one of these ensures you are building with best practices.
+* Navigate to your project dashboard
+{% endstep %}
+
+{% step %}
+### Start devnet
+
+* Click the "Devnet" tab
+* Click "Start Devnet"
+* Wait for status to show "Active"
+{% endstep %}
+
+{% step %}
+### Connect your wallet
+
+* Your devnet wallets are automatically funded with STX and sBTC
+* Use the provided wallet addresses within the templates
+* The platform templates are automatically connected to Devnet, and there are instructions in the READMEs of the templates for how to connect your frontend to your Devnet instance
+{% endstep %}
+{% endstepper %}
+
+#### Local with Clarinet
+
+If you would prefer to have your devnet running locally instead of in the Platform cloud, you can run one yourself.
+
+{% stepper %}
+{% step %}
+### Install Clarinet (version 3.x)
+
+```bash
+brew install clarinet
+```
+{% endstep %}
+
+{% step %}
+### Create a new project
+
+```bash
+clarinet new my-sbtc-project
+cd my-sbtc-project
+```
+{% endstep %}
+
+{% step %}
+### Add sBTC requirements
+
+```bash
+clarinet requirements add SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit
+```
+
+This automatically includes the sBTC token contract in your Clarinet context so you can reference it within your contracts.
+{% endstep %}
+
+{% step %}
+### Start devnet
+
+```bash
+clarinet devnet start
+```
+
+With either of these options, your Devnet wallets are automatically funded with sBTC. You just need to include the sBTC contract in your contract requirements as shown above.
+{% endstep %}
+{% endstepper %}
+
+### Working with sBTC in Smart Contracts
+
+sBTC follows the SIP-010 standard, making it easy to integrate into your contracts.
+
+The primary function you'll be using is the `transfer` function. That's because sBTC exists as a 1:1 Bitcoin peg via a SIP-010 token. Minting is handled by the protocol, the main function of writing smart contracts that use sBTC is to move it around, which means using the `transfer` function.
+
+Here's a very basic example of how to transfer sBTC within your contract.
+
+#### Basic Transfer Example
+
+Create a new contract that accepts sBTC payments. You can do this within the Clarinet project folder with `clarinet contract new sbtc-payment`.
+
+{% code title="contracts/sbtc-payment.clar" %}
+```clarity
+;; contracts/sbtc-payment.clar
+
+;; Define the sBTC token contract reference
+(define-constant sbtc-token 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token)
+
+;; Error codes
+(define-constant err-insufficient-balance (err u100))
+(define-constant err-transfer-failed (err u101))
+
+;; Accept sBTC payment
+(define-public (pay-with-sbtc (amount uint) (recipient principal))
+ (contract-call? sbtc-token transfer
+ amount
+ tx-sender
+ recipient
+ none))
+```
+{% endcode %}
+
+You can test out this contract by either using the UI within the Platform to call the functions directly if you have devnet running or by opening the console with `clarinet console`.
+
+Once you do that you'll see that your devnet accounts have automatically been funded with sBTC.
+
+
+
+Once you are ready to deploy to testnet, you can do so by editing your deployment plan as outlined in [this guide](https://docs.hiro.so/tools/clarinet/sbtc-integration).
+
+### Conclusion
+
+You can build pretty much anything you want using this simple foundation, as all of the complexity of sBTC is handled behind the scenes by the protocol.
+
+What's needed now is for builders to take this foundation and build interesting, useful things with it. sBTC unlocks a lot of additional functionality for Bitcoin that previously would have only been possible with either custodied solutions or slow, complex solutions with poor UX.
+
+If you are interested, you can read more about how sBTC works in the [sBTC Concept Guide](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/sbtc).
diff --git a/docs/build/testing-smart-contracts/README.md b/docs/build/testing-smart-contracts/README.md
new file mode 100644
index 0000000000..08a6f49e9d
--- /dev/null
+++ b/docs/build/testing-smart-contracts/README.md
@@ -0,0 +1,12 @@
+# Testing Smart Contracts
+
+{% hint style="danger" %}
+Smart contracts are immutable once deployed. Bugs are permanent. Test them thoroughly.
+{% endhint %}
+
+This section covers testing Clarity contracts.
+
+* [Fuzz Testing](fuzz-testing.md): Use Rendezvous to hammer your contract with random inputs. It helps expose edge cases and vulnerabilities.
+* [Clarity Unit Testing](https://github.com/stacks-network/clarunit)
+
+More guides will follow.
diff --git a/docs/build/testing-smart-contracts/fuzz-testing.md b/docs/build/testing-smart-contracts/fuzz-testing.md
new file mode 100644
index 0000000000..57d3d73b1e
--- /dev/null
+++ b/docs/build/testing-smart-contracts/fuzz-testing.md
@@ -0,0 +1,148 @@
+# Fuzz Testing
+
+Smart contracts on Stacks are immutable. Bugs are forever. Test early. Test often. Fuzzing finds edge cases that unit tests often miss.
+
+## What is Fuzz Testing?
+
+Fuzzing hits your code with random inputs. It helps uncover unexpected behavior and subtle bugs. Unlike unit tests, it explores paths you didn't think of.
+
+## What is Rendezvous?
+
+Rendezvous (`rv`) is a Clarity fuzzer. It supports:
+
+### Property-Based Testing
+
+You extract properties about your smart contract using Clarity. Rendezvous checks them multiple times with random inputs, in a stateful manner (the smart contract's state is not refreshed during the run).
+
+**What is a property?**
+
+A property is a universal truth about your smart contract's state, functions, etc.
+
+**How to extract a property?**
+
+Say that your smart contract has a function that reverses a list of `uint`s. In this case, one property can be that "reversing a list twice returns the original list". The property will look like this:
+
+```clarity
+(define-public (test-reverse-list (seq (list 127 uint)))
+ (begin
+ (asserts!
+ (is-eq seq
+ (reverse-uint
+ (reverse-uint seq)
+ )
+ )
+ (err u999)
+ )
+ (ok true)
+ )
+)
+```
+
+**Making your property valid for Rendezvous**
+
+> For a property to be cosidered valid by Rendezvous, it has to comply with the following rules:
+>
+> * Function name starts with `test-`
+> * Function is declared as `public`
+> * Test passes when it returns `(ok true)`
+> * Test would be discarded if it returned `(ok false)`
+> * Test fails if it returns an error or throws an exception
+
+***
+
+### Invariant Testing
+
+You define read-only conditions in Clarity that must always hold true. Rendezvous attempts to create state transitions in your smart contract and continuously checks the conditions you defined to hold.
+
+**What is an invariant?**
+
+An invariant is a general truth regarding your smart contract's internal state. It will not be able to mutate the state, its role being solely to check the integrity of the state.
+
+**How to extract an invariant?**
+
+Say that you have a counter contract, having functions to `increment` and `decrement`. In this case, you could use the Rendezvous [`context`](https://stacks-network.github.io/rendezvous/chapter_6.html?#the-rendezvous-context) to extract an invariant regarding your smart contract's internal state:
+
+```clarity
+(define-read-only (invariant-counter-gt-zero)
+ (let
+ (
+ (increment-num-calls
+ (default-to u0 (get called (map-get? context "increment")))
+ )
+ (decrement-num-calls
+ (default-to u0 (get called (map-get? context "decrement")))
+ )
+ )
+ (if
+ (<= increment-num-calls decrement-num-calls)
+ true
+ (> (var-get counter) u0)
+ )
+ )
+)
+```
+
+**Making your invariant valid for Rendezvous**
+
+> For an invariant to be cosidered valid by Rendezvous, it has to complain to the following ruleset:
+>
+> * Function name starts with invariant-
+> * Function is declared as read-only (not public)
+> * Function returns a boolean value (true if the invariant holds, false if violated)
+> * The test can use the special context map to access execution history
+
+## Why Test in Clarity?
+
+{% stepper %}
+{% step %}
+### Same constraints as production
+
+Tests operate under the exact same constraints as production code.
+{% endstep %}
+
+{% step %}
+### Better understanding of Clarity
+
+Writing tests in Clarity improves your familiarity with the language and its semantics.
+{% endstep %}
+
+{% step %}
+### No need to expose internals
+
+You don't have to expose internal functions as public solely for testing.
+{% endstep %}
+
+{% step %}
+### Fewer tools to manage
+
+Running tests in Clarity reduces the number of external tools and integrations you need to maintain.
+{% endstep %}
+{% endstepper %}
+
+## Getting Started
+
+Put tests next to contracts. Rendezvous will find them.
+
+```
+my-project/
+├── Clarinet.toml
+├── contracts/
+│ ├── my-contract.clar # Contract
+│ ├── my-contract.tests.clar # Tests
+└── settings/
+ └── Devnet.toml
+```
+
+### Installation
+
+To install Rendezvous as a dependency in your project, use `npm`:
+
+```
+npm install @stacks/rendezvous
+```
+
+This will add Rendezvous to your project's `node_modules` and update your `package.json`.
+
+## Rendezvous Docs
+
+See full docs at: [https://stacks-network.github.io/rendezvous](https://stacks-network.github.io/rendezvous/)
diff --git a/docs/contribute/README.md b/docs/contribute/README.md
new file mode 100644
index 0000000000..53a04b8288
--- /dev/null
+++ b/docs/contribute/README.md
@@ -0,0 +1,29 @@
+# Contribute
+
+### Contribute to Stacks Core
+
+There is a [detailed contribution guide](https://github.com/stacks-network/stacks-core/blob/master/CONTRIBUTING.md) that lives in the Stacks core GitHub repository that is the best place to get started contributing to Stacks.
+
+### Contribute to these Docs
+
+The Stacks docs are built using GitBook with a two-way sync with the [docs repository on GitHub](https://github.com/stacks-network/docs).
+
+Because of this two-way sync, you can contribute to the documentation in one of two ways:
+
+{% stepper %}
+{% step %}
+### Fork the repo and create a PR
+
+You can fork the docs repo, add your change, and then create a PR to be merged into the main docs.
+{% endstep %}
+
+{% step %}
+### Create an issue
+
+You can create an issue, and someone that works on the docs will take a look and implement it if it is a necessary change.
+{% endstep %}
+{% endstepper %}
+
+What kinds of changes are we looking for?
+
+If you see a typo, a missing tutorial, an unclear explanation, or really anything else you think could improve the quality of the documentation, please feel free to open an issue or create a pull request.
diff --git a/docs/contribute/SUMMARY.md b/docs/contribute/SUMMARY.md
new file mode 100644
index 0000000000..de25e5d9b1
--- /dev/null
+++ b/docs/contribute/SUMMARY.md
@@ -0,0 +1,3 @@
+# Table of contents
+
+* [Contribute](README.md)
diff --git a/docs/learn/.gitbook.yaml b/docs/learn/.gitbook.yaml
new file mode 100644
index 0000000000..515d276164
--- /dev/null
+++ b/docs/learn/.gitbook.yaml
@@ -0,0 +1,61 @@
+root: ./
+
+redirects:
+ # stacks-101 redirects
+ concepts/stacks-101/what-is-stacks: stacks-101/what-is-stacks.md
+ concepts/stacks-101/bitcoin-connection: stacks-101/bitcoin-connection.md
+ concepts/stacks-101/proof-of-transfer: stacks-101/proof-of-transfer.md
+ concepts/stacks-101/stacks-among-other-layers: stacks-101/stacks-among-other-layers.md
+ concepts/stacks-101/financial-incentive-and-security-budget: stacks-101/financial-incentive-and-security-budget.md
+
+ # block-production redirects
+ concepts/block-production/bitcoin-finality: block-production/bitcoin-finality.md
+ concepts/block-production/bitcoin-reorgs: block-production/bitcoin-reorgs.md
+ concepts/block-production/mining: block-production/mining.md
+ concepts/block-production/stackers-and-signing: block-production/signing.md
+ concepts/block-production/stacking: block-production/stacking.md
+
+ # clarity redirects
+ concepts/clarity/decidability: clarity/decidability.md
+ concepts/clarity/overview: clarity/overview.md
+
+ # network-fundamentals redirects
+ concepts/network-fundamentals/accounts: network-fundamentals/accounts.md
+ concepts/network-fundamentals/authentication: network-fundamentals/authentication.md
+ concepts/network-fundamentals/bitcoin-name-system: network-fundamentals/bitcoin-name-system.md
+ concepts/network-fundamentals/mainnet-and-testnets: network-fundamentals/mainnet-and-testnets.md
+ concepts/network-fundamentals/network: network-fundamentals/network-basics.md
+ concepts/network-fundamentals/sips: network-fundamentals/sips.md
+ concepts/network-fundamentals/technical-specifications/audits: network-fundamentals/technical-specifications/audits.md
+
+ # transactions redirects
+ concepts/transactions/post-conditions: transactions/post-conditions.md
+ concepts/transactions/transactions: transactions/how-transactions-work.md
+
+ # sbtc redirects
+ concepts/sbtc/core-features: sbtc/core-features.md
+ concepts/sbtc/emily: sbtc/emily-api.md
+ concepts/sbtc/peg-wallet-utxo: sbtc/peg-wallet-utxo.md
+ concepts/sbtc/sbtc-audits: sbtc/sbtc-audits.md
+ concepts/sbtc/sbtc-faq: sbtc/sbtc-faq.md
+
+ # sbtc auxiliary-features redirects
+ concepts/sbtc/auxiliary-features/fee-sponsorship: sbtc/auxiliary-features/transaction-fee-sponsorship.md
+ concepts/sbtc/auxiliary-features/signer-wallet-rotation: sbtc/auxiliary-features/signer-wallet-rotation.md
+
+ # sbtc clarity-contracts redirects
+ concepts/sbtc/clarity-contracts/sbtc-bootstrap-signers: sbtc/clarity-contracts/sbtc-bootstrap-signers.md
+ concepts/sbtc/clarity-contracts/sbtc-deposit: sbtc/clarity-contracts/sbtc-deposit.md
+ concepts/sbtc/clarity-contracts/sbtc-registry: sbtc/clarity-contracts/sbtc-registry.md
+ concepts/sbtc/clarity-contracts/sbtc-signers: sbtc/clarity-contracts/sbtc-signers.md
+ concepts/sbtc/clarity-contracts/sbtc-token: sbtc/clarity-contracts/sbtc-token.md
+ concepts/sbtc/clarity-contracts/sbtc-withdrawal: sbtc/clarity-contracts/sbtc-withdrawal.md
+
+ # sbtc operations redirects
+ concepts/sbtc/operations/deposit-withdrawal-times: sbtc/sbtc-operations/deposit-vs-withdrawal-times.md
+ concepts/sbtc/operations/deposit: sbtc/sbtc-operations/deposit.md
+ concepts/sbtc/operations/withdrawal: sbtc/sbtc-operations/withdrawal.md
+
+ # sbtc walkthroughs redirects
+ concepts/sbtc/walkthroughs/sbtc-transaction-lifecycle: sbtc/walkthroughs/sbtc-transaction-walkthrough.md
+ concepts/sbtc/walkthroughs/signer-process: sbtc/walkthroughs/signer-process-walkthrough.md
diff --git a/docs/learn/.gitbook/assets/AD_4nXdlY8MKm4IEls6XieRtpunfge6KTNSw2HT_o9iD8FgIL3RCJuzKa781Ft oXNCEn_rIqMqu0_hqD5 GPrF9cT6rFXdnA1BASFoU3Uy6VgR2ARfp 0FnLgrM7GH7hdx Ia2m_DpdonZmlwqTMd1sQe0XqgX4 b/docs/learn/.gitbook/assets/AD_4nXdlY8MKm4IEls6XieRtpunfge6KTNSw2HT_o9iD8FgIL3RCJuzKa781Ft oXNCEn_rIqMqu0_hqD5 GPrF9cT6rFXdnA1BASFoU3Uy6VgR2ARfp 0FnLgrM7GH7hdx Ia2m_DpdonZmlwqTMd1sQe0XqgX4
new file mode 100644
index 0000000000..3f022d11c4
Binary files /dev/null and b/docs/learn/.gitbook/assets/AD_4nXdlY8MKm4IEls6XieRtpunfge6KTNSw2HT_o9iD8FgIL3RCJuzKa781Ft oXNCEn_rIqMqu0_hqD5 GPrF9cT6rFXdnA1BASFoU3Uy6VgR2ARfp 0FnLgrM7GH7hdx Ia2m_DpdonZmlwqTMd1sQe0XqgX4 differ
diff --git a/docs/learn/.gitbook/assets/Blockstack_Desktop_Wallet_Pentest_Report_11-12-2020.pdf b/docs/learn/.gitbook/assets/Blockstack_Desktop_Wallet_Pentest_Report_11-12-2020.pdf
new file mode 100644
index 0000000000..72b6b717bf
Binary files /dev/null and b/docs/learn/.gitbook/assets/Blockstack_Desktop_Wallet_Pentest_Report_11-12-2020.pdf differ
diff --git a/docs/learn/.gitbook/assets/Clarity Alliance - sBTC Rewards Program.pdf b/docs/learn/.gitbook/assets/Clarity Alliance - sBTC Rewards Program.pdf
new file mode 100644
index 0000000000..3fab1ee354
Binary files /dev/null and b/docs/learn/.gitbook/assets/Clarity Alliance - sBTC Rewards Program.pdf differ
diff --git a/docs/learn/.gitbook/assets/Clarity Alliance - sBTC-2.pdf b/docs/learn/.gitbook/assets/Clarity Alliance - sBTC-2.pdf
new file mode 100644
index 0000000000..46fb8bb7ca
Binary files /dev/null and b/docs/learn/.gitbook/assets/Clarity Alliance - sBTC-2.pdf differ
diff --git a/docs/learn/.gitbook/assets/Clarity Alliance - sBTC.pdf b/docs/learn/.gitbook/assets/Clarity Alliance - sBTC.pdf
new file mode 100644
index 0000000000..46fb8bb7ca
Binary files /dev/null and b/docs/learn/.gitbook/assets/Clarity Alliance - sBTC.pdf differ
diff --git a/docs/learn/.gitbook/assets/CoinFabrik - Signer Binary.pdf b/docs/learn/.gitbook/assets/CoinFabrik - Signer Binary.pdf
new file mode 100644
index 0000000000..dc059e72dc
Binary files /dev/null and b/docs/learn/.gitbook/assets/CoinFabrik - Signer Binary.pdf differ
diff --git a/docs/learn/.gitbook/assets/CoinFabrik - StackerDB.pdf b/docs/learn/.gitbook/assets/CoinFabrik - StackerDB.pdf
new file mode 100644
index 0000000000..b0e846fba3
Binary files /dev/null and b/docs/learn/.gitbook/assets/CoinFabrik - StackerDB.pdf differ
diff --git a/docs/learn/.gitbook/assets/CoinFabrik - Stacks LibSigner.pdf b/docs/learn/.gitbook/assets/CoinFabrik - Stacks LibSigner.pdf
new file mode 100644
index 0000000000..6e1a11c272
Binary files /dev/null and b/docs/learn/.gitbook/assets/CoinFabrik - Stacks LibSigner.pdf differ
diff --git a/docs/learn/.gitbook/assets/CoinFabrik - Stacks Signer Audit.pdf b/docs/learn/.gitbook/assets/CoinFabrik - Stacks Signer Audit.pdf
new file mode 100644
index 0000000000..4a733d4e4f
Binary files /dev/null and b/docs/learn/.gitbook/assets/CoinFabrik - Stacks Signer Audit.pdf differ
diff --git a/docs/learn/.gitbook/assets/CoinFabrik - WSTS.pdf b/docs/learn/.gitbook/assets/CoinFabrik - WSTS.pdf
new file mode 100644
index 0000000000..1b73a0857e
Binary files /dev/null and b/docs/learn/.gitbook/assets/CoinFabrik - WSTS.pdf differ
diff --git a/docs/learn/.gitbook/assets/CoinFabrik_WSTS.pdf b/docs/learn/.gitbook/assets/CoinFabrik_WSTS.pdf
new file mode 100644
index 0000000000..1b73a0857e
Binary files /dev/null and b/docs/learn/.gitbook/assets/CoinFabrik_WSTS.pdf differ
diff --git a/docs/learn/.gitbook/assets/Coinfabrik - Stacks PoX.pdf b/docs/learn/.gitbook/assets/Coinfabrik - Stacks PoX.pdf
new file mode 100644
index 0000000000..e9678769ea
Binary files /dev/null and b/docs/learn/.gitbook/assets/Coinfabrik - Stacks PoX.pdf differ
diff --git a/docs/learn/.gitbook/assets/Frame 316125325.jpg b/docs/learn/.gitbook/assets/Frame 316125325.jpg
new file mode 100644
index 0000000000..884cae9020
Binary files /dev/null and b/docs/learn/.gitbook/assets/Frame 316125325.jpg differ
diff --git a/docs/learn/.gitbook/assets/Frame 316125960.jpg b/docs/learn/.gitbook/assets/Frame 316125960.jpg
new file mode 100644
index 0000000000..5d63e59df0
Binary files /dev/null and b/docs/learn/.gitbook/assets/Frame 316125960.jpg differ
diff --git a/docs/learn/.gitbook/assets/Frame 316126243.jpg b/docs/learn/.gitbook/assets/Frame 316126243.jpg
new file mode 100644
index 0000000000..c5e96dfcbd
Binary files /dev/null and b/docs/learn/.gitbook/assets/Frame 316126243.jpg differ
diff --git a/docs/learn/.gitbook/assets/Frame 316126254.jpg b/docs/learn/.gitbook/assets/Frame 316126254.jpg
new file mode 100644
index 0000000000..dfb22d9988
Binary files /dev/null and b/docs/learn/.gitbook/assets/Frame 316126254.jpg differ
diff --git a/docs/learn/.gitbook/assets/Frame 316126255.jpg b/docs/learn/.gitbook/assets/Frame 316126255.jpg
new file mode 100644
index 0000000000..2d78244848
Binary files /dev/null and b/docs/learn/.gitbook/assets/Frame 316126255.jpg differ
diff --git a/docs/learn/.gitbook/assets/Frame 316126258.jpg b/docs/learn/.gitbook/assets/Frame 316126258.jpg
new file mode 100644
index 0000000000..273720c216
Binary files /dev/null and b/docs/learn/.gitbook/assets/Frame 316126258.jpg differ
diff --git a/docs/learn/.gitbook/assets/Frame 316126264 (1).jpg b/docs/learn/.gitbook/assets/Frame 316126264 (1).jpg
new file mode 100644
index 0000000000..8edeb3144e
Binary files /dev/null and b/docs/learn/.gitbook/assets/Frame 316126264 (1).jpg differ
diff --git a/docs/learn/.gitbook/assets/Frame 316126264.jpg b/docs/learn/.gitbook/assets/Frame 316126264.jpg
new file mode 100644
index 0000000000..8edeb3144e
Binary files /dev/null and b/docs/learn/.gitbook/assets/Frame 316126264.jpg differ
diff --git a/docs/learn/.gitbook/assets/Group 316124776.png b/docs/learn/.gitbook/assets/Group 316124776.png
new file mode 100644
index 0000000000..352540fc4d
Binary files /dev/null and b/docs/learn/.gitbook/assets/Group 316124776.png differ
diff --git a/docs/learn/.gitbook/assets/Group 316124777 (1).png b/docs/learn/.gitbook/assets/Group 316124777 (1).png
new file mode 100644
index 0000000000..07b169772b
Binary files /dev/null and b/docs/learn/.gitbook/assets/Group 316124777 (1).png differ
diff --git a/docs/learn/.gitbook/assets/Group 316124777 (2).png b/docs/learn/.gitbook/assets/Group 316124777 (2).png
new file mode 100644
index 0000000000..b203a65e29
Binary files /dev/null and b/docs/learn/.gitbook/assets/Group 316124777 (2).png differ
diff --git a/docs/learn/.gitbook/assets/NCC_Group_Stacks_Blockchain_Audit_Report_2020-11-23_v1.0.pdf b/docs/learn/.gitbook/assets/NCC_Group_Stacks_Blockchain_Audit_Report_2020-11-23_v1.0.pdf
new file mode 100644
index 0000000000..bed4f3bd8b
Binary files /dev/null and b/docs/learn/.gitbook/assets/NCC_Group_Stacks_Blockchain_Audit_Report_2020-11-23_v1.0.pdf differ
diff --git a/docs/learn/.gitbook/assets/NCC_Group_Stacks_Wallet_Report_2020-11-17_v1.0.pdf b/docs/learn/.gitbook/assets/NCC_Group_Stacks_Wallet_Report_2020-11-17_v1.0.pdf
new file mode 100644
index 0000000000..cd00d448fa
Binary files /dev/null and b/docs/learn/.gitbook/assets/NCC_Group_Stacks_Wallet_Report_2020-11-17_v1.0.pdf differ
diff --git a/docs/learn/.gitbook/assets/Ottersec - WSTS.pdf b/docs/learn/.gitbook/assets/Ottersec - WSTS.pdf
new file mode 100644
index 0000000000..b3929dbb39
Binary files /dev/null and b/docs/learn/.gitbook/assets/Ottersec - WSTS.pdf differ
diff --git a/docs/learn/.gitbook/assets/Ottersec - sBTC Withdrawal.pdf b/docs/learn/.gitbook/assets/Ottersec - sBTC Withdrawal.pdf
new file mode 100644
index 0000000000..b093ed87bf
Binary files /dev/null and b/docs/learn/.gitbook/assets/Ottersec - sBTC Withdrawal.pdf differ
diff --git a/docs/learn/.gitbook/assets/Ottersec - stacks_sbtc_audit_final.pdf b/docs/learn/.gitbook/assets/Ottersec - stacks_sbtc_audit_final.pdf
new file mode 100644
index 0000000000..b093ed87bf
Binary files /dev/null and b/docs/learn/.gitbook/assets/Ottersec - stacks_sbtc_audit_final.pdf differ
diff --git a/docs/learn/.gitbook/assets/Ottersec - stacks_wsts_audit_final.pdf b/docs/learn/.gitbook/assets/Ottersec - stacks_wsts_audit_final.pdf
new file mode 100644
index 0000000000..b3929dbb39
Binary files /dev/null and b/docs/learn/.gitbook/assets/Ottersec - stacks_wsts_audit_final.pdf differ
diff --git a/docs/learn/.gitbook/assets/Quantstamp - Network State Machine.pdf b/docs/learn/.gitbook/assets/Quantstamp - Network State Machine.pdf
new file mode 100644
index 0000000000..150723b091
Binary files /dev/null and b/docs/learn/.gitbook/assets/Quantstamp - Network State Machine.pdf differ
diff --git a/docs/learn/.gitbook/assets/Screenshot 2025-10-11 at 3.45.40 PM.png b/docs/learn/.gitbook/assets/Screenshot 2025-10-11 at 3.45.40 PM.png
new file mode 100644
index 0000000000..2532146af2
Binary files /dev/null and b/docs/learn/.gitbook/assets/Screenshot 2025-10-11 at 3.45.40 PM.png differ
diff --git a/docs/learn/.gitbook/assets/image (1).png b/docs/learn/.gitbook/assets/image (1).png
new file mode 100644
index 0000000000..38bbfbae84
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (1).png differ
diff --git a/docs/learn/.gitbook/assets/image (10).png b/docs/learn/.gitbook/assets/image (10).png
new file mode 100644
index 0000000000..47111d002c
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (10).png differ
diff --git a/docs/learn/.gitbook/assets/image (11).png b/docs/learn/.gitbook/assets/image (11).png
new file mode 100644
index 0000000000..3716767855
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (11).png differ
diff --git a/docs/learn/.gitbook/assets/image (12).png b/docs/learn/.gitbook/assets/image (12).png
new file mode 100644
index 0000000000..16dc0b816b
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (12).png differ
diff --git a/docs/learn/.gitbook/assets/image (13).png b/docs/learn/.gitbook/assets/image (13).png
new file mode 100644
index 0000000000..020878ff7d
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (13).png differ
diff --git a/docs/learn/.gitbook/assets/image (14).png b/docs/learn/.gitbook/assets/image (14).png
new file mode 100644
index 0000000000..341e6adaba
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (14).png differ
diff --git a/docs/learn/.gitbook/assets/image (15).png b/docs/learn/.gitbook/assets/image (15).png
new file mode 100644
index 0000000000..26036ee1fa
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (15).png differ
diff --git a/docs/learn/.gitbook/assets/image (16).png b/docs/learn/.gitbook/assets/image (16).png
new file mode 100644
index 0000000000..1df8dcc9ca
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (16).png differ
diff --git a/docs/learn/.gitbook/assets/image (17).png b/docs/learn/.gitbook/assets/image (17).png
new file mode 100644
index 0000000000..26b4e9ac6c
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (17).png differ
diff --git a/docs/learn/.gitbook/assets/image (18).png b/docs/learn/.gitbook/assets/image (18).png
new file mode 100644
index 0000000000..462a9ff6b7
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (18).png differ
diff --git a/docs/learn/.gitbook/assets/image (19).png b/docs/learn/.gitbook/assets/image (19).png
new file mode 100644
index 0000000000..afa91fa7dd
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (19).png differ
diff --git a/docs/learn/.gitbook/assets/image (2).png b/docs/learn/.gitbook/assets/image (2).png
new file mode 100644
index 0000000000..402906fc4f
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (2).png differ
diff --git a/docs/learn/.gitbook/assets/image (20).png b/docs/learn/.gitbook/assets/image (20).png
new file mode 100644
index 0000000000..56cb1a4122
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (20).png differ
diff --git a/docs/learn/.gitbook/assets/image (21).png b/docs/learn/.gitbook/assets/image (21).png
new file mode 100644
index 0000000000..4b4b6fb18a
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (21).png differ
diff --git a/docs/learn/.gitbook/assets/image (22).png b/docs/learn/.gitbook/assets/image (22).png
new file mode 100644
index 0000000000..a2f699bc2a
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (22).png differ
diff --git a/docs/learn/.gitbook/assets/image (23).png b/docs/learn/.gitbook/assets/image (23).png
new file mode 100644
index 0000000000..4b4a055139
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (23).png differ
diff --git a/docs/learn/.gitbook/assets/image (24).png b/docs/learn/.gitbook/assets/image (24).png
new file mode 100644
index 0000000000..0f140b843b
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (24).png differ
diff --git a/docs/learn/.gitbook/assets/image (25).png b/docs/learn/.gitbook/assets/image (25).png
new file mode 100644
index 0000000000..5b26b1c9eb
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (25).png differ
diff --git a/docs/learn/.gitbook/assets/image (26).png b/docs/learn/.gitbook/assets/image (26).png
new file mode 100644
index 0000000000..c269977a82
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (26).png differ
diff --git a/docs/learn/.gitbook/assets/image (27).png b/docs/learn/.gitbook/assets/image (27).png
new file mode 100644
index 0000000000..6b3929bea8
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (27).png differ
diff --git a/docs/learn/.gitbook/assets/image (3).png b/docs/learn/.gitbook/assets/image (3).png
new file mode 100644
index 0000000000..96676a53a7
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (3).png differ
diff --git a/docs/learn/.gitbook/assets/image (4).png b/docs/learn/.gitbook/assets/image (4).png
new file mode 100644
index 0000000000..412a18b787
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (4).png differ
diff --git a/docs/learn/.gitbook/assets/image (5).png b/docs/learn/.gitbook/assets/image (5).png
new file mode 100644
index 0000000000..b908551494
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (5).png differ
diff --git a/docs/learn/.gitbook/assets/image (6).png b/docs/learn/.gitbook/assets/image (6).png
new file mode 100644
index 0000000000..b5725bb6dc
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (6).png differ
diff --git a/docs/learn/.gitbook/assets/image (7).png b/docs/learn/.gitbook/assets/image (7).png
new file mode 100644
index 0000000000..572743764d
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (7).png differ
diff --git a/docs/learn/.gitbook/assets/image (8).png b/docs/learn/.gitbook/assets/image (8).png
new file mode 100644
index 0000000000..5e2e14ea39
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (8).png differ
diff --git a/docs/learn/.gitbook/assets/image (9).png b/docs/learn/.gitbook/assets/image (9).png
new file mode 100644
index 0000000000..bc81eabb22
Binary files /dev/null and b/docs/learn/.gitbook/assets/image (9).png differ
diff --git a/docs/learn/.gitbook/assets/image.png b/docs/learn/.gitbook/assets/image.png
new file mode 100644
index 0000000000..27ae573acc
Binary files /dev/null and b/docs/learn/.gitbook/assets/image.png differ
diff --git a/docs/learn/README.md b/docs/learn/README.md
new file mode 100644
index 0000000000..59d7fb6bda
--- /dev/null
+++ b/docs/learn/README.md
@@ -0,0 +1,80 @@
+---
+layout:
+ width: default
+ title:
+ visible: true
+ description:
+ visible: true
+ tableOfContents:
+ visible: true
+ outline:
+ visible: true
+ pagination:
+ visible: true
+ metadata:
+ visible: true
+---
+
+# Start Here
+
+
+
+## Stacks: The TL;DR
+
+**Stacks is the leading Bitcoin L2, bringing smart contract functionality to Bitcoin, without modifying Bitcoin itself.**
+
+{% hint style="info" %}
+Want to get a guided introduction to everything you need to know to become a Stacks developer? The Stacks Primer is a 5-day email course designed to take you from brand new to building your first contract, and even how to get paid for building out your own project.
+
+[Take the Course](https://stacks.org/dev)
+{% endhint %}
+
+It does so through three key components, that we'll dig into in more detail in the rest of the docs:
+
+#### Proof of Transfer
+
+Proof of Transfer (PoX) is the block production mechanism of the Stacks chain. Essentially, it attempts to recreate the block production patterns of PoW programmatically. Stacks miners spend BTC for a chance to mine new Stacks blocks. Under the hood, this block production mechanism anchors Stacks blocks to Bitcoin blocks, making it as hard to reverse a Stacks block as it is to reverse a Bitcoin block. That's a big claim, and we unpack it in further detail in the sections on Nakamoto block production.
+
+#### Clarity
+
+Clarity is the smart contract language that Stacks uses. It has been designed from the ground up to make it easier for developers to write safe, secure smart contracts. Additionally, since it has been purpose-built for Stacks and Bitcoin, there are built-in functions for reading Bitcoin state, which means you can use Bitcoin state to perform actions in Clarity. For example, you could set up a check to make sure a particular Bitcoin transaction has occurred before executing a mint function in Clarity, which just so happens to be what happens with the third component: sBTC.
+
+#### sBTC
+
+sBTC is the trust-minimized 2-way Bitcoin peg on the Stacks layer. sBTC is the key to making Bitcoin programmable and bringing full smart contract functionality to Bitcoin via Stacks. sBTC is not a federation, but operates as an open-network, decentralized 2-way peg solution to bring smart contract functionality to Bitcoin with as little counterparty risk as possible. There is an entire section of these docs dedicated to explaining[ sBTC](broken-reference).
+
+### How to Use These Docs
+
+{% embed url="https://www.youtube.com/watch?v=eMbzbR53Avo" %}
+
+### AI-Powered Semantic Search
+
+Looking for something specific? These docs are integrated with AI-powered semantic search — hit `Cmd/Ctrl + K` to open up the search box and ask the docs whatever you like.
+
+### What Next?
+
+#### Learn About Stacks
+
+Looking to learn more about exactly how Stacks works? The section in the left navigation is where you'll want to go. The "[What is Stacks](stacks-101/what-is-stacks.md)" page is the best place to start your learning journey. This is where you can dive deep into exactly how Stacks works and learn about all the different building blocks.
+
+#### Build a Stacks Dapp
+
+Are you a developer itching to get building? The [Quickstart tutorial](https://app.gitbook.com/o/hoh4mQXTl8NvI3cETroY/s/Zz9BLmTU9oydDpL3qiUh/) is the best place to start. It will introduce you to the essential things you need to know to build on Stacks in just 30 minutes. After that, check the rest of the Guides & Tutorials to learn how to build things like DeFi apps, crowdfunding, and collectibles, among other use cases.
+
+#### Run a Stacks Node
+
+Looking to run a Stacks node? You can either run a follower node or a miner node. We have guides for how to do both on testnet and mainnet in the "[Run a Node](https://app.gitbook.com/o/hoh4mQXTl8NvI3cETroY/s/4cpTb2lbw0LAOuMHrvhA/)" section of the Guides.
+
+#### Run a Signer
+
+Signers are a critical component of the Stacks ecosystem and are in charge of validating and appending new Stacks blocks and sBTC transactions. We have an entire section dedicated to [running a signer](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/run-a-signer).
+
+#### Stack Your STX
+
+Stacking is one of the key components behind Stacks and the Proof of Transfer consensus mechanism. There are many different ways you can stack depending on if you are stacking solo, stacking in a pool, and running a signer or not. We have a [section on stacking](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/stacking-stx) to walk you through the process no matter your situation.
+
+#### Get More Involved
+
+Looking to grow your career in the Stacks ecosystem? Be sure to start working on your own project and submit it to the [Code for STX](https://stacks.org/code-for-stx) program to earn STX every month just for working on your project. And, if you're feeling up to the challenge, apply to the Clarity Collective, an exclusive community of proven, committed Stacks builders all dedicated to becoming exceptional Stacks developers.
+
+Next up, dig into exactly what Stacks is and how it works 👇🏻
diff --git a/docs/learn/SUMMARY.md b/docs/learn/SUMMARY.md
new file mode 100644
index 0000000000..e0214113b4
--- /dev/null
+++ b/docs/learn/SUMMARY.md
@@ -0,0 +1,53 @@
+# Table of contents
+
+* [Start Here](README.md)
+* [Stacks 101](stacks-101/README.md)
+ * [What Is Stacks?](stacks-101/what-is-stacks.md)
+ * [The Bitcoin Connection](stacks-101/bitcoin-connection.md)
+ * [Proof of Transfer (PoX)](stacks-101/proof-of-transfer.md)
+ * [Stacks Among Other Layers](stacks-101/stacks-among-other-layers.md)
+ * [Financial Incentive And Security Budget](stacks-101/financial-incentive-and-security-budget.md)
+* [Network Fundamentals](network-fundamentals/README.md)
+ * [Network Basics](network-fundamentals/network-basics.md)
+ * [Mainnet and Testnets](network-fundamentals/mainnet-and-testnets.md)
+ * [Accounts](network-fundamentals/accounts.md)
+ * [Authentication](network-fundamentals/authentication.md)
+ * [Bitcoin Name System](network-fundamentals/bitcoin-name-system.md)
+ * [SIPs](network-fundamentals/sips.md)
+ * [Technical Specifications](network-fundamentals/technical-specifications/README.md)
+ * [Audits](network-fundamentals/technical-specifications/audits.md)
+* [Block Production](block-production/README.md)
+ * [Mining](block-production/mining.md)
+ * [Signing](block-production/signing.md)
+ * [Bitcoin Finality](block-production/bitcoin-finality.md)
+ * [Bitcoin Reorgs](block-production/bitcoin-reorgs.md)
+ * [Stacking](block-production/stacking.md)
+* [Transactions](transactions/README.md)
+ * [How Transactions Work](transactions/how-transactions-work.md)
+ * [Post Conditions](transactions/post-conditions.md)
+* [Clarity](clarity/README.md)
+ * [Overview](clarity/overview.md)
+ * [Decidability](clarity/decidability.md)
+* [sBTC](sbtc/README.md)
+ * [Core Features](sbtc/core-features.md)
+ * [sBTC Operations](sbtc/sbtc-operations/README.md)
+ * [Deposit](sbtc/sbtc-operations/deposit.md)
+ * [Withdrawal](sbtc/sbtc-operations/withdrawal.md)
+ * [Deposit vs Withdrawal Times](sbtc/sbtc-operations/deposit-vs-withdrawal-times.md)
+ * [Emily API](sbtc/emily-api.md)
+ * [Peg Wallet UTXO](sbtc/peg-wallet-utxo.md)
+ * [Clarity Contracts](sbtc/clarity-contracts/README.md)
+ * [sBTC Signers](sbtc/clarity-contracts/sbtc-signers.md)
+ * [sBTC Token](sbtc/clarity-contracts/sbtc-token.md)
+ * [sBTC Registry](sbtc/clarity-contracts/sbtc-registry.md)
+ * [sBTC Withdrawal](sbtc/clarity-contracts/sbtc-withdrawal.md)
+ * [sBTC Deposit](sbtc/clarity-contracts/sbtc-deposit.md)
+ * [sbtc bootstrap signers](sbtc/clarity-contracts/sbtc-bootstrap-signers.md)
+ * [Auxiliary Features](sbtc/auxiliary-features/README.md)
+ * [Transaction Fee Sponsorship](sbtc/auxiliary-features/transaction-fee-sponsorship.md)
+ * [Signer Wallet Rotation](sbtc/auxiliary-features/signer-wallet-rotation.md)
+ * [Walkthroughs](sbtc/walkthroughs/README.md)
+ * [Signer Process Walkthrough](sbtc/walkthroughs/signer-process-walkthrough.md)
+ * [sBTC Transaction Walkthrough](sbtc/walkthroughs/sbtc-transaction-walkthrough.md)
+ * [sBTC FAQ](sbtc/sbtc-faq.md)
+ * [sBTC Audits](sbtc/sbtc-audits.md)
diff --git a/docs/learn/block-production/README.md b/docs/learn/block-production/README.md
new file mode 100644
index 0000000000..7c41fa0e17
--- /dev/null
+++ b/docs/learn/block-production/README.md
@@ -0,0 +1,35 @@
+# Block Production
+
+Block production is a key concept to understand how Stacks operates under the hood. This section walks through the three main actions that need to happen for the Stacks chain to operate.
+
+{% stepper %}
+{% step %}
+### Mining
+
+Miners are responsible for building and proposing new blocks on the Stacks chain.
+{% endstep %}
+
+{% step %}
+### Signing
+
+Signing is the process used to validate blocks and sign sBTC deposits and withdrawals. Stackers participate in signing once they meet stacking prerequisites.
+{% endstep %}
+
+{% step %}
+### Stacking
+
+Stacking is an action performed by stackers that is a necessary prerequisite to signing. It enables participation in validation and earning rewards.
+{% endstep %}
+{% endstepper %}
+
+There are two primary parties in Stacks block production: miners and stackers. Miners build and propose new blocks, while stackers validate those blocks and sign sBTC deposits and withdrawals. Stacking enables stackers to participate in signing.
+
+{% hint style="info" %}
+For an in-depth technical overview of block production after the Nakamoto Upgrade, see SIP-021:
+
+https://github.com/stacksgov/sips/blob/feat/sip-021-nakamoto/sips/sip-021/sip-021-nakamoto.md
+{% endhint %}
+
+Here's a diagram outlining the block production process under Nakamoto rules. The following docs dig into each part in detail.
+
+
diff --git a/docs/learn/block-production/bitcoin-finality.md b/docs/learn/block-production/bitcoin-finality.md
new file mode 100644
index 0000000000..a86c441975
--- /dev/null
+++ b/docs/learn/block-production/bitcoin-finality.md
@@ -0,0 +1,46 @@
+# Bitcoin Finality
+
+The concept of 100% Bitcoin finality is crucial to the design of Stacks. This is what turns Stacks into a true Bitcoin L2 and allows it to leverage all of the security inherent in Bitcoin.
+
+Finality refers to the point at which transactions are irreversible. Once a blockchain reaches finality, it is nearly impossible to change the ledger's history without undertaking extraordinary measures that are often computationally and economically prohibitive.
+
+When we talk about Stacks blocks having 100% Bitcoin finality, we mean that they are as hard to reverse as Bitcoin transactions themselves.
+
+That's a bold claim, so how does Stacks accomplish that?
+
+As discussed above, miners are responsible for producing Stacks blocks in their tenure, which corresponds to a single Bitcoin block. As part of their block commit transaction, which is the transaction that previously committed the hash of the next Stacks block to the Bitcoin chain, miners will instead be required to add an indexed block hash.
+
+The indexed block hash is the hash of the first block produced by the last Stacks miner in their tenure. This is the SHA512/256 hash of both the consensus hash of all previously-accepted Bitcoin transactions that Stacks recognizes, as well as the hash of the block itself.
+
+This will anchor the Stacks chain history to Bitcoin up to the start of the previous miner's tenure, as well as all causally-dependent Bitcoin state that Stacks has processed. This ensures Bitcoin finality, resolves miner connectivity issues by putting fork prevention on stackers, and allows nodes with up-to-date copies of the Stacks chain state to identify which Stacks blocks are affected by a Bitcoin reorg and recover the affected Stacks transactions.
+
+This relationship between Stackers, miners, Bitcoin blocks, and Stacks blocks is what maintains Bitcoin finality while allowing miners to rapidly produce Stacks blocks. Bitcoin finality is achieved because at every Bitcoin block N + 1, the state of the Stacks chain as of the start of tenure N is written to Bitcoin. Even if at a future date all of the former Stackers’ signing keys were compromised, they would be unable to rewrite Stacks history for tenure N without rewriting Bitcoin history back to tenure N + 1.
+
+Because of this, Stacks transactions can be considered to have Bitcoin finality after the tenure they are a part of concludes, or Bitcoin block N + 1. As an example, if I initiate a Stacks transaction that gets confirmed by a Stacks miner, at the conclusion of that miner's tenure (the end of the current Bitcoin block) that transaction will be written to Bitcoin as part of the Stacks chain state and all future miners are required to build off of that chain tip, making reversing the transaction as difficult as reversing the corresponding Bitcoin transaction.
+
+{% hint style="info" %}
+Key point: At every Bitcoin block N + 1 the state of the Stacks chain as of the start of tenure N is anchored to Bitcoin. This makes reversing Stacks history for tenure N as hard as rewriting Bitcoin history back to N + 1.
+{% endhint %}
+
+## Nakamoto Transactions and Bitcoin Reorgs
+
+If Nakamoto transactions follow Bitcoin finality, what happens if Bitcoin forks?
+
+In order to answer this question, we need to distinguish between two types of Stacks transactions: Bitcoin-reliant and internal.
+
+{% hint style="info" %}
+* **Bitcoin-reliant** transactions are transactions that read Bitcoin state. If Bitcoin forks, these transactions will change. For these, you cannot do better than following Bitcoin finality. For example, if you moved BTC from L1 to L2, you must wait for Bitcoin finality before your L2 BTC can be used (you don’t have any L2 BTC if the L1 transaction becomes unconfirmed due to a fork).
+* **Internal** transactions don't rely on Bitcoin state, and thus won't change if Bitcoin forks. These can have faster confirmations because even if Bitcoin forks, signers can ensure they are re-processed in the same order.
+{% endhint %}
+
+The key takeaway is this:
+
+Under Nakamoto Stacks, transactions won’t impactfully reorganize due to a Bitcoin fork. Not only is reorging relatively infrequent, but transactions on Stacks that got reorganized due to a Bitcoin fork behave just as reorganized Bitcoin transactions do. With some future analysis, transactions purely on the L2 chain may one day be entirely unaffected.
+
+
+
+Read more about Bitcoin reorg behavior
+
+If you are interested in learning more about how this works, see the [Bitcoin Reorgs](bitcoin-reorgs.md) page of the docs.
+
+
diff --git a/docs/learn/block-production/bitcoin-reorgs.md b/docs/learn/block-production/bitcoin-reorgs.md
new file mode 100644
index 0000000000..86dfec31ec
--- /dev/null
+++ b/docs/learn/block-production/bitcoin-reorgs.md
@@ -0,0 +1,33 @@
+# Bitcoin Reorgs
+
+Under Nakamoto Stacks transactions don’t impactfully reorganize due to a Bitcoin fork. Not only is reorging relatively infrequent, but transactions on Stacks that got reorganized due to a Bitcoin fork behave just as reorganized Bitcoin transactions do. With some future analysis, transactions purely on the L2 chain may one day be entirely unaffected.
+
+Understanding this concept fundamentally comes down to understanding finality on post-Nakamoto Stacks.
+
+{% hint style="info" %}
+Under Nakamoto the Stacks chain won’t fork on its own. It is designed not to fork with only special exceptions, and it’s entirely infeasible for Stacks to fork on its own if even 31% of Stackers don’t want it to fork, and even then it would likely only happen within the span of a single tenure.
+
+The only case in which Stacks forks post-Nakamoto is if Bitcoin forks cause it to fork.
+{% endhint %}
+
+Under Nakamoto, instead of winning the right to make a single block, miners win the right to make a ton of blocks, and during that time we say they’re under “tenure”. Every single Stacks block produced in a tenure requires at least 70% of Stackers to approve (sign) it for it to be included in the Stacks blockchain. The Stackers are watching the Bitcoin blockchain and will only sign blocks from the miner that won the latest sortition.
+
+Now, let’s imagine that Bitcoin reorganizes itself and the Stackers were watching a Bitcoin fork that is now sub-optimal. The Stackers would essentially go back in time to the latest common sortition between the fork that they were watching and the new best Bitcoin fork and start signing the blocks within the tenures from there. Note that 70% of the Stackers will be doing the same thing all at once, and the moment 70% agree to start signing from the latest tenure on the new Bitcoin fork there’s a new singularly optimal Stacks blockchain.
+
+So what happens to the transactions that were confirmed on the tenure that got reorganized? Nothing. Still in the mempool as if the reorganized tenure didn’t happen. For anything within the Stacks blockchain everything is fine.
+
+This is 1:1 with a Bitcoin fork reorganizing a Bitcoin transaction. You shouldn’t consider a transaction on Bitcoin final if it’s near the chain tip, and you shouldn’t consider a Stacks transaction final if it’s near the tenure tip.
+
+
+
+Replaying Transactions
+
+Since 70% of the signers have to sign any Stacks block included in the chain at least 70% of signers know the state of the chain before and after a Bitcoin fork causes a Stacks reorg.
+
+There’s a catch to this that makes enforcing it difficult: if a transaction were dependent on something on the Bitcoin blockchain that also got reorganized (a peg-in, for example), that transaction would now be invalid. Taint analysis is when you attempt to answer the questions “which transaction interacted with the now-orphaned Bitcoin blockchain in a way that makes them invalid (tainted) in the new chain” and then also “which transactions interacted with the now invalid (tainted) transaction such that they are now also invalid”. There’s a cascading effect, but enforcing any kind of replay requires that the Stackers and the Miners can identify which transactions can get replayed at all.
+
+Taint analysis, and subsequently replay enforcement, can be added in the future.
+
+For the first release, Nakamoto explicitly ties the Stacks blockchain to the Bitcoin blockchain such that there’s only one optimal Stacks fork tied to Bitcoin at any given point. This is completely 1:1 with the Bitcoin Blockchain behavior, but on the tenure scale.
+
+
diff --git a/docs/learn/block-production/mining.md b/docs/learn/block-production/mining.md
new file mode 100644
index 0000000000..82e9086239
--- /dev/null
+++ b/docs/learn/block-production/mining.md
@@ -0,0 +1,152 @@
+# Mining
+
+
+
+{% hint style="info" %}
+This is conceptual guide that covers how mining works. For practical steps on how to setup your own miner please refer to the guides to running a miner on [mainnet](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/run-a-miner/mine-mainnet-stacks-tokens) and [testnet](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/run-a-miner/mine-testnet-stacks-tokens).
+{% endhint %}
+
+### Miner Tenures
+
+In previous version of Stacks (before the Nakamoto Upgrade), Stacks miners would mine new Stacks blocks at a one-to-one cadence with Bitcoin blocks.
+
+After Nakamoto, this is no longer the case. Under Nakamoto rules, miners are instead selected for a tenure that corresponds to a Bitcoin block. During this tenure, miners build and propose several Stacks blocks (roughly every 10 seconds) and stackers will approve and append them (next section).
+
+To be considered for a tenure, a miner must have a block commit included in a Bitcoin block. If a miner wishes to update their commitment after submission, they may use Bitcoin Replace-By-Fee.
+
+### Coinbase rewards
+
+Miners receive coinbase rewards for tenures they win.
+
+The reward amounts are:
+
+* 1000 STX per tenure are released in the first 4 years of mining
+* 500 STX per tenure are released during the following 4 years
+* 250 STX per tenure are released during the following 4 years
+* 125 STX per tenure are released from then on indefinitely.
+
+These "halvings" are synchronized with Bitcoin halvings.
+
+
+
+### Transaction fees
+
+Miners receive Stacks fees for transactions mined in any block they produce.
+
+### Reward maturity
+
+Block rewards and transaction fees take 100 blocks on the Bitcoin blockchain to mature. After successfully mining a block your rewards appear in your Stacks account after \~24 hours.
+
+### Mining with proof-of-transfer
+
+Miners commit Bitcoin to **two** addresses in every leader block commit. The amount committed to each address must be the same. The addresses are chosen from the current reward set of stacking participants. Addresses are chosen using a verifiable-random-function, and determining the correct two addresses for a given block requires monitoring the Stacks chain.
+
+For more detailed information on this process, read [SIP-007](https://github.com/stacksgov/sips/blob/main/sips/sip-007/sip-007-stacking-consensus.md), which describes proof of transfer in detail.
+
+
+
+PoX mining is a modification of Proof-of-Burn (PoB) mining, where instead of sending the committed Bitcoin to a burn address, it's transferred to eligible STX holders that participate in the stacking protocol.
+
+{% hint style="info" %}
+A PoX miner can only receive newly minted STX tokens when they transfer Bitcoin to eligible owners of STX tokens
+{% endhint %}
+
+
+
+Miners run Stacks nodes with mining enabled to participate in the PoX mechanism. The node implements the PoX mechanism, which ensures proper handling and incentives through four key phases:
+
+* Registration: miners register for a future election by sending consensus data to the network
+* Commitment: registered miners transfer Bitcoin to participate in the election. Committed BTC are sent to a set participating STX token holders
+* Election: a verifiable random function chooses one miner for a new tenure to write blocks on the Stacks blockchain
+* Assembly: the elected miner writes the new blocks by pulling transactions from the mempool and collects rewards in form of new STX tokens
+
+### Probability to mine next block
+
+The miner who is selected to mine the next block is chosen depending on the amount of BTC the miners sent, that is, transferred or burnt.
+
+The probability for a miner to mine the next block is determined using a variation of the Assumed Total Commitment with Carryforward (ATC-C) MEV mitigation strategy described in [this document](https://github.com/stacksgov/sips/blob/feat/sip-021-nakamoto/sips/sip-021/MEV-Report.pdf) to allocate block rewards to miners. The probability a miner will win the sortition and be granted the current tenure will be based on a function that accounts for the total block commit spend on the blocks leading up to the current sortition.
+
+You can read more about this in the [MEV section of SIP-021](https://github.com/stacksgov/sips/blob/feat/sip-021-nakamoto/sips/sip-021/sip-021-nakamoto.md#block-reward-distribution-and-mev).
+
+While there is no minimum BTC commitment enforced by the protocol, in practice, there's a floor constrained by [dust](https://unchained-capital.com/blog/dust-thermodynamics/): basically, if the fees for a transaction exceed the value of the spent output, it's considered dust. How dust is [calculated](https://github.com/bitcoin/bitcoin/blob/master/src/policy/policy.cpp#L14) depends on a number of factors, we've found 5,500 satoshis to be good lower bound per [output](https://learnmeabitcoin.com/technical/output). Bitcoin transactions from Stacks miners contain two outputs (for Proof-of-Transfer), so a commitment of at least 11,000 satoshis / block is recommended.
+
+To calculate the amount of BTC to send miners should:
+
+* Guess the price BTC/STX for the next day (100 blocks later)
+* Guess the total amount of BTCs committed by all miners
+
+Stackers are in charge of both validating and appending new blocks and conducting miner tenure changes. The next section will explain how that works, and then we'll see how this process results in Bitcoin finality.
+
+### Stacks mining in practice
+
+If you take a look at [SIgnal21's mining dashboard](https://app.signal21.io/stacks/mining), you can view some interesting data about mining on the Stacks network, including BTC spent per block, STX earned per block, the total number of miners over the course of the chain's history, and the number of miners for any given block.
+
+Many people notice the seemingly small number of miners on Stacks. Without context, this can sometimes raise eyebrows. Let's dig into how mining works on Stacks so we can understand why this isn't an issue for decentralization.
+
+Stacks miners function similarly to sequencers in L2 systems in that they are only responsible for constructing and proposing new blocks, not appending them to the chain. But unlike most Ethereum L2s that operate with just a single centralized sequencer, Stacks consistently has at least 4-5 miners with open membership allowing anyone to join.
+
+It's important to note that there are two primary parties involved in the block production process on Stacks: miners and stackers.
+
+These two roles serve complementary relationships in the [block production process](file:///), and stackers drastically reduce any potential destructive power miners have over the chain.
+
+Miners cannot reorganize the chain. In the worst case, all miners can do is omit (some kinds of) transactions, and all that is required to address this is to run your own miner.
+
+Furthermore, more miners on the network would mean fewer BTC rewards for Stackers, as miners would have to spend more of their funds on Bitcoin L1 fees rather than sending it to the Stackers.
+
+{% hint style="info" %}
+**Wouldn't more miners mean more competition, meaning more rewards?**
+
+The reason more miners means fewer rewards is because miners act economically rationally, and they don't have an unlimited amount of BTC to work with.
+
+Miners are paying their PoX commitments plus their Bitcoin fees for a chance to win the coinbase (1,000 STX) plus fees for a tenure. If there are more miners, they will each pay less, because they will have a lower chance of winning. They can't pay ever-increasing amounts of BTC because at some point they will never be profitable, so there is a limit to how much BTC they can spend in order to try and win a tenure.
+
+As they pay less, the Bitcoin fee becomes a more significant portion of their expenses, and that also decreases their odds of winning the tenure.
+
+Here's a concrete example:
+
+Let's say Stacks is trading at 1,000 Sats per STX.
+
+The total spend from all miners, if everyone is acting logically and we ignore Stacks fees, would be less than 1,000,000 Sats (1,000 STX coinbase \* 1000 Sats/STX).
+
+If that is from 5 miners, then it could be 10,000 Sats (2,000 Sats for each transaction) going to Bitcoin fees and 990,000 Sats going to PoX.
+
+If there are 100 miners, then it would be 200,000 Sats going to Bitcoin fees, and 800,000 Sats going to PoX.
+{% endhint %}
+
+This creates a natural economic equilibrium where:
+
+{% stepper %}
+{% step %}
+### Enough miners participate to ensure blocks are produced reliably
+
+Content as above describing reliability.
+{% endstep %}
+
+{% step %}
+### Stackers receive optimal BTC rewards
+
+Content as above describing rewards optimization.
+{% endstep %}
+
+{% step %}
+### The network maintains censorship resistance without unnecessary mining competition
+
+Content as above describing censorship resistance.
+{% endstep %}
+{% endstepper %}
+
+This design is intentional - by having stackers as complimentary security guarantors who receive BTC rewards via PoX, Stacks achieves security without requiring an excessive number of miners competing solely to win block production rights.
+
+Unlike other chains where miners alone determine the canonical chain, Stacks' two-party system provides stronger guarantees:
+
+* Miners cannot force invalid transactions or blocks (stackers won't sign them, and even if they did, the nodes would not accept them)
+* No miner can unilaterally reorg the chain (stackers control chain finality)
+* The 70% stacker threshold signature requirement ensures broad consensus before blocks are accepted
+
+This separation of concerns between miners and stackers is what makes Stacks uniquely secure despite having a small number of miners.
+
+### What About Microblocks?
+
+Microblocks are a legacy feature of the previous version of Stacks that no longer exist. They were originally created as a way to improve transaction throughput, but without the functionality of Nakamoto, they never worked in practice.
+
+Instead of microblocks, Nakamoto instead utilizes a block production structure that creates Stacks blocks at a rapid cadence as described here.
diff --git a/docs/learn/block-production/signing.md b/docs/learn/block-production/signing.md
new file mode 100644
index 0000000000..d92f6628b3
--- /dev/null
+++ b/docs/learn/block-production/signing.md
@@ -0,0 +1,81 @@
+# Signing
+
+Stackers play an essential role in the Nakamoto system that had previously been the responsibility of miners. Before, miners both decided the contents of blocks, and decided whether or not to include them in the chain (i.e. by deciding whether or not to confirm them). In this system each actor has the following responsibilities necessary to make the system function reliably without forks:
+
+* **Miners** decide the contents of blocks.
+* **Stackers** decide whether or not the block is included in the chain.
+
+The bulk of the complexity of the Nakamoto changes is in separating these two concerns while ensuring that both mining and Stacking remain open-membership processes. **Crucially, anyone can become a miner and anyone can become a Stacker, just as before.** The most substantial changes are in getting miners and Stackers to work together in their new roles to achieve this proposal's goals.
+
+The key idea is that Stackers are required to acknowledge and validate a miner's block before it can be appended to the chain. To do so, Stackers must first agree on the canonical chain tip, and then apply (and roll back) the block on this chain tip to determine its validity. Once Stackers agree that the block is both canonical and valid, they collectively sign it and replicate it to the rest of the Stacks peer network. Only at this point do nodes append the block to their chain histories.
+
+This new behavior prevents forks from arising. If a miner builds a block atop a stale tip, Stackers will refuse to sign the block. If Stackers cannot agree on the canonical Stacks tip, then no block will be appended in the first place. While this behavior creates a new failure mode for Stacks -- namely, the chain can halt indefinitely if Stackers cannot agree on the chain tip -- this is mitigated by having a large and diverse body of Stackers such that enough of them are online at all times to meet quorum and incentivizing them via PoX rewards to act as such.
+
+### Stacker Signing
+
+{% hint style="info" %}
+You can view a list of all of the [active signers](https://explorer.hiro.so/signers?chain=mainnet) on Hiro's block explorer.
+{% endhint %}
+
+We'll cover how stacking works in the Stacking section and the sBTC signing in the sBTC section; here we'll cover the signing process as it relates to Stacks block production.
+
+The means by which Stackers agree on the canonical chain tip and agree to append blocks is tied to PoX. In each reward cycle, a Stacker clinches one or more reward slots; there are at most 4,000 reward slots per reward cycle. Stackers vote to accept blocks by producing a weighted threshold signature over the block. The signature must represent a substantial fraction of the total STX locked in PoX (the threshold), and each Stacker's share of the signature (its weight) is proportional to the fraction of locked STX it owns.
+
+The weighted threshold signature is a Schnorr signature generated through a variation of the [FROST protocol](https://eprint.iacr.org/2020/852.pdf). Each Stacker generates a signing key pair, and they collectively generate an aggregate public key for nodes to use to verify signatures computed through a distributed signing protocol. This signing protocol allocates shares of the associated aggregate private key to Stackers proportional to the number of reward slots they clinch. No Stacker learns the aggregate private key; Stackers instead compute shares of the private key and use them to compute shares of a signature, which can be combined into a single Schnorr signature.
+
+When a miner produces a block, Stackers execute a distributed signing protocol to collectively generate a single Schnorr signature for the block. Crucially, the signing protocol will succeed only if at least X% of the reward slots are accounted for in the aggregate signature. Nakamoto is currently set to use a 70% signing threshold -- at least 70% of the reward slots (by proxy, 70% of the stacked STX) must sign a block in order to append it to the Stacks blockchain.
+
+Nakamoto uses the [WSTS protocol with the FIRE extension](https://trust-machines.github.io/wsts/wsts.pdf), which admits a distributed key generation and signature generation algorithm pair whose CPU and network bandwidth complexity grows with the number of distinct Stackers. The FIRE extension enables WSTS to tolerate byzantine Stackers.
+
+Here is a diagram outlining the relationship between signing and stacking.
+
+
+
+### Validating and Appending New Blocks
+
+When miners are selected for a new tenure, they begin building new blocks from transactions in the mempool. They then send those blocks to stackers for approval. Stackers must approve the blocks with a quorum of at least 70% for them to be appended to the chain.
+
+Stackers will approve a block based on several properties:
+
+* The block is well-formed
+ * It has the correct version and mainnet/testnet flag
+ * Its header contains the right number of Stacks blocks preceding this one.
+ * Its header contains the correct total Bitcoin spent in the sortition that elected the current tenure.
+ * Its header contains the same Bitcoin block hash as the Bitcoin block that contains its tenure's block-commit transaction\*
+ * Its header contains the correct parent block ID of the immediate parent of this block.\*
+ * The transaction Merkle tree root is consistent with the transactions
+ * The state root hash matches the MARF tip root hash once all transactions are applied
+ * The block header has a valid ECDSA signature from the miner.
+ * The block header has a valid WSTS Schnorr signature from the set of Stackers.
+* All Bitcoin transactions since the last valid sortition up to (but not including) this tenure's block-commit’s Bitcoin block have been applied to the Stacks chain state\*
+* In the case of a tenure start block:
+ * The first transaction is the `TenureChange` transaction.
+ * The first transaction after the `TenureChange` transaction is a `Coinbase`.
+
+The properties marked with \* are collectively how Stacks ensures Bitcoin finality. By adhering to these properties, it ensures that miners are only able to append blocks if they build atop the correct chain tip, which also anchors the history to Bitcoin.
+
+Stackers, by validating these rules, ensure Bitcoin finality. We'll talk about this more in the next section.
+
+### Conducting Miner Tenure Changes
+
+The other primary signing responsibility in block production involves conducting tenure change transactions. As discussed in the mining section, miners will submit a `block-commit` transaction on the Bitcoin chain to initiate mining. If they are selected, stackers will detect that and create a `tenure-change` transaction.
+
+This tenure change transaction includes:
+
+| Name | Description | Representation |
+| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- |
+| tenure consensus hash | Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. It may be the case that this miner's tenure gets extended across subsequent sortitions; if this happens, then this `consensus hash` value remains the same as the sortition in which the winning block-commit was mined. | 20 bytes |
+| previous tenure consensus hash | Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. | 20 bytes |
+| burn view consensus hash | Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. | 20 bytes |
+| previous tenure end | The index block hash of the last Stacks block from the previous tenure. | 32 bytes |
+| previous tenure blocks | The number of blocks produced since the last sortition-linked tenure. | 4 bytes, big-endian |
+| cause |
A flag to indicate the cause of this tenure change - 0x00 indicates that a sortition occurred, and a new miner should begin producing blocks. - 0x01 indicates that the current miner should continue producing blocks. The current miner’s tenure execution budget is reset upon processing this transaction.
| 1 byte |
+| pubkey hash | The ECDSA public key hash of the current tenure. | 20 bytes |
+
+This tenure change transaction is then sent to the newly elected miner and they must include it as the first transaction in their first block, otherwise stackers will not approve it.
+
+This process is then repeated over and over as new miners are elected for tenures.
+
+Be sure to take a look at [SIP-021](https://github.com/stacksgov/sips/blob/feat/sip-021-nakamoto/sips/sip-021/sip-021-nakamoto.md) to get a detailed description of exactly what happens under the hood during these processes.
+
+Next up, let's dig a little deeper into this idea of Bitcoin finality and how the Stacks block production mechanism achieves it.
diff --git a/docs/learn/block-production/stacking.md b/docs/learn/block-production/stacking.md
new file mode 100644
index 0000000000..601afc88ea
--- /dev/null
+++ b/docs/learn/block-production/stacking.md
@@ -0,0 +1,197 @@
+# Stacking
+
+### Introduction
+
+Stacking rewards Stacks (STX) token holders with bitcoin for providing a valuable service to the network by locking up their tokens for a certain time and participating as consensus-critical signers. If you aren't familiar with the concept of signers in Stacks, be sure to check out the [Signing section](https://app.gitbook.com/o/hoh4mQXTl8NvI3cETroY/s/H74xqoobupBWwBsVMJhK/block-production/signing). This document is a conceptual overview of stacking and how it works.
+
+`pox-4.clar` is the stacking contract. If you are interested in experimenting with proof of transfer use cases including state changes, solo stacking, and pool stacking, all the functions you’ll need can be found at the deployed contract:
+
+* Testnet: https://explorer.hiro.so/txid/0xfba7f786fae1953fa56f4e56aeac053575fd48bf72360523366d739e96613da3?chain=testnet
+* Mainnet: https://explorer.hiro.so/txid/0xc6d6e6ec82cabb2d7a9f4b85fcc298778d01186cabaee01685537aca390cdb46?chain=mainnet
+
+### Stacking vs Staking
+
+While stacking on the Stacks network can be conceptually similar to staking, Stacks is not a PoS network and there are a couple key differences.
+
+There are two primary differences between stacking in Stacks and staking in PoS networks.
+
+#### Yield generated in burnchain token
+
+In staking, users lock one token and earn their yield in the same token. In stacking, users lock one token (STX) and earn a yield in the "burnchain" token (BTC), rather than the same token that was locked. In PoX, the yield comes from a finite, external source (Bitcoin deposits from Stacks miners). In PoS, the yield comes from the currency's issuance schedule itself.
+
+How are these issuance rates set? In Ethereum, issuance rates are determined by network usage. Ethereum's goal is to create a deflationary money supply, so the issuance rate is determined depending on the usage of the network. In order for an Ethereum transaction to be considered valid, it must include a base fee that is burned during transaction execution. The [issuance rate is algorithmically determined](https://ethereum.org/en/roadmap/merge/issuance/#post-merge) block-by-block depending on how much ETH is being burned by these base fees plus normal gas fees.
+
+Stacking doesn't generate yield in the same token and therefore doesn't need to issue new STX for stacking rewards. Stacking yield requires an input of an external token (BTC). Stacks does have an issuance rate and does generate new STX tokens, but that process is separate from stacking and the stacking yield mechanism.
+
+#### No slashing
+
+Although stackers do fulfill a consensus-critical role in Stacks by serving as signers, there is no concept of slashing in PoX (Proof of Transfer).
+
+Rather, if stackers do not perform their duties as signers, they simply cannot unlock their STX tokens and will not receive their BTC rewards.
+
+Stacking is a built-in action, required by the "proof-of-transfer" (PoX) mechanism. The PoX mechanism is executed by every miner on the Stacks network.
+
+{% hint style="info" %}
+Stacking functionality is implemented as a smart contract, using Clarity. Read more about [the contract](https://app.gitbook.com/s/GVj1Z9vMuEOMe7oH7Wnq/clarity/example-contracts/stacking).
+{% endhint %}
+
+### Locking and Unlocking STX
+
+When STX tokens are "locked", no transfer of STX tokens occurs. Locking STX tokens is non-custodial, and STX tokens remain in your wallet. When you initiate a stacking transaction those tokens are locked and unspendable at the protocol level, but they do not leave the stacker's wallet.
+
+At the end of the lock period, they will be automatically unlocked (spendable at the protocol level). This occurs implicitly; there is no direct transaction that unlocks them.
+
+### Stacking flow
+
+The Stacking mechanism can be presented as a flow of actions:
+
+
+
+{% stepper %}
+{% step %}
+### Make API calls to get details about the upcoming reward cycle
+
+Query the network to discover the upcoming cycle parameters and timing.
+{% endstep %}
+
+{% step %}
+### Confirm eligibility for a specific Stacks account
+
+Verify the account meets the minimum requirements and is eligible to participate.
+{% endstep %}
+
+{% step %}
+### Confirm the BTC reward address and lockup duration
+
+Specify the Bitcoin address to receive payouts and input the desired lockup period.
+{% endstep %}
+
+{% step %}
+### Broadcast the stacking transaction to lock STX
+
+The transaction is broadcast and the STX tokens are locked. This must happen before the prepare phase of the next reward cycle (the last 100 Bitcoin blocks of the ongoing reward phase).
+{% endstep %}
+
+{% step %}
+### Reward cycles execute and BTC rewards are sent
+
+The stacking mechanism executes reward cycles and sends out rewards to the configured BTC reward address.
+{% endstep %}
+
+{% step %}
+### Monitor unlocking timing and rewards during lockup
+
+During the lockup period, you can obtain details about unlocking timing, expected rewards, and more.
+{% endstep %}
+
+{% step %}
+### Tokens are released after the lockup period
+
+Once the lockup period has passed, the tokens become spendable again.
+{% endstep %}
+
+{% step %}
+### Display reward history
+
+Show historical details like earnings for previous reward cycles.
+{% endstep %}
+{% endstepper %}
+
+{% hint style="info" %}
+Keep in mind that the target duration for a reward cycle is \~2 weeks. This duration is based on the target block time of the Bitcoin network (10 minutes) and can be higher at times due to [confirmation time variances](https://www.blockchain.com/charts/median-confirmation-time) of the Bitcoin network.
+{% endhint %}
+
+### Stacking delegation flow
+
+There are two main ways you can stack: solo stacking and delegated stacking.
+
+{% stepper %}
+{% step %}
+### Solo stacking
+
+Solo stacking follows the general stacking flow. You stack your own STX tokens and run your own signer. To operate as a solo stacker, you must have a minimum amount of STX tokens. This minimum is dynamic and can be found by viewing the [pox endpoint of the API](https://api.testnet.hiro.so/v2/pox) in the `min_threshold_ustx` field.
+{% endstep %}
+
+{% step %}
+### Delegated stacking
+
+
+
+Delegated stacking differs:
+
+* Before stacking on behalf of a token holder, the delegator must be granted permission by the account owner. Permission is restricted to a maximum amount the delegator may stack; the maximum can be set higher than available funds. An account can be associated with only one delegator.
+* The account sets the delegation relationship. They can optionally restrict the Bitcoin reward address that must be used for payouts and specify an expiration burn block height to limit the delegation duration.
+* Delegators lock STX from different accounts ("pooling phase") until they reach the minimum required to participate in stacking.
+* Once the delegator locks enough STX, they can finalize and commit participation in the next reward cycle.
+* Some delegation relationships may allow the STX holder to receive payouts directly from the miner.
+* Delegation can terminate automatically based on expiration rules or by actively revoking delegation rights.
+{% endstep %}
+{% endstepper %}
+
+### Token holder eligibility
+
+Stacks (STX) token holders don't automatically receive stacking rewards. To participate, they must:
+
+* Commit to participation before a reward cycle begins
+* Commit at least the minimum amount of STX tokens to secure a reward slot, or pool with others to reach the minimum
+* Lock up STX tokens for a specified period
+* Provide a supported Bitcoin address to receive rewards
+* Maintain their signer software (if they operate a signer)
+
+
+
+Token holders have a variety of providers and tools to support their participation in stacking. The Stacks website contains a [list of pools and stacking options](https://www.stacks.co/learn/stacking#startstacking).
+
+### Stacking in the PoX consensus algorithm
+
+Stacking is a built-in capability of PoX and occurs through a set of actions on the Stacks blockchain. The [full proof-of-transfer implementation details](https://github.com/stacks-network/stacks-blockchain/blob/develop/sip/sip-007-stacking-consensus.md) are in SIP-007. Below is a summary of the most relevant actions of the algorithm.
+
+{% hint style="info" %}
+Note that SIP-007 describes stacking before Nakamoto. While much of the functionality remains the same, stackers now have the additional responsibility of operating as signers as outlined in [SIP-021](https://github.com/stacksgov/sips/blob/feat/sip-021-nakamoto/sips/sip-021/sip-021-nakamoto.md).
+{% endhint %}
+
+
+
+Stacking happens in reward cycles of 2100 Bitcoin blocks (roughly two weeks). Reward cycles are split into two phases: the prepare phase and the reward phase.
+
+* The prepare phase lasts 100 Bitcoin blocks and is where the new stackers for the upcoming reward phase are selected by the PoX anchor block (see SIP-007 for details).
+* Because Stacks does not fork after the Nakamoto upgrade, the PoX anchor block is always known 100 Bitcoin blocks before the start of the next reward cycle. It is the last tenure-start block that precedes the prepare phase.
+* The PoX anchor block identifies the next stackers. They have 100 Bitcoin blocks to prepare for signing Stacks blocks, including completing a Distributed Key Generation round for signing blocks.
+* The PoX contract requires stackers to register their block-signing keys when they stack or delegate-stack STX, so the entire network can validate signatures on blocks.
+
+This process is handled by [running a signer](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/run-a-signer) and then subsequently conducting stacking operations as that signer.
+
+### Stacking and Signing
+
+Stacking and signing are distinct actions, but both are necessary. Signers must stack their STX tokens, and you cannot stack STX without associated signing information. The nuance depends on solo vs delegated stacking.
+
+### Solo Stacking
+
+If you are solo stacking, you have two options for signing.
+
+#### Run your own signer
+
+You can run your own signer by following the How to Run a Signer guide. This requires technical knowledge and resources for running a machine. See the guide for details.
+
+#### Work with another signer
+
+If you don't want to run your own signer, you can collaborate with another signer and include their signature in your stacking transactions. Details on how to do this are in the [Stack STX](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/stacking-stx) guide.
+
+### Delegated Stacking
+
+If you delegate your STX to a pool operator, you do not need to run a signer. The pool operator conducts the actual stacking transaction and is responsible for running the signer.
+
+If you are a pool operator, see the [operate-a-pool guide](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/stacking-stx/operate-a-stacking-pool).
+
+### How and Where to Stack
+
+Options for stacking include solo stacking, participating in a pool, using an exchange, and liquid stacking. The Stacks website has a [stacking page](https://www.stacks.co/learn/stacking) describing these options.
+
+For detailed instructions on how to stack, see the [Stack STX guides](https://app.gitbook.com/s/4cpTb2lbw0LAOuMHrvhA/stacking-stx).
+
+Tools and explorers for stacking data and statistics:
+
+* https://app.signal21.io/
+* https://www.stacking-tracker.com/
+* https://www.stakingrewards.com/calculator?asset=stacks
+* https://stacking.tools/
diff --git a/docs/learn/clarity/README.md b/docs/learn/clarity/README.md
new file mode 100644
index 0000000000..06cd4c40a5
--- /dev/null
+++ b/docs/learn/clarity/README.md
@@ -0,0 +1,57 @@
+# Clarity
+
+
+
+Clarity is the smart contract language that Stacks uses. It has been built from the ground up to make it easier for developers to write safe, secure smart contracts. Clarity has several unique features that make it an ideal choice for writing smart contracts. We'll go over an overview of Clarity here, and highly recommend checking out the [Clarity Crash Course](https://app.gitbook.com/u/ZrQItu6D9bMKmf1HfsLTnGc05WZ2) guide to dig in and get started learning Clarity.
+
+Clarity is a **decidable** smart contract language that optimizes for predictability and security, designed for the Stacks blockchain. Smart contracts allow developers to encode essential business logic on a blockchain.
+
+The design decisions behind Clarity were based heavily on taking lessons learned in common Solidity exploits and creating a language that has been purpose-built for safety and security in mind.
+
+These docs serve primarily as a reference for the functions and keywords that you can use in Clarity.
+
+In order to learn Clarity, we recommend diving into the [Clarity of Mind](https://book.clarity-lang.org/), an online book to teach you everything you need to know to build robust smart contracts, or joining a [Clarity Camp](https://clarity-lang.org/universe#camp), the cohort-based immersive Clarity experience.
+
+### What makes Clarity different
+
+The following section is an excerpt from the book, [Clarity of Mind](https://book.clarity-lang.org/ch00-00-introduction.html):
+
+The number of smart contract languages grows by the year. Choosing a first language can be challenging, especially for a beginner. The choice is largely dictated by the ecosystem you are interested in, although some languages are applicable to more than just one platform. Each language has its own upsides and downsides and it is out of the scope of this book to look at all of them. Instead, we will focus on what sets Clarity apart and why it is a prime choice if you require the utmost security and transparency.
+
+One of the core precepts of Clarity is that it is secure by design. The design process was guided by examining common pitfalls, mistakes, and vulnerabilities in the field of smart contract engineering as a whole. There are countless real world examples of where developer failure led to the loss or theft of vast amounts of tokens. To name two big ones: an issue that has become known as the Parity bug led to the irreparable loss of millions of dollars worth of Ethereum. Second, the hacking of The DAO (a "Decentralized Autonomous Organization") caused financial damage so great that the Ethereum Foundation decided to issue a contentious hard fork that undid the theft. These and many other mistakes could have been prevented in the design of the language itself.
+
+#### Clarity is interpreted, not compiled
+
+Clarity code is interpreted and committed to the chain exactly as written. Solidity and other languages are compiled to byte-code before it is submitted to the chain. The danger of compiled smart contract languages is two-fold: first, a compiler adds a layer of complexity. A bug in the compiler may lead to different byte-code than was intended and thus carries the risk of introducing a vulnerability. Second, byte-code is not human-readable, which makes it very hard to verify what the smart contract is actually doing. Ask yourself, would you sign a contract you cannot read? If your answer is no, then why should it be any different for smart contracts? With Clarity, what you see is what you get.
+
+#### Clarity is decidable
+
+A decidable language has the property that from the code itself, you can know with certainty what the program will do. This avoids issues like the halting problem. With Clarity you know for sure that given any input, the program will halt in a finite number of steps. In simple terms: it is guaranteed that program execution will end. Decidability also allows for complete static analysis of the call graph so you get an accurate picture of the exact cost before execution. There is no way for a Clarity call to "run out of gas" in the middle of the call. We explore this idea more, along with a discussion on Turing completeness, in the security deep dive on decidability.
+
+#### Clarity does not permit reentrancy
+
+Reentrancy is a situation where one smart contract calls into another, which then calls back into the first contract—the call "re-enters" the same logic. It may allow an attacker to trigger multiple token withdrawals before the contract has had a chance to update its internal balance sheet. Clarity's design considers reentrancy an anti-feature and disallows it on the language level.
+
+#### Clarity guards against overflow and underflows
+
+Overflows and underflows happen when a calculation results in a number that is either too large or too small to be stored, respectively. These events throw smart contracts into disarray and may intentionally be triggered in poorly written contracts by attackers. Usually this leads to a situation where the contract is either frozen or drained of tokens. Overflows and underflows of any kind automatically cause a transaction to be aborted in Clarity.
+
+#### Support for custom tokens is built-in
+
+Issuance of custom fungible and non-fungible tokens is a popular use-case for smart contracts. Custom token features are built into the Clarity language. Developers do not need to worry about creating an internal balance sheet, managing supply, and emitting token events. Creating custom tokens is covered in depth in later chapters.
+
+#### On Stacks, transactions are secured by post conditions
+
+In order to further safeguard user tokens, post conditions can be attached to transactions to assert the chain state has changed in a certain way once the transaction has completed. For example, a user calling into a smart contract may attach a post condition that states that after the call completes, exactly 500 STX should have been transferred from one address to another. If the post condition check fails, then the entire transaction is reverted. Since custom token support is built right into Clarity, post conditions can also be used to guard any other token in the same way.
+
+#### Returned responses cannot be left unchecked
+
+Public contract calls must return a so-called response that indicates success or failure. Any contract that calls another contract is required to properly handle the response. Clarity contracts that fail to do so are invalid and cannot be deployed on the network. Other languages like Solidity permit the use of low level calls without requiring the return value to be checked. For example, a token transfer can fail silently if the developer forgets to check the result. In Clarity it is not possible to ignore errors, although that obviously does prevent buggy error handling on behalf of the developer. Responses and error handling are covered extensively in the chapters on functions and control flow.
+
+#### Composition over inheritance
+
+Clarity adopts a composition over inheritance. It means that Clarity smart contracts do not inherit from one another like you see in languages like Solidity. Developers instead define traits which are then implemented by different smart contracts. It allows contracts to conform to different interfaces with greater flexibility. There is no need to worry about complex class trees and contracts with implicit inherited behavior.
+
+#### Access to the base chain: Bitcoin
+
+Clarity smart contracts can read the state of the Bitcoin base chain. It means you can use Bitcoin transactions as a trigger in your smart contracts! Clarity also features a number of built-in functions to verify secp256k1 signatures and recover keys.
diff --git a/docs/learn/clarity/decidability.md b/docs/learn/clarity/decidability.md
new file mode 100644
index 0000000000..427424c44e
--- /dev/null
+++ b/docs/learn/clarity/decidability.md
@@ -0,0 +1,173 @@
+# Decidability
+
+### What does it mean for a language to be Non-Turing Complete or Decidable?
+
+Non-Turing complete and decidable are two terms you will often hear about the security advantages of Clarity, but what do they mean?
+
+While related, they are not quite interchangeable, since there are a few differences.
+
+#### Non-Turing Complete
+
+A system or language is non-Turing complete if it cannot simulate a Turing machine, which is an abstract model of computation. Non-Turing complete systems have limited computational power compared to Turing complete systems. A Turing-complete system or language can simulate any Turing machine. Examples of non-Turing complete systems include finite state machines and some domain-specific languages (like Clarity).
+
+Non-Turing complete languages typically cannot express all possible algorithms. Specifically, some problems whose solutions require unbounded loops or recursion cannot be expressed using non-Turing complete languages. This last property is especially important in the context of Clarity, as it makes it so that features like unbounded loops and reentrancy are disallowed at a language level.
+
+#### Decidable
+
+A problem is decidable if there exists an algorithm that can always determine whether a given input has a particular property or not in a finite amount of time. In other words, a decidable problem can be solved by a Turing machine that is guaranteed to halt for all input instances. Decidability is a property of problems, whereas Turing completeness is a property of languages or computational systems.
+
+The fact that Clarity is decidable means that developers (and tooling) can more easily reason about and predict with certainty the behavior of Clarity contracts, regardless of the input.
+
+### Mindset of a Smart Contract Developer
+
+Before we dive into specifics, let's first set the context and viewpoint we should hold as smart contract developers who want to write secure code.
+
+As you explore further into the security properties of Solidity and Clarity, you'll see that there are always mitigation steps that _can_ be taken by developers to help address some of these security issues.
+
+The main issue, with this line of thinking, is it increases the odds of human error in smart contract security. If we can preserve functionality while mitigating the chance of human error as much as possible, we should do so.
+
+### Should smart contracts be Turing complete?
+
+We will discover new applications for smart contracts. These applications will go beyond current smart contracts, traditional contracts, and may even open new economic opportunities. Given these possibilities, how should we build our smart contracts? What characteristics should our smart contract languages have?
+
+It is good practice to separate data from programs. Should smart contracts be data, or programs, or something in between? If smart contracts are data, then should the programs that execute them be Turing complete or perhaps less powerful? If smart contracts are programs, then what language should smart contracts be written in? What characteristics should this programming language have?
+
+The Church–Turing thesis is the hypothesis that all formal notions of computation are captured by Turing machines or modern computers. A programming language is Turing complete if it captures all formal notions of computation. Many programming languages are Turing complete. For example, Python, C++, Rust, Java, Lisp, and Solidity are all Turing complete.
+
+Consider a program and its input. In the worst case, determining this program’s output is impossible. Validating a program, on a particular input, is done by generating a proof-of-correctness.
+
+Proofs-of-correctness are logical proofs that can be mechanically validated. Finding proofs-of-correctness for programs and their input is undecidable. Kurt Gödel showed there are undecidable logical statements.
+
+This indicates all programs in Turing complete languages cannot be validated in the worst case. Thus, Turing complete smart contract languages must allow contracts that cannot be validated.
+
+Alonzo Church and Alan Turing showed there are problems that are uncomputable. Uncomputable problems cannot be solved by any Turing machine. Hence, assuming the Church–Turing thesis, these uncomputable problems cannot be solved by any computer.
+
+We'll explore this idea further later in this section.
+
+Turing complete languages are very expressive. In fact, assuming the Church–Turing thesis, Turing complete languages are as expressive as possible in some sense.
+
+Is there a trade-off? What types of problems can occur with uncomputable problems and programs whose validity may be undecidable?
+
+As smart contracts subsume parts of contract law, consider the large body of laws and regulations for tax law.
+
+For instance, US tax law and regulations take up several million words. International tax law and regulations pushes these numbers much higher.
+
+Are these laws and regulations programs or are they data? If tax law were to be written in a Turing complete language, then the law may codify uncomputable problems. It is an accountant’s nightmare for their advice to be undecidable.
+
+Clarity is non-Turing complete, yet very expressive. This makes it so that Clarity is decidable and cannot encode uncomputable problems. There are discussions and papers on smart contract languages such as Solidity that propose subsets of Solidity that are non-Turing complete. These subsets are decidable and cannot encode uncomputable problems. However, there is no consensus on which subsets to work with and they are not widely used.
+
+### Advantages of Decidability in Smart Contracts
+
+Why is decidability important in the context of smart contracts?
+
+First, it is not possible for a Clarity call to run out of gas in the middle of a call. Because of its decidability, it is possible to get a complete static analysis of the call graph to get an accurate picture of the cost before execution.
+
+Solidity allows for unbounded loops, recursion, and dynamic function calls, which makes it difficult to accurately predict the execution cost or gas usage beforehand. As a result, Solidity contracts may run out of gas during execution if the gas limit is not set appropriately or if the contract encounters a scenario with unexpectedly high computational requirements.
+
+One practical example is the issue of a specific kind of DoS attack in Solidity, where the contract is rendered inoperable because of unbounded execution constraints. An example of this is the GovernMental attack, where a mapping that needed to be deleted for a payout became so large that working with it exceeded the block gas limit.
+
+There are a few different properties of Clarity's language design that prevents such DoS attacks.
+
+The reason that the analysis system can accurately estimate the execution cost is because certain functionality is intentionally limited in Clarity.
+
+For example, there is no recursion in Clarity, so we can't infinitely call into a function over and over.
+
+Data types in Clarity are also restricted. Any data types that don't require a hard length limit are not iterable.
+
+Maps and tuples, for example, do not require you to enter a maximum length when defining them, but you also can't iterate over them.
+
+Lists, on the other hand, which are iterable, do require the developer to define an upper limit when defining them. This is a large part of what allows an accurate static analysis of Clarity contracts.
+
+So how would we implement a mapping of an undefined size in Clarity? We wouldn't, because it's an anti-pattern in smart contract design.
+
+Instead, Clarity forces us to think of a better solution to our problem. For example, implementing a way for users to handle mapping/list element operations themselves, instead of mass operations handled at the contract level.
+
+If you [analyze the GovernMental attack](https://hackernoon.com/smart-contract-attacks-part-2-ponzi-games-gone-wrong-d5a8b1a98dd8#h-attack-2-call-stack-attack), you'll see that it took advantage of multiple security issues, all of which are mitigated in Clarity. You'll also see that a fix was added to make it economically infeasible to carry out this type of attack again.
+
+This brings up another crucial point when setting appropriate mental models for smart contracts and blockchain systems: complexity means more potential bugs, which means adding more complexity to address those bugs.
+
+When this happens over and over again, we are trapping ourselves into creating an evermore complex system. Addressing these issues at the language level prevents this ever-growing complexity.
+
+For a deep dive into how Clarity was designed, check out [SIP-002](https://github.com/stacksgov/sips/blob/main/sips/sip-002/sip-002-smart-contract-language.md).
+
+{% hint style="info" %}
+You can view some more common smart contract vulnerabilities and how they are mitigated in [this article](https://stacks.org/bringing-clarity-to-8-dangerous-smart-contract-vulnerabilities/).
+{% endhint %}
+
+This has second-order effects as well when we look at security testing and auditing. One of the common tools for testing smart contracts is formal verification, where we mathematically prove that certain properties of smart contracts will or will not remain true in all cases.
+
+This can lead to the path explosion problem, where there are so many paths available that formal verification becomes incredibly difficult. This problem is mitigated in Clarity, since there is not chance of a program encountering an unbounded loop.
+
+This leads us to a more general mental model for thinking about decidability as smart contracts continue to become a larger part of our economy. Remember that the goal with blockchain systems is to create an open, transparent, fair financial system.
+
+This means that smart contracts will be responsible for managing large amounts of wealth for ever-growing amounts of people. As smart contracts encompass more financial structures, their complexity and usage will grow.
+
+Complexity is the enemy of security. The more complex a system is, the more danger there is in creating uncomputable problems when there are no hard restrictions on the execution steps that can be taken.
+
+This is deadly in financial infrastructure that is not only open and transparent, but immutable. Let's explore this idea of uncomputability a bit more.
+
+### Intuition on Uncomputability
+
+Intuitively, uncomputability is an algorithmic view of undecidability. Uncomputability has the same foundations as undecidability. Undecidable questions are framed as logic statements or statements about integers. Of course, programs are logic statements and may even be viewed as integers, though we view programs differently. We often view programs with additional details of memory models, implementation details, and execution semantics.
+
+The [Halting problem](https://en.wikipedia.org/wiki/Halting_problem): As an example, given any program `P` and any finite input `I` for `P`, then the Halting Problem is the challenge of determining if `P` halts on input `I`.
+
+Alonzo Church and Alan Turing showed the Halting Problem is unsolvable.
+
+Christopher Strachey gave an intuitive proof-by-contradiction showing the Halting problem is uncomputable. This is set up by supposing there is a program `H` that can solve the Halting problem for any program `P`. `H(P)` returns true if `P` halts and false otherwise. Then build a program `P` that does not halt when `H(P)` is true, giving a contradiction. Similarly, this program `P` halts when `H(P)` is false, also a contradiction.
+
+Uncomputable problems are problems that cannot be solved by an algorithm or a computer, no matter how much time or resources are provided. These problems exist in various forms, and one such example is the Post correspondence problem, which was proposed by Emil Post.
+
+The Post correspondence problem can be described using pairs of strings and an integer. Imagine you have n pairs of strings, called P. These strings are made up of characters from a character set, such as UTF-8 or any other alphabet with at least two symbols. The pairs of strings look like this:
+
+```
+P = { (x1, y1), (x2, y2), … , (xn, yn) }
+```
+
+Now, you also have an integer m that is greater than 0. The Post correspondence problem asks whether there is a way to create a list of indices (i1, i2, …, im) using the given pairs of strings. You can repeat these indices if needed, with one condition: when you combine the x strings from the pairs using the indices, the resulting string must be equal to the combined y strings from the same pairs using the same indices. In other words:
+
+```
+x(i1) x(i2) … x(im) = y(i1) y(i2) … y(im)
+```
+
+When developers try to solve the Post correspondence problem, they often attempt to use indeterminate loops (loops without a fixed number of iterations) rather than recursion. This is because the problem seems to require searching through different combinations of indices until a solution is found or it's proven that no solution exists.
+
+In simple terms, the Post correspondence problem involves trying to find a sequence of indices that, when applied to the given pairs of strings, produces equal concatenated strings from both the x and y components. This problem is considered uncomputable because there is no general algorithm that can solve it for all possible input pairs of strings and integers.
+
+It turns out, many questions about how programs behave are uncomputable. This has a number of consequences for smart contracts that are built in Turing complete languages, many of which we are not aware of yet but will surely become aware of as we encounter them in the future.
+
+### Raymond Smullyan’s Intuition on Undecidability
+
+This is a part of Raymond Smullyan’s approach to understanding undecidability in propositional logic. It uses meta-information to show something must be true, though it cannot be proved in propositional logic. This is based on a paradox.
+
+In propositional logic, a logical statement is undecidable if we cannot prove it true or false. Given a propositional logic statement S, a proof is a sequence of formal logical deductions, starting from basic facts and ending by indicating if S is true or false.
+
+Smullyan starts with an island of Knights and Knaves. Knights always tell the truth. Knaves always lie. We cannot distinguish islanders otherwise.
+
+There is a great logician named Ray. Whatever Ray proves is true. This is just like a good theorem prover.
+
+An islander Jack proclaims: “You cannot prove I am a Knight” to the logician Ray.
+
+The next reasoning is based on meta-knowledge of this situation. This meta-knowledge shows that some problems are undecidable in propositional logic.
+
+If Ray can prove Jack is a Knight, then Jack must be a Knave, since Jack must have lied. That is because Ray proved Jack is a Knight. Since Jack is a Knave, Ray’s proof contradicts the assumption that Ray only proves true things. So, this case cannot hold.
+
+If Ray cannot prove Jack is a Knight, then Jack must be a Knight, since Jack stated the truth. But Ray cannot prove the fact that Jack is a Knight.
+
+In the context of smart contracts and programming languages, Turing complete languages like Solidity come with the possibility of undecidable problems.
+
+These undecidable problems are similar to the paradox presented in the Knights and Knaves story, where it's impossible to determine whether Jack is a Knight or a Knave based on the given information.
+
+In the Knights and Knaves story, Ray is analogous to a theorem prover or a smart contract in a Turing complete language. Ray is faced with a statement that is undecidable within the constraints of the system (Knights and Knaves), which leads to a paradox.
+
+Similarly, a Turing complete smart contract language might face undecidable problems that can't be resolved, leading to unexpected behavior, vulnerabilities, or resource consumption issues (like running out of gas in Ethereum).
+
+On the other hand, non-Turing complete languages like Clarity are designed to avoid undecidable problems by limiting their expressiveness.
+
+In the context of the Knights and Knaves story, a non-Turing complete language would simply not allow Jack to make a statement that could lead to a paradox. By disallowing certain features like unbounded loops and recursion, non-Turing complete languages can provide stronger guarantees about the behavior and resource usage of smart contracts.
+
+This predictability is desirable in many cases, especially when dealing with high-value transactions or critical systems.
+
+### Reference
+
+The Mathematics of Various Entertaining Subjects: Research in Recreational Math Illustrated Edition, Jennifer Beineke (Editor), Jason Rosenhouse (Editor), Raymond M. Smullyan (Foreword), Princeton University Press, 2016.
diff --git a/docs/learn/clarity/overview.md b/docs/learn/clarity/overview.md
new file mode 100644
index 0000000000..ea7c18330a
--- /dev/null
+++ b/docs/learn/clarity/overview.md
@@ -0,0 +1,55 @@
+# Overview
+
+
+
+Clarity is a **decidable** smart contract language that optimizes for predictability and security, designed for the Stacks blockchain. Smart contracts allow developers to encode essential business logic on a blockchain.
+
+The design decisions behind Clarity were based heavily on taking lessons learned in common Solidity exploits and creating a language that has been purpose-built for safety and security in mind.
+
+These docs serve primarily as a reference for the functions and keywords that you can use in Clarity.
+
+In order to learn Clarity, we recommend diving into the [Clarity of Mind](https://book.clarity-lang.org/), an online book to teach you everything you need to know to build robust smart contracts, or joining a [Clarity Camp](https://clarity-lang.org/universe#camp), the cohort-based immersive Clarity experience.
+
+### What makes Clarity different
+
+The following section is an excerpt from the excellent book, [Clarity of Mind](https://book.clarity-lang.org/ch00-00-introduction.html):
+
+The number of smart contract languages grows by the year. Choosing a first language can be challenging, especially for a beginner. The choice is largely dictated by the ecosystem you are interested in, although some languages are applicable to more than just one platform. Each language has its own upsides and downsides and it is out of the scope of this book to look at all of them. Instead, we will focus on what sets Clarity apart and why it is a prime choice if you require the utmost security and transparency.
+
+One of the core precepts of Clarity is that it is secure by design. The design process was guided by examining common pitfalls, mistakes, and vulnerabilities in the field of smart contract engineering as a whole. There are countless real world examples of where developer failure led to the loss or theft of vast amounts of tokens. To name two big ones: an issue that has become known as the Parity bug led to the irreparable loss of millions of dollars worth of Ethereum. Second, the hacking of The DAO (a "Decentralized Autonomous Organization") caused financial damage so great that the Ethereum Foundation decided to issue a contentious hard fork that undid the theft. These and many other mistakes could have been prevented in the design of the language itself.
+
+#### Clarity is interpreted, not compiled
+
+Clarity code is interpreted and committed to the chain exactly as written. Solidity and other languages are compiled to byte-code before it is submitted to the chain. The danger of compiled smart contract languages is two-fold: first, a compiler adds a layer of complexity. A bug in the compiler may lead to different byte-code than was intended and thus carries the risk of introducing a vulnerability. Second, byte-code is not human-readable, which makes it very hard to verify what the smart contract is actually doing. Ask yourself, would you sign a contract you cannot read? If your answer is no, then why should it be any different for smart contracts? With Clarity, what you see is what you get.
+
+#### Clarity is decidable
+
+A decidable language has the property that from the code itself, you can know with certainty what the program will do. This avoids issues like the halting problem. With Clarity you know for sure that given any input, the program will halt in a finite number of steps. In simple terms: it is guaranteed that program execution will end. Decidability also allows for complete static analysis of the call graph so you get an accurate picture of the exact cost before execution. There is no way for a Clarity call to "run out of gas" in the middle of the call. We explore this idea more, along with a discussion on Turing completeness, in the security deep dive on decidability.
+
+#### Clarity does not permit reentrancy
+
+Reentrancy is a situation where one smart contract calls into another, which then calls back into the first contract—the call "re-enters" the same logic. It may allow an attacker to trigger multiple token withdrawals before the contract has had a chance to update its internal balance sheet. Clarity's design considers reentrancy an anti-feature and disallows it on the language level.
+
+#### Clarity guards against overflow and underflows
+
+Overflows and underflows happen when a calculation results in a number that is either too large or too small to be stored, respectively. These events throw smart contracts into disarray and may intentionally be triggered in poorly written contracts by attackers. Usually this leads to a situation where the contract is either frozen or drained of tokens. Overflows and underflows of any kind automatically cause a transaction to be aborted in Clarity.
+
+#### Support for custom tokens is built-in
+
+Issuance of custom fungible and non-fungible tokens is a popular use-case for smart contracts. Custom token features are built into the Clarity language. Developers do not need to worry about creating an internal balance sheet, managing supply, and emitting token events. Creating custom tokens is covered in depth in later chapters.
+
+#### On Stacks, transactions are secured by post conditions
+
+In order to further safeguard user tokens, post conditions can be attached to transactions to assert the chain state has changed in a certain way once the transaction has completed. For example, a user calling into a smart contract may attach a post condition that states that after the call completes, exactly 500 STX should have been transferred from one address to another. If the post condition check fails, then the entire transaction is reverted. Since custom token support is built right into Clarity, post conditions can also be used to guard any other token in the same way.
+
+#### Returned responses cannot be left unchecked
+
+Public contract calls must return a so-called response that indicates success or failure. Any contract that calls another contract is required to properly handle the response. Clarity contracts that fail to do so are invalid and cannot be deployed on the network. Other languages like Solidity permit the use of low level calls without requiring the return value to be checked. For example, a token transfer can fail silently if the developer forgets to check the result. In Clarity it is not possible to ignore errors, although that obviously does prevent buggy error handling on behalf of the developer. Responses and error handling are covered extensively in the chapters on functions and control flow.
+
+#### Composition over inheritance
+
+Clarity adopts a composition over inheritance. It means that Clarity smart contracts do not inherit from one another like you see in languages like Solidity. Developers instead define traits which are then implemented by different smart contracts. It allows contracts to conform to different interfaces with greater flexibility. There is no need to worry about complex class trees and contracts with implicit inherited behavior.
+
+#### Access to the base chain: Bitcoin
+
+Clarity smart contracts can read the state of the Bitcoin base chain. It means you can use Bitcoin transactions as a trigger in your smart contracts! Clarity also features a number of built-in functions to verify secp256k1 signatures and recover keys.
diff --git a/docs/learn/network-fundamentals/README.md b/docs/learn/network-fundamentals/README.md
new file mode 100644
index 0000000000..9cbb5d7a9e
--- /dev/null
+++ b/docs/learn/network-fundamentals/README.md
@@ -0,0 +1,5 @@
+# Network Fundamentals
+
+Now that you have a high-level understanding of what Stacks is and how it works, let's dive into some more details of all of the components that make up the Stacks Bitcoin L2.
+
+We're going to start with the basics of how the network is actually structured and the components that comprise it.
diff --git a/docs/learn/network-fundamentals/accounts.md b/docs/learn/network-fundamentals/accounts.md
new file mode 100644
index 0000000000..e7f908c51b
--- /dev/null
+++ b/docs/learn/network-fundamentals/accounts.md
@@ -0,0 +1,105 @@
+# Accounts
+
+
+
+### Introduction
+
+Stacks uses an accounts-based model, more similar to Ethereum, rather than a [UTXO](https://learnmeabitcoin.com/technical/transaction/utxo/) model like Bitcoin. In a UTXO model, the network operates as a ledger, with each UTXO being analagous to a cash bill.
+
+With an accounts-based model, each account is associated with a balance and that balance can be added to or subtracted from.
+
+Stacks accounts are entities that own assets, like Stacks (STX) tokens. An account has an address, private key, nonce, and one or more asset balances.
+
+{% hint style="info" %}
+The cryptographic signature algorithm used in Stacks is [**secp256k1**](https://en.bitcoinwiki.org/wiki/Secp256k1).
+
+Additionally, [Ed25519](https://ed25519.cr.yp.to/) is also used just for the VRF (Verifiable Random Function).
+{% endhint %}
+
+Assets cannot leave an account without an action from the account owner. All changes to assets (and the balances of the account) require a corresponding transaction.
+
+{% hint style="info" %}
+The transaction type doesn't need to be a token transfer - contract deploy and contract call transactions can change the balances of an account
+{% endhint %}
+
+### Creation
+
+An account is generated from a 24-word mnemonic phrase. This is often referred to as the **seed phrase**. The seed phrase provides access to Stacks accounts.
+
+{% hint style="danger" %}
+If the seed phrase is lost, access to the associated account cannot be restored. No person or organization can recover a lost seed phrase.
+{% endhint %}
+
+The easiest way to generate a new Stacks account is to use the [Stacks CLI](https://github.com/hirosystems/stacks.js/tree/master/packages/cli):
+
+{% code title="Generate a new account (CLI)" %}
+```bash
+# install CLI globally
+npm install --global @stacks/cli
+
+# generate a new account and store details in a new file
+
+# '-t' option makes this a testnet account
+stx make_keychain -t > cli_keychain.json
+```
+{% endcode %}
+
+`make_keychain` creates the following file:
+
+```js
+{
+ "mnemonic": "aaa bbb ccc ddd ...",
+ "keyInfo": {
+ "privateKey": "5a3f1f15245bb3fb...",
+ "address": "STJRM2AMVF90ER6G3RW1QTF85E3HZH37006D5ER1",
+ "btcAddress": "biwSd6KTEvJcyX2R8oyfgj5REuLzczMYC1",
+ "wif": "L4HXn7PLmzoNW...",
+ "index": 0
+ }
+}
+```
+
+{% hint style="info" %}
+Check out the [Stacks CLI reference](https://docs.hiro.so/references/stacks-cli) for more details
+{% endhint %}
+
+| Field | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `mnemonic` | A 24-word seed phrase used to access the account, generated using [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) with 256 bits of entropy |
+| `keyInfo.privateKey` | Private key for the account. Required for token transfers and often referred to as `senderKey` |
+| `keyInfo.address` | Stacks address for the account |
+| `keyInfo.btcAddress` | Corresponding BTC address for the account. |
+| `keyInfo.wif` | Private key of the btcAddress in compressed format. |
+| `keyInfo.index` | Nonce for the account, starting at 0 |
+
+Note that a new account automatically exists for each new private key. There is no need to manually instantiate an account on the Stacks blockchain.
+
+{% hint style="info" %}
+Addresses are created by generating the [RIPEMD-160 hash](https://en.wikipedia.org/wiki/RIPEMD#RIPEMD-160_hashes) of the [SHA256](https://en.bitcoinwiki.org/wiki/SHA-256) of the public key. BTC addresses are encoded with [Base58Check](https://bitcoin.it/wiki/Base58Check_encoding). For Stacks addresses, [c32check](https://github.com/stacks-network/c32check) is used. Deriving an address from a public key can be done without internet access, for instance using the c32check `c32addressDecode` method.
+{% endhint %}
+
+Alternatively to the CLI creation, the [Stacks Transactions JS](https://github.com/hirosystems/stacks.js/tree/master/packages/transactions) library can be used:
+
+{% code title="Generate a private key & derive address (transactions library)" %}
+```js
+import {
+ makeRandomPrivKey,
+ privateKeyToString,
+ getAddressFromPrivateKey,
+ TransactionVersion,
+ getPublicKey,
+} from "@stacks/transactions";
+
+const privateKey = makeRandomPrivKey();
+
+// Get public key from private
+const publicKey = getPublicKey(privateKey);
+
+const stacksAddress = getAddressFromPrivateKey(
+ privateKeyToString(privateKey),
+ TransactionVersion.Testnet // remove for Mainnet addresses
+);
+```
+{% endcode %}
+
+Finally, you can generate new account using a Stacks-enabled wallet like [Leather](https://leather.io/), [Xverse](https://www.xverse.app/), or [Asigna](https://asigna.io/).
diff --git a/docs/learn/network-fundamentals/authentication.md b/docs/learn/network-fundamentals/authentication.md
new file mode 100644
index 0000000000..9b60949a6c
--- /dev/null
+++ b/docs/learn/network-fundamentals/authentication.md
@@ -0,0 +1,103 @@
+# Authentication
+
+
+
+### Introduction
+
+This guide explains how authentication is performed on the Stacks blockchain.
+
+Authentication provides a way for users to identify themselves to an app while retaining complete control over their credentials and personal details.
+
+Users who register for your app can subsequently authenticate to any other app with support for the [Bitcoin Name System](bitcoin-name-system.md) and vice versa.
+
+### Web2 vs Web3 Authentication
+
+If you come from the web2 world, you are likely used to authenticating with usernames and passwords, where the user's info is stored in a database. Upon entering the password, it is hashed and compared to the hash stored in the database and, if it matches, the user is logged in.
+
+Web3 authentication works a bit differently. One of the core philosophies of web3 is data ownership, which means users are in control of their data, including their authentication.
+
+Authentication in the Bitcoin and Stacks world makes use of cryptography to generate private keys, public keys and addresses.
+
+We'll go over the basics here, but if you want to dig in, [Learn Me a Bitcoin](https://learnmeabitcoin.com/beginners/guide/keys-addresses/) is a great place to start.
+
+To generate a Stacks account, we generate a private key from a 24 word mnemonic phrase, as discussed in the previous section. This private key is then used to generate a public key using a one-way hash function. Meaning you can derive a public key from a private key, but not vice versa.
+
+A user's private key is their main source of security and is used to authenticate them. Do not lose your private key.
+
+So, when I use a wallet app like [Leather](https://leather.io/) and I want to use it to authenticate with a dapp like StackingDAO, what I am doing is that I am giving my wallet my private key, proving that I own the corresponding address.
+
+The wallet will then pass that information (my address and public key) to the app along with a signature.
+
+A signature can be thought of as proof that I own the private key without actually revealing the private key. That mechanism is how I can use the same wallet and address to log in to any app that supports Stacks authentication.
+
+Third Web has a great [conceptual primer](https://blog.thirdweb.com/web3-auth/) on web3 authentication.
+
+For a more practical introduction, take a look at the [Quickstart tutorial ](https://app.gitbook.com/o/hoh4mQXTl8NvI3cETroY/s/Zz9BLmTU9oydDpL3qiUh/)and [Hiro's Stacks.js docs](https://docs.hiro.so/stacks/connect/guides/authenticate-users).
+
+### How it works
+
+The authentication flow with Stacks is similar to the typical client-server flow used by centralized sign in services (for example, OAuth). However, with Stacks the authentication flow happens entirely client-side.
+
+{% hint style="info" %}
+This explanation is here so you can understand how this process works, but the bulk of this functionality is handled by the wallet and the JS library you use. Take a look at the [Stacks.js docs](https://docs.hiro.so/stacks/stacks.js/concepts/accounts-and-addresses) for more info.
+{% endhint %}
+
+An app and authenticator, such as the [Leather wallet](https://leather.io/), communicate during the authentication flow by passing back and forth two tokens. The requesting app sends the authenticator an `authRequest` token. Once a user approves authentication, the authenticator responds to the app with an `authResponse` token.
+
+These tokens are based on [a JSON Web Token (JWT) standard](https://tools.ietf.org/html/rfc7519) with additional support for the `secp256k1` curve used by Bitcoin and many other cryptocurrencies. They are passed via URL query strings.
+
+When a user chooses to authenticate an app, it sends the `authRequest` token to the authenticator via a URL query string with an equally named parameter:
+
+`https://wallet.hiro.so/...?authRequest=j902120cn829n1jnvoa...`
+
+When the authenticator receives the request, it generates an `authResponse` token for the app using an ephemeral transit key. The ephemeral transit key is just used for the particular instance of the app, in this case, to sign the `authRequest`.
+
+The app stores the ephemeral transit key during request generation. The public portion of the transit key is passed in the `authRequest` token. The authenticator uses the public portion of the key to encrypt an app private key which is returned via the `authResponse`.
+
+The authenticator generates the app private key from the user's identity address private key and the app's domain. The app private key serves three functions:
+
+{% stepper %}
+{% step %}
+### It is used to create credentials that give the app access to a storage bucket in the user's Gaia hub
+
+This allows the app to access the user's app-specific storage in their Gaia hub.
+{% endstep %}
+
+{% step %}
+### It is used in the end-to-end encryption of files stored for the app in the user's Gaia storage
+
+This key is used to encrypt files so only the app (with the derived key) can decrypt them.
+{% endstep %}
+
+{% step %}
+### It serves as a cryptographic secret that apps can use to perform other cryptographic functions
+
+Apps can use this deterministic secret for additional cryptographic operations tied to the user's identity and domain.
+{% endstep %}
+{% endstepper %}
+
+Finally, the app private key is deterministic, meaning that the same private key will always be generated for a given Stacks address and domain.
+
+### Key pairs
+
+Authentication with Stacks makes extensive use of public key cryptography generally and ECDSA with the `secp256k1` curve in particular.
+
+The following sections describe the three public-private key pairs used, including how they're generated, where they're used and to whom private keys are disclosed.
+
+#### Transit private key
+
+The transit private key is an ephemeral key that is used to encrypt secrets that need to be passed from the authenticator to the app during the authentication process. It is randomly generated by the app at the beginning of the authentication response.
+
+The public key that corresponds to the transit private key is stored in a single element array in the `public_keys` key of the authentication request token. The authenticator encrypts secret data such as the app private key using this public key and sends it back to the app when the user signs in to the app. The transit private key signs the app authentication request.
+
+#### Identity address private key
+
+The identity address private key is derived from the user's keychain phrase and is the private key of the Stacks username that the user chooses to use to sign in to the app. It is a secret owned by the user and never leaves the user's instance of the authenticator.
+
+This private key signs the authentication response token for an app to indicate that the user approves sign in to that app.
+
+#### App private key
+
+The app private key is an app-specific private key that is generated from the user's identity address private key using the `domain_name` as input.
+
+The app private key is securely shared with the app on each authentication, encrypted by the authenticator with the transit public key. Because the transit key is only stored on the client side, this prevents a man-in-the-middle attack where a server or internet provider could potentially snoop on the app private key.
diff --git a/docs/learn/network-fundamentals/bitcoin-name-system.md b/docs/learn/network-fundamentals/bitcoin-name-system.md
new file mode 100644
index 0000000000..e7d33aeda5
--- /dev/null
+++ b/docs/learn/network-fundamentals/bitcoin-name-system.md
@@ -0,0 +1,210 @@
+# Bitcoin Name System
+
+
+
+Bitcoin Name System (BNS) is a network system that binds Stacks usernames to off-chain state without relying on any central points of control.
+
+The Stacks V1 blockchain implemented BNS through first-order name operations. In Stacks V2, BNS is instead implemented through a smart-contract loaded during the genesis block.
+
+Names in BNS have three properties:
+
+* **Names are globally unique.** The protocol does not allow name collisions, and all well-behaved nodes resolve a given name to the same state.
+* **Names are human-meaningful.** Each name is chosen by its creator.
+* **Names are strongly owned.** Only the name's owner can change the state it resolves to. Specifically, a name is owned by one or more ECDSA private keys.
+
+The Stacks blockchain ensures that each node's BNS view is synchronized to all of the other nodes in the world, so queries on one node will be the same on other nodes. Stacks blockchain nodes allow a name's owner to bind up to 40Kb of off-chain state to their name, which will be replicated to all other Stacks blockchain nodes via a P2P network.
+
+The biggest consequence for developers is that in BNS, reading name state is fast and cheap but writing name state is slow and expensive. This is because registering and modifying names requires one or more transactions to be sent to the underlying blockchain, and BNS nodes will not process them until they are sufficiently confirmed. Users and developers need to acquire and spend the requisite cryptocurrency (STX) to send BNS transactions.
+
+### Motivation behind name systems
+
+We rely on name systems in everyday life, and they play a critical role in many different applications. For example, when you look up a friend on social media, you are using the platform's name system to resolve their name to their profile. When you look up a website, you are using the Domain Name Service to resolve the hostname to its host's IP address. When you check out a Git branch, you are using your Git client to resolve the branch name to a commit hash. When you look up someone's PGP key on a keyserver, you are resolving their key ID to their public key.
+
+What kinds of things do we want to be true about names? In BNS, names are globally unique, names are human-meaningful, and names are strongly owned. However, if you look at these examples, you'll see that each of them only guarantees two of these properties. This limits how useful they can be.
+
+* In DNS and social media, names are globally unique and human-readable, but not strongly owned. The system operator has the final say as to what each name resolves to.
+ * Problem: Clients must trust the system to make the right choice in what a given name resolves to. This includes trusting that no one but the system administrators can make these changes.
+* In Git, branch names are human-meaningful and strongly owned, but not globally unique. Two different Git nodes may resolve the same branch name to different unrelated repository states.
+ * Problem: Since names can refer to conflicting state, developers have to figure out some other mechanism to resolve ambiguities.
+* In PGP, names are key IDs. They are globally unique and cryptographically owned, but not human-readable. PGP key IDs are derived from the keys they reference.
+ * Problem: These names are difficult for most users to remember since they do not carry semantic information relating to their use in the system.
+
+BNS names have all three properties, and none of these problems. This makes it a powerful tool for building all kinds of network applications. With BNS, we can do the following and more:
+
+* Build domain name services where hostnames can't be hijacked.
+* Build social media platforms where user names can't be stolen by phishers.
+* Build version control systems where repository branches do not conflict.
+* Build public-key infrastructure where it's easy for users to discover and remember each other's keys.
+
+### Organization of BNS
+
+BNS names are organized into a global name hierarchy. There are three different layers in this hierarchy related to naming:
+
+* **Namespaces.** These are the top-level names in the hierarchy. An analogy to BNS namespaces are DNS top-level domains. Existing BNS namespaces include `.id`, `.podcast`, and `.helloworld`. All other names belong to exactly one namespace. Anyone can create a namespace, but in order for the namespace to be persisted, it must be _launched_ so that anyone can register names in it. Namespaces are not owned by their creators.
+* **BNS names.** These are names whose records are stored directly on the blockchain. The ownership and state of these names are controlled by sending blockchain transactions. Example names include `verified.podcast` and `muneeb.id`. Anyone can create a BNS name, as long as the namespace that contains it exists already.
+* **BNS subdomains.** These are names whose records are stored off-chain, but are collectively anchored to the blockchain. The ownership and state for these names lives within the P2P network data. While BNS subdomains are owned by separate private keys, a BNS name owner must broadcast their subdomain state. Example subdomains include `jude.personal.id` and `podsaveamerica.verified.podcast`. Unlike BNS namespaces and names, the state of BNS subdomains is _not_ part of the blockchain consensus rules.
+
+A feature comparison matrix summarizing the similarities and differences between these name objects:
+
+| Feature | **Namespaces** | **BNS names** | **BNS Subdomains** |
+| -------------------------------------- | -------------- | ------------- | ------------------ |
+| Globally unique | X | X | X |
+| Human-meaningful | X | X | X |
+| Owned by a private key | | X | X |
+| Anyone can create | X | X | \[1] |
+| Owner can update | | X | \[1] |
+| State hosted on-chain | X | X | |
+| State hosted off-chain | | X | X |
+| Behavior controlled by consensus rules | X | X | |
+| May have an expiration date | | X | |
+
+\[1] Requires the cooperation of a BNS name owner to broadcast its transactions
+
+### Namespaces
+
+Namespaces are the top-level name objects in BNS. They control a few properties about the names within them:
+
+* How expensive they are to register
+* How long they last before they have to be renewed
+* Who (if anyone) receives the name registration fees
+* Who is allowed to seed the namespace with its initial names
+
+At the time of this writing, by far the largest BNS namespace is the `.id` namespace. Names in the `.id` namespace are meant for resolving user identities. Short names in `.id` are more expensive than long names, and have to be renewed by their owners every two years. Name registration fees are not paid to anyone in particular—they are instead sent to a "black hole" where they are rendered non-spendable (the intention is to discourage ID squatters).
+
+Unlike DNS, anyone can create a namespace and set its properties. Namespaces are created on a first-come first-serve basis, and once created, they last forever.
+
+However, creating a namespace is not free. The namespace creator must burn cryptocurrency to do so. The shorter the namespace, the more cryptocurrency must be burned (that is, short namespaces are more valuable than long namespaces). For example, it cost Blockstack PBC 40 BTC to create the `.id` namespace in 2015 (in transaction `5f00b8e609821edd6f3369ee4ee86e03ea34b890e242236cdb66ef6c9c6a1b281`).
+
+Namespaces can be between 1 and 19 characters long, and are composed of the characters `a-z`, `0-9`, `-`, and `_`.
+
+### Subdomains
+
+BNS names are strongly owned because the owner of its private key can generate valid transactions that update its zone file hash and owner. However, this comes at the cost of requiring a name owner to pay for the underlying transaction in the blockchain. Moreover, this approach limits the rate of BNS name registrations and operations to the underlying blockchain's transaction bandwidth.
+
+BNS overcomes this with subdomains. A **BNS subdomain** is a type of BNS name whose state and owner are stored outside of the blockchain, but whose existence and operation history are anchored to the blockchain. Like their on-chain counterparts, subdomains are globally unique, strongly owned, and human-readable. BNS gives them their own name state and public keys. Unlike on-chain names, subdomains can be created and managed cheaply, because they are broadcast to the BNS network in batches. A single blockchain transaction can send up to 120 subdomain operations.
+
+This is achieved by storing subdomain records in the BNS name zone files. An on-chain name owner broadcasts subdomain operations by encoding them as `TXT` records within a DNS zone file. To broadcast the zone file, the name owner sets the new zone file hash with a `NAME_UPDATE` transaction and replicates the zone file. This, in turn, replicates all subdomain operations it contains, and anchors the set of subdomain operations to an on-chain transaction. The BNS node's consensus rules ensure that only valid subdomain operations from valid `NAME_UPDATE` transactions will ever be stored.
+
+For example, the name `verified.podcast` once wrote the zone file hash `247121450ca0e9af45e85a82e61cd525cd7ba023`, which is the hash of the following zone file:
+
+```bash
+$TTL 3600
+1yeardaily TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAxeWVhcmRhaWx5CiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vMXllYXJkYWlseS9oZWFkLmpzb24iCg=="
+2dopequeens TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAyZG9wZXF1ZWVucwokVFRMIDM2MDAKX2h0dHAuX3RjcCBVUkkgMTAgMSAiaHR0cHM6Ly9waC5kb3Rwb2RjYXN0LmNvLzJkb3BlcXVlZW5zL2hlYWQuanNvbiIK"
+10happier TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAxMGhhcHBpZXIKJFRUTCAzNjAwCl9odHRwLl90Y3AgVVJJIDEwIDEgImh0dHBzOi8vcGguZG90cG9kY2FzdC5jby8xMGhhcHBpZXIvaGVhZC5qc29uIgo="
+31thoughts TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAzMXRob3VnaHRzCiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vMzF0aG91Z2h0cy9oZWFkLmpzb24iCg=="
+359 TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAzNTkKJFRUTCAzNjAwCl9odHRwLl90Y3AgVVJJIDEwIDEgImh0dHBzOi8vcGguZG90cG9kY2FzdC5jby8zNTkvaGVhZC5qc29uIgo="
+30for30 TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAzMGZvcjMwCiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vMzBmb3IzMC9oZWFkLmpzb24iCg=="
+onea TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiBvbmVhCiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vb25lYS9oZWFkLmpzb24iCg=="
+10minuteteacher TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAxMG1pbnV0ZXRlYWNoZXIKJFRUTCAzNjAwCl9odHRwLl90Y3AgVVJJIDEwIDEgImh0dHBzOi8vcGguZG90cG9kY2FzdC5jby8xMG1pbnV0ZXRlYWNoZXIvaGVhZC5qc29uIgo="
+36questionsthepodcastmusical TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAzNnF1ZXN0aW9uc3RoZXBvZGNhc3RtdXNpY2FsCiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vMzZxdWVzdGlvbnN0aGVwb2RjYXN0bXVzaWNhbC9oZWFkLmpzb24iCg=="
+_http._tcp URI 10 1 "https://dotpodcast.co/"
+```
+
+Each `TXT` record in this zone file encodes a subdomain-creation. For example, `1yeardaily.verified.podcast` resolves to:
+
+```json
+{
+ "address": "1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH",
+ "blockchain": "bitcoin",
+ "last_txid": "d87a22ebab3455b7399bfef8a41791935f94bc97aee55967edd5a87f22cce339",
+ "status": "registered_subdomain",
+ "zonefile_hash": "e7acc97fd42c48ed94fd4d41f674eddbee5557e3",
+ "zonefile_txt": "$ORIGIN 1yeardaily\n$TTL 3600\n_http._tcp URI 10 1 \"https://ph.dotpodcast.co/1yeardaily/head.json\"\n"
+}
+```
+
+This information was extracted from the `1yeardaily` `TXT` resource record in the zone file for `verified.podcast`.
+
+Subdomain lifecycle
+
+{% stepper %}
+{% step %}
+### Creation
+
+A subdomain-creation operation is created by the subdomain owner and encoded into a `TXT` record in an on-chain name owner's zone file. The on-chain name owner broadcasts the zone file by issuing a `NAME_UPDATE` transaction, which anchors the subdomain-creation on-chain.
+{% endstep %}
+
+{% step %}
+### Update
+
+Subdomain updates are done off-chain by creating signed operations from the subdomain owner's private key. Any on-chain name owner can include these signed operations in their zone file and broadcast via `NAME_UPDATE`. Operations are ordered by a sequence number and require a valid signature that links to the previous operation's public key.
+{% endstep %}
+
+{% step %}
+### Transfer
+
+To change the address (public key hash) owning a subdomain, the subdomain owner signs a subdomain-transfer operation and asks an on-chain name owner (typically the one who created the subdomain) to broadcast it via `NAME_UPDATE`. The broadcasting on-chain name owner's zone file must be present in the Atlas network to prove absence of conflicting operations.
+{% endstep %}
+{% endstepper %}
+
+Sequence and validation rules
+
+* Subdomain operations are ordered by sequence number, starting at 0. Each new operation must include:
+ * The next sequence number
+ * The public key that hashes to the previous subdomain transaction's address
+ * A signature from the corresponding private key over the entire subdomain operation
+* If two correctly signed but conflicting operations have the same sequence number, the one earlier in blockchain history is accepted. Invalid operations are ignored.
+
+Subdomain creation and management rules
+
+* A subdomain-creation transaction can only be processed by the owner of the on-chain name that shares its suffix (e.g., only the owner of `res_publica.id` can broadcast creations for `*.res_publica.id`).
+* A subdomain-transfer transaction can only be broadcast by the owner of the on-chain name that created it.
+* To send a subdomain-creation or subdomain-transfer, all of an on-chain name owner's zone files must be present in the Atlas network. This allows proving the absence of conflicting operations.
+* A subdomain update can be broadcast by any on-chain name owner, but the subdomain owner needs to find a cooperating on-chain name owner to include and broadcast it.
+
+To create a subdomain, the subdomain owner generates the creation operation and gives it to the on-chain name owner. Once created, the subdomain owner can use any on-chain name owner to broadcast updates by providing signed operations packaged into zone files.
+
+Subdomain registrars
+
+Because subdomain names are cheap, developers may run subdomain registrars for their applications. For example, the name `personal.id` is used to register usernames without requiring users to spend Bitcoin.
+
+A reference implementation is available: https://github.com/stacks-network/subdomain-registrar. Users still own their subdomain names; the registrar helps developers broadcast subdomain operations.
+
+### BNS and DID Standards
+
+BNS names are compliant with the emerging Decentralized Identity Foundation (DIF) protocol specification for decentralized identifiers (DIDs): http://identity.foundation
+
+Each name in BNS has an associated DID. The DID format for BNS is:
+
+```bash
+did:stack:v0:{address}-{index}
+```
+
+Where:
+
+* `{address}` is an on-chain public key hash (for example a Bitcoin address).
+* `{index}` refers to the `nth` name this address created.
+
+Examples:
+
+* `personal.id` → `did:stack:v0:1dARRtzHPAFRNE7Yup2Md9w18XEQAtLiV-0` (first name created by that address)
+* `jude.id` → `did:stack:v0:16EMaNw3pkn3v6f2BgnSSs53zAKH4Q8YJg-1` (the address had created one earlier name before this one)
+
+Purpose: a DID provides an eternal identifier for a public key. The public key may change, but the DID will not.
+
+For a DID to be resolvable, all of the following must be true for a name:
+
+* The name must exist
+* The name's zone file hash must be the hash of a well-formed DNS zone file
+* The DNS zone file must be present in the Stacks node's data
+* The DNS zone file must contain a `URI` resource record that points to a signed JSON Web Token
+* The public key that signed the JSON Web Token (and is included with it) must hash to the address that owns the name
+
+Not all names will have DIDs that resolve to public keys. Names created by standard tooling will have DIDs that do.
+
+A RESTful API is under development.
+
+### DID Encoding for Subdomains
+
+Every name and subdomain in BNS has a DID. Encoding differs so software can determine which code-path to take.
+
+* For on-chain BNS names, the `{address}` is the same as the Bitcoin address that owns the name. Currently, both version byte 0 and version byte 5 addresses are supported (addresses starting with `1` or `3`, meaning `p2pkh` and `p2sh` addresses).
+* For off-chain BNS subdomains, the `{address}` has version byte 63 for subdomains owned by a single private key, and version byte 50 for subdomains owned by an m-of-n set of private keys. That is, subdomain DID addresses start with `S` or `M`, respectively.
+
+The `{index}` field for a subdomain's DID is distinct from the `{index}` field for a BNS name's DID, even if the same address created both names and subdomains. Example:
+
+* The name `abcdefgh123456.id` → `did:stack:v0:16EMaNw3pkn3v6f2BgnSSs53zAKH4Q8YJg-0` (first name created by that address)
+* The subdomain `jude.statism.id` created by the same address → `did:stack:v0:SSXMcDiCZ7yFSQSUj7mWzmDcdwYhq97p2i-0`
+
+Note: The address `SSXMcDiCZ7yFSQSUj7mWzmDcdwYhq97p2i` encodes the same public key hash as `16EMaNw3pkn3v6f2BgnSSs53zAKH4Q8YJg`—the difference is base58check version byte (63 vs 0).
diff --git a/docs/learn/network-fundamentals/mainnet-and-testnets.md b/docs/learn/network-fundamentals/mainnet-and-testnets.md
new file mode 100644
index 0000000000..0753ce0395
--- /dev/null
+++ b/docs/learn/network-fundamentals/mainnet-and-testnets.md
@@ -0,0 +1,64 @@
+# Mainnet and Testnets
+
+
+
+Stacks has both a mainnet and a few different testnets for different purposes. Mainnet and testnet are two completely different networks and tokens cannot be transferred between one or the other.
+
+### Mainnet
+
+Stacks mainnet is directly connected to Bitcoin mainnet and is the network where tokens have actual monetary worth. This is the production network and should be treated as such.
+
+You can view mainnet activity using [Hiro's block explorer](https://explorer.hiro.so/).
+
+### Primary and Nakamoto Testnets
+
+There are some notable differences between Primary Testnet and Nakamoto Testnet; this table can guide you in selecting the one most aligned with your needs.
+
+
Attributes
Nakamoto Testnet
Primary Testnet
Stacking Cycle Length
3 days
1 week
Description
Bleeding edge, more frequent upgrades with Release Candidates.
Stable release updates ONLY, the last step before Mainnet.
Usage Recommendations
Use this if you don’t mind frequent resets and would like to test the latest features as they’re released
Use this if you prefer faster feedback loops to test various stacking-signer scenarios
Use this if you prefer more stable releases and don’t want frequent resets and updates
Use this if you don't need to be among the first to test new features
Use this if you prefer longer Stacking cycles
Lifespan
Nakamoto Testnet will remain available until sBTC goes live on Mainnet
The Primary Testnet will exist and be maintained forever.
+
+### Important notes on the Primary Testnet
+
+* Core devs are working on a BTC Regtest Explorer. In the meantime, Wallet, Explorer, and API links to BTC transactions will lead you nowhere. This is expected and will be addressed. All STX transactions are available to track on the [Explorer](https://explorer.hiro.so/?chain=testnet).
+* You can start onboarding your Signer, deploy contracts and test your Apps. All functionality from the previous testnet is available.
+* Old testnet data is archived and will remain [available](https://explorer.hiro.so/?chain=testnet\&api=https://api.old.testnet.hiro.so) until the end of June 2024
+* Faucet and tSTX:
+ * The [Faucet address](https://explorer.hiro.so/address/ST2QKZ4FKHAH1NQKYKYAYZPY440FEPK7GZ1R5HBP2?chain=testnet) and limits stay the same.
+ * If you need more tSTX than the current daily limit to onboard your Signer on Primary Testnet, please reach out to your main point of contact in the ecosystem.
+
+### About Testnet
+
+The testnet is a separate blockchain from the Stacks mainnet analogous to a staging environnement. It's a network used by developers to test their apps, smart contracts, or changes to the protocol in a production-like environment.
+
+It produces blocks at roughly the same rate as mainnet; about 1 block every 10 minutes on average. The Stacks testnet is rarely reset.
+
+#### Faucets
+
+Testnet faucets provide you with free Stacks Token (STX) to test with. These are not the same as STX on mainnet and have no value. There are a couple of different options for getting testnet STX.
+
+{% tabs %}
+{% tab title="Hiro" %}
+You can get STX from the Hiro faucet on the [Hiro Explorer Sandbox](https://explorer.hiro.so/sandbox/faucet?chain=testnet), or using the [API](https://docs.hiro.so/api#tag/Faucets).
+
+To get STX tokens from within the Explorer Sandbox, navigate to the "Faucet" tab on the left and click "Request STX" button.
+
+You can also try out Stacking by clicking on `I want to stack`.
+
+{% hint style="info" %}
+The Explorer Sandbox requires you to login with a Stacks wallet
+{% endhint %}
+{% endtab %}
+
+{% tab title="LearnWeb3" %}
+Alternatively, you can use the [LearnWeb3 faucet](https://learnweb3.io/faucets).
+
+
+{% endtab %}
+{% endtabs %}
+
+#### Testnet API
+
+The hosted Stacks Blockchain API for the testnet is available at this base URL:
+
+```shell
+https://api.testnet.hiro.so/
+```
diff --git a/docs/learn/network-fundamentals/network-basics.md b/docs/learn/network-fundamentals/network-basics.md
new file mode 100644
index 0000000000..449266d54b
--- /dev/null
+++ b/docs/learn/network-fundamentals/network-basics.md
@@ -0,0 +1,97 @@
+# Network Basics
+
+
+
+### Tokens
+
+Stacks (STX) tokens are the native tokens on the Stacks blockchain. The smallest fraction is one micro-STX. 1,000,000 micro-STX make one Stacks (STX).
+
+STX amounts should be stored as integers (8 bytes long), and represent the amount of micro-STX.
+
+### Fees
+
+Fees are used to incentivize miners to confirm transactions on the Stacks blockchain. The fee is calculated based on the estimate fee rate and the size of the raw transaction in bytes. The fee rate is a market determined variable. For the testnet, it is set to 1 micro-STX.
+
+Fee estimates can obtained through the [`GET /v2/fees/transfer`](https://docs.hiro.so/api#operation/get_fee_transfer) endpoint of the API.
+
+{% hint style="info" %}
+Note that this example uses an external tool, [Hiro's Stacks API](https://www.hiro.so/stacks-api). You can also use the native [Stacks API ](https://app.gitbook.com/u/ZrQItu6D9bMKmf1HfsLTnGc05WZ2)if you would rather run your own node or connect to one.
+{% endhint %}
+
+{% code title="terminal" %}
+```bash
+# for mainnet, replace `testnet` with `mainnet`
+curl 'https://api.testnet.hiro.so/v2/fees/transfer'
+```
+{% endcode %}
+
+The API will respond with the fee rate (as integer):
+
+```json
+1
+```
+
+[The Stacks Transactions JS library](https://github.com/hirosystems/stacks.js/tree/master/packages/transactions) supports fee estimation for:
+
+* token transfers (`estimateTransfer`)
+* contract deploys (`estimateContractDeploy`)
+* non read-only contract calls (`estimateContractFunctionCall`)
+
+{% hint style="info" %}
+For an implementation using a different language than JavaScript, please review [this reference implementation](https://github.com/hirosystems/stacks.js/blob/master/packages/transactions/src/builders.ts#L97).
+{% endhint %}
+
+### Nonces
+
+Every account carries a [nonce property](https://en.wikipedia.org/wiki/Cryptographic_nonce) that indicates the number of transactions processed for the given account. Nonces are one-time codes, starting at `0` for new accounts, and incremented by 1 on every transaction.
+
+Nonces are added to all transactions and help identify them in order to ensure transactions are processed in order and to avoid duplicated processing.
+
+{% hint style="info" %}
+The consensus mechanism also ensures that transactions aren't "replayed" in two ways. First, nodes query its unspent transaction outputs (UTXOs) in order to satisfy their spending conditions in a new transaction. Second, messages sent between nodes review sequence numbers.
+{% endhint %}
+
+When a new token transfer transaction is constructed, the most recent nonce of the account needs to be fetched and set.
+
+{% hint style="info" %}
+The API provides an endpoint to [simplify nonce handling](https://docs.hiro.so/get-started/stacks-blockchain-api#nonce-handling).
+{% endhint %}
+
+### Querying
+
+Stacks network details can be queried using the [Stacks Blockchain API](https://docs.hiro.so/get-started/stacks-blockchain-api).
+
+#### Health check
+
+The [status checker](https://status.stacks.org/) is a service that provides a user interface to quickly review the health of the Stacks blockchain.
+
+#### Network info
+
+The network information can be obtained using the [`GET /v2/info`](https://docs.hiro.so/api#operation/get_core_api_info) endpoint:
+
+{% code title="curl (testnet)" %}
+```bash
+# for mainnet, replace `testnet` with `mainnet`
+curl 'https://api.testnet.hiro.so/v2/info'
+```
+{% endcode %}
+
+Sample response:
+
+```js
+{
+ "peer_version": 385875968,
+ "burn_consensus": "826401d65cf3671210a3fb135d827d549c0b4d37",
+ "burn_block_height": 1972,
+ "stable_burn_consensus": "e27ea23f199076bc41a729d76a813e125b725f64",
+ "stable_burn_block_height": 1971,
+ "server_version": "blockstack-core 0.0.1 => 23.0.0.0 (master:bdd042242+, release build, linux [x86_64]",
+ "network_id": 2147483648,
+ "parent_network_id": 3669344250,
+ "stacks_tip_height": 933,
+ "stacks_tip": "1f601823fbcc5b6b2215b2ff59d2818fba61ee4a3cea426d8bc3dbb268005d8f",
+ "stacks_tip_burn_block": "54c56a9685545c45accf42b5dcb2787c97eda8185a1c794daf9b5a59d4807abc",
+ "unanchored_tip": "71948ee211dac3b241eb65d881637f649d0d49ac08ee4a41c29217d3026d7aae",
+ "exit_at_block_height": 28160
+}
+```
diff --git a/docs/learn/network-fundamentals/sips.md b/docs/learn/network-fundamentals/sips.md
new file mode 100644
index 0000000000..3c36e99eae
--- /dev/null
+++ b/docs/learn/network-fundamentals/sips.md
@@ -0,0 +1,56 @@
+# SIPs
+
+
+
+### Stacks Improvement Proposals (SIPs)
+
+Stacks improvement proposals (SIPs) are aimed at describing the implementation of the Stacks blockchain, as well as proposing improvements.
+
+The SIP process [(SIP-000)](https://github.com/stacksgov/sips/blob/main/sips/sip-000/sip-000-stacks-improvement-proposal-process.md) describes how to make a SIP and get it ratified.
+
+They should contain concise technical specifications of features or standards and the rationale behind it. SIPs are intended to be the primary medium for proposing new features, for collecting community input on a system-wide issue, and for documenting design decisions.
+
+The SIPs are located in the [stacksgov/sips](https://github.com/stacksgov/sips) repository as part of the [Stacks Community Governance organization](https://github.com/stacksgov).
+
+Anyone in the Stacks community can submit a SIP.
+
+{% hint style="info" %}
+Stacks Improvement Proposals Community Calls Add the [weekly community SIP call](https://www.addevent.com/event/wS15955379) to your calendar.
+
+SIP Meeting calls are recorded and available [here](https://www.youtube.com/playlist?list=PLg717Ri_rTnx5kuaWqp3cUAtwQk_yzslT)
+
+More details of the meetings are available [here](https://github.com/stacksgov/sips/issues/79)
+{% endhint %}
+
+### Ratified SIPSs
+
+* [x] [SIP 000: Improvement Proposal Process](https://github.com/stacksgov/sips/blob/main/sips/sip-000/sip-000-stacks-improvement-proposal-process.md)
+* [x] [SIP 001: Burn Election](https://github.com/stacksgov/sips/blob/main/sips/sip-001/sip-001-burn-election.md)
+* [x] [SIP 002: Clarity, a language for predictable smart contracts](https://github.com/stacksgov/sips/blob/main/sips/sip-002/sip-002-smart-contract-language.md)
+* [x] [SIP 003: Peer Network](https://github.com/stacksgov/sips/blob/main/sips/sip-003/sip-003-peer-network.md)
+* [x] [SIP 004: Cryptographic Commitment to Materialized Views](https://github.com/stacksgov/sips/blob/main/sips/sip-004/sip-004-materialized-view.md)
+* [x] [SIP 005: Blocks, Transactions, and Accounts](https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md)
+* [x] [SIP 006: Clarity Execution Cost Assessment](https://github.com/stacksgov/sips/blob/main/sips/sip-006/sip-006-runtime-cost-assessment.md)
+* [x] [SIP 007: Stacking Consensus](https://github.com/stacksgov/sips/blob/main/sips/sip-007/sip-007-stacking-consensus.md)
+* [x] [SIP 008: Clarity Parsing and Analysis Cost Assessment](https://github.com/stacksgov/sips/blob/main/sips/sip-008/sip-008-analysis-cost-assessment.md)
+* [x] [SIP 009: Standard Trait Definition for Non-Fungible Tokens](https://github.com/stacksgov/sips/blob/main/sips/sip-009/sip-009-nft-standard.md)
+* [x] [SIP 010: Standard Trait Definition for Fungible Tokens](https://github.com/stacksgov/sips/blob/main/sips/sip-010/sip-010-fungible-token-standard.md)
+* [x] [SIP 012: Burn Height Selection for a Network Upgrade to Introduce New Cost-Limits](https://github.com/stacksgov/sips/blob/main/sips/sip-012/sip-012-cost-limits-network-upgrade.md)
+* [x] [SIP 013: Standard Trait Definition for Semi-Fungible Tokens](https://github.com/stacksgov/sips/blob/main/sips/sip-013/sip-013-semi-fungible-token-standard.md)
+* [x] [SIP-015: Stacks Upgrade of Proof-of-Transfer and Clarity](https://github.com/stacksgov/sips/blob/main/sips/sip-015/sip-015-network-upgrade.md)
+* [x] [SIP-016: Metadata for Tokens](https://github.com/stacksgov/sips/blob/main/sips/sip-016/sip-016-token-metadata.md)
+* [x] [SIP-018: Signed Structured Data](https://github.com/stacksgov/sips/blob/main/sips/sip-018/sip-018-signed-structured-data.md)
+* [x] [SIP-019: Notifications for Token Metadata Updates](https://github.com/stacksgov/sips/blob/main/sips/sip-019/sip-019-token-metadata-update-notifications.md)
+* [x] [SIP-020: Bitwise Operations in Clarity](https://github.com/stacksgov/sips/blob/main/sips/sip-020/sip-020-bitwise-ops.md)
+* [x] [SIP-022: Emergency Fix to PoX Stacking Increases](https://github.com/stacksgov/sips/blob/main/sips/sip-022/sip-022-emergency-pox-fix.md)
+* [x] [SIP-023: Emergency Fix to Trait Invocation Behavior](https://github.com/stacksgov/sips/blob/main/sips/sip-023/sip-023-emergency-fix-traits.md)
+* [x] [SIP-024: Emergency Fix to Data Validation and Serialization Behavior](https://github.com/stacksgov/sips/blob/main/sips/sip-024/sip-024-least-supertype-fix.md)
+
+### How to Get Involved
+
+There are several ways you can get involved with the SIP process:
+
+* **Join the weekly SIP Meeting call** listed [here](https://community.stacks.org/events).
+* **SIP Editor**. SIP editors help SIP authors make sure their SIPs are well-formed and follow the right process. They help get SIPs ready for deep review by advancing it them from Draft to Accepted status. If you want to become a SIP editor, open an issue with your name and email to ask to be added to the list of SIP editors.
+* **Join a CAB** (Consideration Advisory Board). SIPs fall under the purview of one or more considerations. A full list is in [this github](https://github.com/stacksgov/sips/tree/main/considerations) directory. Currently they are: Diversity, Economics, Ethics, Governance and Technical. Members of SIP consideration advisory boards use their domain expertise to give Accepted SIPs a deep read, and give the authors any/all feedback to help make the SIP workable. If you want to join a board, reach out to the board's chairperson via the listed contact information.
+* **Steering Committee**. The Steering Committee organizes the consideration advisory boards and votes to advance Recommended SIPs to Activation-in-Progress status, and then to either Ratified or Rejected status. Once they are in the process of being activated, they use a SIP's Activation section to determine whether or not the Stacks ecosystem has ratified or rejected the SIP. Joining this committee requires the consent of the Stacks Foundation board.
diff --git a/docs/learn/network-fundamentals/technical-specifications/README.md b/docs/learn/network-fundamentals/technical-specifications/README.md
new file mode 100644
index 0000000000..625f21733a
--- /dev/null
+++ b/docs/learn/network-fundamentals/technical-specifications/README.md
@@ -0,0 +1,95 @@
+# Technical Specifications
+
+### Consensus
+
+* Proof of Transfer (PoX) as described in [SIP-007](https://github.com/stacksgov/sips/blob/main/sips/sip-007/sip-007-stacking-consensus.md)
+* Network will transition to Proof of Burn (PoB) as described in [SIP-001](https://github.com/stacksgov/sips/blob/main/sips/sip-001/sip-001-burn-election.md) after 10 years. [Learn more about Proof-of-Burn in SIP-001](https://github.com/stacksgov/sips/blob/main/sips/sip-001/sip-001-burn-election.md).
+* Threat model
+ * 51% of malicious Bitcoin mining power can reorg the Stacks chain or perform a double-spend attack
+ * Chain can halt if Stackers cannot meet 70% consensus on block validity
+* Different actors and their roles
+ * Stacks Miners package transactions into blocks and propose them to stackers
+ * Stacks Holders may alter the calculation of block limits (subject to a miner veto) and may vote to disable Proof-of-Transfer rewards for a reward cycle.
+ * Stackers validate and append blocks to the chain and validate sBTC deposit and withdrawal transactions
+
+### Proof of Transfer Mining
+
+* Coinbase reward schedule:
+ * 1000 STX/block for first 4 years
+ * 500 STX/block for following 4 years
+ * 250 STX/block for subsequent 4 years
+ * 125 STX/block in perpetuity after that
+* Coinbase rewards accumulate for "missed sortitions": If a Bitcoin block has no sortition (at height N), then any Stacks block mined in a subsequent sortition that builds off of any Stacks chain tip that existed at the penultimate sortition (at height N-1) may claim its coinbase. This encourages miners to keep mining even if Bitcoin fees are high.
+* Initial mining bonus: This is a special case of the above to incentivize early miners. Coinbase for all burnchain blocks between the first burn block height (to be chosen by independent miners as part of the Stacks 2.0 launch) and the first sortition winner accumulate and are distributed to miners over a fixed window (to be determined). For instance, say burn block height is 10,000 and first sortition is at block 10500 and distribution window is 100 blocks, then coinbase for the first 500 blocks (10,500 - 10,000) will be distributed evenly to miners who win sortition over the subsequent 100 blocks.
+* Reward maturity window: 100 blocks, meaning leaders will earn the coinbase reward 100 blocks after the block they successfully mine.
+* Block interval: Stacks blockchain produces fast blocks roughly every 10 seconds with a miner tenure change occurring every Bitcoin block
+* BTC commitment: Miners must commit at least 11,000 satoshis (5,500 sats / [UTXO output](https://learnmeabitcoin.com/technical/utxo)); 2 outputs / block) to avoid "dust."
+* For more details, see Block Production.
+
+### Stacking
+
+{% stepper %}
+{% step %}
+### Prepare phase
+
+An "anchor block" is chosen. The qualifying set of addresses ("reward set") is determined based on the snapshot of the chain at the anchor block. Length of prepare phase is 100 blocks. Stacking commitments need to be confirmed before this phase starts.
+{% endstep %}
+
+{% step %}
+### Reward phase
+
+Miner BTC commitments are distributed amongst the reward set. Reward cycle length is 2000 BTC blocks (\~2 weeks).
+{% endstep %}
+{% endstepper %}
+
+* Two reward addresses / block, for a total of 4000 addresses every reward cycle. The addresses are chosen using a VRF (verifiable random function), so each node can deterministically arrive at the same reward addresses for a given block.
+* Stacking threshold: 0.025% of the participating amount of STX when participation is between 25% and 100% and when participation is below 25%, the threshold level is always 0.00625 of the liquid supply of STX.
+* Delegation: An STX address can designate another address to participate in Stacking on its behalf. [Relevant section in SIP-007](https://github.com/stacksgov/sips/blob/main/sips/sip-007/sip-007-stacking-consensus.md#stacker-delegation).
+* Pooling: STX holders that individually do not meet the Stacking threshold can pool together their holdings to participate in Stacking. To do this, STX holders must set the (optional) reward address to the "delegate address." For more details, see [this reference](https://docs.stacks.co/references/stacking-contract#delegate-stx).
+* Legacy, SegWit, Native Segwit, and Taproot addresses are supported
+
+### Accounts and Addresses
+
+* Transactions in the Stacks blockchain originate from, are paid for by, and execute under the authority of accounts
+* An account is fully specified by its address + nonce + assets
+* Address contains 2 or 3 fields: 1 byte version, 20 byte public key hash (RIPEMD160(SHA256(input))), optional name (variable length, max 128 bytes)
+* Two types of accounts: standard accounts are owned by one or more private keys; contract accounts are materialized when a smart-contract is instantiated (specified by the optional name field above)
+* Nonce counts number of times an account has authorized a transaction. Starts at 0, valid authorization must include the _next_ nonce value.
+* Assets are a map of all asset types -- STX, any on-chain assets specified by a Clarity contract (for example NFTs) -- to quantities owned by that account.
+* Accounts need not be explicit "created" or registered; all accounts implicitly exist and are instantiated on first-use.
+
+### Transactions
+
+* Transaction types: coinbase, token-transfer, contract-deploy, contract-call, tenure-change.
+* Only standard accounts (not contracts) can pay transaction fees.
+* Transaction execution is governed by:
+
+{% stepper %}
+{% step %}
+### Originating account
+
+The account that creates, authorizes and sends the transaction.
+{% endstep %}
+
+{% step %}
+### Paying account
+
+The account that is billed by the leader for the cost of validating and executing the transaction.
+{% endstep %}
+
+{% step %}
+### Sending account
+
+The account that identifies who is currently executing the transaction: this can change as a transaction executes via the `as-contract` Clarity function.
+{% endstep %}
+{% endstepper %}
+
+* Transactions can be batched or streamed into blocks. The behavior can be controlled by the anchor mode of a transaction. With streaming (microblocks), a faster confirmation time is possible.
+* Two types of authorizations: standard authorization is where originating account is the same as paying account. _Sponsored_ authorization is where originating account and paying account are distinct. For instance, developers or service providers could pay for users to call their smart-contracts.
+* For sponsored authorization, first a user signs with the originating account and then a sponsor signs with the paying account.
+* Mempool limit for concurrent pending transactions is 25 per account
+* Pending mempool transactions will be garbage-collected [256 blocks after receipt](https://github.com/stacks-network/stacks-blockchain/blob/master/src/core/mempool.rs#L62). With 10 minutes target block time, this would equal \~42 hours
+* [Learn more about transaction encoding in SIP-005](https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-encoding)
+* [Transaction signing and verification are described in SIP-005](https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-signing-and-verifying)
+* All transactions impacting account balance are atomic, a transfer operation can not increment one account’s balance without decrementing another’s. However, transactions that perform multiple account actions (for example, transferring from multiple accounts) may partially complete.
+* Transactions can include a memo string (max 34 bytes)
diff --git a/docs/learn/network-fundamentals/technical-specifications/audits.md b/docs/learn/network-fundamentals/technical-specifications/audits.md
new file mode 100644
index 0000000000..a95d7d9c6c
--- /dev/null
+++ b/docs/learn/network-fundamentals/technical-specifications/audits.md
@@ -0,0 +1,59 @@
+# Audits
+
+
+
+_All 'high' or 'critical' issues listed in audits have either been mitigated or otherwise made obsolete, even if the report states otherwise._
+
+#### sBTC
+
+{% file src="../../.gitbook/assets/Clarity Alliance - sBTC.pdf" %}
+
+{% file src="../../.gitbook/assets/CoinFabrik - WSTS.pdf" %}
+
+{% file src="../../.gitbook/assets/Ottersec - sBTC Withdrawal.pdf" %}
+
+{% file src="../../.gitbook/assets/Ottersec - WSTS.pdf" %}
+
+
+
+#### Stacks Core
+
+{% file src="../../.gitbook/assets/CoinFabrik - Signer Binary.pdf" %}
+
+{% file src="../../.gitbook/assets/CoinFabrik - StackerDB.pdf" %}
+
+{% file src="../../.gitbook/assets/CoinFabrik - Stacks LibSigner.pdf" %}
+
+{% file src="../../.gitbook/assets/Coinfabrik - Stacks PoX.pdf" %}
+
+{% file src="../../.gitbook/assets/CoinFabrik - Stacks Signer Audit.pdf" %}
+
+{% file src="../../.gitbook/assets/Quantstamp - Network State Machine.pdf" %}
+
+
+
+#### Audits are just part of the story
+
+For any project, layers of security are crucial. Audits represent one layer, while core developers and contributors collaborate to provide many more. Notable security programs, designs, and partners beyond audits include:
+
+* Embedded security researchers [via Asymmetric Research](https://stacks.org/asymmetric-joins-stacks-ecosystem)
+* Attackathon programs in partnership with Immunefi
+* sBTC’s decentralized [network of validators/signers](https://www.stacks.co/sbtc) (removing the need to entrust a single entity and mitigating counterparty risk)
+* Stacks’ underlying design that offers 100% Bitcoin finality, securing sBTC at the consensus level of a $2.5 billion network.
+* Support at the app layer via [Hypernative](https://hackernoon.com/hypernative-bolsters-bitcoin-l2-security-as-stacks-ecosystem-gets-real-time-protection)
+* Bitcoin L2 Labs' [whitehat security program](https://bitcoinl2-labs.github.io/2024/06/04/orange-hats.html)
+* Stacks Foundation's partnership with Staking Defense League
+* Stacks Founation's ongoing [Immunefi bug bounty program](https://immunefi.com/bug-bounty/stacks/information/)
+* Dedicated Stacks Foundation Residents focused exclusively on fuzz and penetration testing (created [Rendezvous](https://stacks-network.github.io/rendezvous/))
+
+#### Other audits
+
+{% file src="../../.gitbook/assets/Clarity Alliance - sBTC Rewards Program.pdf" %}
+
+{% file src="../../.gitbook/assets/Blockstack_Desktop_Wallet_Pentest_Report_11-12-2020.pdf" %}
+
+{% file src="../../.gitbook/assets/NCC_Group_Stacks_Blockchain_Audit_Report_2020-11-23_v1.0.pdf" %}
+
+{% file src="../../.gitbook/assets/NCC_Group_Stacks_Wallet_Report_2020-11-17_v1.0.pdf" %}
+
+Trail of Bits Report, Stacks Blockchain (No PDF, [Github Issues List provided](https://github.com/diwakergupta/stacks-blockchain-tob-audit/issues))
diff --git a/docs/learn/sbtc/README.md b/docs/learn/sbtc/README.md
new file mode 100644
index 0000000000..e7c1d9c4fa
--- /dev/null
+++ b/docs/learn/sbtc/README.md
@@ -0,0 +1,52 @@
+# sBTC
+
+
+
+### Introduction to sBTC
+
+sBTC is a SIP-010 token on the Stacks blockchain that represents Bitcoin (BTC) in a 1:1 ratio. It enables Bitcoin holders to participate in DeFi applications and other smart contract functionalities while maintaining a peg to the underlying Bitcoin.
+
+#### Purpose
+
+The primary purpose of sBTC is to bridge Bitcoin to DeFi via the Stacks blockchain, providing Bitcoin holders with access to the rich functionality of smart contracts without sacrificing the security and value of their BTC holdings.
+
+#### Key Benefits
+
+1. **Bitcoin Compatibility**: Allows Bitcoin holders to participate in the Stacks ecosystem without selling their BTC.
+2. **Quick Conversions**: Facilitates rapid movement between BTC and sBTC (within 3 Bitcoin blocks for deposit, 6 for withdrawal).
+3. **Decentralized Management**: Initially utilizes a set of 15 community-chosen signers for maintaining the peg wallet.
+4. **Community Governance**: Involves the community in key decisions, such as selecting the initial signing set.
+
+### Key Concepts
+
+Understanding sBTC requires familiarity with several key concepts:
+
+#### sBTC
+
+sBTC is a [SIP-010](https://github.com/stacksgov/sips/blob/main/sips/sip-010/sip-010-fungible-token-standard.md) token on the Stacks Blockchain that can be converted back to BTC on the Bitcoin Blockchain. The key property of sBTC is its 1:1 peg to Bitcoin, meaning 1 sBTC is always equivalent to 1 BTC.
+
+#### sBTC UTXO
+
+The sBTC UTXO is the single unspent transaction output (UTXO) on the Bitcoin blockchain that holds the entire BTC balance pegged into sBTC. This UTXO is managed and maintained by the set of sBTC Signers.
+
+#### sBTC Signer
+
+In sBTC, the sBTC Signer is a signer entity separate from the Stacks Nakamoto signer. sBTC signer responsibilities include:
+
+* Signing sBTC operations
+* Communicating with the sBTC contracts on the Stacks chain
+* Managing the sBTC UTXO
+
+#### sBTC Signer Set
+
+The sBTC Signer Set is the group of all sBTC signers. This set has full democratic access to the sBTC UTXO and is responsible for maintaining the security of the peg wallet. The signers also have the ability to rotate their private keys for enhanced security.
+
+#### Emily API
+
+Emily is an API that helps facilitate and supervise the sBTC Bridge in addition to serving as a programmatic liaison between sBTC users and signers.
+
+#### SIP-010 Token
+
+sBTC adheres to the [SIP-010](https://github.com/stacksgov/sips/blob/main/sips/sip-010/sip-010-fungible-token-standard.md) standard for fungible tokens on the Stacks blockchain. This ensures compatibility with wallets and applications that support the SIP-010 standard.
+
+Understanding these concepts is crucial for grasping the overall architecture and functionality of sBTC. In the following sections, we'll explore how these concepts come together to create sBTC.
diff --git a/docs/learn/sbtc/auxiliary-features/README.md b/docs/learn/sbtc/auxiliary-features/README.md
new file mode 100644
index 0000000000..b0e7df2d63
--- /dev/null
+++ b/docs/learn/sbtc/auxiliary-features/README.md
@@ -0,0 +1,17 @@
+# Auxiliary Features
+
+This section covers additional features that enhance the functionality and security of the sBTC system. These auxiliary features contribute to the overall robustness and user-friendliness of the sBTC ecosystem.
+
+{% stepper %}
+{% step %}
+### Transaction Fee Sponsorship
+
+Allowing sBTC transactions to be sponsored.
+{% endstep %}
+
+{% step %}
+### Signer Wallet Rotation
+
+Enabling secure key rotation for sBTC Signers.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/learn/sbtc/auxiliary-features/signer-wallet-rotation.md b/docs/learn/sbtc/auxiliary-features/signer-wallet-rotation.md
new file mode 100644
index 0000000000..fd4ec92eea
--- /dev/null
+++ b/docs/learn/sbtc/auxiliary-features/signer-wallet-rotation.md
@@ -0,0 +1,53 @@
+# Signer Wallet Rotation
+
+Signer wallet rotation allows sBTC signers to update their private keys and modify the signer set composition. This mechanism is how the network maintains security over time and adapts to changing participants.
+
+## How it works
+
+The sBTC system uses a multi-signature wallet on Bitcoin to custody BTC deposits. When the system needs to change who controls this wallet—either by rotating keys or changing the signer set—it uses the rotation mechanism.
+
+As of v1.1.0, the system supports:
+
+* Adding new signers to the set
+* Removing existing signers
+* Replacing specific signers
+* Rotating keys for current signers
+
+When signers agree on a new configuration, the system automatically runs a Distributed Key Generation (DKG) protocol to create new signing shares for the updated group. Once complete, control of the sBTC wallet transfers to the new configuration.
+
+## The rotation process
+
+{% stepper %}
+{% step %}
+### Signers coordinate off-chain
+
+Signers agree on the new signer set.
+{% endstep %}
+
+{% step %}
+### Update configuration
+
+Each signer operator updates their configuration with the newly decided set.
+{% endstep %}
+
+{% step %}
+### DKG runs automatically
+
+Once all signers have configured the exact same set of signers, DKG occurs automatically to generate new signing shares.
+{% endstep %}
+
+{% step %}
+### New signer set takes control
+
+The new signer set takes control of the sBTC wallet.
+{% endstep %}
+{% endstepper %}
+
+The Bitcoin UTXOs remain under continuous control throughout this process—there's no moment where funds are unsecured.
+
+## When rotation occurs
+
+Key rotation typically happens when:
+
+* **Signer changes**: When someone leaves the signer set or new participants join, the configuration must be updated to reflect the new membership.
+* **Security events**: If a key might be compromised, an emergency rotation can be initiated to secure the system.
diff --git a/docs/learn/sbtc/auxiliary-features/transaction-fee-sponsorship.md b/docs/learn/sbtc/auxiliary-features/transaction-fee-sponsorship.md
new file mode 100644
index 0000000000..18bd63f127
--- /dev/null
+++ b/docs/learn/sbtc/auxiliary-features/transaction-fee-sponsorship.md
@@ -0,0 +1,56 @@
+# Transaction Fee Sponsorship
+
+Transaction Fee Sponsorship is a feature in sBTC that allows users to pay for Stacks transaction fees using sBTC instead of STX.
+
+## Overview
+
+* sBTC transactions on Stacks can be sponsored in return for some sBTC.
+* This feature improves user experience by allowing sBTC holders to use their tokens for gas fees.
+
+## Implementation
+
+The fee sponsorship system is implemented using the approach suggested in [stacks-network/stacks-core#4235](https://github.com/stacks-network/stacks-core/issues/4235).
+
+{% stepper %}
+{% step %}
+### Sponsor support for fees
+
+sBTC users can get support from existing STX holders for transaction fees.
+{% endstep %}
+
+{% step %}
+### Sponsor receives sBTC
+
+The sponsor pays the STX fee and receives sBTC in return.
+{% endstep %}
+{% endstepper %}
+
+## User Experience
+
+From a user's perspective:
+
+{% stepper %}
+{% step %}
+### Opt into fee sponsorship
+
+When initiating an sBTC transaction, they can opt for fee sponsorship.
+{% endstep %}
+
+{% step %}
+### Agree to sponsorship terms
+
+The user agrees to pay a small amount of sBTC for the sponsorship.
+{% endstep %}
+
+{% step %}
+### Transaction processed
+
+The transaction is then processed with the fees paid in STX by the sponsor.
+{% endstep %}
+{% endstepper %}
+
+## Benefits
+
+* Improved UX: Users don't need to hold STX to use sBTC.
+* Lower Barrier to Entry: New users can start using sBTC without first acquiring STX.
+* Flexibility: Provides an additional option for handling transaction fees.
diff --git a/docs/learn/sbtc/clarity-contracts/README.md b/docs/learn/sbtc/clarity-contracts/README.md
new file mode 100644
index 0000000000..678d4c8e89
--- /dev/null
+++ b/docs/learn/sbtc/clarity-contracts/README.md
@@ -0,0 +1,45 @@
+# Clarity Contracts
+
+### Deployed Mainnet Contracts
+
+* [sbtc-token](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token?chain=mainnet)
+* [sbtc-registry](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-registry?chain=mainnet)
+* [sbtc-deposit](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit?chain=mainnet)
+* [sbtc-withdrawal](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-withdrawal?chain=mainnet)
+* [sbtc-bootstrap-signers](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-bootstrap-signers?chain=mainnet)
+
+This graph summarizes the Clarity portion of the sBTC protocol.
+
+
+
+### sBTC Clarity Contracts
+
+At a high level, the sBTC Clarity contracts are responsible for the following:
+
+#### sbtc-bootstrap signers
+
+Core contract for meta signer functionality such as registration & the rotation process.
+
+#### sbtc-deposit
+
+Processing contract called by the signers to record a consumed Bitcoin transaction & mint some amount of sBTC to a principal contained in the payload.
+
+#### sbtc-registry
+
+State storage for maintaining upgradability across protocol.
+
+#### sbtc-withdrawal
+
+Interaction points for users and signers to update withdrawal request state.
+
+### User Types
+
+In addition to the contracts themselves, there are two main user types that will interact with these contracts.
+
+#### Signer
+
+A signer that is part of the current sBTC signer set. More information on signers and their role in sBTC can be found in the [Signer Process Walkthrough](../walkthroughs/signer-process-walkthrough.md).
+
+#### Wallet
+
+A participant in the Stacks/Bitcoin ecosystem that wants to deposit/withdraw/use sbtc.
diff --git a/docs/learn/sbtc/clarity-contracts/sbtc-bootstrap-signers.md b/docs/learn/sbtc/clarity-contracts/sbtc-bootstrap-signers.md
new file mode 100644
index 0000000000..d7bb7cb743
--- /dev/null
+++ b/docs/learn/sbtc/clarity-contracts/sbtc-bootstrap-signers.md
@@ -0,0 +1,89 @@
+---
+hidden: true
+---
+
+# sbtc bootstrap signers
+
+I can convert and optimize that page for GitBook — please paste the full page content (or provide the page URL) you want imported.
+
+If you don't have it ready, here are two quick options I can produce now to get started — tell me which you want or paste the content:
+
+1. Empty GitBook-ready markdown template for "sBTC Bootstrap Signers" you can fill in.
+2. Full conversion if you paste the original page content or URL.
+
+Template (choose 1 or paste content):
+
+***
+
+## sBTC Bootstrap Signers
+
+Short description: Briefly describe the purpose of this page and what a bootstrap signer is.
+
+### Signer list
+
+Provide signer identities, keys, and any relevant metadata here.
+
+* Signer name
+ * Public key:
+ * Contact:
+ * Notes:
+
+(Repeat for each signer)
+
+### Setup / Installation
+
+Use a stepper for multi-step setup instructions.
+
+{% stepper %}
+{% step %}
+### Prepare environment
+
+Describe prerequisites and environment setup.
+{% endstep %}
+
+{% step %}
+### Install dependencies
+
+Commands and configuration.
+{% endstep %}
+
+{% step %}
+### Start the signer
+
+Service start commands, verification steps.
+{% endstep %}
+{% endstepper %}
+
+### Configuration examples
+
+Include config file examples and code blocks.
+
+{% code title="signer-config.toml" %}
+```toml
+# Example config
+[signer]
+key = "-----BEGIN PUBLIC KEY-----..."
+```
+{% endcode %}
+
+### Security and key handling
+
+Best practices for key generation, storage, and rotation.
+
+{% hint style="warning" %}
+Never share private keys. Use hardware security modules (HSMs) or secure enclaves where possible.
+{% endhint %}
+
+### FAQ
+
+
+
+How do I rotate a signer key?
+
+Describe key rotation steps.
+
+
+
+***
+
+If you paste the original content, I'll convert it exactly into GitBook-optimized markdown (tabs, steppers, expandables, etc.) preserving all links and URLs. Which would you like?
diff --git a/docs/learn/sbtc/clarity-contracts/sbtc-deposit.md b/docs/learn/sbtc/clarity-contracts/sbtc-deposit.md
new file mode 100644
index 0000000000..42e127fe84
--- /dev/null
+++ b/docs/learn/sbtc/clarity-contracts/sbtc-deposit.md
@@ -0,0 +1,130 @@
+# sBTC Deposit
+
+## Overview
+
+The [sBTC Deposit contract](https://github.com/stacks-network/sbtc/blob/main/contracts/contracts/sbtc-deposit.clar) (`sbtc-deposit.clar`) manages the deposit process for the sBTC system. It handles the validation and minting of sBTC tokens when users deposit Bitcoin, and interacts with the sBTC Registry contract to update the protocol state.
+
+## Constants
+
+* `txid-length`: The required length of a transaction ID (32 bytes).
+* `dust-limit`: The minimum amount for a valid deposit (546 satoshis).
+
+## Error Constants
+
+* `ERR_TXID_LEN` (u300): Indicates that the provided transaction ID is not the correct length.
+* `ERR_DEPOSIT_REPLAY` (u301): Signifies an attempt to replay a deposit that has already been completed.
+* `ERR_LOWER_THAN_DUST` (u302): Indicates that the deposit amount is below the dust limit.
+* `ERR_DEPOSIT_INDEX_PREFIX`: Used as a prefix for deposit-related errors in batch processing.
+* `ERR_DEPOSIT` (u303): General deposit error.
+* `ERR_INVALID_CALLER` (u304): Indicates that the caller is not authorized to perform the operation.
+
+***
+
+## Public Functions
+
+### complete-deposit-wrapper
+
+Processes a single deposit request.
+
+* Parameters:
+ * `txid`: `(buff 32)` - The Bitcoin transaction ID
+ * `vout-index`: `uint` - The output index of the deposit transaction
+ * `amount`: `uint` - The amount of sBTC to mint (in satoshis)
+ * `recipient`: `principal` - The Stacks address to receive the minted sBTC
+* Returns: `(response bool uint)`
+
+{% stepper %}
+{% step %}
+### Validation and authorization
+
+1. Verifies that the caller is the current signer principal.
+2. Checks that the deposit amount is above the dust limit.
+3. Validates the transaction ID length.
+{% endstep %}
+
+{% step %}
+### Replay protection
+
+4. Ensures the deposit hasn't been processed before (prevents replay).
+{% endstep %}
+
+{% step %}
+### Execution
+
+5. Mints sBTC tokens to the recipient via `.sbtc-token`'s `protocol-mint`.
+6. Updates the deposit state in the sBTC Registry contract via `.sbtc-registry`'s `complete-deposit`.
+{% endstep %}
+{% endstepper %}
+
+***
+
+### complete-deposits-wrapper
+
+Processes multiple deposit requests in a single transaction.
+
+* Parameters:
+ * `deposits`: `(list 650 {txid: (buff 32), vout-index: uint, amount: uint, recipient: principal})` - List of deposit data
+* Returns: `(response uint uint)`
+
+{% stepper %}
+{% step %}
+### Authorization
+
+1. Verifies that the caller is the current signer principal.
+{% endstep %}
+
+{% step %}
+### Batch processing
+
+2. Iterates through the list of deposits, processing each one using the `complete-individual-deposits-helper` function.
+{% endstep %}
+{% endstepper %}
+
+***
+
+## Private Functions
+
+### complete-individual-deposits-helper
+
+Helper function to process individual deposits within the batch operation.
+
+* Parameters:
+ * `deposit`: `{txid: (buff 32), vout-index: uint, amount: uint, recipient: principal}` - Single deposit data
+ * `helper-response`: `(response uint uint)` - Accumulator for tracking processed deposits
+* Returns: `(response uint uint)`
+
+{% stepper %}
+{% step %}
+### Call deposit wrapper
+
+1. Calls `complete-deposit-wrapper` for the individual deposit.
+{% endstep %}
+
+{% step %}
+### Success handling
+
+2. If successful, increments the processed deposit count.
+{% endstep %}
+
+{% step %}
+### Error handling
+
+3. If an error occurs, it's propagated with additional index information (using `ERR_DEPOSIT_INDEX_PREFIX` or related error constants).
+{% endstep %}
+{% endstepper %}
+
+***
+
+## Interactions with Other Contracts
+
+* `.sbtc-registry`: Calls `get-current-signer-data`, `get-completed-deposit`, and `complete-deposit` to manage deposit state.
+* `.sbtc-token`: Calls `protocol-mint` to create new sBTC tokens.
+
+***
+
+## Security Considerations
+
+1. Access Control: Only the current signer principal can call the deposit completion functions.
+2. Replay Prevention: The contract checks for previously processed deposits to prevent replay attacks.
+3. Dust Limit: Enforces a minimum deposit amount to prevent spam and ensure economic viability.
+4. Transaction ID Validation: Ensures the provided transaction ID is the correct length.
diff --git a/docs/learn/sbtc/clarity-contracts/sbtc-registry.md b/docs/learn/sbtc/clarity-contracts/sbtc-registry.md
new file mode 100644
index 0000000000..39934e27f7
--- /dev/null
+++ b/docs/learn/sbtc/clarity-contracts/sbtc-registry.md
@@ -0,0 +1,224 @@
+# sBTC Registry
+
+## Overview
+
+The [sBTC Registry contract](https://github.com/stacks-network/sbtc/blob/main/contracts/contracts/sbtc-registry.clar) (`sbtc-registry.clar`) serves as the central registry for the sBTC system. It manages withdrawal requests, completed deposits, and the current signer set. This contract is crucial for maintaining the state and coordinating operations within the sBTC ecosystem.
+
+## Error Constants
+
+* `ERR_UNAUTHORIZED` (u400): Indicates unauthorized access.
+* `ERR_INVALID_REQUEST_ID` (u401): Signifies an invalid withdrawal request ID.
+* `ERR_AGG_PUBKEY_REPLAY` (u402): Indicates an attempt to replay an aggregate public key.
+* `ERR_MULTI_SIG_REPLAY` (u403): Signifies an attempt to replay a multi-signature address.
+
+## State Variables
+
+* `last-withdrawal-request-id`: Tracks the latest withdrawal request ID.
+* `current-signature-threshold`: Stores the current threshold for required signatures.
+* `current-signer-set`: Maintains a list of current signer public keys.
+* `current-aggregate-pubkey`: Holds the current aggregate public key.
+* `current-signer-principal`: Stores the current signer's principal address.
+
+## Data Maps
+
+### withdrawal-requests
+
+Stores withdrawal request details indexed by request ID.
+
+* Fields:
+ * `amount`: Amount of sBTC being withdrawn (in sats)
+ * `max-fee`: Maximum fee for the withdrawal
+ * `sender`: Principal of the sender
+ * `recipient`: BTC recipient address (version and hashbytes)
+ * `block-height`: Burn block height where the request was created
+
+### withdrawal-status
+
+Tracks the status of withdrawal requests indexed by request ID.
+
+* Value: `bool` (true if accepted, false if rejected, none if pending)
+
+### completed-deposits
+
+Records completed deposit transactions to prevent replay attacks.
+
+* Key: `{txid: (buff 32), vout-index: uint}`
+* Value: `{amount: uint, recipient: principal}`
+
+### aggregate-pubkeys
+
+Tracks used aggregate public keys to prevent replay attacks.
+
+* Key: `(buff 33)` (aggregate public key)
+* Value: `bool`
+
+### multi-sig-address
+
+Tracks used multi-signature addresses to prevent replay attacks.
+
+* Key: `principal` (multi-sig address)
+* Value: `bool`
+
+### protocol-contracts
+
+Stores authorized protocol contract addresses.
+
+* Key: `principal` (contract address)
+* Value: `bool`
+
+## Read-only Functions
+
+### get-withdrawal-request
+
+Retrieves a withdrawal request by its ID.
+
+* Parameters:
+ * `id`: `uint`
+* Returns: `(optional {amount: uint, max-fee: uint, sender: principal, recipient: {version: (buff 1), hashbytes: (buff 32)}, block-height: uint, status: (optional bool)})`
+
+### get-completed-deposit
+
+Fetches a completed deposit by transaction ID and output index.
+
+* Parameters:
+ * `txid`: `(buff 32)`
+ * `vout-index`: `uint`
+* Returns: `(optional {amount: uint, recipient: principal})`
+
+### get-current-signer-data
+
+Returns current signer set information.
+
+* Returns: `{current-signer-set: (list 128 (buff 33)), current-aggregate-pubkey: (buff 33), current-signer-principal: principal, current-signature-threshold: uint}`
+
+### get-current-aggregate-pubkey
+
+Returns the current aggregate public key.
+
+* Returns: `(buff 33)`
+
+### get-current-signer-principal
+
+Returns the current signer's principal.
+
+* Returns: `principal`
+
+### get-current-signer-set
+
+Returns the current set of signer public keys.
+
+* Returns: `(list 128 (buff 33))`
+
+## Public Functions
+
+### create-withdrawal-request
+
+Creates a new withdrawal request. Only callable by protocol contracts.
+
+* Parameters:
+ * `amount`: `uint`
+ * `max-fee`: `uint`
+ * `sender`: `principal`
+ * `recipient`: `{version: (buff 1), hashbytes: (buff 32)}`
+ * `height`: `uint`
+* Returns: `(response uint uint)`
+
+### complete-withdrawal-accept
+
+Marks a withdrawal request as accepted.
+
+* Parameters:
+ * `request-id`: `uint`
+ * `bitcoin-txid`: `(buff 32)`
+ * `output-index`: `uint`
+ * `signer-bitmap`: `uint`
+ * `fee`: `uint`
+* Returns: `(response bool uint)`
+
+### complete-withdrawal-reject
+
+Marks a withdrawal request as rejected.
+
+* Parameters:
+ * `request-id`: `uint`
+ * `signer-bitmap`: `uint`
+* Returns: `(response bool uint)`
+
+### complete-deposit
+
+Records a completed deposit transaction.
+
+* Parameters:
+ * `txid`: `(buff 32)`
+ * `vout-index`: `uint`
+ * `amount`: `uint`
+ * `recipient`: `principal`
+* Returns: `(response bool uint)`
+
+### rotate-keys
+
+Updates the signer set, multi-sig principal, and aggregate public key.
+
+* Parameters:
+ * `new-keys`: `(list 128 (buff 33))`
+ * `new-address`: `principal`
+ * `new-aggregate-pubkey`: `(buff 33)`
+ * `new-signature-threshold`: `uint`
+* Returns: `(response (buff 33) uint)`
+
+## Private Functions
+
+### increment-last-withdrawal-request-id
+
+Increments and returns the next withdrawal request ID.
+
+* Returns: `uint`
+
+### is-protocol-caller
+
+Checks if the caller is an authorized protocol contract.
+
+* Returns: `(response bool uint)`
+
+### validate-protocol-caller
+
+Validates if a given principal is an authorized protocol contract.
+
+* Parameters:
+ * `caller`: `principal`
+* Returns: `(response bool uint)`
+
+## Events
+
+The contract emits events (via `print`) for important actions:
+
+* Withdrawal request creation: "withdrawal-create"
+* Withdrawal acceptance: "withdrawal-accept"
+* Withdrawal rejection: "withdrawal-reject"
+* Deposit completion: "completed-deposit"
+
+{% hint style="info" %}
+Events are emitted via `print` statements in the contract for the actions listed above.
+{% endhint %}
+
+## Security Considerations
+
+{% stepper %}
+{% step %}
+### Access Control
+
+Only authorized protocol contracts can call certain functions.
+{% endstep %}
+
+{% step %}
+### Replay Prevention
+
+The contract prevents replay attacks on deposits, aggregate public keys, and multi-signature addresses.
+{% endstep %}
+
+{% step %}
+### State Management
+
+The contract carefully manages the state of withdrawals and the current signer set.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/learn/sbtc/clarity-contracts/sbtc-signers.md b/docs/learn/sbtc/clarity-contracts/sbtc-signers.md
new file mode 100644
index 0000000000..5b8cce5065
--- /dev/null
+++ b/docs/learn/sbtc/clarity-contracts/sbtc-signers.md
@@ -0,0 +1,148 @@
+# sBTC Signers
+
+Overview
+
+The [sBTC Signers contract](https://github.com/stacks-network/sbtc/blob/main/contracts/contracts/sbtc-bootstrap-signers.clar) (`sbtc-bootstrap-signers.clar`) manages the signer set for the sBTC system. It handles rotation of signer keys and provides utilities for generating multisig addresses.
+
+Constants
+
+* `key-size`: The required length of public keys (33 bytes).
+
+Error Constants
+
+* `ERR_KEY_SIZE_PREFIX`: Prefix for key size errors in batch processing.
+* `ERR_KEY_SIZE` (u200): Indicates that a provided key is not the correct length.
+* `ERR_INVALID_CALLER` (u201): Signifies that the function caller is not the current signer principal.
+* `ERR_SIGNATURE_THRESHOLD` (u202): Indicates an invalid signature threshold (must be >50% and ≤100% of total signer keys).
+
+Public Functions
+
+rotate-keys-wrapper
+
+Rotates the keys of the signers. Called when the signer set is updated.
+
+* Parameters:
+ * `new-keys`: `(list 128 (buff 33))` - List of new signer public keys
+ * `new-aggregate-pubkey`: `(buff 33)` - New aggregate public key
+ * `new-signature-threshold`: `uint` - New signature threshold
+* Returns: `(response (buff 33) uint)`
+
+Function flow:
+
+{% stepper %}
+{% step %}
+### Validate signature threshold
+
+Ensure the new signature threshold is valid (must be >50% and ≤100% of total signer keys).
+{% endstep %}
+
+{% step %}
+### Verify caller
+
+Verify that the caller is the current signer principal.
+{% endstep %}
+
+{% step %}
+### Validate keys
+
+Check the length of each new key and the aggregate public key (must be 33 bytes).
+{% endstep %}
+
+{% step %}
+### Update registry
+
+Call the sBTC Registry contract to update the keys and address.
+{% endstep %}
+{% endstepper %}
+
+Read-only Functions
+
+pubkeys-to-spend-script
+
+Generates the p2sh redeem script for a multisig.
+
+* Parameters:
+ * `pubkeys`: `(list 128 (buff 33))` - List of public keys
+ * `m`: `uint` - Number of required signatures
+* Returns: `(buff 1024)` - The p2sh redeem script
+
+pubkeys-to-hash
+
+Computes the hash160 of the p2sh redeem script.
+
+* Parameters:
+ * `pubkeys`: `(list 128 (buff 33))` - List of public keys
+ * `m`: `uint` - Number of required signatures
+* Returns: `(buff 20)` - The hash160 of the redeem script
+
+pubkeys-to-principal
+
+Generates a principal (Stacks address) from a set of pubkeys and an m-of-n threshold.
+
+* Parameters:
+ * `pubkeys`: `(list 128 (buff 33))` - List of public keys
+ * `m`: `uint` - Number of required signatures
+* Returns: `principal` - The generated Stacks address
+
+pubkeys-to-bytes
+
+Concatenates a list of pubkeys into a buffer with length prefixes.
+
+* Parameters:
+ * `pubkeys`: `(list 128 (buff 33))` - List of public keys
+* Returns: `(buff 510)` - Concatenated pubkeys with length prefixes
+
+concat-pubkeys-fold
+
+Concatenates a pubkey buffer with a length prefix.
+
+* Parameters:
+ * `pubkey`: `(buff 33)` - A single public key
+ * `iterator`: `(buff 510)` - Accumulator for concatenation
+* Returns: `(buff 510)` - Updated concatenated buffer
+
+bytes-len
+
+Returns the length of a byte buffer as a single byte.
+
+* Parameters:
+ * `bytes`: `(buff 33)` - Input byte buffer
+* Returns: `(buff 1)` - Length as a single byte
+
+uint-to-byte
+
+Converts a uint to a single byte.
+
+* Parameters:
+ * `n`: `uint` - Input number
+* Returns: `(buff 1)` - Number as a single byte
+
+Private Functions
+
+signer-key-length-check
+
+Checks that the length of each key is exactly 33 bytes.
+
+* Parameters:
+ * `current-key`: `(buff 33)` - Public key to check
+ * `helper-response`: `(response uint uint)` - Accumulator for error handling
+* Returns: `(response uint uint)` - Updated accumulator or error
+
+Constants
+
+BUFF\_TO\_BYTE
+
+A constant list mapping uint values (0-255) to their corresponding byte representations.
+
+Interactions with Other Contracts
+
+* `.sbtc-registry`: Calls `get-current-signer-data` and `rotate-keys` to manage signer data.
+
+Security Considerations
+
+{% hint style="warning" %}
+* Access Control: Only the current signer principal can call the key rotation function.
+* Key Validation: Ensures all provided keys are the correct length.
+* Signature Threshold: Enforces a minimum threshold of over 50% of signers and a maximum of 100%.
+* Multisig Generation: Provides utilities for secure generation of multisig addresses.
+{% endhint %}
diff --git a/docs/learn/sbtc/clarity-contracts/sbtc-token.md b/docs/learn/sbtc/clarity-contracts/sbtc-token.md
new file mode 100644
index 0000000000..e7e84f0c28
--- /dev/null
+++ b/docs/learn/sbtc/clarity-contracts/sbtc-token.md
@@ -0,0 +1,158 @@
+# sBTC Token
+
+## Overview
+
+The [sBTC Token contract](https://github.com/stacks-network/sbtc/blob/main/contracts/contracts/sbtc-token.clar) (`sbtc-token.clar`) implements the fungible token functionality for sBTC. It manages both unlocked and locked sBTC tokens and provides functions for minting, burning, transferring, and querying token information. sBTC is a SIP-010 standard fungible token.
+
+## Constants
+
+* `ERR_NOT_OWNER` (u4): Error when the sender tries to move a token they don't own.
+* `ERR_NOT_AUTH` (u5): Error when the caller is not an authorized protocol caller.
+* `token-decimals` (u8): The number of decimal places for the token.
+
+## Fungible Tokens
+
+* `sbtc-token`: The main sBTC fungible token.
+* `sbtc-token-locked`: Represents locked sBTC tokens.
+
+## Data Variables
+
+* `token-name`: The name of the token (default: "sBTC").
+* `token-symbol`: The symbol of the token (default: "sBTC").
+* `token-uri`: An optional URI for token metadata.
+
+## Protocol Functions
+
+These functions can only be called by authorized protocol contracts:
+
+### protocol-transfer
+
+* Parameters: `amount: uint`, `sender: principal`, `recipient: principal`
+* Returns: `(response bool uint)`
+
+### protocol-lock
+
+* Parameters: `amount: uint`, `owner: principal`
+* Returns: `(response bool uint)`
+
+### protocol-unlock
+
+* Parameters: `amount: uint`, `owner: principal`
+* Returns: `(response bool uint)`
+
+### protocol-mint
+
+* Parameters: `amount: uint`, `recipient: principal`
+* Returns: `(response bool uint)`
+
+### protocol-burn
+
+* Parameters: `amount: uint`, `owner: principal`
+* Returns: `(response bool uint)`
+
+### protocol-burn-locked
+
+* Parameters: `amount: uint`, `owner: principal`
+* Returns: `(response bool uint)`
+
+### protocol-set-name
+
+* Parameters: `new-name: (string-ascii 32)`
+* Returns: `(response bool uint)`
+
+### protocol-set-symbol
+
+* Parameters: `new-symbol: (string-ascii 10)`
+* Returns: `(response bool uint)`
+
+### protocol-set-token-uri
+
+* Parameters: `new-uri: (optional (string-utf8 256))`
+* Returns: `(response bool uint)`
+
+### protocol-mint-many
+
+* Parameters: `recipients: (list 200 {amount: uint, recipient: principal})`
+* Returns: `(response (list 200 (response bool uint)) uint)`
+
+## Public Functions (SIP-010 Trait)
+
+### transfer
+
+* Parameters: `amount: uint`, `sender: principal`, `recipient: principal`, `memo: (optional (buff 34))`
+* Returns: `(response bool uint)`
+
+### get-name
+
+* Returns: `(response (string-ascii 32) uint)`
+
+### get-symbol
+
+* Returns: `(response (string-ascii 10) uint)`
+
+### get-decimals
+
+* Returns: `(response uint uint)`
+
+### get-balance
+
+Returns the total balance (locked + unlocked) for a principal.
+
+* Parameters: `who: principal`
+* Returns: `(response uint uint)`
+
+### get-balance-available
+
+Returns the available (unlocked) balance for a principal.
+
+* Parameters: `who: principal`
+* Returns: `(response uint uint)`
+
+### get-balance-locked
+
+Returns the locked balance for a principal.
+
+* Parameters: `who: principal`
+* Returns: `(response uint uint)`
+
+### get-total-supply
+
+* Returns: `(response uint uint)`
+
+### get-token-uri
+
+* Returns: `(response (optional (string-utf8 256)) uint)`
+
+## Private Functions
+
+### protocol-mint-many-iter
+
+* Helper function for minting tokens to multiple recipients.
+* Parameters: `item: {amount: uint, recipient: principal}`
+* Returns: `(response bool uint)`
+
+## Security Considerations
+
+{% stepper %}
+{% step %}
+### Access Control
+
+Protocol functions can only be called by authorized contracts, enforced through the `sbtc-registry` contract.
+{% endstep %}
+
+{% step %}
+### Ownership Verification
+
+The `transfer` function checks that the sender owns the tokens being transferred.
+{% endstep %}
+
+{% step %}
+### Separate Token Tracking
+
+The contract maintains separate tracking for locked and unlocked tokens, ensuring proper accounting.
+{% endstep %}
+{% endstepper %}
+
+## Interactions with Other Contracts
+
+* `.sbtc-registry`: Used to validate protocol callers for privileged operations.
diff --git a/docs/learn/sbtc/clarity-contracts/sbtc-withdrawal.md b/docs/learn/sbtc/clarity-contracts/sbtc-withdrawal.md
new file mode 100644
index 0000000000..0cb5eda628
--- /dev/null
+++ b/docs/learn/sbtc/clarity-contracts/sbtc-withdrawal.md
@@ -0,0 +1,141 @@
+# sBTC Withdrawal
+
+## Overview
+
+The [sBTC Withdrawal contract](https://github.com/stacks-network/sbtc/blob/main/contracts/contracts/sbtc-withdrawal.clar) (`sbtc-withdrawal.clar`) manages the withdrawal process for the sBTC system. It handles the initiation, acceptance, and rejection of withdrawal requests, ensuring proper validation and interaction with other sBTC contracts.
+
+## Constants
+
+### Error Codes
+
+* `ERR_INVALID_ADDR_VERSION` (u500): Invalid address version.
+* `ERR_INVALID_ADDR_HASHBYTES` (u501): Invalid address hashbytes.
+* `ERR_DUST_LIMIT` (u502): Withdrawal amount below dust limit.
+* `ERR_INVALID_REQUEST` (u503): Invalid withdrawal request ID.
+* `ERR_INVALID_CALLER` (u504): Caller is not the current signer principal.
+* `ERR_ALREADY_PROCESSED` (u505): Withdrawal request already processed.
+* `ERR_FEE_TOO_HIGH` (u505): Paid fee higher than requested.
+* `ERR_WITHDRAWAL_INDEX_PREFIX`: Prefix for withdrawal index errors.
+* `ERR_WITHDRAWAL_INDEX` (u506): General withdrawal index error.
+
+### Other Constants
+
+* `MAX_ADDRESS_VERSION` (u6): Maximum value of an address version.
+* `MAX_ADDRESS_VERSION_BUFF_20` (u4): Maximum version for 20-byte hashbytes.
+* `MAX_ADDRESS_VERSION_BUFF_32` (u6): Maximum version for 32-byte hashbytes.
+* `DUST_LIMIT` (u546): Minimum amount of sBTC for withdrawal.
+
+## Public Functions
+
+### initiate-withdrawal-request
+
+Initiates a new withdrawal request.
+
+* Parameters:
+ * `amount`: `uint` - Amount of sBTC to withdraw
+ * `recipient`: `{ version: (buff 1), hashbytes: (buff 32) }` - Bitcoin address details
+ * `max-fee`: `uint` - Maximum fee for the withdrawal
+* Returns: `(response uint uint)`
+
+### accept-withdrawal-request
+
+Accepts a withdrawal request.
+
+* Parameters:
+ * `request-id`: `uint` - Withdrawal request ID
+ * `bitcoin-txid`: `(buff 32)` - Bitcoin transaction ID
+ * `signer-bitmap`: `uint` - Bitmap of signers
+ * `output-index`: `uint` - Output index in the Bitcoin transaction
+ * `fee`: `uint` - Actual fee paid
+* Returns: `(response bool uint)`
+
+### reject-withdrawal-request
+
+Rejects a withdrawal request.
+
+* Parameters:
+ * `request-id`: `uint` - Withdrawal request ID
+ * `signer-bitmap`: `uint` - Bitmap of signers
+* Returns: `(response bool uint)`
+
+### complete-withdrawals
+
+Processes multiple withdrawal requests (accept or reject).
+
+* Parameters:
+ * `withdrawals`: `(list 600 {...})` - List of withdrawal details
+* Returns: `(response uint uint)`
+
+## Read-only Functions
+
+### validate-recipient
+
+Validates the recipient's Bitcoin address format.
+
+* Parameters:
+ * `recipient`: `{ version: (buff 1), hashbytes: (buff 32) }` - Bitcoin address details
+* Returns: `(response bool uint)`
+
+## Private Functions
+
+### complete-individual-withdrawal-helper
+
+Helper function to process individual withdrawals in the batch operation.
+
+* Parameters:
+ * `withdrawal`: `{...}` - Individual withdrawal details
+ * `helper-response`: `(response uint uint)` - Accumulator for processing
+* Returns: `(response uint uint)`
+
+## Interactions with Other Contracts
+
+* `.sbtc-token`: Calls `protocol-lock`, `protocol-burn-locked`, `protocol-mint`, and `protocol-unlock` for token operations.
+* `.sbtc-registry`: Calls `create-withdrawal-request`, `get-withdrawal-request`, `get-current-signer-data`, `complete-withdrawal-accept`, and `complete-withdrawal-reject` for managing withdrawal requests and signer data.
+
+## Security Considerations
+
+{% stepper %}
+{% step %}
+### Access Control
+
+Only the current signer principal can accept or reject withdrawal requests.
+{% endstep %}
+
+{% step %}
+### Dust Limit
+
+Enforces a minimum withdrawal amount to prevent spam and ensure economic viability.
+{% endstep %}
+
+{% step %}
+### Fee Management
+
+Ensures that the actual fee doesn't exceed the maximum fee set by the user.
+{% endstep %}
+
+{% step %}
+### Address Validation
+
+Implements thorough validation of Bitcoin address formats.
+{% endstep %}
+
+{% step %}
+### State Management
+
+Prevents double-processing of withdrawal requests.
+{% endstep %}
+{% endstepper %}
+
+## Bitcoin Address Types
+
+The contract supports various Bitcoin address types, including:
+
+* P2PKH (Pay-to-Public-Key-Hash)
+* P2SH (Pay-to-Script-Hash)
+* P2SH-P2WPKH (P2SH nested P2WPKH)
+* P2SH-P2WSH (P2SH nested P2WSH)
+* P2WPKH (Pay-to-Witness-Public-Key-Hash)
+* P2WSH (Pay-to-Witness-Script-Hash)
+* P2TR (Pay-to-Taproot)
+
+Each address type is represented by a specific version byte and hashbytes format in the recipient structure.
diff --git a/docs/learn/sbtc/core-features.md b/docs/learn/sbtc/core-features.md
new file mode 100644
index 0000000000..8336ae30d5
--- /dev/null
+++ b/docs/learn/sbtc/core-features.md
@@ -0,0 +1,50 @@
+# Core Features
+
+sBTC offers several core features that make it a powerful trust-minimized Bitcoin bridge between Stacks and Bitcoin:
+
+{% stepper %}
+{% step %}
+### 1:1 Bitcoin Backing
+
+Each sBTC token is backed by an equivalent amount of Bitcoin in the peg wallet. This ensures that sBTC maintains a stable value relative to BTC.
+{% endstep %}
+
+{% step %}
+### Decentralized Management
+
+The sBTC peg wallet is maintained and managed by a set of sBTC signers. This decentralized approach enhances security and reduces single points of failure.
+{% endstep %}
+
+{% step %}
+### Quick Conversions
+
+sBTC facilitates rapid movement between BTC and sBTC:
+
+* BTC to sBTC conversion can be completed within 3 Bitcoin blocks
+* sBTC to BTC conversion can be completed within 6 Bitcoin blocks
+{% endstep %}
+
+{% step %}
+### SIP-010 Compatibility
+
+sBTC adheres to the SIP-010 fungible token standard on the Stacks blockchain. This ensures wide compatibility with Stacks wallets and applications.
+{% endstep %}
+
+{% step %}
+### Community Governance
+
+The initial sBTC signing set is determined by a community vote, weighted by STX holdings. This approach ensures that the community has a say in the management of the sBTC system.
+{% endstep %}
+
+{% step %}
+### Signer Key Rotation
+
+sBTC signers have the ability to rotate their private keys, enhancing long-term security of the system.
+{% endstep %}
+
+{% step %}
+### Transaction Fee Sponsorship
+
+sBTC transactions on Stacks can be sponsored, allowing users to pay transaction fees in sBTC instead of STX.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/learn/sbtc/emily-api.md b/docs/learn/sbtc/emily-api.md
new file mode 100644
index 0000000000..a459ab91ea
--- /dev/null
+++ b/docs/learn/sbtc/emily-api.md
@@ -0,0 +1,138 @@
+# Emily API
+
+[Emily](https://github.com/stacks-network/sbtc/tree/main/emily) is an API that helps facilitate and supervise the sBTC Bridge, serving as a programmatic liaison between sBTC users and signers.
+
+## Overview
+
+The Emily API is designed to track deposits and withdrawals, providing information about the status of in-flight sBTC operations. It serves two primary user groups: sBTC users and sBTC app developers.
+
+## Why Emily?
+
+The Emily API is given an indirect name because it handles more than just Deposits and Withdrawals; it can detect the health of the system and will likely be extended to handle more as user requirements mature. It was once called the “Revealer API”, which stopped making sense after a few design changes, and then “Deposit API” which also stopped making sense after a few changes. The most obvious choice “sBTC API” gives the wrong impression of what the API is responsible for as well, since the API itself isn’t managing the entirety of the protocol.
+
+Large companies name their APIs after something loosely related but ambiguous enough that extensions of the API don’t make the original name of the API misleading. Following this, we chose “Emily” after Emily Warren Roebling who was the liaison between the builders and chief engineer, her husband, of the Brooklyn bridge. She was, in effect, the supervisor of the bridge’s construction; similarly, the Emily API supervises the sBTC bridge and liaises between the users of the protocol and the sBTC signers.
+
+## Key Features
+
+* Track Deposits: Monitor the process of converting BTC to sBTC.
+* Track Withdrawals: Monitor the process of converting sBTC back to BTC.
+* Provide Operation Status: Offer real-time status updates for ongoing sBTC operations.
+* Retrieve Historical Data: Allow querying of past sBTC operations.
+
+## Core Concepts
+
+### sBTC Operations
+
+sBTC operations are the fundamental processes tracked by Emily:
+
+* Deposits: Converting BTC to sBTC
+* Withdrawals: Converting sBTC back to BTC
+
+### Operation States
+
+Each sBTC operation goes through several states:
+
+* PENDING: The operation has been initiated.
+* ACCEPTED: The operation has been approved by the signers.
+* CONFIRMED: The operation has been completed and confirmed on the blockchain.
+* FAILED: The operation could not be completed.
+
+## Interaction Flows
+
+### Deposit Flow
+
+{% stepper %}
+{% step %}
+### User creates a deposit transaction on Bitcoin
+
+User creates a deposit transaction on Bitcoin.
+{% endstep %}
+
+{% step %}
+### User submits proof of deposit to the Deposit API
+
+User submits proof of deposit to the Deposit API.
+{% endstep %}
+
+{% step %}
+### Emily records the deposit as PENDING
+
+Emily records the deposit as PENDING.
+{% endstep %}
+
+{% step %}
+### Signers validate and vote on the deposit
+
+Signers validate and vote on the deposit.
+{% endstep %}
+
+{% step %}
+### If accepted, Emily updates status to ACCEPTED
+
+If accepted, Emily updates status to ACCEPTED.
+{% endstep %}
+
+{% step %}
+### Signers process the Bitcoin transaction
+
+Signers process the Bitcoin transaction.
+{% endstep %}
+
+{% step %}
+### Signers mint sBTC on Stacks
+
+Signers mint sBTC on Stacks.
+{% endstep %}
+
+{% step %}
+### Emily updates the deposit status to CONFIRMED
+
+Emily updates the deposit status to CONFIRMED.
+{% endstep %}
+{% endstepper %}
+
+### Withdrawal Flow
+
+{% stepper %}
+{% step %}
+### User initiates withdrawal through the sBTC Clarity contract
+
+User initiates withdrawal through the sBTC Clarity contract.
+{% endstep %}
+
+{% step %}
+### Emily records the withdrawal as PENDING
+
+Emily records the withdrawal as PENDING.
+{% endstep %}
+
+{% step %}
+### Signers decide to accept or reject the withdrawal
+
+Signers decide to accept or reject the withdrawal.
+{% endstep %}
+
+{% step %}
+### If accepted, Emily updates status to ACCEPTED
+
+If accepted, Emily updates status to ACCEPTED.
+{% endstep %}
+
+{% step %}
+### Signers process the Bitcoin transaction
+
+Signers process the Bitcoin transaction.
+{% endstep %}
+
+{% step %}
+### Signers burn sBTC on Stacks
+
+Signers burn sBTC on Stacks.
+{% endstep %}
+
+{% step %}
+### Emily updates the withdrawal status to CONFIRMED
+
+Emily updates the withdrawal status to CONFIRMED.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/learn/sbtc/peg-wallet-utxo.md b/docs/learn/sbtc/peg-wallet-utxo.md
new file mode 100644
index 0000000000..7cbb7765ed
--- /dev/null
+++ b/docs/learn/sbtc/peg-wallet-utxo.md
@@ -0,0 +1,60 @@
+# Peg Wallet UTXO
+
+The Peg Wallet UTXO is a fundamental element of the sBTC system, serving as the Bitcoin backing for all sBTC tokens in circulation. The system uses a Single UTXO Model: the sBTC peg wallet is consistently represented as a single Unspent Transaction Output (UTXO) on the Bitcoin blockchain. This design offers simplicity and improved efficiency in managing the peg wallet.
+
+## Overview
+
+* Single UTXO Model: the peg wallet is always a single UTXO.
+* Responsibility: UTXO management is performed by the Signer set.
+* Purpose: simplify tracking and management, reduce Bitcoin transactions required for sBTC operations, and centralize funds in a single, well-secured output.
+
+## How the Single UTXO is maintained
+
+{% stepper %}
+{% step %}
+### Constructing the new UTXO
+
+A Signer coordinator constructs the UTXO by creating a new Bitcoin output that will represent the peg wallet going forward.
+{% endstep %}
+
+{% step %}
+### Consolidating requests into a batch
+
+The Signer set collectively consolidates all deposit and withdrawal requests and creates optimized batches that can be processed within a single UTXO.
+{% endstep %}
+
+{% step %}
+### Creating the new UTXO from the previous UTXO
+
+The new UTXO is created by:
+
+* spending the amount from the previous UTXO,
+* adding confirmed deposits,
+* subtracting confirmed withdrawals.
+{% endstep %}
+
+{% step %}
+### Optimizing batching with approval sets
+
+When multiple sBTC operation requests are present, the Signer coordinator groups them by approval sets. If differing approval sets exist across active operations, the coordinator batches deposit UTXOs into groups with the maximum size per approval set to preserve the single UTXO invariant while maximizing batch efficiency.
+{% endstep %}
+{% endstepper %}
+
+## Benefits
+
+* Simplified tracking and management of peg funds.
+* Fewer Bitcoin transactions for sBTC operations.
+* Centralized funds in a single, well-secured output improves operational efficiency.
+
+{% hint style="info" %}
+The Single UTXO Model is designed to balance simplicity and operational efficiency for the sBTC peg wallet.
+{% endhint %}
+
+## Security considerations
+
+* The single UTXO is managed by the sBTC Bootstrap Signer Set, which requires a threshold of signers to approve any spending (multi-signature).
+* Regular audits and continuous monitoring are essential to ensure the UTXO accurately represents the total sBTC in circulation at all times.
+
+{% hint style="warning" %}
+Security is paramount: multi-signature approval, audits, and monitoring are core controls to protect the peg wallet.
+{% endhint %}
diff --git a/docs/learn/sbtc/sbtc-audits.md b/docs/learn/sbtc/sbtc-audits.md
new file mode 100644
index 0000000000..c7ef6b4f76
--- /dev/null
+++ b/docs/learn/sbtc/sbtc-audits.md
@@ -0,0 +1,11 @@
+# sBTC Audits
+
+Several third-party security audits have been conducted on the sBTC system and can be referenced here.
+
+{% file src="../.gitbook/assets/Ottersec - stacks_wsts_audit_final.pdf" %}
+
+{% file src="../.gitbook/assets/Ottersec - stacks_sbtc_audit_final.pdf" %}
+
+{% file src="../.gitbook/assets/CoinFabrik_WSTS.pdf" %}
+
+{% file src="../.gitbook/assets/Clarity Alliance - sBTC-2.pdf" %}
diff --git a/docs/learn/sbtc/sbtc-faq.md b/docs/learn/sbtc/sbtc-faq.md
new file mode 100644
index 0000000000..ac60f12fca
--- /dev/null
+++ b/docs/learn/sbtc/sbtc-faq.md
@@ -0,0 +1,262 @@
+# sBTC FAQ
+
+### sBTC Basics
+
+
+
+What is sBTC?
+
+sBTC is a decentralizedl 1:1 Bitcoin-backed asset on the Stacks Bitcoin Layer. Read more about Stacks [here](https://www.stacks.co/) and sBTC [here](https://www.stacks.co/sbtc).
+
+
+
+
+
+How does sBTC work?
+
+sBTC as a SIP-010 tokensBTC is a SIP-010 token on the Stacks blockchain that represents Bitcoin (BTC) in a 1:1 ratio. sBTC is always backed 1:1 against BTC.Peg wallet and signersThe sBTC peg wallet is maintained and managed by a set of sBTC signers. This decentralized approach enhances security and reduces single points of failure. Read more about Stacker Signing here.
+
+
+
+
+
+What is Bitcoin Finality, and why is it important?
+
+Stacks and sBTC state automatically fork with Bitcoin. As such, all transactions settle to Bitcoin with 100% Bitcoin Finality. This protects users against attacks to sBTC via a hard fork. This is a critical security measure that aligns sBTC security with Bitcoin. Read more in [the Stacks Documentation](https://docs.stacks.co/concepts/block-production/bitcoin-finality).
+
+
+
+
+
+How does the Stacks Signer network improve security?
+
+Signers are responsible for approving all sBTC deposit and withdrawal operations, ensuring the integrity of the system. With a requirement of 70% consensus for transaction approval, Signers maintain the protocol's liveness and security.
+
+To launch sBTC, the Stacks community approved [SIP-028](https://github.com/stacksgov/sips/blob/69d40a5f4f0ad98eb448ba44e7c31ca054820aa3/sips/sip-028-sbtc_peg.md), defining the criteria for selecting signers based on factors such as technical expertise, reliability, performance, and decentralization. An initial group of 15 institutional Signers has been chosen for Phase 1 to maintain simplicity and reduce operational risks. This group will expand over time as the protocol matures.
+
+The list of sBTC signers is public and listed [here](https://bitcoinl2labs.com/sbtc-rollout#sbtc-signers).
+
+
+
+
+
+What security measures have been put in place to ensure sBTC is safe?
+
+sBTC is always backed 1:1 against BTC, and it's verifiably secure through threshold cryptography. sBTC removes the need for 3rd party custodian or trusted setup. Instead, BTC is secured by a decentralized signer set.
+
+Partnerships with top-tier security experts have been established to ensure the protocol is fortified at every level:
+
+Asymmetric ResearchAsymmetric Research is a core security contributor. Known for their rigorous research and protocol audits, Asymmetric brings security expertise to sBTC to identify and mitigate potential vulnerabilities.ImmuneFiA robust bug bounty program incentivizes ethical hackers to uncover and address potential issues, adding an additional layer of defense.3rd Party AuditsSeveral third-party security audits have been conducted on the sBTC system and can be referenced on the sBTC Audits page.
+
+
+
+
+
+What sets sBTC apart?
+
+Here are the main differentiating characteristics of sBTC:
+
+* sBTC is a true Bitcoin native product
+* sBTC is backed by respected leaders in the Bitcoin community (signer network)
+* sBTC's security is provided by a decentralized network of validators/signers rather than a single custodian, removing the need to trust a single entity or exchange
+* sBTC leverages 100% Bitcoin finality
+* sBTC's technology offers optimal UX and DevEx for an L2
+* sBTC is a fully transparent project/product working in the open with public code
+
+
+
+
+
+Where can I learn more about the sBTC signers?
+
+Read the "[Selection of sBTC Signer Set](https://github.com/stacks-network/sbtc/discussions/624)" post for more information about each signer and their qualifications.
+
+
+
+### sBTC Rewards Program
+
+
+
+Where does the yield paid in BTC come from?
+
+The sBTC Rewards Program is powered by a group of Stackers "Stacking" STX to a designated reward address, contributing their BTC rewards to the program.
+
+When Stacking STX, Stackers receive BTC through Stack's [Proof-of-Transfer](https://docs.stacks.co/concepts/stacks-101/proof-of-transfer) (PoX) consensus mechanism. For example, over a given 2-week period, the Stacks protocol has historically [distributed around 10% APY to Stackers](https://www.stacking-tracker.com/), paid in BTC.
+
+To enable the sBTC Rewards Program, these stackers contribute the corresponding Proof of Transfer BTC rewards to the sBTC incentive pool. This BTC from the incentive pool is directly deposited into a smart contract that bridges the BTC to sBTC and distributes the rewards pro rata to sBTC holders.
+
+The program is designed to increase sBTC liquidity and drive early usage of the protocol.
+
+Here's a handy illustration to show the sBTC incentives design:
+
+
+
+
+
+How are rewards distributed?
+
+sBTC is automatically distributed every two weeks to the STX address used to enroll in your non-custodial wallet.
+
+
+
+
+
+What do I have to do to be eligible for rewards?
+
+To be eligible, you must enroll in the rewards program at bitcoinismore.org.
+
+
+
+
+
+Do I need to re-enroll in the sBTC Rewards Program if I previously enrolled in the sBTC Rewards Program and have received additional sBTC?
+
+No re-enrollment is needed. The Yield smart contract will automatically calculate enrolled users updated balance, as long as the sBTC contract address remains the same.
+
+
+
+
+
+What level of rewards should I expect?
+
+The level of rewards users can expect will vary based on the amount of STX in the rewards pool, the PoX yield rate, and the amount of sBTC that has been minted.
+
+
+
+
+
+What is the difference between PoX Rewards and the sBTC Rewards Program?
+
+PoX Bitcoin rewards are earned by Stackers who lock up their STX tokens to secure the Stacks network, a process that has been ongoing since the launch of Stacks.
+
+The sBTC Rewards Program, on the other hand, offers additional BTC rewards specifically for early adopters who hold sBTC without requiring them to participate in network consensus or lock up any tokens.
+
+
+
+### Using sBTC
+
+
+
+When will sBTC be available?
+
+sBTC deposits first went live on December 16, 2024, quickly hitting the 1,000 BTC cap. The second cap will go live on February 25th, 2025, quickly hitting the 3,000 BTC cap. Withdrawals went live on April 30, 2025.
+
+Full decentralization of the Signer set will follow in [a subsequent phase](https://bitcoinl2labs.com/sbtc-rollout), gradually expanding beyond the initial 15 community-elected signers.
+
+
+
+
+
+What wallets are supported for sBTC?
+
+[Xverse](https://www.xverse.app/) and [Leather](https://leather.io/) wallets are supported — two leading wallets with seamless integrations designed for Bitcoin and Stacks users.
+
+In addition, [Ledger](https://www.ledger.com/) and [Asigna](https://www.asigna.io/) support sBTC.
+
+We are actively working with institutional custodians, staking providers, and other 3rd party wallets to support sBTC. More will be announced.
+
+
+
+
+
+Why is there a .01 BTC minimum for BTC to sBTC deposits?
+
+A .01 BTC minimum is imposed for BTC to sBTC deposits to ensure the system does not get spammed by many smaller transactions. We are exploring reducing the deposit minimum for future phases.
+
+
+
+
+
+What are the steps to use the sBTC Bridge and earn rewards?
+
+In the Stacks Documentation, find a [video](https://www.youtube.com/watch?v=XZruuDgTo4k\&t=1s) and a [more detailed walkthrough](https://docs.stacks.co/guides-and-tutorials/sbtc/how-to-use-the-sbtc-bridge).
+
+Ensure BTC is accessible in a supported walletEnsure BTC is accessible via one of the following non-custodial wallets: Xverse, Leather, Ledger, or Asigna.Connect your wallet to the sBTC appTo interact with the sBTC protocol and mint sBTC, head to app.stacks.co and connect your non-custodial wallet with BTC ready to deposit.Enter BTC amountEnter the BTC amount to convert to sBTC (app.stacks.co will guide you through this step).Provide your Stacks receiving addressEnter your Stacks receiving address to initiate the transfer (app.stacks.co will guide you through this step).Enroll in the rewards programAfter your sBTC has been minted to your wallet, visit the rewards program site at bitcoinismore.org and connect your wallet. Then click the 'Earn Rewards' button. Read more in the Stacks Documentation.Start earningSeamlessly start earning sBTC rewards. sBTC is automatically paid every two weeks to the STX address used to enroll in your non-custodial wallet.Note: There is an initial lock-up period until withdrawals are activated in March. Following the lock-up period, sBTC can always be withdrawn.
+
+
+
+
+
+How long will it take for my BTC deposit to confirm?
+
+sBTC facilitates rapid movement between BTC and sBTC.
+
+BTC to sBTCBTC to sBTC conversion can be completed within 3 Bitcoin blocks (under an hour).sBTC to BTCsBTC to BTC conversion can be completed within 6 Bitcoin blocks (Approximately two hours)
+
+Read more in the [Stacks Documentation](https://docs.stacks.co/concepts/sbtc/operations/deposit-withdrawal-times).
+
+
+
+
+
+Why is there a cap on the total BTC pegged in?
+
+A BTC cap will be implemented to ensure a smooth rollout process with a focus on security.
+
+In addition, the BTC cap will give developers the time to focus on the sBTC user experience and integration with DeFi applications across the Stacks ecosystem prior to opening sBTC for all users.
+
+
+
+
+
+Are there any associated fees with minting sBTC?
+
+There are two transaction fees required to mint your sBTC. The first is set by the user manually when they initiate the deposit transaction within their wallet.
+
+The second is a fee used to consolidate the deposit UTXOs into the single signer UTXO. This separate transaction fee happens automatically and is set to a max of 80k sats. This is automatically deducted from your minted sBTC. This is not a signer fee but a regular Bitcoin transaction fee.
+
+
+
+
+
+Are there multi-signature solutions for sBTC?
+
+Yes. [Asigna](https://www.asigna.io/) provides a multi-signature solution for sBTC users.
+
+
+
+
+
+Are custodians available to support sBTC?
+
+At the moment, there is no custodian support for sBTC. However, we are actively working with institutional custodians to support sBTC.
+
+Copper and BitGo already support Stacks and Stacking; however, we are working to prioritize SIP-10 and sBTC integration.
+
+
+
+### sBTC Troubleshooting
+
+
+
+My Bitcoin transaction confirmed, but I'm not seeing the sBTC token in my wallet.
+
+You may need to enable the display of the sBTC token within your wallet by clicking on 'Manage Tokens' and enabling sBTC.
+
+
+
+
+
+I received an "Errors.Invalid_Transaction" error when using an Xverse Wallet
+
+If you received a "Errors.Invalid\_Transaction" error when using an Xverse Wallet, you may be using a "Nested SegWit" wallet. To resolve the issue, change your Xverse wallet to use the "Native SegWit".
+
+
+
+
+
+sBTC still isn't showing up in wallet after 3 Bitcoin blocks. How much longer do I have to wait?
+
+BTC to sBTC conversions are typically completed within 3 Bitcoin blocks. Due to the speed of Bitcoin blocks, deposits can take up to two hours to see sBTC in your wallet.
+
+However, there may be a lag with your Leather or Xverse wallet where the sBTC will take another 20 minutes to show up in the wallet.
+
+
+
+
+
+I didn't receive a confirmation that I enrolled in the rewards program. How can I ensure I'm enrolled?
+
+Visit [bitcoinismore.org](https://bitcoinismore.org/). On the enroll page, when your wallet is linked, it will say enrolled if you are enrolled in the program.
+
+
diff --git a/docs/learn/sbtc/sbtc-operations/README.md b/docs/learn/sbtc/sbtc-operations/README.md
new file mode 100644
index 0000000000..6c13733b17
--- /dev/null
+++ b/docs/learn/sbtc/sbtc-operations/README.md
@@ -0,0 +1,17 @@
+# sBTC Operations
+
+This section covers the main operations in the sBTC system. These operations form the core functionality of sBTC, allowing users to move value between the Bitcoin and Stacks ecosystems.
+
+{% stepper %}
+{% step %}
+### Deposit
+
+Converting BTC to sBTC.
+{% endstep %}
+
+{% step %}
+### Withdrawal
+
+Converting sBTC back to BTC.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/learn/sbtc/sbtc-operations/deposit-vs-withdrawal-times.md b/docs/learn/sbtc/sbtc-operations/deposit-vs-withdrawal-times.md
new file mode 100644
index 0000000000..ba2e3379e5
--- /dev/null
+++ b/docs/learn/sbtc/sbtc-operations/deposit-vs-withdrawal-times.md
@@ -0,0 +1,37 @@
+# Deposit vs Withdrawal Times
+
+## Why are Deposits So Fast and Withdrawals So Slow?
+
+sBTC allows users to use their BTC on the Stacks L2 by using a wrapped token called sBTC. Moving sBTC onto the Stacks L2 can take as little time as 1 Bitcoin block, but moving sBTC off the Stacks L2 into the native Bitcoin blockchain takes 6 Bitcoin blocks. Why is that?
+
+To understand why moving onto the Stacks layer can be so fast and yet moving off must be so slow, we need to first understand the consensus mechanism of the Stacks blockchain.
+
+The Stacks blockchain uses a consensus mechanism called proof of transfer, or PoX, in order to mint new blocks. On each Bitcoin block miners on the Stacks blockchain each sacrifice some amount of Bitcoin in a bid to win the right to make the next few Stacks blocks, where they retain the right to keep making Stacks blocks until the next Bitcoin block occurs and the latest bidding round elects a new Miner. Signers (validators equivalents for the Stacks Blockchain) look at the Bitcoin blocks and approve new Stacks blocks based on which miner currently has the right to make Stacks blocks, and they only approve new blocks from the Signers that won the most recent bid on the Bitcoin block within the fork that they collectively consider to be the “best”. The Stacks blockchain can only have new blocks added if the Signers agree that the miner who proposed it is the winner of the bid on the Bitcoin blockchain, and all the Signers are voting on which block should be added, effectively collectively deciding which Bitcoin fork is the best one.
+
+Here’s an important part: if the Signers believe that there’s a new and better Bitcoin fork that differs from the one that the last several Stacks blocks had been mined on, they’ll then only approve new Stacks blocks that build off of Stacks blocks that are tied to that new fork. As in, every Stacks block that was built on Bitcoin Blocks in the other Bitcoin fork that aren’t in this new fork are considered invalid; thus the Stacks blockchain forks too.
+
+A simple way to say this: “The Stacks blockchain forks with the Bitcoin blockchain.”
+
+Now that we understand this forking mechanism, let's take a look at why moving off the Stacks layer must be so slow.
+
+sBTC exists on the Stacks layer as a token that smart contracts can interact with. To move sBTC over from the Stacks layer to the Bitcoin layer the owner of the sBTC calls a smart contract to initiate what we call the “withdrawal” sequence. This lets the “sBTC Signers” (these are different from the earlier Signers mentioned) know that they need to create a transaction on the Bitcoin blockchain to distribute the BTC back to the user.
+
+If the signers create a Bitcoin transaction to enact the withdrawal they can’t take it back, and it will be valid on every fork of the Bitcoin blockchain. So what happens if, say, the bitcoin blockchain forks and the withdrawal on the Stacks layer got reorganized out? Then there’s an irretrievable withdrawal transaction on the Bitcoin blockchain giving precious BTC to a user who never withdrew their sBTC on the Stacks layer.
+
+
+
+Can the Signers that maintain the original chain force miners to replay all previously confirmed transactions?
+
+The Stacks blockchain is a true Layer 2 on top of Bitcoin, and you can write a smart contract to have different behavior based on observations of the Bitcoin blockchain underneath. You can, for example, write a Stacks contract that says “Pay to Jeff if the latest Bitcoin block hash ends in an even hex digit, and pay to Abigail if it’s an odd hex digit.” Now when there’s a reorg of the Bitcoin blockchain you can replay this transaction which originally paid to Jeff, but it now pays to Abigail, and what happens if this contract was giving out sBTC, and further what happens if Jeff then immediately executed a withdrawal?
+
+
+
+So in the end, to process a withdrawal safely you need to be sufficiently sure it won’t get reorganized out. That means it can only be processed 6 Bitcoin blocks (the finality criteria the Signers are comfortable with) after the withdrawal was made on the Stacks blockchain.
+
+But then, why can deposits be done in one Bitcoin block at its fastest?
+
+Remember how Stacks forks with Bitcoin? Let's say someone makes a deposit on the Bitcoin blockchain in an attempt to mint sBTC, and then lets say the sBTC Signers immediately mint sBTC. What happens if the Bitcoin chain forks causing the Stacks blockchain to fork? The mint gets reorganized out! Sure, the deposit is no longer on the Bitcoin blockchain, but it’s not on the Stacks blockchain either. If that deposit doesn’t ever arrive on the Bitcoin blockchain the sBTC signers will never mint sBTC, so there’s nothing to take back!
+
+So all in all, for movements of sBTC from the Stacks layer into the Bitcoin layer the protocol needs to wait for Bitcoin to be sufficiently final, but movements from the Bitcoin layer to the Stacks layer don’t need to wait for finality to mint because the Stacks layer will just reorganize itself if the Bitcoin layer reorganizes too.
+
+But then conceptually remember, the mint call on the Stacks blockchain is just as final as the Bitcoin block that contains the deposit of BTC onto the Stacks layer. If you’re minting sBTC on the Stacks layer and you want to wait for it to be final you’ll need to wait a suitable number of Bitcoin blocks to consider it finally minted, but that’s up to you and not the sBTC Signers.
diff --git a/docs/learn/sbtc/sbtc-operations/deposit.md b/docs/learn/sbtc/sbtc-operations/deposit.md
new file mode 100644
index 0000000000..0fa87a9a5e
--- /dev/null
+++ b/docs/learn/sbtc/sbtc-operations/deposit.md
@@ -0,0 +1,43 @@
+# Deposit
+
+The deposit operation enables users to mint sBTC, anchored to the BTC they have placed in the threshold wallet on the Bitcoin chain. This process can be completed within a single Bitcoin block, streamlining the user experience.
+
+## Process Overview
+
+
+
+The deposit process begins when a user initiates a specific Bitcoin transaction that has two outputs. The depositor (usually through the application they are using to deposit) then initiates an API call referencing that Bitcoin transaction. This call triggers the Emily API, which relays deposit information to the sBTC Signers. These signers verify and process the deposit. Once verified, an equivalent amount of sBTC is minted on the Stacks blockchain.
+
+{% stepper %}
+{% step %}
+### Script output
+
+A script that lets the signers spend the funds.
+{% endstep %}
+
+{% step %}
+### Time-locked output
+
+A time lock that allows the depositor to reclaim the funds if necessary.
+{% endstep %}
+{% endstepper %}
+
+The deposit is usually completed within a single Bitcoin block, but is guaranteed to be completed within 3. For more information on deposit and withdrawal confirmation times and why deposits can be so fast, check out the [Deposit and Withdrawal Times](deposit-vs-withdrawal-times.md) doc.
+
+## Bitcoin Deposit Requirements
+
+For a deposit to be considered valid, it must adhere to specific requirements:
+
+* The deposit must be made to a taproot address.
+* The output must be spendable by a consensus threshold of signers.
+* The deposit must follow a format that prevents short-term clawbacks, ensuring the security and integrity of the system.
+
+## User Experience
+
+From a user's perspective, the deposit process is straightforward:
+
+1. Initiate a BTC transaction to the specified address.
+2. Wait for the transaction to be confirmed on the Bitcoin blockchain.
+3. Receive the equivalent amount of sBTC in the Stacks wallet once the deposit is verified and processed.
+
+To enhance the user experience, an sBTC bridge web application is currently in development which will provide an intuitive interface for users to track the status of their deposit operations, allowing users to stay informed throughout the process from initiation to completion.
diff --git a/docs/learn/sbtc/sbtc-operations/withdrawal.md b/docs/learn/sbtc/sbtc-operations/withdrawal.md
new file mode 100644
index 0000000000..36ff4fbf42
--- /dev/null
+++ b/docs/learn/sbtc/sbtc-operations/withdrawal.md
@@ -0,0 +1,73 @@
+# Withdrawal
+
+The sBTC withdrawal operation enables users to convert their sBTC back to BTC. This process involves burning sBTC on the Stacks blockchain and releasing an equivalent amount of BTC on the Bitcoin blockchain.
+
+## Process Overview
+
+
+
+
+
+{% stepper %}
+{% step %}
+### Initiate withdrawal
+
+A user initiates a Clarity contract call (via a Stacks wallet or dApp) specifying:
+
+* the amount of sBTC to withdraw
+* the destination Bitcoin address
+{% endstep %}
+
+{% step %}
+### Stacks transaction finality
+
+The Stacks transaction must reach finality. The protocol requires six Bitcoin block confirmations before proceeding to the next step.
+{% endstep %}
+
+{% step %}
+### Signer verification and BTC release
+
+After confirmations, sBTC Signers verify the withdrawal request and create the withdrawal transaction on the Bitcoin network, releasing the equivalent BTC to the specified Bitcoin address.
+{% endstep %}
+{% endstepper %}
+
+The withdrawal process requires six Bitcoin block confirmations to complete. After these confirmations, sBTC Signers create the withdrawal transaction on the Bitcoin network.
+
+## Withdrawal Confirmation
+
+The six-block confirmation requirement serves multiple purposes:
+
+* Ensures finality of the Stacks transaction and prevents potential reversals or conflicts.
+* Mitigates issues from potential Bitcoin forks by allowing time for network stability.
+* Gives sBTC Signers sufficient time to verify and process the withdrawal request accurately.
+
+For more information on deposit and withdrawal confirmation times and why deposits can be faster than withdrawals, see the [Deposit and Withdrawal Times](https://app.gitbook.com/u/ZrQItu6D9bMKmf1HfsLTnGc05WZ2) doc.
+
+## Failure Cases
+
+Some withdrawal failures can be identified and resolved before the six confirmations are complete. Other failures may only become apparent after the sBTC Bootstrap Signer attempts to create the withdrawal transaction on the Bitcoin network. These delays stem from the complexity of cross-chain operations and the need for thorough verification at each step.
+
+
+
+More about failure detection timing
+
+Because cross-chain operations involve verification on both Stacks and Bitcoin, certain issues (for example: insufficient signer consensus, malformed Bitcoin transaction construction, or Bitcoin network conditions) may only be detectable when the signer attempts to broadcast the Bitcoin transaction. This can cause failure detection to occur after confirmations on Stacks are already complete.
+
+
+
+## Security Considerations
+
+{% hint style="info" %}
+The multi-block confirmation process is a critical security measure to help prevent double-spending attempts. Requiring multiple block confirmations ensures the withdrawal request is valid and final before processing on the Bitcoin network. Additionally, sBTC Signers perform verification of each withdrawal request prior to creating the Bitcoin transaction, providing an extra security layer.
+{% endhint %}
+
+## User Experience
+
+From a user's perspective:
+
+* Initiate a withdrawal through a Stacks wallet or dApp.
+* Specify the sBTC amount and destination Bitcoin address.
+* Wait for the required six Bitcoin blocks to confirm.
+* Once confirmations complete and signers process the request, BTC is sent to the specified Bitcoin address.
+
+The sBTC bridge web application offers a user-friendly interface that lets users track the status of their withdrawal operations in real time, providing updates at each stage so users can understand progress and estimate when they will receive BTC.
diff --git a/docs/learn/sbtc/walkthroughs/README.md b/docs/learn/sbtc/walkthroughs/README.md
new file mode 100644
index 0000000000..b3862d07e7
--- /dev/null
+++ b/docs/learn/sbtc/walkthroughs/README.md
@@ -0,0 +1,5 @@
+# Walkthroughs
+
+These walkthroughs describe at a high level exactly how users and signers can expect to interact with the sBTC system.
+
+Read these to get a firm understanding of what is actually happening under the hood of the sBTC system.
diff --git a/docs/learn/sbtc/walkthroughs/sbtc-transaction-walkthrough.md b/docs/learn/sbtc/walkthroughs/sbtc-transaction-walkthrough.md
new file mode 100644
index 0000000000..274116f343
--- /dev/null
+++ b/docs/learn/sbtc/walkthroughs/sbtc-transaction-walkthrough.md
@@ -0,0 +1,145 @@
+# sBTC Transaction Walkthrough
+
+Let's follow the journey of 1 BTC as it moves through the sBTC system, from initial deposit to final withdrawal.
+
+## Part 1: Deposit (BTC → sBTC)
+
+{% stepper %}
+{% step %}
+### Initiation
+
+* Alice decides to convert 1 BTC to sBTC to participate in Stacks DeFi.
+* Alice creates a deposit transaction on the Bitcoin network (typically via a UI such as the sBTC bridge or a DeFi application).
+* The transaction enters the Bitcoin mempool.
+{% endstep %}
+
+{% step %}
+### Proof Submission
+
+* Alice submits proof of her deposit to the Deposit API (usually via the application's UI).
+* The Deposit API sets the deposit status to PENDING.
+{% endstep %}
+
+{% step %}
+### Signer Validation
+
+The sBTC Signer Set:
+
+* Detects the deposit.
+* Validates the UTXO format.
+* Votes on the deposit.
+
+If the deposit is rejected:
+
+* Signers notify the API of the rejection.
+* The Deposit API updates the status to FAILED.
+
+If the deposit is accepted:
+
+* The Deposit API updates the status to ACCEPTED.
+{% endstep %}
+
+{% step %}
+### Bitcoin Transaction
+
+If accepted, the sBTC Signer Set:
+
+* Creates a new Bitcoin transaction consuming Alice's deposited BTC.
+* Broadcasts this transaction to the Bitcoin network.
+
+If this transaction fails:
+
+* Signers notify the API of the failure.
+* The Deposit API updates the status to FAILED.
+{% endstep %}
+
+{% step %}
+### sBTC Minting
+
+Upon successful Bitcoin transaction:
+
+* The sBTC Signer Set interacts with the Stacks blockchain.
+* They fulfill the deposit by minting 1 sBTC to Alice's Stacks address.
+{% endstep %}
+
+{% step %}
+### Confirmation
+
+* The Deposit API updates the deposit status to CONFIRMED.
+* Alice now has 1 sBTC in her Stacks wallet.
+{% endstep %}
+{% endstepper %}
+
+***
+
+## Part 2: sBTC Usage
+
+Alice can now use her 1 sBTC in the Stacks ecosystem:
+
+* Transfer it to other users via the `sbtc-token` contract (typically via an application UI).
+* Participate in DeFi applications.
+* Use it in any application that supports SIP-010 tokens.
+
+***
+
+## Part 3: Withdrawal (sBTC → BTC)
+
+{% stepper %}
+{% step %}
+### Initiation
+
+* Alice initiates a withdrawal by interacting with the Clarity contract on the Stacks blockchain.
+* She specifies her Bitcoin address for the withdrawal.
+* If successful, the contract locks her sBTC and the withdrawal status is set to PENDING.
+* If the transaction fails, no withdrawal occurs.
+{% endstep %}
+
+{% step %}
+### Signer Validation
+
+The sBTC Signer Set:
+
+* Detects the withdrawal request.
+* Decides whether to accept or reject the withdrawal.
+
+If the withdrawal is rejected:
+
+* Signers unlock the sBTC.
+* The withdrawal status is updated to FAILED.
+
+If the withdrawal is accepted:
+
+* The withdrawal status is updated to ACCEPTED.
+* Signers wait for 6 Bitcoin block confirmations (for security purposes).
+{% endstep %}
+
+{% step %}
+### Bitcoin Transaction
+
+After the waiting period, if accepted:
+
+* The sBTC Signer Set creates a new Bitcoin transaction fulfilling Alice's withdrawal.
+* They broadcast this transaction to the Bitcoin network.
+
+If this transaction fails:
+
+* Signers unlock the sBTC.
+* The withdrawal status is updated to FAILED.
+{% endstep %}
+
+{% step %}
+### sBTC Burning and Confirmation
+
+Upon successful Bitcoin transaction:
+
+* The sBTC Signer Set burns the locked 1 sBTC on the Stacks blockchain.
+* The withdrawal status is updated to CONFIRMED.
+{% endstep %}
+
+{% step %}
+### Completion
+
+* Alice now has her 1 BTC back in her specified Bitcoin address.
+* The withdrawn sBTC has been permanently removed from circulation.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/learn/sbtc/walkthroughs/signer-process-walkthrough.md b/docs/learn/sbtc/walkthroughs/signer-process-walkthrough.md
new file mode 100644
index 0000000000..6c2f81824a
--- /dev/null
+++ b/docs/learn/sbtc/walkthroughs/signer-process-walkthrough.md
@@ -0,0 +1,76 @@
+# Signer Process Walkthrough
+
+## Introduction
+
+This document provides a detailed overview of the sBTC system, focusing on the operations of an sBTC signer node. We'll explore the automated processes and software interactions that occur in the sBTC ecosystem.
+
+A step-by-step guide for setting up and running a sBTC signer node is in the works. This is a conceptual guide to help signers understand what their role looks like in the sBTC system.
+
+## Signer Node Setup
+
+As an sBTC signer, your primary responsibility is to run and maintain a signer node. Here's what that entails:
+
+{% stepper %}
+{% step %}
+### Hardware setup
+
+Ensure your node has sufficient computational power and storage.
+{% endstep %}
+
+{% step %}
+### Software installation
+
+Install the sBTC signer node software and its dependencies.
+{% endstep %}
+
+{% step %}
+### Key management
+
+The node software securely generates and stores the Bitcoin private key and corresponding public key.
+{% endstep %}
+
+{% step %}
+### Node registration
+
+Upon first run, the node automatically registers its public key with the sBTC Registry contract on the Stacks blockchain.
+{% endstep %}
+{% endstepper %}
+
+## Day-to-Day Operations
+
+Once set up, your signer node operates autonomously, performing the following tasks:
+
+{% stepper %}
+{% step %}
+### Monitoring Deposit Requests
+
+Your node continuously monitors for sBTC minting requests:
+
+* The node connects to the Bitcoin network and the Stacks blockchain.
+* It watches for Bitcoin transactions sent to the sBTC UTXO address.
+* When a deposit is detected, the node verifies the transaction details.
+{% endstep %}
+
+{% step %}
+### Processing Mint Requests
+
+Upon confirming a deposit:
+
+* The node automatically prepares a signature for the mint operation using its private key.
+* It submits this signature to the sBTC Deposit contract on the Stacks blockchain.
+* The contract verifies the signature and combines it with signatures from other signer nodes.
+* Once enough valid signatures are collected, the contract mints the corresponding amount of sBTC.
+{% endstep %}
+
+{% step %}
+### Handling Withdrawal Requests
+
+For sBTC withdrawal requests:
+
+* The node monitors the sBTC Withdrawal contract for new requests.
+* Upon detecting a request, it verifies the user's sBTC balance and the request's validity.
+* The node automatically signs the withdrawal operation and submits its signature.
+* Once enough signatures are collected and the sBTC is burned, the node participates in creating and signing a Bitcoin transaction to fulfill the withdrawal.
+* The signed Bitcoin transaction is broadcast to the Bitcoin network.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/learn/stacks-101/README.md b/docs/learn/stacks-101/README.md
new file mode 100644
index 0000000000..22bd03150b
--- /dev/null
+++ b/docs/learn/stacks-101/README.md
@@ -0,0 +1,7 @@
+# Stacks 101
+
+Stacks has a very unique technical model in the blockchain world. This section will help you get a high-level overview of the essential components to understand how Stacks works.
+
+We'll cover the basics of what Stacks is and how it works from both a philosophical and technical level, and you can dive into the further sections for more details.
+
+First up, let's get an overview of exactly what Stacks is.
diff --git a/docs/learn/stacks-101/bitcoin-connection.md b/docs/learn/stacks-101/bitcoin-connection.md
new file mode 100644
index 0000000000..a397f5a8fa
--- /dev/null
+++ b/docs/learn/stacks-101/bitcoin-connection.md
@@ -0,0 +1,165 @@
+# The Bitcoin Connection
+
+
source: Hiro Blog
+
+In the previous section, we described Stacks as bringing smart contract functionality to Bitcoin, without modifying Bitcoin itself, and explained a bit about how the chain works.
+
+That's a big promise, but how does Stacks actually deliver on it? And what makes Stacks unique among other Bitcoin layers and other blockchains like Ethereum?
+
+Before we get into the technical details of how Stacks works, it's important to get a high-level overview of the problem it's solving and how it actually does that. We'll dive deeper into some of these topics as we go through the docs, but it's good to get a high-level picture to bring everything together.
+
+This topic is a bit of a rabbit hole, and this section is pretty long, but it will give you an in-depth understanding of exactly the problem Stacks is looking to solve, and how it solves it.
+
+Let's get into it.
+
+### Is Stacks a Bitcoin L2?
+
+Stacks is a Bitcoin layer for smart contracts. The classification as a layer-1 (L1) or layer-2 (L2) or sidechain really depends on the definition used. With that said, generally speaking L1 chains are sovereign meaning that (a) they have their own security budget, and (b) they can survive without the need for any other L1 chain. L2 chains typically do not have their own security budget and share the security of the underlying L1 chain, and they cannot live without the underlying L1 chain. There are many different design mechanisms that L2s can use, and we cover several of them and how Stacks compares in the [Stacks Among Other Bitcoin Layers](stacks-among-other-layers.md) section.
+
+The initial release of Stacks in early 2021 had a separate security budget from Bitcoin L1. Even though the Stacks layer could not function without Bitcoin L1, the developers working on the project described it as a different system that does not fit neatly into existing classifications, sometimes using the term layer 1.5 (see [this Decrypt article](https://decrypt.co/82019/bitcoin-defi-thing-says-stacks-founder-muneeb-ali) for example).
+
+The upcoming planned release of Stacks, called the Nakamoto release, will no longer have a separate security budget from Bitcoin. Instead, a 100% of Bitcoin hashpower will determine finality on Stacks layer. After the next upgrade, to reorg Stacks blocks/transactions the attacker will need to reorg Bitcoin L1 itself (which is very hard to do and therefore a great security property for a Bitcoin layer to have). More details in the [Stacks paper](https://stacks.co/stacks.pdf).
+
+The definition of [L2 used in Ethereum](https://ethereum.org/en/layer-2/) and other newer ecosystems is different and focuses on the ability to withdraw assets using only L1 security and L1 miners. According to that definition Stacks layer is not a clear L2, given the set of peg-out signers determine if users can withdraw sBTC. Bitcoin cannot support such verification without changes to Bitcoin L1 (which may happen in the future). The Ethereum L2 definition also does not apply that cleanly to Bitcoin L2s, given new assets are issued on L2s when it comes to Bitcoin and not issued on L1 (only BTC is the L1 asset). Therefore, using the definition of security of withdrawing assets is not directly applicable given assets are defined and used on L2s and not withdrawn out to Bitcoin L1 anyway (with the exception of BTC itself). Rather, what becomes more important is "settlement on Bitcoin" i.e., is contract data and state secured by 100% of Bitcoin's hashpower or not.
+
+Remember that L2s on Bitcoin also have to serve the additional purpose of expanding both functionality and scalability, which means L2s accomplish fundamentally different goals depending on the functionality of the L1.
+
+Users and developers organically call Stacks a Bitcoin L2, since it is a simpler concept to understand. There are certain properties of Stacks layer that also help the concept of Stacks as a Bitcoin L2:
+
+{% stepper %}
+{% step %}
+### Bitcoin finality
+
+100% of the Bitcoin hashpower decides block ordering and transaction finality.
+{% endstep %}
+
+{% step %}
+### Consensus runs on Bitcoin L1
+
+Stacks consensus runs on Bitcoin L1, and Stacks L2 cannot operate or survive without Bitcoin L1.
+{% endstep %}
+
+{% step %}
+### sBTC and economic unit
+
+With the upcoming decentralized Bitcoin peg, called sBTC, most of the economy on Stacks layer will likely use BTC as the unit of economy. It is expected that most users will simply use Bitcoin in wallets and apps and then peg out their BTC to Bitcoin L1.
+{% endstep %}
+
+{% step %}
+### Data hashed and stored on Bitcoin L1
+
+All data and transactions on Stacks are automatically hashed and permanently stored on Bitcoin L1 on every Bitcoin block. Anyone can verify that some data on Stacks is valid by checking the corresponding hash on Bitcoin L1. This compact storage of hashes on L1 is somewhat similar to rollups (although there are other differences). You can read more about this process in the [Block Production](../block-production/) section.
+{% endstep %}
+
+{% step %}
+### Contracts can read Bitcoin L1
+
+Contracts on Stacks layer can read Bitcoin L1 transactions and respond to them. Assets on Stacks layer can be moved simply through Bitcoin L1 transactions.
+{% endstep %}
+{% endstepper %}
+
+Given all the details above, why would some people think that Stacks is not a Bitcoin L2? There are a couple of reasons this question comes up often:
+
+{% stepper %}
+{% step %}
+### Old security-budget material
+
+The initial version of Stacks (released early 2021) had a separate security budget which changed to following 100% Bitcoin hashpower with the Nakamoto release. There is old material and blog posts floating around that still talk about the initial Stacks version. The old materials will likely get updated with time.
+{% endstep %}
+
+{% step %}
+### Ethereum L2 withdrawal definition doesn't map cleanly
+
+According to the Ethereum definition of L2s a user should be able to withdraw their base-layer assets purely by doing an L1 transaction and relying only on L1 security (this is true for Lightning for example). This definition does not apply cleanly to Bitcoin L2s because assets are not defined at Bitcoin L1 but are defined in L2s instead. The only asset where this matters is the pegged BTC asset from Bitcoin L1, given all other assets are native to L2s anyway. In the upcoming Stacks release, users can withdraw their BTC by sending just a Bitcoin L1 transaction but Bitcoin L1 cannot validate that complex transaction and a majority of peg-out signers will need to sign on the peg-out request. In an ideal world Bitcoin miners can validate such transactions but that would require a change to Bitcoin L1. Therefore, Stacks design optimizes for a method that is decentralized and can be deployed without any changes to Bitcoin L1. If in the future it is possible to make changes to Bitcoin L1 then Stacks layer security can benefit from that as well.
+{% endstep %}
+
+{% step %}
+### Healthy Bitcoin skepticism
+
+Bitcoin community members are generally skeptical of claims and on the lookout for people making any false marketing claims. This is generally a healthy thing for the Bitcoin ecosystem and builds up the immune system. Some such community members might be skeptical about Stacks as a Bitcoin layer or L2 until they fully read the technical details and reasoning. There is a good [Twitter thread](https://twitter.com/lopp/status/1623756872976158722?s=20) about this topic as well.
+{% endstep %}
+{% endstepper %}
+
+Why don't we use the term 'sidechain' for Stacks then? Sidechains in Bitcoin typically have a different security budget from Bitcoin L1, typically as a subset of Bitcoin miners who participate in the sidechain (they don't follow 100% Bitcoin finality), their consensus runs on the sidechain (vs running on Bitcoin L1), and they don't publish their data/hashes on Bitcoin L1. The Stacks layer does not fit that definition cleanly given the consensus runs on Bitcoin L1, it follows Bitcoin finality, and publishes data/hashes on L1.
+
+Can Stacks layer work with rollups?
+
+Yes! There is already an active R\&D effort to integrate rollups with the Stacks layer. Both with the Stacks layer and sovereign rollups the technically challenging part is how to get BTC in and out of the Stacks layer or the sovereign rollup. The decentralized BTC peg, [sBTC](../sbtc/), applies to both the Stacks layer and sovereign rollups. Without modifying Bitcoin L1, an sBTC-like design with a decentralized open-membership group of signers is the most trust-minimized way to move BTC in and out of Bitcoin layers. Once the necessary upgrades to Bitcoin L1 can be made to enable validity rollups i.e., Bitcoin L1 can enforce BTC withdrawal from a layer, then the Stacks layer can also upgrade to benefit from it.
+
+Given a trust-minimized asset like sBTC is needed for sovereign rollups, with the launch of sBTC such sovereign rollups become even more interesting to deploy. The Stacks layer can potentially provide the decentralized group of signers for a trust-minimized BTC asset that can be used in a sovereign rollup, and DA comes directly from Bitcoin L1 e.g., with Ordinals.
+
+### Why Does Stacks Need a Token?
+
+This brings us to a central philosophical conversation in the world of crypto and Bitcoin, whether or not blockchains need tokens.
+
+Let's start by looking at the fundamental reason why tokens exist: to fund the maintenance and forward progress of a blockchain.
+
+Bitcoin is a token. It is a cryptocurrency that is used to incentivize miners to add new blocks to the chain. In Bitcoin's case, mining rewards are set on a predefined schedule, and once those mining rewards run out, the chain will need to survive on transaction fees alone.
+
+The purpose of a blockchain is to have a permanent historical record of every transaction that has ever occurred on the chain. Blockchains are basically ledgers. The token aspect is used as an incentive mechanism to secure and maintain the chain.
+
+This is why networks like Lightning and other P2P networks don't need tokens, they don't need to maintain a historical record. Channel-based solutions like Lightning rely on users opening 2-of-2 multisigs with each other. Once those channels are closed, the state disappears. When we are talking about a system that is supposed to maintain a global financial system, it is important for the maintenance of that system to be incentivized correctly.
+
+Let's look at this concept in the context of Stacks and its goals. Stacks seeks to provide smart contract functionality to Bitcoin, to serve as the programming rails for building a decentralized economy on top of Bitcoin.
+
+Many Bitcoin community members are skeptical of new tokens and rightly so. There are countless projects out there that force the use of a token on their project and in many cases a token is actually not needed. The Stacks project was started by Bitcoin builders who have a long history of building apps & protocols on Bitcoin L1 without any token (e.g., BNS launched in 2015 on Bitcoin L1 which was one of the largest protocols using OP\_RETURN on Bitcoin L1). So why did a bunch of Bitcoin builders decide to have a separate token for Stacks L2? Great question! Let's dig into the details.
+
+The Stacks token (STX) is primarily meant to be used for two things:
+
+{% stepper %}
+{% step %}
+### Incentives for Stacks L2 miners
+
+Newly minted STX are used to incentivize decentralized block production on Stacks L2.
+{% endstep %}
+
+{% step %}
+### Incentives for peg-out signers
+
+Signers participating in peg-out operations receive incentives in STX to economically align them with protocol rules.
+{% endstep %}
+{% endstepper %}
+
+The only way to remove the token is to build Stacks as a federated network like Liquid. In a federation the pre-selected group of companies control the mining and block production and a pre-selected group of companies need to be trusted for peg-out transactions.
+
+Stacks developers wanted to design an open and permissionless system. The only way to have a decentralized mining process is through incentives. As mentioned above, this is how Bitcoin works as well, where newly minted BTC are used as incentives to mine new blocks and anyone in the world can decide to become a miner. Anyone with BTC can mine the Stacks L2 chain, it is open and permissionless.
+
+Similarly, the way sBTC is designed is that the group of signers is open and permissionless (unlike a federation). These signers have economic incentives to correctly follow the protocol for peg-out requests. In a federation, users need to blindly trust the pre-set federation members to get their BTC out of the federation and back on Bitcoin L1. Stacks developers wanted to have an open, permissionless, and decentralized way to move BTC from Bitcoin L1 to Stacks L2 and back. This is made possible through economic incentives i.e., need for a token.
+
+{% hint style="info" %}
+With more and more Bitcoin layers emerging, there is some nuance in this federated vs open network design. Some protocols like Botanix's Spiderchain offer an open network but have different incentive mechanisms. We dig into these in detail in the [Stacks Among Other Layers](stacks-among-other-layers.md) section.
+{% endhint %}
+
+Other than these two reasons, STX is also used to pay gas fees for transactions. However, once the upcoming sBTC peg is live most of the economy of Stacks L2 is expected to follow a Bitcoin standard and work using BTC as the economic unit. It is expected that users will mostly interact just with Bitcoin and use BTC in wallets and apps (gas fees can be paid with BTC using atomic swaps in the background). It is important to note that BTC cannot be used for mining incentives on Stacks L2 because the only way to incentivize decentralized block production is through newly minted assets by the protocol (similar to how Bitcoin works itself) i.e., need for a token.
+
+### The Symbiotic Relationship Between Stacks and Bitcoin
+
+Stacks and Bitcoin complement each other. Stacks leverages the extreme decentralization of Bitcoin, its PoW consensus mechanism, and its value as a cryptocurrency.
+
+But Stacks also complements Bitcoin by unlocking additional use cases, thereby increasing its value over time. This also helps to solve the additional problem of the future maintainability of Bitcoin after the coinbase rewards are gone and Bitcoin has to function on transaction fees alone.
+
+If Bitcoin is seen as only a store of value, the economic density, meaning how much value is being exchanged, of each transaction will be minimal. But if Bitcoin is the underlying foundation for an entire decentralized economy, those [transactions become much more valuable](https://twitter.com/muneeb/status/1506976317618728963), increasing transaction fees. This is a crucial incentive for miners to continue securing the network as coinbase rewards drop.
+
+### Reading from Bitcoin State
+
+One of the things that gives the Stacks chain its superpowers in connecting with Bitcoin is not only how it connects to Bitcoin at a protocol level, discussed above, but also how we can utilize that Bitcoin at a programmatic level.
+
+That's where Clarity comes in. Clarity is the smart contract language for Stacks, and is how we actually build out a lot of the functionality we are talking about here.
+
+One of the often-touted features of Clarity is that it has access to the state of the Bitcoin chain built in, but how does it actually do that? Because of Stacks' PoX mechanism, every Stacks block is connected to a Bitcoin block, and can query Bitcoin block header hashes with the [`get-burn-block-info?` function](https://github.com/stacksgov/sips/blob/feat/sip-015/sips/sip-015/sip-015-network-upgrade.md#new-method-get-burn-block-info).
+
+This function allows us to pass in a Bitcoin block height and get back the header hash. The [`burn-block-height` Clarity keyword](https://docs.stacks.co/docs/write-smart-contracts/clarity-language/language-keywords#burn-block-height) will give us the current block height of the Bitcoin chain.
+
+However, `get-burn-block-info?` only returns data of the Bitcoin block at that height if it has already been processed and was created after the launch of the Stacks chain. So if we want to evaluate whether or not something happened on Bitcoin, we have to wait at least one block later to do so.
+
+This is step 1 of Clarity contracts being able to serve as the programming layer for Bitcoin. When a BTC transaction is initiated, the first thing that needs to happen is that a Clarity contract needs to become aware of it. This can happen manually by utilizing Clarity functions discussed above with the [BTC library](https://explorer.stacks.co/txid/0x8b112f2b50c1fa864997b7496aaad1e3940700309a3fdcc6c07f1c6f8b9cfb7b?chain=mainnet), as [Catamaran Swaps](https://docs.catamaranswaps.org/en/latest/catamaran.html) do.
+
+{% hint style="info" %}
+Note that this process is made easier by the additional Clarity functions added in 2.1, like the `get-burn-block-info?` function we looked at above.
+{% endhint %}
+
+Or we can automate (albeit at a cost of some centralization in our dapp) using an event-based architecture using something like Hiro's [chainhooks](https://www.hiro.so/blog/meet-4-new-features-in-clarinet#setting-up-trigger-actions-with-chainhooks), which will allow us to automatically trigger a Clarity contract call when a certain BTC transaction is initiated.
+
+This is the first component of using Stacks to build Bitcoin dapps, the read access to Bitcoin chain.
+
+Next up, let's dig a bit deeper into how exactly Stacks is "built on Bitcoin" by taking a look at Stacks' block production mechanism, Proof of Transfer.
diff --git a/docs/learn/stacks-101/financial-incentive-and-security-budget.md b/docs/learn/stacks-101/financial-incentive-and-security-budget.md
new file mode 100644
index 0000000000..7d0742bfde
--- /dev/null
+++ b/docs/learn/stacks-101/financial-incentive-and-security-budget.md
@@ -0,0 +1,11 @@
+# Financial Incentive And Security Budget
+
+
+
+In order to reorg the Stacks chain, someone must take control of at least 70% of the STX that are currently Stacked and conduct a 51% attack on Bitcoin itself. If acquired at market prices, then at the time of this writing, that amounts to spending nearly $1 billion USD in only the STX stacked.
+
+In addition to this, because of how Stacks achieves Bitcoin finality by not allowing forks, Stacks security budget reaches 51% of Bitcoin's mining power because in order to reverse the chain state you would need to reverse the Bitcoin chain state as well.
+
+Stackers have the new-found power to sign blocks in order to append them to the Stacks chain. However, some of them could refuse to sign, and ensure that no block ever reaches the 70% signature threshold. While this can happen by accident, this is not economically rational behavior -- if they stall the chain for too long, their STX loses their value, and furthermore, they cannot re-stack or liquidate their STX or activate PoX to earn BTC. Also, miners will stop mining if no blocks are getting confirmed, which eliminates their ongoing PoX payouts.
+
+The technical details of how this all works are discussed in the [Block Production](../block-production/) section.
diff --git a/docs/learn/stacks-101/proof-of-transfer.md b/docs/learn/stacks-101/proof-of-transfer.md
new file mode 100644
index 0000000000..9ef4a7cb13
--- /dev/null
+++ b/docs/learn/stacks-101/proof-of-transfer.md
@@ -0,0 +1,61 @@
+# Proof of Transfer (PoX)
+
+
source: Hiro blog
+
+In the previous sections, we took a look at the vision and ethos of Stacks and talked a lot about it being connected to Bitcoin and how it enables expanding functionality without modifying Bitcoin itself.
+
+In this section, we'll run through the block production mechanism that makes that happen, Proof of Transfer.
+
+This section will be a conceptual overview of Proof of Transfer. For more details on exactly how block production happens at a technical level, check out the section on [Block Production](../block-production/).
+
+Consensus algorithms for blockchains require compute or financial resources to secure the blockchain. The general practice of decentralized consensus is to make it practically infeasible for any single malicious actor to have enough computing power or ownership stake to attack the network.
+
+Popular consensus mechanisms in modern blockchains include proof of work, in which nodes dedicate computing resources, and proof of stake, in which nodes dedicate financial resources to secure the network.
+
+Proof of burn is another, less-frequently used consensus mechanism where miners compete by ‘burning’ (destroying) a proof of work cryptocurrency as a proxy for computing resources.
+
+Proof of Transfer (PoX) is an extension of the proof of burn mechanism. PoX uses the proof of work cryptocurrency of an established blockchain (Bitcoin in this case) to secure a new blockchain. However, unlike proof of burn, rather than burning the cryptocurrency, miners transfer the committed cryptocurrency to some other participants in the network (Stackers in this case).
+
+
+
+This allows network participants to secure the PoX cryptocurrency network and earn a reward in the base cryptocurrency (BTC). Thus, PoX blockchains are anchored on their chosen PoW chain. Stacks uses Bitcoin as its anchor chain.
+
+
+
+### Why Bitcoin?
+
+There are a number of reasons that Stacks chose Bitcoin as the blockchain to power consensus. It's the oldest blockchain protocol, having launched in 2009, and has become a recognized asset outside of the cryptocurrency community. BTC has held the highest market capitalization of any cryptocurrency for the past decade.
+
+Bitcoin champions simplicity and stability, and has stood the test of time. Influencing or attacking the network is infeasible or impractical for any potential hackers. It's one of the only cryptocurrencies to capture public attention. Bitcoin is a household name, and is recognized as an asset by governments, large corporations, and legacy banking institutions. Lastly, Bitcoin is largely considered a reliable store of value, and provides extensive infrastructure to support the PoX consensus mechanism.
+
+SIP-001 provides a full [list of reasons why Bitcoin was chosen to secure Stacks](https://github.com/stacksgov/sips/blob/main/sips/sip-001/sip-001-burn-election.md).
+
+{% hint style="info" %}
+By the way, SIP stands for Stacks Improvement Proposal, and it's the process by which community members agree on making changes to the network. Reading the SIPs in detail is an excellent way to familiarize yourself with Stacks at the implementation level. All of the SIPs are available in the [SIPs section](../network-fundamentals/sips.md) of the docs.
+{% endhint %}
+
+### Unlocking Bitcoin capital
+
+In the previous section we talked about Stacks being able to allow us to build a decentralized economy on top of Bitcoin and that PoX was a key piece of being able to do that.
+
+The reason is two-fold. First, as a part of this PoX mining process we have covered here, a hash of each Stacks block is recorded to the OP\_RETURN opcode of a Bitcoin transaction. If you aren't familiar, the OP\_RETURN opcode allows us to store up to 40 bytes of arbitrary data in a Bitcoin transaction.
+
+{% hint style="info" %}
+This [Stack Exchange answer](https://bitcoin.stackexchange.com/questions/29554/explanation-of-what-an-op-return-transaction-looks-like) gives a good overview of the reasoning and history of this opcode.
+{% endhint %}
+
+This is the first part of how Stacks inherits Bitcoin's security: its history is anchored block-by-block to the Bitcoin chain. Anyone can use merkle roots to verify these hashes to determine if the history is correct.
+
+Additionally, after the Nakamoto Upgrade, Stacks no longer forks on its own. Miners are required at a protocol level to build atop the last mined Stacks blocks, meaning that **Stacks is secured by both 100% of Bitcoin's hashrate in addition to the Stacks security budget from its miners.** We'll get into this process in more detail in the [Block Production](../block-production/) section.
+
+Additionally, part of this PoX process involves each Stacks block also knowing which Bitcoin block it is anchored to. Clarity, Stacks' smart contract language, has built-in functions for reading this data, such as [`get-block-info`](https://docs.stacks.co/docs/write-smart-contracts/clarity-language/language-functions#get-block-info), which returns, among other things, a field called `burnchain-header-hash`, which gives us the hash of the Bitcoin header corresponding to this Stacks block.
+
+This allows us to do really interesting things like trigger certain things to happen in a Clarity contract by watching the chain and verifying whether or not certain transactions occurred. You can see this in action in [Catamaran Swaps](https://docs.catamaranswaps.org/en/latest/catamaran.html), with other interesting projects like [Zest](https://www.zestprotocol.com/) seeking to expand on this functionality.
+
+The ultimate goal of all this is to enable the vision of web3, building a decentralized economy and enabling true user ownership of assets and data, on top of Bitcoin as a settlement layer, and using Bitcoin as a base decentralized money.
+
+### Proof of Transfer Contracts and Technical Details
+
+The Proof of Transfer functionality is implemented on the Stacks chain via a [Clarity smart contract](https://explorer.hiro.so/txid/0xc6d6e6ec82cabb2d7a9f4b85fcc298778d01186cabaee01685537aca390cdb46?chain=mainnet). An overview of this contract is available in the docs.
+
+You can see the original design for stacking and proof of transfer by reading the relevant SIP, [SIP-007](https://github.com/stacksgov/sips/blob/main/sips/sip-007/sip-007-stacking-consensus.md). You can also utilize [Hiro's API](https://docs.hiro.so/api#tag/Info/operation/get_pox_info) to get proof of transfer details including the relevant contract address.
diff --git a/docs/learn/stacks-101/stacks-among-other-layers.md b/docs/learn/stacks-101/stacks-among-other-layers.md
new file mode 100644
index 0000000000..dd072d1237
--- /dev/null
+++ b/docs/learn/stacks-101/stacks-among-other-layers.md
@@ -0,0 +1,81 @@
+# Stacks Among Other Layers
+
+
+
+Recently, we have seen a flurry of new "Bitcoin layers" popping up across the ecosystem as the market has finally woken up to the idea.
+
+However, not all Bitcoin layers are made equal. While a large chunk of these projects are vaporware riding the hype train, there are several projects that are making a good faith effort to grow the Bitcoin economy and build on top of Bitcooin using various approaches.
+
+The [Bitcoin Layers project](https://www.bitcoinlayers.org/) is an excellent place to begin learning about these different layers. In addition, here we've broken down how Stacks compares to some of the most promising Bitcoin L2 solutions so you can begin to learn about them all and make an educated decision on which to use.
+
+### What is a Bitcoin Layer?
+
+It's important to define terms, especially in a new and evolving ecosystem like web3, and an even newer and more rapidly evolving subecosystem like Bitcoin layers.
+
+For the purpose of this document and comparison, we can use the following definition of a Bitcoin layer: A Bitcoin layer is a separate distributed computing system built either alongside or on top of Bitcoin for the purpose of enhancing its scalability, functionality, or both.
+
+That definition is intentionally general, and encompasses many different projects like L2s, sidechains, federated, open network, etc.
+
+#### Technical vs Economic Considerations
+
+It's important to understand that when designing blockchains, especially layer 2 systems, we have to consider both technical and economic factors. Since a core component of a blockchain system is money, we need to make sure that our systems are both technically robust and economically efficient. And we need to accomplish both of these things while maintaining decentralization.
+
+While it is trivial to create a trusted bridge to bridge BTC from the L1 to a L2, that defeats the purpose of blockchain technology in general, since the goal should be to create permissionless, trust-minimized systems.
+
+At the same time, a great technical solution that doesn't consider the economic incentives of the decentralized actors running the network will not have a sustainable path to long-term adoption and viability.
+
+This balance is why Stacks has chosen the design it has, to balance both achieving the technical features of a Bitcoin L2 like security inheritance and a trust-minimized BTC peg with the economic incentives for the participants in the ecosystem to maintain it in the long term.
+
+As an example of this, Galaxy recently [conducted research](https://www.galaxy.com/insights/research/exploring-bitcoin-for-data-availability/) on this topic and found that a Bitcoin rollup "will need to generate approximately between $1.9m and $9.63m in revenue from L2 transaction fees per month." That is a significant number and again highlights the need to consider both technical and economic factors when designing Bitcoin layers.
+
+### Popular Bitcoin Layers Compared
+
+#### Lightning
+
+Lightning is probably the most well-known Bitcoin layer, and is primarily designed to address scalability issues. Lightning functions as a separate P2P network from Bitcoin, allowing participants to move their BTC from the main chain to Lightning, conduct multiple transactions on Lightning, and then send the final result to the BTC chain where it is finalized.
+
+This is actually a completely separate problem from what Stacks is trying to address. Where Lightning takes the existing functionality of Bitcoin and makes it much more scalable, Stacks is seeking to expand Bitcoin's functionality to do things you can't do now.
+
+Crucially, Lightning is ephemeral, meaning it has no state management. There is no continuous record of what has happened on the Lightning network, only current channels. Once users close their channel and their transactions are written back to the Bitcoin chain, they are gone.
+
+A key component of fully-expressive smart contracts is that they maintain a permanent historical record of all transactions that have happened on the chain.
+
+Bitcoin does this now, but its scripting language is very limited. So where Lightning seeks to make existing Bitcoin functionality happen faster, Stacks seeks to add new functionality.
+
+#### RSK
+
+Like Stacks, [RSK](https://www.rsk.co/) seeks to add additional functionality to Bitcoin, but it goes about that process differently than Stacks.
+
+RSK is a merge-mined chain, meaning that it is mined concurrently with Bitcoin. Stacks has its own miners and mining process, and its own economic value and security that is a function of that token value, more on this below.
+
+There are multiple perspectives to look at this from. Because RSK is merge-mined, Bitcoin miners are also the ones mining RSK blocks, and RSK does not have its own token.
+
+RSK can only exist with opt-in from Bitcoin miners and mining rewards are highly dependent on transaction volume.
+
+This also opens up a wider discussion on the costs and benefits of having a separate token, which we'll get into below a bit when we discuss rollups.
+
+RSK is also EVM-compatible, where Stacks uses Clarity and the Clarity VM.
+
+#### Liquid
+
+[Liquid](https://liquid.net/) is a federated network focused on unlocking more advanced financial capabilities with Bitcoin. Being federated, Liquid is not an open network, and thus not decentralized.
+
+The Liquid consensus mechanism is managed by 15 functionaries, who handle the transaction processing and validating. Liquid also does not support general-purpose applications, but is solely focused on financial applications.
+
+For another perspective, Hiro wrote an [excellent post](https://www.hiro.so/blog/building-on-bitcoin-project-comparison) comparing Stacks with other Bitcoin projects.
+
+#### Bitcoin Rollups
+
+Rollups are an exciting development for scaling decentralized applications. There are many different types of rollups; they're broadly divided into ZK rollups and Optimistic rollups, although other classifications are also there (see [this overview](https://era.zksync.io/docs/dev/fundamentals/rollups.html#what-are-rollups)).
+
+Rollups are generally considered layer-2 (L2) technology that runs on top of a layer-1 blockchain like Bitcoin or Ethereum. A critical aspect of rollups is the trustless nature where logic running on the L1 chain can determine whether something that happened on the rollup was valid. This is not true for all types of rollups, and there is some fuzziness around exact definitions. [Sovereign rollups](https://blog.celestia.org/sovereign-rollup-chains/), for example, only use the underlying L1 for data availability (DA) and not for consensus.
+
+Most of the rollups work on Ethereum uses Ethereum L1 both as a data availability layer, and for consensus, i.e., the validity of rollup transactions is determined by logic running on Ethereum L1. Newer systems, [like Celestia](https://celestia.org/), are taking a more modular approach and are separating DA from consensus. One interesting aspect of separating DA is that more established and durable chains like Bitcoin can be used for DA as well. Below is an interesting comparison of sidechains and two types of rollups possible on Bitcoin (John Light posted this [on Twitter](https://twitter.com/lightcoin/status/1630301411962388481?s=20)):
+
+
+
+This image broadly means developers can build sovereign rollups on Bitcoin today, but you'll need a "trusted" setup for moving BTC in and out of the rollup. In fact, people are already doing this -- see the recent [Rollkit announcement](https://rollkit.dev/blog/sovereign-rollups-on-bitcoin/). To build validity rollups, meaning Bitcoin L1 enforces BTC withdrawals from the rollup, you'll need modifications to Bitcoin L1. See [this overview](https://bitcoinrollups.org/) for more details.
+
+One important nuance here is the cost required to effectively run a rollup on Bitcoin as discussed in the Galaxy research report linked in the first section.
+
+Now we have a solid grasp of how Stacks works and how it fits in among other layers. Let's begin to dig into some of the technical implementation details and see how Stacks actually works.
diff --git a/docs/learn/stacks-101/what-is-stacks.md b/docs/learn/stacks-101/what-is-stacks.md
new file mode 100644
index 0000000000..8f02e001d9
--- /dev/null
+++ b/docs/learn/stacks-101/what-is-stacks.md
@@ -0,0 +1,74 @@
+# What Is Stacks?
+
+
source: Hiro Blog
+
+We can get an idea of the goal and ethos behind Stacks by looking at [how Satoshi envisioned generalizing Bitcoin](https://satoshi.nakamotoinstitute.org/posts/bitcointalk/threads/244/#222) back in 2010:
+
+> "...to be a completely separate network and separate block chain, yet share CPU power with Bitcoin...all networks in the world would share combined CPU power, increasing the total strength."
+
+This is a major theme in the design decisions for Stacks. A bit of a contradiction in the Bitcoin world, the Stacks network is a Bitcoin L2, but it does have its own token.
+
+This is an intentional and critical design decision primarily for the purpose of maintaining decentralization, rather than needing to rely on a federation.
+
+If that's confusing or you are skeptical, that's understandable — we'll be diving deeper into these ideas as we go through the docs.
+
+### Stacks and the Purpose of Blockchain Technology
+
+When evaluating new blockchain technologies, it's important to keep the original intent and purpose of them intact. If we go back to Bitcoin, it was originally designed to be:
+
+* Decentralized
+* Immutable
+* Secure
+
+You've likely heard of the blockchain trilemma — the problem of trying to balance decentralization, scalability, and security of a blockchain network.
+
+Stacks takes the approach of solving this trilemma by separating out chains into layers.
+
+So at the bottom, you have the foundational layer: Bitcoin.
+
+Bitcoin is the most decentralized, most secure, and most immutable blockchain network. However, that comes with a few tradeoffs.
+
+* Bitcoin is very slow compared to other networks. Bitcoin only has a new block written once every \~10 minutes, making its throughput negligible compared to networks designed for speed like Solana.
+* Bitcoin is also "boring". Ethereum came along after Bitcoin and sought to do the same thing for software that Bitcoin did for money. Ethereum's goal is to be a decentralized supercomputer of sorts, serving as a global compute environment for smart contracts (code that is written to a blockchain).
+* Bitcoin is not scalable. Because every new block must propagate to every node on the network, Bitcoin can only run as fast as the slowest node in the network.
+
+Now we are seeing the rise of modular blockchain networks like Cosmos that are designed to make it easy for people to spin up their own blockchain networks.
+
+While most new blockchain protocols popping up these days see these properties as negatives and seek to eliminate them, the Stacks community sees things differently.
+
+### The Stacks Way
+
+Stacks takes a layered approach: the foundational settlement layer is Bitcoin, and scalability and functionality are added on top of that using layers.
+
+There are many different types of L2s and different ways they can be built. They all come with [different tradeoffs](stacks-among-other-layers.md) and have their own way of accomplishing the goals of scalability or functionality.
+
+By taking this layered approach, we are able to have all of the same functionality as chains like Ethereum, but built on Bitcoin.
+
+So Stacks is a Bitcoin layer 2 with some unique properties, like having its own token, that acts as an incentive mechanism to maintain a historical ledger of all of its transactions and operate with its own security budget (in addition to Bitcoin's security budget — more on this in the next section).
+
+This is one of the things that separates Stacks from other Bitcoin layers like Lightning.
+
+* Lightning doesn't add any additional functionality to Bitcoin; it simply helps to scale functionality Bitcoin already has and helps it operate faster. Lightning is also ephemeral — it has no permanent state — and so is unsuitable for things like smart contracts that need to keep track of data and maintain state.
+* Contrast this to Stacks, which adds additional functionality to Bitcoin but still ultimately settles to Bitcoin (we'll cover this in the next section as well).
+
+The benefit is that we can maintain a separation of concerns and keep Bitcoin simple and sturdy, chugging along producing blocks, while adding additional layers for functionality and speed. If those other layers were compromised, the foundational layer would remain unaffected.
+
+This is important when building systems intended to be a global decentralized money (Bitcoin) and a decentralized economy built on top of that money (Stacks).
+
+The STX token is a separate token used to incentivize honest block production. It does not represent pegged Bitcoin (there is a separate Bitcoin peg called [sBTC](../sbtc/) for that purpose). While this may ruffle some feathers among parts of the Bitcoin community, it has several advantages.
+
+By implementing a token into the Stacks chain, we provide additional economic incentive for miners to produce Stacks blocks honestly.
+
+This token provides additional incentive as a way to grow the chain. Rather than relying on altruism to produce blocks and grow the chain, we can incentivize builders, token-holders, and investors all at the same time by having a token.
+
+The ICO scams of 2017 put a bad taste in many people's mouths, which has justifiably made a lot of people skeptical of every new blockchain project that pops up with a new token.
+
+But the problem with many of those projects was they had no actual value, weren't anchored to anything else of value, and provided no real utility.
+
+With a project like Stacks, we have real utility in the sense of serving as a way to utilize Bitcoin and make it a productive asset in a decentralized way. This is a key point: currently the only common ways to make Bitcoin productive are to give it to a custodial service or transfer it off the Bitcoin chain via something like wBTC on Ethereum.
+
+Stacks allows us to do this while ultimately still settling to the Bitcoin chain.
+
+In addition, Stacks allows us to build decentralized and censorship-resistant software utilizing Bitcoin as the foundational settlement layer. Eventually, the goal is to build a network of financial systems and decentralized software products that all utilize Bitcoin as their money.
+
+With that context, let's dive into exactly how Stacks is connected to Bitcoin.
diff --git a/docs/learn/transactions/README.md b/docs/learn/transactions/README.md
new file mode 100644
index 0000000000..8e77cb2089
--- /dev/null
+++ b/docs/learn/transactions/README.md
@@ -0,0 +1,3 @@
+# Transactions
+
+Transactions are a key component of the Stacks chain and are the primary way users will interact with it. In this section, we'll cover how transactions work and give an introduction to post conditions, an additional security feature of Stacks that allows client-side developers to enforce certain conditions to protect users from interacting with malicious contracts.
diff --git a/docs/learn/transactions/how-transactions-work.md b/docs/learn/transactions/how-transactions-work.md
new file mode 100644
index 0000000000..f63758f6aa
--- /dev/null
+++ b/docs/learn/transactions/how-transactions-work.md
@@ -0,0 +1,74 @@
+# How Transactions Work
+
+
+
+### Introduction
+
+Transactions are the fundamental unit of execution in the Stacks blockchain. Each transaction is originated from a Stacks account, and is retained in the Stacks blockchain history for eternity. This guide helps you understand Stacks transactions.
+
+### Lifecycle
+
+Transactions go through phases before being finally confirmed, and available for all, on the Stacks 2.0 network.
+
+
+
+{% stepper %}
+{% step %}
+### Generate
+
+Transactions are assembled according to the encoding specification.
+{% endstep %}
+
+{% step %}
+### Validate and sign
+
+Transactions are validated to confirm they are well-formed. Required signatures are filled in.
+{% endstep %}
+
+{% step %}
+### Broadcast
+
+Transactions are sent to a node.
+{% endstep %}
+
+{% step %}
+### Register
+
+A miner receives transactions, verifies, and adds them to the ["mempool,"](https://academy.binance.com/en/glossary/mempool) a holding area for all the pending transactions.
+{% endstep %}
+
+{% step %}
+### Process
+
+Miners review the mempool and select transactions for the next block to be mined. Depending on the transaction type, different actions can happen during this step. For example, post-conditions could be verified for a token transfer, smart-contract defined tokens could be minted, or an attempt to call an existing smart contract method could be made.
+{% endstep %}
+
+{% step %}
+### Confirm
+
+Miners successfully propose blocks with a set of transactions. The transactions inside are successfully propagated to the network when the stackers approve them.
+{% endstep %}
+{% endstepper %}
+
+{% hint style="info" %}
+A transaction can have one of three states once it is registered: `pending`, `success`, or `failed`.
+{% endhint %}
+
+### Types
+
+Stacks supports a set of different transaction types:
+
+| **Type** | **Value** | **Description** |
+| ------------------------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Tenure change | `TenureChange` | A tenure change is an event in the existing Stacks blockchain when one miner assumes responsibility for creating new stacks blocks from another miner. A change in tenure occurs when a Stacks block is discovered from a cryptographic sortition. Carried out by stackers. |
+| Tenure change block found | `TenureChange-BlockFound` | A `TenureChange-BlockFound` transaction is induced by a winning sortition. This causes the new miner to start producing blocks, and stops the current miner from producing more blocks. |
+| Tenure change extend | `TenureChange-Extend` | A `TenureChange-Extend`, which is induced by Stackers, resets the current tenure's ongoing execution budget, thereby allowing the miner to continue producing blocks. |
+| Token transfer | `token_transfer` | Asset transfer from a sender to a recipient |
+| Contract deploy | `smart_contract` | Contract instantiation |
+| Contract call | `contract_call` | Contract call for a public, non read-only function |
+
+A sample of each transaction type can be found in the [Stacks Blockchain API response definition for transactions](https://docs.hiro.so/stacks/api/transactions/get-transaction).
+
+{% hint style="info" %}
+Read-only contract call calls do **not** require transactions. Read more about it in the network guide.
+{% endhint %}
diff --git a/docs/learn/transactions/post-conditions.md b/docs/learn/transactions/post-conditions.md
new file mode 100644
index 0000000000..91edcaca66
--- /dev/null
+++ b/docs/learn/transactions/post-conditions.md
@@ -0,0 +1,37 @@
+# Post Conditions
+
+
+
+Post conditions are one of the most interesting and unique aspects of Stacks.
+
+From the beginning, safety and security has been at the heart of the Stacks ethos and formed the foundation of architecture decisions when building it.
+
+Like Clarity, Stacks' smart contract programming language, post conditions were specifically built and designed to solve the problem of user safety when interacting with blockchain applications.
+
+So what are they and how do they work?
+
+### How Post Conditions Work
+
+Post conditions are conditions that are set on the client side to ensure that a smart contract does not perform any unexpected behavior.
+
+Let's look at an example to make this more concrete.
+
+Let's say a user is on an NFT marketplace and is expecting to purchase an NFT for 100 STX. Using post conditions, the developer who is building the frontend of the application can add in post conditions to ensure that this is in fact what happens when the user initiates the transaction.
+
+If it does not, the transaction will abort and the user won't be out anything except the transaction fee.
+
+It's important to note that post conditions do not live in smart contracts. They are designed to be an extra layer of security on top of smart contracts.
+
+The problem they help address is a user interacting with a malicious smart contract that attempts to do something the user does not expect.
+
+But rather than simply being a UI feature of a wallet, these post conditions are built into the Stacks blockchain itself and are enforced at the protocol level.
+
+When you use a Stacks wallet like the Hiro web wallet and initiate a transaction, the wallet will display the post conditions set by the developer and tell the user exactly what is going to happen. If the action taken by the smart contract matches, the transaction goes through fine, otherwise it aborts.
+
+Here's what that looks like:
+
+
+
+In this example, if the smart contract does not transfer one fabulous-frog NFT and and take 50 STX from the user, the transaction will abort.
+
+You can learn more about how post conditions work in [SIP-005](https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions) and how to utilize them in your applications in Hiro's excellent [post conditions tutorial](https://docs.hiro.so/stacks/stacks.js/guides/post-conditions).
diff --git a/docs/operate/.gitbook.yaml b/docs/operate/.gitbook.yaml
new file mode 100644
index 0000000000..9c25db3cbb
--- /dev/null
+++ b/docs/operate/.gitbook.yaml
@@ -0,0 +1,31 @@
+root: ./
+
+redirects:
+
+ # nodes-and-miners to run-a-node redirects
+ guides-and-tutorials/nodes-and-miners: README.md
+ guides-and-tutorials/nodes-and-miners/run-a-node-with-docker: run-a-node/run-a-node-with-docker.md
+ guides-and-tutorials/nodes-and-miners/run-a-node-with-digital-ocean: run-a-node/run-a-node-with-digital-ocean.md
+
+ # guides-and-tutorials/run-a-miner to operate/run-a-miner redirects
+ guides-and-tutorials/run-a-miner/mine-mainnet-stacks-tokens: run-a-miner/mine-mainnet-stacks-tokens.md
+ guides-and-tutorials/run-a-miner/mine-testnet-stacks-tokens: run-a-miner/mine-testnet-stacks-tokens.md
+ guides-and-tutorials/run-a-miner/miner-costs-and-fees: run-a-miner/miner-costs-and-fees.md
+ guides-and-tutorials/run-a-miner/miner-prerequisites: run-a-miner/miner-prerequisites.md
+ guides-and-tutorials/run-a-miner/verify-miner: run-a-miner/verify-miner.md
+
+ # guides-and-tutorials/running-a-signer to operate/run-a-signer redirects
+ guides-and-tutorials/running-a-signer/best-practices-to-run-a-signer: run-a-signer/best-practices-to-run-a-signer.md
+ guides-and-tutorials/running-a-signer/how-to-monitor-signer: run-a-signer/how-to-monitor-signer.md
+ guides-and-tutorials/running-a-signer/how-to-read-signer-logs: run-a-signer/how-to-read-signer-logs.md
+ guides-and-tutorials/running-a-signer/opsec-best-practices: run-a-signer/opsec-best-practices.md
+ guides-and-tutorials/running-a-signer/signer-quickstart: run-a-signer/signer-quickstart.md
+
+ guides-and-tutorials/best-practices-to-snapshot-the-chainstate: snapshot-the-chainstate.md
+
+ # guides-and-tutorials/stack-stx to operate/stacking-stx redirects
+ guides-and-tutorials/stack-stx/increase-stacking: stacking-stx/increase-stacked-position.md
+ guides-and-tutorials/stack-stx/operate-a-pool: stacking-stx/operate-a-stacking-pool.md
+ guides-and-tutorials/stack-stx/stack-with-a-pool: stacking-stx/stack-with-a-pool.md
+ guides-and-tutorials/stack-stx/stacking-flow: stacking-stx/solo-stack.md
+ guides-and-tutorials/stack-stx/stop-stacking: stacking-stx/stop-stacking.md
diff --git a/docs/operate/.gitbook/assets/Frame 316126262 (1).jpg b/docs/operate/.gitbook/assets/Frame 316126262 (1).jpg
new file mode 100644
index 0000000000..b80d52e8b7
Binary files /dev/null and b/docs/operate/.gitbook/assets/Frame 316126262 (1).jpg differ
diff --git a/docs/operate/.gitbook/assets/Frame 316126262.jpg b/docs/operate/.gitbook/assets/Frame 316126262.jpg
new file mode 100644
index 0000000000..b80d52e8b7
Binary files /dev/null and b/docs/operate/.gitbook/assets/Frame 316126262.jpg differ
diff --git a/docs/operate/README.md b/docs/operate/README.md
new file mode 100644
index 0000000000..5396379e37
--- /dev/null
+++ b/docs/operate/README.md
@@ -0,0 +1,20 @@
+# Run a Node
+
+
+
+This section walks through the technical setup steps required to run Stacks Blockchain nodes and miners. There are multiple options available for running a node, including Docker, Digital Ocean, and Render.
+
+Running your own Stacks node is a great way to increase the decentralization of the ecosystem and avoid relying on third-party centralized providers.
+
+## Minimum viable requirements
+
+While you can run a node using these specs, it's recommended to assign more than the minimum for better performance.
+
+{% hint style="warning" %}
+* ⚠️ docker-compose version `2.2.2` or greater is **required** — https://docs.docker.com/compose/install/
+* **8 GB memory** if running only a Stacks node
+* **16 GB memory** if running Stacks + Bitcoin node
+* **2 vCPU**
+* **1 TB disk** for Stacks node
+* **1 TB disk** for Bitcoin node
+{% endhint %}
diff --git a/docs/operate/SUMMARY.md b/docs/operate/SUMMARY.md
new file mode 100644
index 0000000000..968520db00
--- /dev/null
+++ b/docs/operate/SUMMARY.md
@@ -0,0 +1,28 @@
+# Table of contents
+
+* [Run a Node](README.md)
+ * [Run a Node with Docker](run-a-node/run-a-node-with-docker.md)
+ * [Run a Node with Digital Ocean](run-a-node/run-a-node-with-digital-ocean.md)
+ * [Run a Node with a Hosted Provider](run-a-node/run-a-node-with-a-hosted-provider.md)
+ * [Run a Node with Quicknode](run-a-node/run-a-node-with-quicknode.md)
+ * [Run a Bitcoin Node](run-a-node/run-a-bitcoin-node.md)
+ * [Run a Pruned Bitcoin Node](run-a-node/run-a-pruned-bitcoin-node.md)
+* [Run a Miner](run-a-miner/README.md)
+ * [Miner Prerequisites](run-a-miner/miner-prerequisites.md)
+ * [Miner Costs and Fees](run-a-miner/miner-costs-and-fees.md)
+ * [Mine Testnet Stacks Tokens](run-a-miner/mine-testnet-stacks-tokens.md)
+ * [Mine Mainnet Stacks Tokens](run-a-miner/mine-mainnet-stacks-tokens.md)
+ * [Verify Miner](run-a-miner/verify-miner.md)
+* [Run a Signer](run-a-signer/README.md)
+ * [Signer Quickstart](run-a-signer/signer-quickstart.md)
+ * [How to Read Signer Logs](run-a-signer/how-to-read-signer-logs.md)
+ * [How to Monitor Signer](run-a-signer/how-to-monitor-signer.md)
+ * [Best Practices to Run a Signer](run-a-signer/best-practices-to-run-a-signer.md)
+ * [OpSec Best Practices](run-a-signer/opsec-best-practices.md)
+* [Snapshot the Chainstate](snapshot-the-chainstate.md)
+* [Stacking STX](stacking-stx/README.md)
+ * [Solo Stack](stacking-stx/solo-stack.md)
+ * [Operate a Stacking Pool](stacking-stx/operate-a-stacking-pool.md)
+ * [Stack with a Pool](stacking-stx/stack-with-a-pool.md)
+ * [Increase Stacked Position](stacking-stx/increase-stacked-position.md)
+ * [Stop Stacking](stacking-stx/stop-stacking.md)
diff --git a/docs/operate/run-a-miner/README.md b/docs/operate/run-a-miner/README.md
new file mode 100644
index 0000000000..f0da72f8a3
--- /dev/null
+++ b/docs/operate/run-a-miner/README.md
@@ -0,0 +1,5 @@
+# Run a Miner
+
+If you are interested in running a Stacks miner, there are a few things you'll need to understand. Running a miner is similar to running a node, but you'll need to set up some additional configuration.
+
+These guides will help you get up and running with both a testnet and mainnet Stacks miner.
diff --git a/docs/operate/run-a-miner/mine-mainnet-stacks-tokens.md b/docs/operate/run-a-miner/mine-mainnet-stacks-tokens.md
new file mode 100644
index 0000000000..8f1df5a046
--- /dev/null
+++ b/docs/operate/run-a-miner/mine-mainnet-stacks-tokens.md
@@ -0,0 +1,302 @@
+# Mine Mainnet Stacks Tokens
+
+### Introduction
+
+For more on the technical details of mining, please review the mining guide.
+
+The following is an abridged version of the [walkthrough here](https://github.com/stacksfoundation/miner-docs), written for a Linux system. If you're on Windows or MacOS, there will be some slight modifications needed (PR's welcome!).
+
+If you're interested in mining on the Stacks mainnet, you can find instructions on how to do that here:
+
+### Running a Bitcoin Mainnet Full Node
+
+To participate as a miner on mainnet, you must have access to a mainnet bitcoin node with a wallet (and the wallet's private key). One way to accomplish this is to run bitcoin locally.
+
+* [Ensure your computer meets the minimum hardware requirements before continuing.](https://bitcoin.org/en/bitcoin-core/features/requirements#system-requirements)
+
+First, download a [bitcoin binary](https://bitcoin.org/en/download), or [build from source](https://github.com/stacksfoundation/miner-docs/blob/main/bitcoin.md#source-install) (_there may be some extra requirements to building,_ [_defined here_](https://github.com/stacksfoundation/miner-docs/blob/main/prerequisites.md#install-required-packages)).
+
+If you want to learn more about the technical details of mining, please review the mining guide:
+
+{% hint style="info" %}
+**Tip:** It is recommended to use a persistent location for the chainstate, in the steps below we're using `/bitcoin`.
+{% endhint %}
+
+#### Update the Bitcoin Configuration File
+
+Next, update the bitcoin configuration:
+
+* **Optional, but recommended:** Use a persistent directory to store the Bitcoin chainstate, i.e. `datadir=/bitcoin`.
+* **Optional, but recommended:** Update the `rpcallowip` value to only allow `127.0.0.1`, or the stacks miner IPv4.
+* Modify the `rpcuser` and `rpcpassword` values from the defaults below.
+* Store the following configuration somewhere on your filesystem (ex: `$HOME/bitcoin.conf`).
+
+```toml
+server=1
+disablewallet=0
+datadir=/bitcoin
+rpcuser=btcuser
+rpcpassword=btcpass
+rpcallowip=0.0.0.0/0
+bind=0.0.0.0:8333
+rpcbind=0.0.0.0:8332
+dbcache=512
+banscore=1
+rpcthreads=256
+rpcworkqueue=256
+rpctimeout=100
+txindex=1
+```
+
+#### Start Bitcoin
+
+Finally, start `bitcoind` as follows (adjust the `conf` path to where it was created in the previous step, i.e. `$HOME/bitcoin.conf`):
+
+```bash
+bitcoind -conf=$HOME/bitcoin.conf
+```
+
+{% hint style="info" %}
+**Note:** It will take a few hours for the node to synchronize with Bitcoin Mainnet.
+{% endhint %}
+
+While it's syncing, you can track the progress with `bitcoin-cli` or the logfile (will be located where the chainstate is stored, i.e. `/bitcoin/debug.log`):
+
+```bash
+$ bitcoin-cli \
+ -rpcconnect=127.0.0.1 \
+ -rpcport=8332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpass \
+getblockchaininfo | jq .blocks
+836745
+```
+
+### Running a Stacks Blockchain miner
+
+First, download the latest tagged [stacks blockchain binary](https://github.com/stacks-network/stacks-blockchain/releases/latest), or [build from source](https://github.com/stacksfoundation/miner-docs/blob/main/stacks-blockchain.md#build-and-install-stacks-blockchain-from-source) (_there may be some extra requirements to building,_ [_defined here_](https://github.com/stacksfoundation/miner-docs/blob/main/prerequisites.md#install-required-packages)).
+
+{% hint style="info" %}
+**Tip:** It is recommended to use a persistent location for the chainstate, in the steps below we're using `/stacks-blockchain`.
+{% endhint %}
+
+#### Generate a keychain
+
+First, a keychain needs to be generated. With this keychain, we'll purchase some BTC from a cryptocurrency exchange, and then use that BTC to start mining.
+
+To create a keychain, the simplest way is to use the [stacks-cli](https://docs.hiro.so/references/stacks-cli) with the `make_keychain` command.
+
+```bash
+npx @stacks/cli make_keychain 2>/dev/null | jq -r
+```
+
+After this runs, you should see some JSON printed to the screen that looks like this:
+
+```json
+{
+ "mnemonic": "spare decade dog ghost luxury churn flat lizard inch nephew nut drop huge divert mother soccer father zebra resist later twin vocal slender detail",
+ "keyInfo": {
+ "privateKey": "ooxeemeitar4ahw0ca8anu4thae7aephahshae1pahtae5oocahthahho4ahn7eici",
+ "address": "SPTXOG3AIHOHNAEH5AU6IEX9OOTOH8SEIWEI5IJ9",
+ "btcAddress": "Ook6goo1Jee5ZuPualeiqu9RiN8wooshoo",
+ "wif": "rohCie2ein2chaed9kaiyoo6zo1aeQu1yae4phooShov2oosh4ox",
+ "index": 0
+ }
+}
+```
+
+{% hint style="danger" %}
+**Do not lose this information** - we'll need to use the `privateKey`, `btcAddress` and `wif` fields in later steps.
+{% endhint %}
+
+The above `wif` (`Kyk49jsPGen5C1ThhyJJH4CndLk8yLESuQJVGsbbTV3FFF9CRTJG`) will then need to be imported into the bitcoin mainnet network.
+
+Next, a bitcoin wallet is created:
+
+```bash
+bitcoin-cli \
+ -rpcconnect=127.0.0.1 \
+ -rpcport=8332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpass \
+ createwallet \
+ wallet_name="miner" \
+ disable_private_keys=false \
+ blank=false \
+ passphrase="" \
+ avoid_reuse=false \
+ descriptors=false \
+ load_on_startup=true
+```
+
+Now, import your wif (bitcoin private key) inside the newly created wallet.
+
+{% hint style="info" %}
+**Note:** Be sure to replace `` with the wif value in the `Generate a keychain` step.
+{% endhint %}
+
+```bash
+bitcoin-cli \
+ -rpcport=8332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpassword \
+ importprivkey
+```
+
+{% hint style="info" %}
+**Note:** The import may take a while, because a wallet rescan is triggered. After the import has completed successfully, you can check that the address is imported with `getaddressinfo`.
+{% endhint %}
+
+```bash
+bitcoin-cli \
+ -rpcconnect=127.0.0.1 \
+ -rpcport=8332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpass \
+ getaddressinfo
+```
+
+Once imported, we need to get some BTC to that address. You should be able to transfer BTC to this address using a cryptocurrency exchange such as [Coinbase](https://www.coinbase.com/), [Binance](https://www.binance.com/), or [Kraken](https://www.kraken.com/).
+
+#### Update the Stacks Blockchain Configuration File
+
+Now, we need to configure our node to use this Bitcoin keychain. Copy the [sample mainnet miner config](https://raw.githubusercontent.com/stacks-network/stacks-blockchain/master/testnet/stacks-node/conf/mainnet-miner-conf.toml) to your local machine in a _memorable_ location like `$HOME/mainnet-miner-conf.toml`.
+
+Next, update the stacks configuration:
+
+* **Optional, but recommended:** Use a persistent directory to store the Stacks chainstate, i.e. `working_dir = "/stacks-blockchain"`
+* From the `make_keychain` step, modify the `seed` and `mining_key` values with `privatekey`
+* Store the following configuration somewhere on your filesystem (ex: `$HOME/mainnet-miner-conf.toml`)
+
+```toml
+[node]
+working_dir = "/stacks-blockchain"
+rpc_bind = "0.0.0.0:20443"
+p2p_bind = "0.0.0.0:20444"
+seed = ""
+miner = true
+bootstrap_node = "02196f005965cebe6ddc3901b7b1cc1aa7a88f305bb8c5893456b8f9a605923893@seed.mainnet.hiro.so:20444,02539449ad94e6e6392d8c1deb2b4e61f80ae2a18964349bc14336d8b903c46a8c@cet.stacksnodes.org:20444,02ececc8ce79b8adf813f13a0255f8ae58d4357309ba0cedd523d9f1a306fcfb79@sgt.stacksnodes.org:20444,0303144ba518fe7a0fb56a8a7d488f950307a4330f146e1e1458fc63fb33defe96@est.stacksnodes.org:20444"
+mine_microblocks = false
+
+[burnchain]
+wallet_name = "miner"
+chain = "bitcoin"
+mode = "mainnet"
+peer_host = "127.0.0.1"
+username = ""
+password = ""
+rpc_port = 8332
+peer_port = 8333
+satoshis_per_byte = 100
+burn_fee_cap = 450000
+
+[miner]
+mining_key = ""
+activated_vrf_key_path = "/stacks-blockchain/saved_vrf_key.json"
+
+[connection_options]
+private_neighbors = false
+```
+
+#### Start the Stacks Blockchain
+
+To run your miner, run this in the command line:
+
+```bash
+stacks-node start --config $HOME/mainnet-miner-conf.toml
+```
+
+Your node should start. It will take some time to sync, and then your miner will be running.
+
+#### Enable Debug Logging
+
+In case you are running into issues or would like to see verbose logging, you can run your node with debug logging enabled. In the command line, run:
+
+```bash
+STACKS_LOG_DEBUG=1 stacks-node start --config $HOME/mainnet-miner-conf.toml
+```
+
+### Optional: Running a Stacks Blockchain miner with Docker
+
+Alternatively, you can run a Stacks mainnet miner with Docker.
+
+{% hint style="warning" %}
+Ensure you have [Docker](https://docs.docker.com/get-docker/) installed.
+{% endhint %}
+
+#### Generate a Keychain and Get Some Tokens
+
+Generate a keychain:
+
+```bash
+docker run -i node:20-alpine npx @stacks/cli make_keychain 2>/dev/null | jq -r
+```
+
+We need to get some BTC to that address. You should be able to transfer BTC to this address using a cryptocurrency exchange such as [Coinbase](https://www.coinbase.com/), [Binance](https://www.binance.com/), or [Kraken](https://www.kraken.com/).
+
+#### Update Stacks Blockchain Docker Configuration File
+
+Use the steps outlined above to create the configuration file.
+
+#### Start the Stacks Blockchain miner with Docker
+
+{% hint style="info" %}
+**Info:** The ENV VARS `RUST_BACKTRACE` and `STACKS_LOG_DEBUG` are optional. If removed, debug logs will be disabled.
+{% endhint %}
+
+```bash
+docker run -d \
+ --name stacks_miner \
+ --rm \
+ --network host \
+ -e RUST_BACKTRACE="full" \
+ -e STACKS_LOG_DEBUG="1" \
+ -v "$HOME/mainnet-miner-conf.toml:/src/stacks-node/mainnet-miner-conf.toml" \
+ -v "/stacks-blockchain:/stacks-blockchain" \
+ -p 20443:20443 \
+ -p 20444:20444 \
+ blockstack/stacks-blockchain:latest \
+/bin/stacks-node start --config /src/stacks-node/mainnet-miner-conf.toml
+```
+
+You can review the node logs with this command:
+
+```bash
+docker logs -f stacks_miner
+```
+
+### Optional: Running in Kubernetes with Helm
+
+In addition, you're also able to run a Stacks miner in a Kubernetes cluster using the [stacks-blockchain Helm chart](https://github.com/stacks-network/stacks-blockchain/tree/master/deployment/helm/stacks-blockchain).
+
+Ensure you have the following prerequisites installed:
+
+* [Docker](https://docs.docker.com/get-docker/)
+* [minikube](https://minikube.sigs.k8s.io/docs/start/) (Only needed if standing up a local Kubernetes cluster)
+* [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
+* [helm](https://helm.sh/docs/intro/install/)
+
+#### Generate keychain and get some tokens
+
+Use the steps outlined above
+
+#### Install the chart and run the miner
+
+To install the chart with the release name `my-release` and run the node as a miner:
+
+```bash
+minikube start # Only run this if standing up a local Kubernetes cluster
+helm repo add blockstack https://charts.blockstack.xyz
+helm install my-release blockstack/stacks-blockchain \
+ --set config.node.miner=true \
+ --set config.node.seed="your-privateKey-from-generate-keychain-step" \
+ --set config.burnchain.mode="mainnet"
+```
+
+You can review the node logs with this command:
+
+```bash
+kubectl logs -l app.kubernetes.io/name=stacks-blockchain
+```
+
+For more information on the Helm chart and configuration options, please refer to the [chart's homepage](https://github.com/stacks-network/stacks-blockchain/tree/master/deployment/helm/stacks-blockchain).
diff --git a/docs/operate/run-a-miner/mine-testnet-stacks-tokens.md b/docs/operate/run-a-miner/mine-testnet-stacks-tokens.md
new file mode 100644
index 0000000000..5053833301
--- /dev/null
+++ b/docs/operate/run-a-miner/mine-testnet-stacks-tokens.md
@@ -0,0 +1,316 @@
+# Mine Testnet Stacks Tokens
+
+### Introduction
+
+For more on the technical details of mining, please review the mining guide.
+
+The following is an abridged version of the [walkthrough here](https://github.com/stacksfoundation/miner-docs/tree/testnet), written for a Linux system. If you're on Windows or MacOS, there will be some slight modifications needed (PR's welcome!).
+
+If you're interested in mining on the Stacks testnet, you can find instructions on how to do that here:
+
+### Running a Bitcoin Testnet Full Node
+
+To participate as a miner on testnet, you must have access to a testnet bitcoin node with a wallet (and the wallet's private key). One way to accomplish this is to run bitcoin locally.
+
+* [Ensure your computer meets the minimum hardware requirements before continuing.](https://bitcoin.org/en/bitcoin-core/features/requirements#system-requirements)
+
+First, download a [bitcoin binary](https://bitcoin.org/en/download), or [build from source](https://github.com/stacksfoundation/miner-docs/blob/testnet/bitcoin.md#source-install) (_there may be some extra requirements to building,_ [_defined here_](https://github.com/stacksfoundation/miner-docs/blob/testnet/prerequisites.md#install-required-packages)).
+
+{% hint style="info" %}
+Tip: It is recommended to use a persistent location for the chainstate, in the steps below we're using `/bitcoin`.
+{% endhint %}
+
+#### Update the Bitcoin Configuration File
+
+Next, update the bitcoin configuration:
+
+* Optional, but recommended: Use a persistent directory to store the Bitcoin chainstate, i.e. `datadir=/bitcoin`.
+* Optional, but recommended: Update the `rpcallowip` value to only allow `127.0.0.1`, or the stacks miner IPv4.
+* Modify the `rpcuser` and `rpcpassword` values from the defaults below.
+* Store the following configuration somewhere on your filesystem (ex: `$HOME/bitcoin.conf`).
+
+```toml
+server=1
+testnet=1
+disablewallet=0
+datadir=/bitcoin
+rpcuser=btcuser
+rpcpassword=btcpass
+rpcallowip=0.0.0.0/0
+dbcache=512
+banscore=1
+rpcthreads=256
+rpcworkqueue=256
+rpctimeout=100
+txindex=1
+
+[test]
+bind=0.0.0.0:18333
+rpcbind=0.0.0.0:18332
+rpcport=18332
+```
+
+#### Start Bitcoin
+
+Finally, start `bitcoind` as follows (adjust the `conf` path to where it was created in the previous step, i.e. `$HOME/bitcoin.conf`):
+
+```bash
+bitcoind -conf=$HOME/bitcoin.conf
+```
+
+{% hint style="info" %}
+Note: It will take a few hours for the node to synchronize with Bitcoin Testnet.
+{% endhint %}
+
+While it's syncing, you can track the progress with `bitcoin-cli` or the logfile (will be located where the chainstate is stored, i.e. `/bitcoin/testnet3/debug.log`):
+
+```bash
+$ bitcoin-cli \
+ -rpcconnect=127.0.0.1 \
+ -rpcport=18332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpass \
+getblockchaininfo | jq .blocks
+2583513
+```
+
+***
+
+### Running a Stacks Blockchain miner
+
+First, download the latest tagged [stacks blockchain binary](https://github.com/stacks-network/stacks-blockchain/releases/latest), or [build from source](https://github.com/stacksfoundation/miner-docs/blob/testnet/stacks-blockchain.md#build-and-install-stacks-blockchain-from-source) (_there may be some extra requirements to building,_ [_defined here_](https://github.com/stacksfoundation/miner-docs/blob/testnet/prerequisites.md#install-required-packages)).
+
+{% hint style="info" %}
+Tip: It is recommended to use a persistent location for the chainstate, in the steps below we're using `/stacks-blockchain`.
+{% endhint %}
+
+#### Generate a keychain
+
+First, a keychain needs to be generated. With this keychain, we'll get some testnet BTC from a faucet, and then use that BTC to start mining.
+
+To create a keychain, the simplest way is to use the [stacks-cli](https://docs.hiro.so/references/stacks-cli) with the `make_keychain` command.
+
+```bash
+npx @stacks/cli make_keychain -t 2>/dev/null | jq -r
+```
+
+After this runs, you should see some JSON printed to the screen that looks like this:
+
+```json
+{
+ "mnemonic": "spare decade dog ghost luxury churn flat lizard inch nephew nut drop huge divert mother soccer father zebra resist later twin vocal slender detail",
+ "keyInfo": {
+ "privateKey": "ooxeemeitar4ahw0ca8anu4thae7aephahshae1pahtae5oocahthahho4ahn7eici",
+ "address": "STTXOG3AIHOHNAEH5AU6IEX9OOTOH8SEIWEI5IJ9",
+ "btcAddress": "Ook6goo1Jee5ZuPualeiqu9RiN8wooshoo",
+ "wif": "rohCie2ein2chaed9kaiyoo6zo1aeQu1yae4phooShov2oosh4ox",
+ "index": 0
+ }
+}
+```
+
+{% hint style="danger" %}
+Do not lose this information - we'll need to use the `privateKey`, `btcAddress` and `wif` fields in later steps.
+{% endhint %}
+
+The above `wif` (`cPdTdMgww2njhnekUZmHmFNKsWAjVdCR4cfvD2Y4UQhFzMmwoW33`) will then need to be imported into the bitcoin testnet network.
+
+Next, a bitcoin wallet is created:
+
+```bash
+bitcoin-cli \
+ -rpcconnect=127.0.0.1 \
+ -rpcport=18332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpass \
+ createwallet "miner" \
+ false \
+ false \
+ "" \
+ false \
+ false \
+ true
+```
+
+Now, import your wif (bitcoin private key) inside the newly created wallet.
+
+{% hint style="info" %}
+Note: Be sure to replace `` with the wif value in the `Generate a keychain` step.
+{% endhint %}
+
+```bash
+bitcoin-cli \
+ -rpcport=18332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpassword \
+ importprivkey
+```
+
+{% hint style="info" %}
+Note: The import may take a while, because a wallet rescan is triggered. After the import has completed successfully, you can check that the address is imported with `getaddressinfo`.
+{% endhint %}
+
+```bash
+bitcoin-cli \
+ -rpcconnect=127.0.0.1 \
+ -rpcport=18332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpass \
+ getaddressinfo
+```
+
+Once imported, we need to get some testnet BTC to that address. Grab the `btcAddress` field, and paste it into [this Bitcoin testnet faucet](https://tbtc.bitaps.com/). You'll be sent `0.01` testnet BTC to that address.
+
+#### Update the Stacks Blockchain Configuration File
+
+Now, we need to configure our node to use this Bitcoin keychain. Copy the [sample testnet miner config](https://raw.githubusercontent.com/stacks-network/stacks-blockchain/master/testnet/stacks-node/conf/testnet-miner-conf.toml) to your local machine in a memorable location like `$HOME/testnet-miner-conf.toml`.
+
+Next, update the stacks configuration:
+
+* Optional, but recommended: Use a persistent directory to store the Stacks chainstate, i.e. `working_dir = "/stacks-blockchain"`
+* From the `make_keychain` step, modify the `seed` value with `privatekey`
+* Store the following configuration somewhere on your filesystem (ex: `$HOME/testnet-miner-conf.toml`)
+
+```toml
+[node]
+working_dir = "/stacks-blockchain"
+rpc_bind = "0.0.0.0:20443"
+p2p_bind = "0.0.0.0:20444"
+seed = ""
+miner = true
+bootstrap_node = "029266faff4c8e0ca4f934f34996a96af481df94a89b0c9bd515f3536a95682ddc@seed.testnet.hiro.so:30444"
+mine_microblocks = false
+wait_time_for_microblocks = 10000
+
+[burnchain]
+wallet_name = "miner"
+chain = "bitcoin"
+mode = "xenon"
+peer_host = "127.0.0.1"
+username = ""
+password = ""
+rpc_port = 18332
+peer_port = 18333
+
+[[ustx_balance]]
+address = "ST2QKZ4FKHAH1NQKYKYAYZPY440FEPK7GZ1R5HBP2"
+amount = 10000000000000000
+
+[[ustx_balance]]
+address = "ST319CF5WV77KYR1H3GT0GZ7B8Q4AQPY42ETP1VPF"
+amount = 10000000000000000
+
+[[ustx_balance]]
+address = "ST221Z6TDTC5E0BYR2V624Q2ST6R0Q71T78WTAX6H"
+amount = 10000000000000000
+
+[[ustx_balance]]
+address = "ST2TFVBMRPS5SSNP98DQKQ5JNB2B6NZM91C4K3P7B"
+amount = 10000000000000000
+```
+
+#### Start the Stacks Blockchain
+
+To run your miner, run this in the command line:
+
+```bash
+stacks-node start --config $HOME/testnet-miner-conf.toml
+```
+
+Your node should start. It will take some time to sync, and then your miner will be running.
+
+#### Enable Debug Logging
+
+In case you are running into issues or would like to see verbose logging, you can run your node with debug logging enabled. In the command line, run:
+
+```bash
+STACKS_LOG_DEBUG=1 stacks-node start --config $HOME/testnet-miner-conf.toml
+```
+
+***
+
+### Optional: Running a Stacks Blockchain miner with Docker
+
+Alternatively, you can run a Stacks testnet miner with Docker.
+
+{% hint style="warning" %}
+Ensure you have [Docker](https://docs.docker.com/get-docker/) installed.
+{% endhint %}
+
+#### Generate a Keychain and Get Some Tokens
+
+Generate a keychain:
+
+```bash
+docker run -i node:20-alpine npx @stacks/cli make_keychain 2>/dev/null | jq -r
+```
+
+Now, we need to get some tBTC. Grab the `btcAddress` field, and paste it into [this Bitcoin testnet faucet](https://tbtc.bitaps.com/). You'll be sent `0.01` tBTC to that address.
+
+#### Update Stacks Blockchain Docker Configuration File
+
+Use the steps outlined above to create the configuration file.
+
+#### Start the Stacks Blockchain miner with Docker
+
+{% hint style="info" %}
+Info: The ENV VARS `RUST_BACKTRACE` and `STACKS_LOG_DEBUG` are optional. If removed, debug logs will be disabled.
+{% endhint %}
+
+```bash
+docker run -d \
+ --name stacks_miner \
+ --rm \
+ --network host \
+ -e RUST_BACKTRACE="full" \
+ -e STACKS_LOG_DEBUG="1" \
+ -v "$HOME/testnet-miner-conf.toml:/src/stacks-node/testnet-miner-conf.toml" \
+ -v "/stacks-blockchain:/stacks-blockchain" \
+ -p 20443:20443 \
+ -p 20444:20444 \
+ blockstack/stacks-blockchain:latest \
+/bin/stacks-node start --config /src/stacks-node/testnet-miner-conf.toml
+```
+
+You can review the node logs with this command:
+
+```bash
+docker logs -f stacks_miner
+```
+
+***
+
+### Optional: Running in Kubernetes with Helm
+
+In addition, you're also able to run a Stacks miner in a Kubernetes cluster using the [stacks-blockchain Helm chart](https://github.com/stacks-network/stacks-blockchain/tree/master/deployment/helm/stacks-blockchain).
+
+Ensure you have the following prerequisites installed:
+
+* [Docker](https://docs.docker.com/get-docker/)
+* [minikube](https://minikube.sigs.k8s.io/docs/start/) (Only needed if standing up a local Kubernetes cluster)
+* [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
+* [helm](https://helm.sh/docs/intro/install/)
+
+#### Generate keychain and get some tokens
+
+Use the steps outlined above
+
+#### Install the chart and run the miner
+
+To install the chart with the release name `my-release` and run the node as a miner:
+
+```bash
+minikube start # Only run this if standing up a local Kubernetes cluster
+helm repo add blockstack https://charts.blockstack.xyz
+helm install my-release blockstack/stacks-blockchain \
+ --set config.node.miner=true \
+ --set config.node.seed="privateKey-from-generate-keychain-step" \
+```
+
+You can review the node logs with this command:
+
+```bash
+kubectl logs -l app.kubernetes.io/name=stacks-blockchain
+```
+
+For more information on the Helm chart and configuration options, please refer to the [chart's homepage](https://github.com/stacks-network/stacks-blockchain/tree/master/deployment/helm/stacks-blockchain).
diff --git a/docs/operate/run-a-miner/miner-costs-and-fees.md b/docs/operate/run-a-miner/miner-costs-and-fees.md
new file mode 100644
index 0000000000..291a94e499
--- /dev/null
+++ b/docs/operate/run-a-miner/miner-costs-and-fees.md
@@ -0,0 +1,36 @@
+# Miner Costs and Fees
+
+### Configuring Cost and Fee Estimation
+
+{% code title="config.toml" %}
+```toml
+[fee_estimation]
+cost_estimator = naive_pessimistic
+fee_estimator = fuzzed_weighted_median_fee_rate
+fee_rate_fuzzer_fraction = 0.1
+fee_rate_window_size = 5
+cost_metric = proportion_dot_product
+log_error = true
+enabled = true
+```
+{% endcode %}
+
+Fee and cost estimators observe transactions on the network and use the observed costs of those transactions to build estimates for viable fee rates and expected execution costs. Estimators and metrics can be selected using the configuration fields above (the defaults shown are currently the only options). `log_error` controls whether the INFO logger will display information about cost estimator accuracy as new costs are observed. Setting `enabled = false` turns off the cost estimators.
+
+{% hint style="info" %}
+Cost estimators are not consensus-critical components — they are intended for miners to rank mempool transactions or for clients to pick appropriate fee rates before broadcasting.
+{% endhint %}
+
+The `fuzzed_weighted_median_fee_rate` estimator:
+
+* uses a median estimate from a window of the fees paid in the last `fee_rate_window_size` blocks, and
+* then applies a uniform random "fuzz" up to `fee_rate_fuzzer_fraction` of the base estimate.
+
+
+
+Mining calculator (external)
+
+There is a mining calculator that can help with this process: https://friedger.github.io/mining-calculator/\
+Source code: https://github.com/friedger/mining-calculator
+
+
diff --git a/docs/operate/run-a-miner/miner-prerequisites.md b/docs/operate/run-a-miner/miner-prerequisites.md
new file mode 100644
index 0000000000..a75cefa59c
--- /dev/null
+++ b/docs/operate/run-a-miner/miner-prerequisites.md
@@ -0,0 +1,109 @@
+# Miner Prerequisites
+
+## Prerequisites
+
+### VM setup
+
+The VM will not need a lot of resources to run a miner - the most resources will be consumed during the blockchain syncs (for both Bitcoin and Stacks). For this example, we'll assume a [**Debian**](https://www.debian.org/) host with `x86_64` architecture (_commands may also work on any Debian-derived distribution_).
+
+A single CPU system with at least 4GB of memory and 1TB of disk space should be considered the minimum required specs to run the miner.
+
+#### VM Specs
+
+* Minimum CPU: `1 vCPU`
+* Minimum Memory: `4GB`
+* Minimum Storage: `1TB Disk` to allow for chainstate growth
+ * as of **July 2022**:
+ * Bitcoin chainstate is roughly `420GB`
+ * Stacks chainstate is roughly `45GB`
+
+#### Disk Configuration
+
+Two options here — either are fine but it's recommended to mount the chainstate from a separate disk that only contains the chainstate (see the first option).
+
+{% stepper %}
+{% step %}
+### Separate disks for chainstate(s) and OS
+
+* mount a dedicated disk for bitcoin at `/bitcoin` of 1TB
+* mount a dedicated disk for stacks-blockchain at `/stacks-blockchain` of at least 100GB
+* root volume `/` of at least 25GB
+{% endstep %}
+
+{% step %}
+### Combined Disk for all data
+
+* root volume `/` of at least 1TB
+{% endstep %}
+{% endstepper %}
+
+Create the required directories:
+
+{% code title="Create directories" %}
+```bash
+$ sudo mkdir -p /bitcoin
+$ sudo mkdir -p /stacks-blockchain
+$ sudo mkdir -p /etc/bitcoin
+$ sudo mkdir -p /etc/stacks-blockchain
+```
+{% endcode %}
+
+If using mounted disks: mount the disks to each filesystem created above — edit `/etc/fstab` to automount these disks at boot.
+
+Example `/etc/fstab` entries:
+
+```
+/dev/xvdb1 /bitcoin xfs rw,relatime,attr2,inode64,noquota
+/dev/xvdc1 /stacks-blockchain xfs rw,relatime,attr2,inode64,noquota
+```
+
+Mount the disks:
+
+```bash
+sudo mount -a
+```
+
+### Scripted install
+
+You can use the scripts/prerequisites.sh to install everything:
+
+```bash
+curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/stacksfoundation/miner-docs/main/scripts/prerequisites.sh | bash
+```
+
+### Install required packages
+
+The following packages are required and used by the rest of these docs:
+
+{% code title="Install packages" %}
+```bash
+$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
+$ sudo apt-get update -y && sudo apt-get install -y \
+ build-essential \
+ jq \
+ netcat \
+ nodejs \
+ git \
+ autoconf \
+ libboost-system-dev \
+ libboost-filesystem-dev \
+ libboost-thread-dev \
+ libboost-chrono-dev \
+ libevent-dev \
+ libzmq5 \
+ libtool \
+ m4 \
+ automake \
+ pkg-config \
+ libtool \
+ libboost-system-dev \
+ libboost-filesystem-dev \
+ libboost-chrono-dev \
+ libboost-program-options-dev \
+ libboost-test-dev \
+ libboost-thread-dev \
+ libboost-iostreams-dev
+$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh && source $HOME/.cargo/env
+$ sudo npm install -g @stacks/cli rimraf shx
+```
+{% endcode %}
diff --git a/docs/operate/run-a-miner/verify-miner.md b/docs/operate/run-a-miner/verify-miner.md
new file mode 100644
index 0000000000..47907ccf11
--- /dev/null
+++ b/docs/operate/run-a-miner/verify-miner.md
@@ -0,0 +1,21 @@
+# Verify Miner
+
+## Verify Configuration
+
+You can verify that your node is operating as a miner by checking its log output to verify that it was able to find its Bitcoin UTXOs:
+
+{% code title="logs" %}
+```bash
+$ head -n 1000 /path/to/your/node/logs | grep -i utxo
+INFO [1630127492.031042] [testnet/stacks-node/src/run_loop/neon.rs:146] [main] Miner node: checking UTXOs at address:
+INFO [1630127492.062652] [testnet/stacks-node/src/run_loop/neon.rs:164] [main] UTXOs found - will run as a Miner node
+```
+{% endcode %}
+
+## Verify Operations
+
+The first transaction of the miner is a registration transaction on Bitcoin. It just contains an `OP_RETURN` utxo.
+
+Thereafter, the miner creates for each block one transaction on Bitcoin with one data output, and two commit outputs to the stackers. The amount is half the value of the configured `burn_fee_cap` property.
+
+If the miner won a sortition, the corresponding Stacks address will create a tenure change transaction and a coinbase transaction. The block rewards will be awarded 100 blocks later if mining was successful.
diff --git a/docs/operate/run-a-node/run-a-bitcoin-node.md b/docs/operate/run-a-node/run-a-bitcoin-node.md
new file mode 100644
index 0000000000..b935cf30e2
--- /dev/null
+++ b/docs/operate/run-a-node/run-a-bitcoin-node.md
@@ -0,0 +1,236 @@
+# Run a Bitcoin Node
+
+{% stepper %}
+{% step %}
+### Requirements
+
+This guide is written for a Unix based system. It's reasonable to expect some modifications will be required for other operating systems.
+
+When started, the Bitcoin node will take several days to reach chain tip.
+
+* Bitcoin Core >= v25.0
+ * https://github.com/bitcoin/bitcoin
+ * https://bitcoincore.org/en/download/
+* Host with a minimum of:
+ * 2 vCPU (a single dedicated cpu for the bitcoind process)
+ * 4GB Memory (during sync, more available memory will improve sync time)
+ * 1TB free disk space
+* User account: `bitcoin:bitcoin`
+* Chainstate directory located at: `/bitcoin/mainnet`
+ * `bitcoin` user must have read/write access.
+* Config directory located at: `/etc/bitcoin`
+ * `bitcoin` user must have at least read access
+{% endstep %}
+
+{% step %}
+### Add bitcoin user and set file ownership
+
+Run the following commands:
+
+{% code title="Create directories and add user" %}
+```shell
+$ sudo mkdir -p /bitcoin/mainnet
+$ sudo mkdir /etc/bitcoin
+$ sudo useradd bitcoin -d /bitcoin
+$ sudo chown -R bitcoin:bitcoin /bitcoin /etc/bitcoin/
+```
+{% endcode %}
+{% endstep %}
+
+{% step %}
+### Bitcoin config
+
+Below is a sample config used to sync a bitcoin node - feel free to adjust as needed.
+
+{% hint style="info" %}
+If using the [systemd unit below](run-a-bitcoin-node.md#systemd-unit-file), save this file as `/etc/bitcoin/bitcoin.conf`
+{% endhint %}
+
+* `btuser:btcpass` is hardcoded as an rpcauth user/password ([generated using this script](https://github.com/bitcoin/bitcoin/tree/master/share/rpcauth)).
+* Only localhost access is allowed (`127.0.0.1`) on the standard mainnet ports.
+* `dbcache` is set to the maximum of 16GB.
+* Wallet (and wallet rpc calls) are disabled.
+
+{% code title="Sample /etc/bitcoin/bitcoin.conf" %}
+```
+## [rpc]
+
+# Accept command line and JSON-RPC commands.
+server=1
+
+# Allow JSON-RPC connections from specified source.
+rpcallowip=127.0.0.1/0
+
+# Bind to given address to listen for JSON-RPC connections.
+rpcbind=127.0.0.1:8332
+
+# Username and HMAC-SHA-256 hashed password for JSON-RPC connections.
+
+# Use the script at https://github.com/bitcoin/bitcoin/tree/master/share/rpcauth to generate
+
+# Note: may be specified multiple times for different users.
+rpcauth=btcuser:18857b4df4b1f0f5e6b1d7884617ab39$de6e02e1da8ee138ee702e13e0637e24679d844756216b066c3aeac4bcac5e10 # btuser:btcpass
+
+# Optional: rpcwhitelist can restrict listed RPC calls to specific rpcauth users.
+
+# Uncomment the below the restrict the `limited` user to a small subset of `get` commands
+
+# rpcauth=limited:350c91a60895b567c4662c27e63e9a41$25188b0f51f2f974dcdc75c1e0d41174e8f7ae19fb96927abf68ac5bc1e8897b # limited:limited
+
+# rpcwhitelist=limited:getblockchaininfo,getblock,getblockcount,getblockhash,getblockheader,getnetworkinfo
+
+# rpcwhitelistdefault=0
+
+## [core]
+
+# Specify data directory
+datadir=/bitcoin/mainnet
+
+# Do not keep transactions in the mempool longer than hours (default: 336)
+mempoolexpiry=24
+
+# Bind to given address and always listen on it (default: 0.0.0.0)
+bind=127.0.0.1:8333
+
+# Maximum database cache size MiB (4 to 16384, default: 450). In addition, unused mempool memory is shared for this cache
+dbcache=16384
+
+# Maintain a full transaction index, used by the getrawtransaction rpc call
+txindex=1
+
+## [wallet]
+
+# Do not load the wallet and disable wallet RPC calls
+disablewallet=1
+```
+{% endcode %}
+{% endstep %}
+
+{% step %}
+### Systemd unit file
+
+Reference: https://github.com/bitcoin/bitcoin/blob/master/contrib/init/bitcoind.service
+
+Save the following as your systemd unit (for example `/etc/systemd/system/bitcoin.service`):
+
+{% code title="bitcoind.service" %}
+```
+[Unit]
+Description=Bitcoin daemon
+Documentation=https://github.com/bitcoin/bitcoin/blob/master/doc/init.md
+
+# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+ExecStart=/usr/bin/bitcoind -pid=/run/bitcoind/bitcoind.pid \
+ -conf=/etc/bitcoin/bitcoin.conf \
+ -startupnotify='systemd-notify --ready' \
+ -shutdownnotify='systemd-notify --stopping'
+
+# Make sure the config directory is readable by the service user
+PermissionsStartOnly=true
+ExecStartPre=/bin/chgrp bitcoin /etc/bitcoin
+
+# Process management
+####################
+
+Type=notify
+NotifyAccess=all
+PIDFile=/run/bitcoind/bitcoind.pid
+
+Restart=on-failure
+TimeoutStartSec=infinity
+TimeoutStopSec=600
+
+# Directory creation and permissions
+####################################
+
+# Run as bitcoin:bitcoin
+User=bitcoin
+Group=bitcoin
+
+# /run/bitcoind
+RuntimeDirectory=bitcoind
+RuntimeDirectoryMode=0710
+
+# /etc/bitcoin
+ConfigurationDirectory=bitcoin
+ConfigurationDirectoryMode=0710
+
+# /var/lib/bitcoind
+StateDirectory=bitcoind
+StateDirectoryMode=0710
+
+# Hardening measures
+####################
+
+# Provide a private /tmp and /var/tmp.
+PrivateTmp=true
+
+# Mount /usr, /boot/ and /etc read-only for the process.
+ProtectSystem=full
+
+# Deny access to /home, /root and /run/user
+ProtectHome=true
+
+# Disallow the process and all of its children to gain
+
+# new privileges through execve().
+NoNewPrivileges=true
+
+# Use a new /dev namespace only populated with API pseudo devices
+
+# such as /dev/null, /dev/zero and /dev/random.
+PrivateDevices=true
+
+# Deny the creation of writable and executable memory mappings.
+MemoryDenyWriteExecute=true
+
+# Restrict ABIs to help ensure MemoryDenyWriteExecute is enforced
+SystemCallArchitectures=native
+
+[Install]
+WantedBy=multi-user.target
+```
+{% endcode %}
+{% endstep %}
+
+{% step %}
+### Enable and start the Bitcoin service
+
+Run:
+
+{% code title="Enable and start service" %}
+```shell
+$ sudo systemctl daemon-reload
+$ sudo systemctl enable bitcoin.service
+$ sudo systemctl start bitcoin.service
+```
+{% endcode %}
+{% endstep %}
+
+{% step %}
+### Track sync progress
+
+{% hint style="info" %}
+Once started, you may track the sync progress:
+{% endhint %}
+
+{% code title="Tail debug log and query RPC" %}
+```
+$ sudo tail -f /bitcoin/mainnet/debug.log
+2024-12-05T19:35:31Z UpdateTip: new best=00000000000000000058990a84cc8f8eab25dbbd572f123f9190cea7256d7349 height=509258 version=0x20000000 log2_work=88.128280 tx=299522737 date='2018-02-15T03:42:14Z' progress=0.295203 cache=43.5MiB(172740txo)
+...
+$ bitcoin-cli \
+ -rpcconnect=127.0.0.1 \
+ -rpcport=8332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpass \
+ getblockcount
+509016
+```
+{% endcode %}
+{% endstep %}
+{% endstepper %}
diff --git a/docs/operate/run-a-node/run-a-node-with-a-hosted-provider.md b/docs/operate/run-a-node/run-a-node-with-a-hosted-provider.md
new file mode 100644
index 0000000000..5a10fe2d30
--- /dev/null
+++ b/docs/operate/run-a-node/run-a-node-with-a-hosted-provider.md
@@ -0,0 +1,19 @@
+# Run a Node with a Hosted Provider
+
+We're always looking for new hosting providers that enable anyone to run the Stacks Blockchain. Below, you'll find some examples of the current providers that are known to support running a node.
+
+### Quicknode
+
+Please refer to the Quicknode Section for instructions on launching an instance with Quicknode.
+
+### Stacks on Render
+
+The [render-stacks](https://github.com/stacksfoundation/render-stacks) GitHub repo has instructions so anyone can deploy a Stacks node to the hosted [Render](https://render.com/) service in one click.
+
+{% hint style="warning" %}
+While it is possible to use the free plan with some modifications, it is recommended to run this on a paid plan.
+{% endhint %}
+
+### Stacks on Fly
+
+The [fly-stacks](https://github.com/stacksfoundation/fly-stacks) GitHub repo has instructions so anyone can deploy a Stacks node to the hosted [Fly](https://fly.io/) service.
diff --git a/docs/operate/run-a-node/run-a-node-with-digital-ocean.md b/docs/operate/run-a-node/run-a-node-with-digital-ocean.md
new file mode 100644
index 0000000000..5f125b0caa
--- /dev/null
+++ b/docs/operate/run-a-node/run-a-node-with-digital-ocean.md
@@ -0,0 +1,104 @@
+# Run a Node with Digital Ocean
+
+### Introduction
+
+This is a step by step guide to deploy the [Stacks Blockchain](https://github.com/stacks-network/stacks-blockchain) on [DigitalOcean](https://digitalocean.com/).
+
+Build code is hosted on this [Github repository](https://github.com/stacksfoundation/stacks-machine-images) using the [methods from here](https://github.com/stacks-network/stacks-blockchain-docker).
+
+### Steps
+
+{% stepper %}
+{% step %}
+### Create the Droplet from the Marketplace
+
+Go to the [Stacks Blockchain page](https://marketplace.digitalocean.com/apps/stacks-blockchain) in DigitalOcean's marketplace. Click on `Create Stacks Blockchain Droplet`.
+{% endstep %}
+
+{% step %}
+### Choose plan and region
+
+Choose a plan (it will only allow you to select a droplet that meets the minimum requirements) and your preferred datacenter region.
+{% endstep %}
+
+{% step %}
+### Authentication
+
+Enter a root password or [enable SSH keys](https://docs.digitalocean.com/products/droplets/how-to/add-ssh-keys/) if you prefer.
+{% endstep %}
+
+{% step %}
+### Create the Droplet
+
+You can leave the rest of the options as they are and click on `Create Droplet`.
+{% endstep %}
+
+{% step %}
+### Wait for creation
+
+You will need to wait a few seconds for the droplet to get created. Once created click on it to see more information.
+{% endstep %}
+
+{% step %}
+### Access the Droplet
+
+Congratulations! You are now running the Stacks Blockchain. You can click on `Console` for a terminal window to open or login using SSH to the public IP you've been assigned to with user `root`.
+{% endstep %}
+{% endstepper %}
+
+### Getting started after deploying Stacks Blockchain
+
+Once the droplet is launched, the initial startup can take several minutes while BNS data is imported (this is a one time operation) and the Bitcoin headers are synced.
+
+To keep track of the progress, you can SSH to the host and view logs:
+
+```bash
+ssh root@your_droplet_public_ipv4
+/opt/stacks-blockchain-docker/manage.sh -n mainnet -a logs
+```
+
+After the stacks blockchain finishes the initial header sync and starts to sync with its peers, the application ports will open (`20443` and `3999`) and HTTP port `80` will now start proxying requests.
+
+Use `http://your_droplet_public_ipv4` to access the data directly, with output being similar to:
+
+```json
+{
+ "server_version": "stacks-blockchain-api v6.2.3 (master:77ab3ae2)",
+ "status": "ready",
+ "chain_tip": {
+ "block_height": 91820,
+ "block_hash": "0x06b276e85f238151414616618ae0adaf5eeda4eac6cad5bbefceeb37948ab275",
+ "index_block_hash": "0x4d7c075d7ab0f90b1dbc175f5c42b7344265d00cfef202dd9681d95388eeed8c",
+ "microblock_hash": "0xcf4f9037cc10696b2812b617ca105885be625c6acf8ad67e71bb4c09fa6ebb21",
+ "microblock_sequence": 4
+ }
+}
+```
+
+{% hint style="info" %}
+For the full list of API endpoints for the Stacks Blockchain, consult the [Hiro API Docs](https://docs.hiro.so/api)
+{% endhint %}
+
+All services are managed by a [systemd unit file](https://github.com/stacksfoundation/stacks-machine-images/blob/master/files/etc/systemd/system/stacks.service) that is set to start on boot.
+
+Manual control is also possible via the [manage.sh script](https://github.com/stacks-network/stacks-blockchain-docker/blob/master/manage.sh) at `/opt/stacks-blockchain-docker/manage.sh` on the host.
+
+Full details on how to use the manage.sh script is [available here](https://github.com/stacks-network/stacks-blockchain-docker/blob/master/docs/usage.md).
+
+### Launching a Droplet using the DigitalOcean API
+
+In addition to creating a Droplet from the Stacks Blockchain 1-Click App via the control panel, you can also use the [DigitalOcean API](https://digitalocean.com/docs/api).
+
+As an example, to create a 4GB Stacks Blockchain Droplet in the SFO2 region, you can use the following curl command. You’ll need to either save your [API access token](https://docs.digitalocean.com/reference/api/create-personal-access-token/) to an environment variable or substitute it into the command below.
+
+{% hint style="info" %}
+The `name`, `region` and `size` values below are hardcoded, so adjust as desired.
+{% endhint %}
+
+```bash
+$ export TOKEN=
+$ curl -X POST -H 'Content-Type: application/json' \
+ -H 'Authorization: Bearer '$TOKEN'' -d \
+ '{"name":"stacks-blockchain","region":"sfo2","size":"s-2vcpu-4gb","image":"stacksfoundation-stacksblockchain"}' \
+ "https://api.digitalocean.com/v2/droplets"
+```
diff --git a/docs/operate/run-a-node/run-a-node-with-docker.md b/docs/operate/run-a-node/run-a-node-with-docker.md
new file mode 100644
index 0000000000..defe4be9b4
--- /dev/null
+++ b/docs/operate/run-a-node/run-a-node-with-docker.md
@@ -0,0 +1,119 @@
+# Run a Node with Docker
+
+### Stacks Blockchain with Docker
+
+Run your own Stacks Blockchain node using [docker-compose](https://docs.docker.com/compose/) with just a few commands using [stacks-blockchain-docker](https://github.com/stacks-network/stacks-blockchain-docker)
+
+### Requirements
+
+The minimum viable requirements are listed below.
+
+While you _can_ run a node using these specs, it's _recommended_ to assign more than the minimum for better performance.
+
+* ⚠️ [docker-compose](https://docs.docker.com/compose/install/) version `2.2.2` or greater is **required**
+* **8GB memory if running only a Stacks node**
+* **16 GB memory if running Stacks + Bitcoin node**
+* **1 Vcpu** ( _minimum of 2 Vcpu is recommended_ )
+* **500GB disk for Stacks node**
+* **1TB disk space for Bitcoin node**
+
+{% hint style="warning" %}
+MacOS with an ARM (M-series chip) processor is NOT recommended
+
+The way Docker for Mac on an Arm CPU is designed makes the I/O incredibly slow, and blockchains are _**very**_ heavy on I/O. This only seems to affect MacOS with the M-series chip, other Arm based systems like Raspberry Pi work as expected.
+{% endhint %}
+
+### Quickstart
+
+The `` placeholder used below can be replaced with one of:
+
+* mainnet
+* testnet
+* mocknet
+
+{% stepper %}
+{% step %}
+### Clone the repository
+
+Clone the stacks-blockchain-docker repository locally and change into the directory:
+
+{% code title="Clone repository" %}
+```bash
+git clone https://github.com/stacks-network/stacks-blockchain-docker && cd stacks-blockchain-docker
+```
+{% endcode %}
+{% endstep %}
+
+{% step %}
+### Start the services
+
+Start the docker-compose services for the chosen network:
+
+{% code title="Start services" %}
+```bash
+./manage.sh -n -a start
+```
+{% endcode %}
+
+{% hint style="info" %}
+With an optional HTTP proxy on port 80:
+
+{% code title="Start with proxy" %}
+```bash
+./manage.sh -n -a start -f proxy
+```
+{% endcode %}
+{% endhint %}
+{% endstep %}
+{% endstepper %}
+
+### Accessing the services
+
+{% hint style="info" %}
+For networks other than `mocknet`, downloading the initial headers can take several minutes. Until the headers are downloaded, the `/v2/info` endpoints won't return any data.
+
+Follow the logs to track the sync progress:
+
+{% code title="Follow logs" %}
+```bash
+./manage.sh -n -a logs
+```
+{% endcode %}
+{% endhint %}
+
+stacks-blockchain:
+
+* Ports `20443-20444` are exposed on `localhost`
+
+{% code title="Check stacks-blockchain /v2/info" %}
+```bash
+curl -sL localhost:20443/v2/info | jq -r
+```
+{% endcode %}
+
+stacks-blockchain-api:
+
+* Port `3999` is exposed on `localhost`
+
+{% code title="Check stacks-blockchain-api" %}
+```bash
+curl -sL localhost:3999 | jq -r
+```
+{% endcode %}
+
+proxy:
+
+* Port `80` is exposed on `localhost`
+
+{% code title="Check proxy" %}
+```bash
+curl -sL localhost/v2/info | jq -r
+curl -sL localhost | jq -r
+```
+{% endcode %}
+
+### Upgrades
+
+{% hint style="warning" %}
+For schema-breaking upgrades to running instances of this repo, you'll need to [run an event-replay](https://github.com/stacks-network/stacks-blockchain-docker/blob/master/docs/upgrade.md).
+{% endhint %}
diff --git a/docs/operate/run-a-node/run-a-node-with-quicknode.md b/docs/operate/run-a-node/run-a-node-with-quicknode.md
new file mode 100644
index 0000000000..aa06a7868b
--- /dev/null
+++ b/docs/operate/run-a-node/run-a-node-with-quicknode.md
@@ -0,0 +1,63 @@
+# Run a Node with Quicknode
+
+[QuickNode](https://www.quicknode.com/) is a service for rapidly getting set up with a Stacks node. As an easy and fast alternative to running your own node, you can utilize QuickNode to serve as an API.
+
+{% stepper %}
+{% step %}
+### Create a QuickNode account
+
+Sign up on QuickNode: https://www.quicknode.com/signup
+{% endstep %}
+
+{% step %}
+### Create an endpoint
+
+Once signed in, click "Create an endpoint". Select:
+
+* Stacks
+* your desired network (e.g., mainnet or testnet)
+* your desired QuickNode plan level
+
+After that you'll have an API endpoint URL you can use to connect to Stacks.
+{% endstep %}
+
+{% step %}
+### Install the Stacks network package
+
+Install the `@stacks/network` package in your frontend project.
+{% endstep %}
+
+{% step %}
+### Import the network class
+
+In your frontend code, import the network class:
+
+{% code title="example.js" %}
+```javascript
+import { StacksTestnet } from "@stacks/network";
+```
+{% endcode %}
+{% endstep %}
+
+{% step %}
+### Configure the network with your QuickNode endpoint
+
+Create the network instance using your QuickNode endpoint URL:
+
+{% code title="example.js" %}
+```javascript
+const network = new StacksTestnet({ url: "" });
+```
+{% endcode %}
+
+Replace \ with the full endpoint URL provided by QuickNode.
+{% endstep %}
+
+{% step %}
+### Use with @stacks/transactions
+
+You can now call transactions and other Stacks RPC methods as you normally would using the `@stacks/transactions` library, passing the `network` instance where required.
+
+For an example integration and walkthrough, refer to the Hello Stacks tutorial.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/operate/run-a-node/run-a-pruned-bitcoin-node.md b/docs/operate/run-a-node/run-a-pruned-bitcoin-node.md
new file mode 100644
index 0000000000..e5b5c22356
--- /dev/null
+++ b/docs/operate/run-a-node/run-a-pruned-bitcoin-node.md
@@ -0,0 +1,255 @@
+# Run a Pruned Bitcoin Node
+
+This guide is written for a Unix based system. It's reasonable to expect some modifications will be required for other operating systems.
+
+When started, the pruned Bitcoin node will take roughly \~24 hours to reach chain tip.
+
+{% hint style="warning" %}
+While bitcoin is syncing, it's recommended to keep a stacks-blockchain node at chain tip, or [use a stacks chainstate archive](https://docs.hiro.so/stacks/archive/guides/stacks-blockchain).
+{% endhint %}
+
+Requirements:
+
+* Bitcoin Core >= v25.0
+ * https://github.com/bitcoin/bitcoin
+ * https://bitcoincore.org/en/download/
+* Host with a minimum of:
+ * 2 vCPU (a single dedicated cpu for the bitcoind process)
+ * 4GB Memory (during sync, more available memory will improve sync time)
+ * 50GB free disk space (actual usage is closer to 20GB)
+* User account: `bitcoin:bitcoin`
+* Chainstate directory located at: `/bitcoin/mainnet`
+ * `bitcoin` user must have read/write access.
+* Config directory located at: `/etc/bitcoin`
+ * `bitcoin` user must have at least read access
+
+Caveats
+
+[BIP-0159](https://github.com/bitcoin/bips/blob/master/bip-0159.mediawiki)
+
+In short, this BIP specifies that pruned nodes will advertise the service bit `NODE_NETWORK_LIMITED`, which restricts syncing blocks older than 288 blocks (\~2 days).
+
+What this means is that in practice, a stacks-blockchain node:
+
+* Cannot sync from genesis using a pruned node.
+* Must not be offline or otherwise down for longer than \~2 days (or 288 Bitcoin blocks).
+
+{% stepper %}
+{% step %}
+### Add bitcoin user and set file ownership
+
+```shell
+$ sudo mkdir -p /bitcoin/mainnet
+$ sudo mkdir /etc/bitcoin
+$ sudo useradd bitcoin -d /bitcoin
+$ sudo chown -R bitcoin:bitcoin /bitcoin /etc/bitcoin/
+```
+{% endstep %}
+
+{% step %}
+### Bitcoin Config
+
+Below is a sample config used to sync a pruned bitcoin node - feel free to adjust as needed.
+
+{% hint style="info" %}
+If using the [systemd unit below](run-a-pruned-bitcoin-node.md#systemd-unit-file), save this file as `/etc/bitcoin/bitcoin.conf`
+{% endhint %}
+
+Notes:
+
+* `btuser:btcpass` is hardcoded as an rpcauth user/password ([generated using this script](https://github.com/bitcoin/bitcoin/tree/master/share/rpcauth)).
+* Only localhost access is allowed (`127.0.0.1`) on the standard mainnet ports.
+* Pruning is set to be small, storing only the last 1GB of blocks (for p2p traffic, this is more than enough).
+* `dbcache` is set to the maximum of 16GB.
+* Wallet (and wallet rpc calls) are disabled.
+
+```
+## [rpc]
+
+# Accept command line and JSON-RPC commands.
+server=1
+
+# Allow JSON-RPC connections from specified source.
+rpcallowip=127.0.0.1/0
+
+# Bind to given address to listen for JSON-RPC connections.
+rpcbind=127.0.0.1:8332
+
+# Username and HMAC-SHA-256 hashed password for JSON-RPC connections.
+
+# Use the script at https://github.com/bitcoin/bitcoin/tree/master/share/rpcauth to generate
+
+# Note: may be specified multiple times for different users.
+rpcauth=btcuser:18857b4df4b1f0f5e6b1d7884617ab39$de6e02e1da8ee138ee702e13e0637e24679d844756216b066c3aeac4bcac5e10 # btuser:btcpass
+
+# Optional: rpcwhitelist can restrict listed RPC calls to specific rpcauth users.
+
+# Uncomment the below the restrict the `limited` user to a small subset of `get` commands
+
+# rpcauth=limited:350c91a60895b567c4662c27e63e9a41$25188b0f51f2f974dcdc75c1e0d41174e8f7ae19fb96927abf68ac5bc1e8897b # limited:limited
+
+# rpcwhitelist=limited:getblockchaininfo,getblock,getblockcount,getblockhash,getblockheader,getnetworkinfo
+
+# rpcwhitelistdefault=0
+
+## [core]
+
+# Specify data directory
+datadir=/bitcoin/mainnet
+
+# Do not keep transactions in the mempool longer than hours (default: 336)
+mempoolexpiry=24
+
+# Bind to given address and always listen on it (default: 0.0.0.0)
+bind=127.0.0.1:8333
+
+# Maximum database cache size MiB (4 to 16384, default: 450). In addition, unused mempool memory is shared for this cache
+dbcache=16384
+
+# Maintain a full transaction index, used by the getrawtransaction rpc call (**Running a pruned node requires that this option is disabled**)
+txindex=0
+
+# Reduce storage requirements by enabling pruning (deleting) of old
+
+# blocks. This allows the pruneblockchain RPC to be called to
+
+# delete specific blocks and enables automatic pruning of old
+
+# blocks if a target size in MiB is provided. This mode is
+
+# incompatible with -txindex. Warning: Reverting this setting
+
+# requires re-downloading the entire blockchain. (default: 0 =
+
+# disable pruning blocks, 1 = allow manual pruning via RPC, >=550 =
+
+# automatically prune block files to stay under the specified
+
+# target size in MiB)
+prune=1024 # 1GB of chainstate is enough for p2p block data (if using the RPC,this can be adjusted higher to store more blocks)
+
+## [wallet]
+
+# Do not load the wallet and disable wallet RPC calls
+disablewallet=1
+```
+{% endstep %}
+
+{% step %}
+### Systemd unit file
+
+ref: https://github.com/bitcoin/bitcoin/blob/master/contrib/init/bitcoind.service
+
+```
+[Unit]
+Description=Bitcoin daemon
+Documentation=https://github.com/bitcoin/bitcoin/blob/master/doc/init.md
+
+# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+ExecStart=/usr/bin/bitcoind -pid=/run/bitcoind/bitcoind.pid \
+ -conf=/etc/bitcoin/bitcoin.conf \
+ -startupnotify='systemd-notify --ready' \
+ -shutdownnotify='systemd-notify --stopping'
+
+# Make sure the config directory is readable by the service user
+PermissionsStartOnly=true
+ExecStartPre=/bin/chgrp bitcoin /etc/bitcoin
+
+# Process management
+####################
+
+Type=notify
+NotifyAccess=all
+PIDFile=/run/bitcoind/bitcoind.pid
+
+Restart=on-failure
+TimeoutStartSec=infinity
+TimeoutStopSec=600
+
+# Directory creation and permissions
+####################################
+
+# Run as bitcoin:bitcoin
+User=bitcoin
+Group=bitcoin
+
+# /run/bitcoind
+RuntimeDirectory=bitcoind
+RuntimeDirectoryMode=0710
+
+# /etc/bitcoin
+ConfigurationDirectory=bitcoin
+ConfigurationDirectoryMode=0710
+
+# /var/lib/bitcoind
+StateDirectory=bitcoind
+StateDirectoryMode=0710
+
+# Hardening measures
+####################
+
+# Provide a private /tmp and /var/tmp.
+PrivateTmp=true
+
+# Mount /usr, /boot/ and /etc read-only for the process.
+ProtectSystem=full
+
+# Deny access to /home, /root and /run/user
+ProtectHome=true
+
+# Disallow the process and all of its children to gain
+
+# new privileges through execve().
+NoNewPrivileges=true
+
+# Use a new /dev namespace only populated with API pseudo devices
+
+# such as /dev/null, /dev/zero and /dev/random.
+PrivateDevices=true
+
+# Deny the creation of writable and executable memory mappings.
+MemoryDenyWriteExecute=true
+
+# Restrict ABIs to help ensure MemoryDenyWriteExecute is enforced
+SystemCallArchitectures=native
+
+[Install]
+WantedBy=multi-user.target
+```
+{% endstep %}
+
+{% step %}
+### Enable and start the Bitcoin service
+
+```shell
+$ sudo systemctl daemon-reload
+$ sudo systemctl enable bitcoin.service
+$ sudo systemctl start bitcoin.service
+```
+{% endstep %}
+
+{% step %}
+### Track sync progress
+
+{% hint style="info" %}
+Once started, you may track the sync progress:
+
+```
+$ sudo tail -f /bitcoin/mainnet/debug.log
+2024-12-05T19:35:31Z UpdateTip: new best=00000000000000000058990a84cc8f8eab25dbbd572f123f9190cea7256d7349 height=509258 version=0x20000000 log2_work=88.128280 tx=299522737 date='2018-02-15T03:42:14Z' progress=0.295203 cache=43.5MiB(172740txo)
+...
+$ bitcoin-cli \
+ -rpcconnect=127.0.0.1 \
+ -rpcport=8332 \
+ -rpcuser=btcuser \
+ -rpcpassword=btcpass \
+ getblockcount
+509016
+```
+{% endhint %}
+{% endstep %}
+{% endstepper %}
diff --git a/docs/operate/run-a-signer/README.md b/docs/operate/run-a-signer/README.md
new file mode 100644
index 0000000000..ed8aad2fd6
--- /dev/null
+++ b/docs/operate/run-a-signer/README.md
@@ -0,0 +1,361 @@
+# Run a Signer
+
+### How to Use This Guide
+
+If you are not familiar with the concept of signing and stacking, and how they work together, be sure to check out the [Stackers and Signing concept guide](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/block-production/signing).
+
+This guide is a step-by-step walkthrough for setting up and running a signer. If you need to troubleshoot your signer setup, see the Signer Troubleshooting section. If you need to Stack your STX, or have questions about how that process works, check out the Stack STX guide.
+
+### Background and High-Level Process
+
+To run a signer you'll run a signer and a Stacks node side-by-side. Specifically, run a follower node. The signer monitors events from the Stacks node and uses the generated account (see Preflight Setup) to sign incoming Stacks blocks sent from the Stacks node.
+
+This doc provides instructions to set up both using either Docker or the release binaries available in the [stacks core releases](https://github.com/stacks-network/stacks-core/releases) repository, and how to configure them so the signer and Stacks node communicate correctly.
+
+### Knowledge Prerequisites
+
+* Docker and basic knowledge of pulling and running images
+* Basic knowledge of [Stacks accounts](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/network-fundamentals/accounts)
+* Basic knowledge of [stacking](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/block-production/stacking) and the stacking flow
+
+{% stepper %}
+{% step %}
+### Signer Checklist — Pre-Launch Setup
+
+Quick reference of major setup steps prior to launching a signer.
+
+* Ensure your system meets the [minimum system requirements](./#minimum-system-requirements).
+* Acquire Docker and basic knowledge of Stacks accounts, stacking, and the Nakamoto stacking flow (links above).
+{% endstep %}
+
+{% step %}
+### Signer Checklist — Preflight Setup
+
+* Generate a new private key using stacks-cli (see Preflight Setup).
+* Save the generated account information securely.
+{% endstep %}
+
+{% step %}
+### Signer Checklist — Configuration Setup
+
+* Create a `signer-config.toml` file with necessary configurations:
+ * node\_host
+ * endpoint
+ * network
+ * db\_path
+ * auth\_password
+ * stacks\_private\_key
+* Store `signer-config.toml` securely and note down the values used.
+{% endstep %}
+
+{% step %}
+### Signer Checklist — Running the Signer
+
+* Decide whether to run the signer using Docker (recommended) or as a binary.
+* If using Docker:
+ * Set up the necessary ports and volumes.
+ * Run the Docker container with the appropriate settings.
+* If running as a binary:
+ * Build `stacks-core` from source or download the pre-built binary.
+ * Run the signer using: `stacks-signer run --config `.
+{% endstep %}
+
+{% step %}
+### Signer Checklist — Verify Signer Operation
+
+* Check that the signer is listening on its configured endpoint.
+* Confirm that there are no errors and that the system is ready for connections.
+{% endstep %}
+
+{% step %}
+### Signer Checklist — Setting Up the Stacks Node
+
+* Create a `node-config.toml`, include:
+ * connection\_options.sauth\_token
+ * events\_observer.endpoint (matching signer config)
+* Decide whether to run the Stacks node using Docker or as a binary and follow the respective run steps.
+{% endstep %}
+
+{% step %}
+### Signer Checklist — Verify Stacks Node Operation
+
+* Check Stacks node logs for successful connection to the signer.
+* Confirm the node is syncing Bitcoin headers properly.
+{% endstep %}
+
+{% step %}
+### Signer Checklist — Setup Stacks Accounts
+
+* Set up a pool operator wallet in a Stacks wallet (e.g., Leather or Xverse).
+* Fund the pool operator wallet with sufficient STX for transaction fees.
+* Share the pool operator wallet’s STX address with delegating parties.
+* Fund your signer's STX wallet with enough STX to cover transaction fees (recommend at least 100–200 STX).
+{% endstep %}
+{% endstepper %}
+
+### Minimum System Requirements
+
+These are the minimum required specs to run a node and signer. More resources are recommended for optimal performance.
+
+#### Signer, Stacks node and Bitcoin node
+
+* 4 vCPU
+* 8 GB memory if running only a Stacks node and signer
+* 16 GB memory if running Stacks + Bitcoin node + signer
+* 1.5+ TB storage (1 TB for Bitcoin node, 500 GB for Stacks node, and 50 GB for signer)
+
+***
+
+## Preflight Setup
+
+Before you get your signer set up, you'll need to [generate a new private key](https://docs.stacks.co/stacks-101/accounts#creation). The `stacks-cli` provides a mechanism for quickly generating a new account keychain via a simple CLI interface. The linked guide shows how to create one of those accounts on testnet.
+
+Save the generated account information securely; you'll need it later.
+
+{% hint style="info" %}
+What should the networking setup look like?
+
+Signers are intended to work with a local node. The node<->signer connection is not run over SSL, which means you can be exposed to a man-in-the-middle attack if your signer and node are hosted on separate machines. Ensure your signer isn't allowing requests from the public internet. We recommend having the signer and node running locally on the same machine or using internal networking between them.
+{% endhint %}
+
+***
+
+## Create a Configuration File
+
+Create a file named `signer-config.toml`. Populate it with the example signer config file contents from the [Sample Configuration Files](https://app.gitbook.com/s/GVj1Z9vMuEOMe7oH7Wnq/signer-configuration) page. Each field is described on that page.
+
+***
+
+## Running the Signer
+
+Two options: Docker (recommended) or binary. Binaries are available on the [Stacks Core releases page](https://github.com/stacks-network/stacks-core/releases).
+
+### Running the Signer with Docker
+
+You can run the signer as a Docker container using the `blockstack/stacks-signer:3.1.0.0.5.0` image.
+
+Requirements when running the container:
+
+* The port configured as the `endpoint` (example: 30000) must be exposed to your Stacks node (endpoint should not be public).
+* A volume with at least a few GB available that contains the folder specified by your `db_path` (example: `/var`).
+* Mount your `signer-config.toml` file as a volume.
+
+Example docker run command:
+
+```bash
+IMG="blockstack/stacks-signer"
+VER="3.1.0.0.5.0"
+STX_SIGNER_PATH="./"
+STX_SIGNER_DATA="$STX_SIGNER_PATH/data"
+STX_SIGNER_CONFIG="$STX_SIGNER_PATH/signer-config.toml"
+
+docker run -d \
+ -v $STX_SIGNER_CONFIG:/config.toml \
+ -v $STX_SIGNER_DATA:/var/stacks \
+ -p 30000:30000 \
+ -e RUST_BACKTRACE=full \
+ -e BLOCKSTACK_DEBUG=0 \
+ --name stacks-signer \
+ $IMG:$VER \
+ stacks-signer run \
+ --config /config.toml
+```
+
+Hint about platform mismatch:
+
+{% hint style="info" %}
+If you get an error about the manifest not found or the image platform not matching the host platform, you probably are running on an architecture other than x64. Add `--platform=linux/amd64` to the command (for example, on M1 Mac).
+{% endhint %}
+
+Or, using a custom Dockerfile:
+
+```docker
+FROM blockstack/stacks-signer:3.1.0.0.5.0
+COPY signer-config.toml /config.toml
+EXPOSE 30000
+CMD ["stacks-signer", "run", "--config", "/config.toml"]
+```
+
+### Running the Signer as a Binary
+
+Download the pre-built binaries from the [Stacks Core releases page on Github](https://github.com/stacks-network/stacks-core/releases), unzip the archive for your architecture — inside is a `stacks-signer` binary.
+
+Run the signer:
+
+```bash
+stacks-signer run --config ../signer-config.toml
+```
+
+(Replace `../signer-config.toml` with the actual path to your config.)
+
+***
+
+## Verify the Signer is Running
+
+List running containers:
+
+```bash
+docker ps
+```
+
+Check the container logs:
+
+```bash
+docker logs
+```
+
+You should see:
+
+Signer spawned successfully. Waiting for messages to process...
+
+You may also see a warning like:
+
+```
+WARN [1712003997.160121] [stacks-signer/src/runloop.rs:247] [signer_runloop] Signer is not registered for reward cycle 556. Waiting for confirmed registration...
+```
+
+This means your signer is running and awaiting registration; proceed to set up the Stacks node and begin stacking.
+
+{% hint style="warning" %}
+Even after you Stack, you may still see messages saying the signer is not registered for the current or next reward cycle. This is normal until the prepare phase for your chosen reward cycle; assuming you meet the stacking minimum, the signer will be registered during that phase.
+{% endhint %}
+
+***
+
+## Set Up Your Bitcoin Node
+
+Optional but recommended to improve signer health and performance.
+
+Guides:
+
+* Run a full Bitcoin node: https://docs.stacks.co/guides-and-tutorials/nodes-and-miners/run-a-bitcoin-node
+* Run a pruned Bitcoin node: https://docs.stacks.co/guides-and-tutorials/nodes-and-miners/run-a-pruned-bitcoin-node
+
+***
+
+## Set Up Your Stacks Node
+
+Start the Stacks node after the signer is running — the node will not run unless it can send events to the signer.
+
+### Stacks Node Configuration
+
+Create `node-config.toml`. See the [Sample Configuration Files](https://app.gitbook.com/s/GVj1Z9vMuEOMe7oH7Wnq/signer-configuration) page for the full contents.
+
+Important fields to change:
+
+* `working_dir`: directory where the node persists data
+* `auth_token`: authentication token used by signer (must match signer `auth_password`)
+* `events_observer.endpoint`: host and port where your signer listens (example: `127.0.0.1:30000` or `stacks-signer.local:30000`)
+
+### Start with an archive
+
+Starting from an archive snapshot is much faster than syncing from genesis. Archives are at https://archive.hiro.so.
+
+Example to download and extract the latest mainnet snapshot:
+
+```bash
+curl -# https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz -o stacks-snapshot.tar.gz
+tar -zxvf stacks-snapshot.tar.gz
+```
+
+This creates a `mainnet` folder where downloaded. Set `working_dir` to the parent directory containing `mainnet`.
+
+See best practices for snapshots: ../best-practices-to-snapshot-the-chainstate.md
+
+### Run a Stacks Node with Docker
+
+Use the `blockstack/stacks-core` image (example tag: `3.1.0.0.13`).
+
+When running the container:
+
+* Expose the port configured for `p2p_bind` to the internet.
+* Make the port configured for `rpc_bind` accessible by your signer.
+* `working_dir` needs 500 GB–1 TB storage.
+* Include your `node-config.toml`.
+
+Example docker run:
+
+```bash
+IMG="blockstack/stacks-core"
+VER="3.1.0.0.13"
+STX_NODE_CONFIG="./node-config.toml"
+
+docker run -d \
+ -v $STX_NODE_CONFIG:/config.toml \
+ -v /var/stacks \
+ -p 20443:20443 \
+ -p 20444:20444 \
+ -e RUST_BACKTRACE=full \
+ --name stacks-node \
+ $IMG:$VER \
+ stacks-node start \
+ --config /config.toml
+```
+
+Or with a custom Dockerfile:
+
+```docker
+FROM blockstack/stacks-core:3.1.0.0.13
+COPY node-config.toml /config.toml
+EXPOSE 20444
+EXPOSE 20443
+CMD ["stacks-node", "start", "--config", "/config.toml"]
+```
+
+If you get connection refused errors, you may need to point `events_observer.endpoint` to the Docker signer container. If using default Docker bridge mode, `localhost` inside the container is not the host — point the endpoint to the Docker host or the signer container hostname accordingly.
+
+### Run a Stacks Node with a Binary
+
+Download the pre-built `stacks-node` binary from the [Stacks Core releases](https://github.com/stacks-network/stacks-core/releases).
+
+Start the node:
+
+```bash
+./stacks-node start --config node-config.toml
+```
+
+### Verify Stacks Node is Running
+
+Typical startup logs:
+
+```bash
+Mar 6 19:35:08.212848 INFO stacks-node 0.1.0
+Mar 6 19:35:08.213084 INFO Loading config at path ./Stacks-config.toml
+Mar 6 19:35:08.216674 INFO Registering event observer at: localhost:30000
+Mar 6 19:35:08.221603 INFO Migrating sortition DB to the latest schema version
+Mar 6 19:35:08.224082 INFO Migrating chainstate DB to the latest schema version
+Mar 6 19:35:08.227404 INFO Start syncing Bitcoin headers, feel free to grab a cup of coffee, this can take a while
+```
+
+Ensure you see the `Registering event observer at XXX` log with your signer endpoint. Once Bitcoin headers are synced, you can GET `/v2/info` on the node RPC endpoint (default port 20443).
+
+You may see many logs while syncing; refer to How to Read the Signer Logs if concerned.
+
+***
+
+## Setup Your Stacks Accounts
+
+{% hint style="info" %}
+For more on stacking and signing relationship, see the [Stack STX](broken-reference) guide.
+{% endhint %}
+
+As a signer you’ll manage two Stacks accounts:
+
+1. A “pool operator” wallet, which commits delegated STX to your signer
+2. Your signer’s wallet
+
+{% hint style="warning" %}
+For testing, make sure you are using testnet (not mainnet). Testnet STX can be [requested from a faucet](https://explorer.hiro.so/sandbox/faucet?chain=testnet).
+{% endhint %}
+
+### Setup Your Pool Operator Wallet
+
+Set up a pool operator wallet using any Stacks wallet, such as [Leather](https://leather.io/) or [Xverse](https://www.xverse.app/). You may generate a new account or use an existing one. Leather supports Ledger hardware wallets if you prefer.
+
+Fund the wallet with enough STX to cover transaction fees (testnet: faucet at https://explorer.hiro.so/sandbox/faucet?chain=testnet).
+
+Share this wallet’s STX address with parties that will delegate STX to you. For improved UX, you might use the helper contract allowing a BTC address for stackers ([pox4-pools](https://explorer.hiro.so/txid/SP001SFSMC2ZY76PD4M68P3WGX154XCH7NE3TYMX.pox4-pools?chain=mainnet)) and add your pool to [earn.leather.io](https://earn.leather.io/).
+
+***
+
+If you need more detailed troubleshooting or further setup examples (config snippets, sample signer-config.toml or node-config.toml), let me know which files or examples you'd like converted or added.
diff --git a/docs/operate/run-a-signer/best-practices-to-run-a-signer.md b/docs/operate/run-a-signer/best-practices-to-run-a-signer.md
new file mode 100644
index 0000000000..96b30092c8
--- /dev/null
+++ b/docs/operate/run-a-signer/best-practices-to-run-a-signer.md
@@ -0,0 +1,101 @@
+# Best Practices to Run a Signer
+
+{% hint style="info" %}
+**Intended audience**: solo Stackers or Stacking pool operators.
+{% endhint %}
+
+The following best practices suggest how to create a resilient setup for running your Signer.
+
+{% hint style="info" %}
+tl;dr: avoid single point of failures, introduce redundancy, monitor things.
+{% endhint %}
+
+### Monitor your Signer and collect logs
+
+* See [here](how-to-monitor-signer.md) on how to set up monitoring.
+* Retain at least 1 week of logs for both the Signer and the Stacks node.
+
+### Downstream components
+
+* Run a dedicated Bitcoin node and Stacks node per Signer.
+ * Ensure the nodes are provisioned with the minimum hardware requirements described [here](https://docs.stacks.co/guides-and-tutorials/running-a-signer#minimum-system-requirements).
+ * Nodes should be exclusively dedicated to serve the Signer. Avoid re-using them to serve other clients as that may negatively affect performance (no mock-signing, no Stacks API nodes).
+* If running dedicated nodes is not possible, then ensure that the Bitcoin / Stacks nodes do not become single points of failure for multiple signers depending on them.
+ * Introduce redundancy, load balancing, rely on a robust Bitcoin RPC provider, etc.
+
+### Split voting power across multiple Signers
+
+* Distribute your voting power across multiple, distinct Signer public keys to mitigate the risk of loss or downtime from a single compromised key.
+* Each Signer should also limit voting power to a maximum amount and invite Stackers to use a different Signer when the limit is reached.
+
+### Monitor new software releases
+
+* Stay up-to-date with new releases, patches, and security advisories (e.g., GitHub, mailing lists, Discord).
+* Apply updates as quickly as possible, especially those addressing a security vulnerability.
+
+### Upgrade procedures
+
+{% stepper %}
+{% step %}
+### Test one instance first
+
+Upgrade one Signer instance at a time. Test the update on a single instance and verify functionality before proceeding to others.
+{% endstep %}
+
+{% step %}
+### Roll out gradually
+
+If the test is successful, proceed to upgrade the remaining instances one-by-one.
+{% endstep %}
+
+{% step %}
+### Minimize downtime
+
+While a Signer is offline for upgrades, it won't sign any blocks. Ensure that the downtime is as short as possible.
+{% endstep %}
+{% endstepper %}
+
+### Diversified hosting
+
+* Use different provider / configuration where feasible (e.g., a self-hosted instance and one in the cloud, or in two different data center regions, etc.).
+* Ensure each host has redundant power supply and network connectivity.
+
+### Fall-back deployments
+
+* Deploy additional Stacks nodes and Bitcoin nodes to be used as fall-back.
+ * Use the same configuration as your active instances.
+ * For the Stacks node, comment out the `event_observer` section.
+* Prepare a backup Signer (same configuration) to be quickly activated, but do not run it.
+ * At all times, there should be exactly one Signer instance running for each Signer private key.
+* These fall-back instances should be hosted on separate physical hosts (see diversified hosting) from the instances usually active in operations (serving each Signer).
+
+To switch to the fall-back configuration quickly if an active instance fails, follow these steps:
+
+{% stepper %}
+{% step %}
+### Run the backup Signer
+
+Start the prepared backup Signer instance.
+{% endstep %}
+
+{% step %}
+### Enable event observer
+
+Enable the `event_observer` section of the Stacks node configuration.
+{% endstep %}
+
+{% step %}
+### Restart the node
+
+Restart the Stacks node so it runs with the enabled `event_observer`.
+{% endstep %}
+{% endstepper %}
+
+### Redundancy in operations
+
+* Ensure that multiple, trusted users can manage and maintain signer instances.
+* Where feasible, users should span different timezones.
+
+### Backup signer keys in cold-storage
+
+* Keep an offline, secure backup of all Signer private keys (e.g., hardware security modules or encrypted storage devices).
diff --git a/docs/operate/run-a-signer/how-to-monitor-signer.md b/docs/operate/run-a-signer/how-to-monitor-signer.md
new file mode 100644
index 0000000000..baad96143a
--- /dev/null
+++ b/docs/operate/run-a-signer/how-to-monitor-signer.md
@@ -0,0 +1,229 @@
+# How to Monitor Signer
+
+We will use [Grafana Cloud](https://grafana.com/) to observe and monitor both the Signer and its corresponding Stacks node.
+
+## Requirements
+
+Grafana's application observability docs have a [great quick-start](https://grafana.com/docs/grafana-cloud/monitor-applications/application-observability/). We will use:
+
+* Grafana Cloud to collect metrics and visualize them.
+* Grafana Alloy, on the Signer host, to push the metrics.
+
+### Creating a Grafana Cloud account
+
+Before we begin, create a [Grafana Cloud](https://grafana.com/docs/grafana-cloud/monitor-applications/application-observability/grafana-cloud/) account (they offer a free tier that you can use).
+
+Once done, access your dashboard and follow these steps:
+
+{% stepper %}
+{% step %}
+### Add a new connection
+
+Click on "Connections", then "Add new connection".
+{% endstep %}
+
+{% step %}
+### Select Hosted Prometheus metrics
+
+Select "Hosted Prometheus metrics".
+{% endstep %}
+
+{% step %}
+### Choose via Grafana Alloy
+
+Select "Via Grafana Alloy", then on step 2 choose "Run Grafana Alloy" to generate an API token.
+{% endstep %}
+{% endstepper %}
+
+Note the token `GCLOUD_RW_API_KEY` and the parameters `GCLOUD_HOSTED_METRICS_URL` and `GCLOUD_HOSTED_METRICS_ID`; we will use them later.
+
+### Configuring the Signer and the Stacks node
+
+Ensure both your Signer configuration and your node configuration include the following lines:
+
+```toml
+# signer-config.toml
+
+# ...
+
+# Adjust to 0.0.0.0:30001 if running in Docker.
+metrics_endpoint = "127.0.0.1:30001"
+```
+
+```toml
+# node-config.toml
+[node]
+
+# ...
+
+# Adjust to 0.0.0.0:9153 if running in Docker.
+prometheus_bind = "127.0.0.1:9153"
+```
+
+The pre-compiled binaries already include the monitoring feature. However, if you are compiling the application binaries yourself, remember to enable the Cargo feature `monitoring_prom` while building them, for example:
+
+```bash
+cargo build --features monitoring_prom,slog_json --release
+```
+
+Once both binaries are running with the updated configuration, you can peek at the metrics being exposed:
+
+```bash
+curl 127.0.0.1:30001/metrics
+
+# HELP stacks_signer_current_reward_cycle The current reward cycle
+
+# TYPE stacks_signer_current_reward_cycle gauge
+stacks_signer_current_reward_cycle 95
+
+# HELP stacks_signer_node_rpc_call_latencies_histogram Time (seconds) measuring round-trip RPC call latency to the Stacks node
+
+# TYPE stacks_signer_node_rpc_call_latencies_histogram histogram
+...
+stacks_signer_node_rpc_call_latencies_histogram_bucket{path="/v2/info",le="0.005"} 0
+stacks_signer_node_rpc_call_latencies_histogram_bucket{path="/v2/info",le="0.01"} 0
+stacks_signer_node_rpc_call_latencies_histogram_bucket{path="/v2/info",le="0.025"} 0
+stacks_signer_node_rpc_call_latencies_histogram_bucket{path="/v2/info",le="0.05"} 985
+stacks_signer_node_rpc_call_latencies_histogram_bucket{path="/v2/info",le="0.1"} 1194
+...
+```
+
+Also, you'll have a `/info` endpoint on the same port:
+
+```bash
+curl 127.0.0.1:30001/info
+```
+
+### Install Alloy
+
+Follow these instructions to install [Grafana Alloy](https://grafana.com/docs/alloy/latest/set-up/install/linux/).
+
+On Debian-based distributions:
+
+```bash
+sudo apt install gpg
+sudo mkdir -p /etc/apt/keyrings/
+wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
+echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
+sudo apt-get update
+sudo apt-get install alloy
+```
+
+### Configure Alloy
+
+Edit the file `/etc/alloy/config.alloy` as follows, replacing the placeholders related to the `prometheus` endpoint with the parameters obtained when creating a Grafana Cloud account:
+
+* `GCLOUD_HOSTED_METRICS_URL`
+* `GCLOUD_HOSTED_METRICS_ID`
+* `GCLOUD_RW_API_KEY`
+
+```conf
+// For a full configuration reference, see https://grafana.com/docs/alloy
+// For a default configuration, integrating all environmental variables from Grafana Cloud
+// see https://storage.googleapis.com/cloud-onboarding/alloy/config/config.alloy
+
+logging {
+ level = "warn"
+}
+
+prometheus.exporter.unix "default" {
+ include_exporter_metrics = true
+ disable_collectors = ["mdadm"]
+}
+
+prometheus.scrape "default" {
+ targets = array.concat(
+ prometheus.exporter.unix.default.targets,
+ [
+ {
+ // Self-collect metrics
+ job = "alloy",
+ __address__ = "127.0.0.1:12345",
+ },
+ {
+ // stacks-signer
+ job = "stacks-signer",
+ __address__ = "127.0.0.1:30001",
+ },
+ {
+ // stacks-node
+ job = "stacks-node",
+ __address__ = "127.0.0.1:9153",
+ },
+ ],
+ )
+
+ forward_to = [prometheus.remote_write.metrics_service.receiver]
+}
+
+prometheus.remote_write "metrics_service" {
+ external_labels = {"instance" = constants.hostname}
+ endpoint {
+ # TODO: Edit the URL below with your Grafana production URL.
+ # should end with /api/prom/push
+ url = ""
+
+ # TODO: Edit with your Grafana Cloud ID and Token
+ basic_auth {
+ username = ""
+ password = ""
+ }
+ }
+}
+```
+
+Enable and start Alloy:
+
+```bash
+sudo systemctl daemon-reload
+sudo systemctl enable alloy.service
+sudo systemctl start alloy.service
+```
+
+Metrics from your Signer and node will now start being pushed to Grafana Cloud.
+
+## Visualizing the metrics
+
+You can now start building a dashboard to visualize the metrics.
+
+1. Log in to Grafana Cloud and create a new Dashboard.
+2. Pick the Prometheus instance you created before as the data source.
+3. Create a new panel and pick `stacks_signer_current_reward_cycle` from the metrics.
+
+You should now be able to see Stacks' current reward cycle, as measured by the Signer, in the dashboard.
+
+Grafana comes with powerful data visualization tools. You can read about how to query and transform data [here](https://grafana.com/docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/), and find examples on how to build [Prometheus queries](https://prometheus.io/docs/prometheus/latest/querying/basics/).
+
+[This template](https://grafana.com/grafana/dashboards/22137-stacks-signer-template/) will kick-start your dashboard.
+
+
+
+## Bonus: monitoring the host
+
+Since we are here, we can also monitor the host itself. Debian-based distributions make it very easy for us by using [`node_exporter`](https://github.com/prometheus/node_exporter/tree/master).
+
+```bash
+sudo apt install prometheus-node-exporter
+sudo systemctl enable prometheus-node-exporter
+sudo systemctl start prometheus-node-exporter
+```
+
+This will expose metrics on port `9100` of `localhost`.
+
+We can now configure `alloy` to push them to Grafana. Edit your `/etc/alloy/config.alloy` file and add the following scrape target to the `prometheus.scrape "default"` targets list:
+
+```conf
+{
+ job = "node_exporter",
+ __address__ = "127.0.0.1:9100",
+}
+```
+
+Now reload `alloy` and check its status:
+
+```bash
+sudo systemctl reload alloy
+sudo systemctl status alloy
+```
+
+`node_exporter` provides a lot of metrics. Explore them through the Grafana Explorer or use one of the many prepared dashboards (e.g., [this one](https://grafana.com/grafana/dashboards/1860-node-exporter-full/)) to see comprehensive information. Once you have a dashboard ready, you can also use it to configure alerts (e.g., on disk space, etc.).
diff --git a/docs/operate/run-a-signer/how-to-read-signer-logs.md b/docs/operate/run-a-signer/how-to-read-signer-logs.md
new file mode 100644
index 0000000000..2f74b2fd13
--- /dev/null
+++ b/docs/operate/run-a-signer/how-to-read-signer-logs.md
@@ -0,0 +1,63 @@
+# How to Read Signer Logs
+
+There are a lot of different messages you can get in the logs when running a signer. Getting a good grasp on what some of these logs mean can help you troubleshoot effectively and determine if your signer is running successfully or not.
+
+There are three types of log messages you should be aware of:
+
+* Successful
+* Informational
+* Errors
+
+Successful log messages indicate that you are on track and everything is working as expected. However, there are various success stages depending on several factors including your stacking status and the timing of the current reward cycle.
+
+There are also several informational/warning logs that you don't necessarily need to take action on, but they provide useful context about the network or the signer.
+
+Finally, error logs indicate something has gone wrong and you need to take action.
+
+Below are some common log messages you might see, what they mean, and what action (if any) you should take.
+
+{% hint style="info" %}
+Successful / informational / error categories — general guidance:
+
+* Successful: nothing to do unless the message indicates a different stage of operation that requires action (e.g., registration needed).
+* Informational: often safe to ignore, but useful for context.
+* Errors: require investigation and remediation.
+{% endhint %}
+
+## Successful
+
+### Signer uninitialized or not registered
+
+If you get a message saying your signer is uninitialized, it means your signer is not registered for the current or upcoming reward cycle (or the burnchain block height is not yet at the second block in the prepare phase) so the signer cannot determine registration status yet. This does not mean the signer process itself has failed — it is running successfully, but the signer cannot act until registration/delegation occurs.
+
+Example log:
+
+`Signer spawned successfully. Waiting for messages to process... INFO [1711088054.872542] [stacks-signer/src/runloop.rs:278] [signer_runloop] Running one pass for signer ID# 0. Current state: Uninitialized`
+
+You may also see a warning like:
+
+```
+WARN [1712003997.160121] [stacks-signer/src/runloop.rs:247] [signer_runloop] Signer is not registered for reward cycle 556. Waiting for confirmed registration...
+```
+
+Action:
+
+* If you want the signer to participate, either delegate to it or stack on your own for an upcoming reward cycle.
+* For more details on stacking and registration, see the How to Stack doc: ../stack-stx/stacking-flow.md
+
+## Informational
+
+### Peer not connecting
+
+If you see a message about a peer not connecting, for example:
+
+```
+INFO [1711988555.021567] [stackslib/src/net/neighbors/walk.rs:1015] [p2p-(0.0.0.0:20444,0.0.0.0:20443)] local.80000000://(bind=0.0.0.0:20444)(pub=Some(10.0.19.16:20444)): Failed to connect to facade0b+80000000://172.16.60.18:20444: PeerNotConnected
+```
+
+This means your node attempted to connect to another node on the network but was unable to. This can happen for many reasons (network connectivity, remote node offline, NAT/firewall, etc.).
+
+Action:
+
+* Usually not a cause for concern and does not impact whether your signer is running correctly.
+* If you see many such messages or persistent connectivity issues, investigate network connectivity, firewall/NAT rules, or peer configuration.
diff --git a/docs/operate/run-a-signer/opsec-best-practices.md b/docs/operate/run-a-signer/opsec-best-practices.md
new file mode 100644
index 0000000000..bd1b1361a2
--- /dev/null
+++ b/docs/operate/run-a-signer/opsec-best-practices.md
@@ -0,0 +1,113 @@
+# OpSec Best Practices
+
+#### Threat Modeling
+
+A threat actor that is able to compromise > 70% of Signers (by stake weight) would be able to successfully propose Stacks blocks that would otherwise be considered invalid.
+
+Some potential vectors for signer key compromise are as follows:
+
+* stacks-signer node is compromised and key is exfiltrated from the filesystem
+* Signer key is compromised during generation or deployment
+* Signer key is accidentally checked into SCM (eg Github or Gitlab)
+* Social engineering attack against Signer community: eg a malicious link is posted to social media that harvests key material
+* An undisclosed backdoor is discovered in the Signer binary.
+* Supply chain attack against stacks-signer source code: threat actor compromises upstream dependencies of stacks-signer
+
+#### Countermeasures
+
+What can Signers do to mitigate the threat vectors identified above? Let's identify countermeasures in response to each of the threats identified above, starting with the first vector: stacks-signer node compromise and key exfiltration.
+
+{% stepper %}
+{% step %}
+### Run the stacks-signer on a separate system from the stacks-node
+
+This reduces discoverability of the signer. Systems running the stacks-node participate in the peer-to-peer network and are more easily enumerated. If an attacker can't find your stacks-signer, they can't attack it directly.
+
+Best practice: ensure stacks-node and stacks-signer communicate only over trusted networks, ideally using localhost (127.0.0.1) or a secure private subnet.
+
+Note: Running the stacks-signer on a separate system is an option, but not strictly necessary. Running both on the same virtual machine within a private network, with traffic firewalled to allow only incoming P2P connections (port 20444), provides a secure and easier setup while minimizing exposure.
+{% endstep %}
+
+{% step %}
+### Run the stacks-signer as a separate user from the stacks-node
+
+When resource constraints prevent separate workloads, run the stacks-signer under a distinct unprivileged user account from the stacks-node. Ensure exclusive ownership and restrictive permissions for each user's configuration files.
+
+Example: the user running the signer binary (e.g., signer) should own the signer’s config file and set permissions to prevent other users from reading it. The same principle applies to the stacks-node user. This ensures only appropriate processes can access sensitive configuration details.
+{% endstep %}
+
+{% step %}
+### Harden the systemd configuration for the stacks-signer
+
+Hardening systemd can reduce blast radius if an attacker gains control of the stacks-signer process. An example stacks-signer.service systemd unit is shown below. This unit prevents certain filesystem writes and otherwise restricts the process.
+
+{% code title="stacks-signer.service" %}
+```ini
+[Unit]
+Description=Stacks Signer
+After=network.target
+StartLimitBurst=3
+StartLimitIntervalSec=300
+ConditionFileIsExecutable=/usr/local/bin/stacks-signer
+ConditionPathExists=/etc/stacks/signer
+ConditionFileNotEmpty=/etc/stacks/signer/signer-config.toml
+
+[Service]
+ExecStart=/usr/local/bin/stacks-signer run --config /home/etc/stacks/signer/signer-config.toml
+User={{ svc_user }}
+Group={{ svc_user }}
+Type=simple
+Restart=on-failure
+TimeoutStopSec=600
+KillSignal=SIGTERM
+#KillSignal=SIGINT
+
+# Provide a private /tmp and /var/tmp.
+PrivateTmp=true
+
+# Mount /usr, /boot/ and /etc read-only for the process.
+ProtectSystem=full
+
+# Deny access to /home, /root and /run/user
+ProtectHome=true
+
+# Disallow the process and all of its children to gain
+
+# new privileges through execve().
+NoNewPrivileges=true
+
+# Use a new /dev namespace only populated with API pseudo devices
+
+# such as /dev/null, /dev/zero and /dev/random.
+PrivateDevices=true
+
+[Install]
+WantedBy=multi-user.target
+```
+{% endcode %}
+
+Read more about systemd hardening: https://www.ctrl.blog/entry/systemd-service-hardening.html
+{% endstep %}
+
+{% step %}
+### Restrict access to unnecessary ports and protocols
+
+The stacks-signer requires outbound TCP access to the stacks-node, but typically no other inbound network exposure is needed (except for OS updates and administrative access). Restrict network access to the minimum required for operation.
+{% endstep %}
+
+{% step %}
+### Harden the operating system
+
+A few practical OS hardening measures:
+
+* Run stacks-signer as an unprivileged user (not root).
+* Set permissions on the stacks-signer key/config to be readable only by the user running the stacks-signer process, e.g.:
+ * sudo chmod 600 signer/signer-config.toml
+* Require public-key authentication for SSH and disable SSH root login.
+* Consider running sshd on a non-standard port to reduce noise from port scanners and credential-stuffing attacks.
+{% endstep %}
+{% endstepper %}
+
+This post outlines essential operational security best practices for Stacks Signers, key actors in the Nakamoto architecture.
+
+By implementing these strategies, signer operators can effectively mitigate risks and maintain the security and reliability of the Stacks network.
diff --git a/docs/operate/run-a-signer/signer-quickstart.md b/docs/operate/run-a-signer/signer-quickstart.md
new file mode 100644
index 0000000000..6de12f7c56
--- /dev/null
+++ b/docs/operate/run-a-signer/signer-quickstart.md
@@ -0,0 +1,461 @@
+# Signer Quickstart
+
+{% hint style="info" %}
+**Current Signer and Stacks Node Versions**
+
+**Stacks Signer - latest**
+
+* [Docker Image](https://hub.docker.com/layers/blockstack/stacks-signer/latest)
+* [GitHub Release](https://github.com/stacks-network/stacks-core/releases/latest)
+
+**Stacks Node - latest**
+
+* [Docker Image](https://hub.docker.com/layers/blockstack/stacks-core/latest)
+* [GitHub Release](https://github.com/stacks-network/stacks-core/releases/latest)
+{% endhint %}
+
+If you want to get up and running as an active signer as quickly as possible, here is a list of the commands you need to run and actions to take.
+
+If you are not familiar with how signing works yet, be sure to check out the [Signing concept guide](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/block-production/signing).
+
+If you would like a more detailed walkthrough of all of these steps, take a look at the [Running a Signer](file:///) guide.
+
+{% hint style="danger" %}
+The CLI examples below may show outdated release versions. For the latest releases, always refer to the links above in the top info block.
+{% endhint %}
+
+{% stepper %}
+{% step %}
+### Prerequisites
+
+{% tabs %}
+{% tab title="Mainnet" %}
+```bash
+# Create the required directories
+mkdir -p ~/stacks-signer/data
+mkdir -p ~/stacks-node/data
+
+# Install needed packages
+sudo apt install -y npm wget unzip jq tar
+
+# Install Stacks CLI globally
+npm install --global @stacks/cli
+
+# Generate a new account and store details in a file
+stx make_keychain | jq > ~/stacks-signer/keychain.json
+```
+{% endtab %}
+
+{% tab title="Testnet" %}
+```bash
+# Create the required directories
+mkdir -p ~/stacks-signer/data
+mkdir -p ~/stacks-node/data
+
+# Install needed packages
+sudo apt install -y npm wget unzip jq tar
+
+# Install Stacks CLI globally
+npm install --global @stacks/cli
+
+# Generate a new account and store details in a file
+
+# '-t' option makes this a testnet account
+stx make_keychain -t | jq > ~/stacks-signer/keychain.json
+```
+{% endtab %}
+{% endtabs %}
+
+The account file previously created looks like this:
+
+```json
+{
+ "mnemonic": "aaa bbb ccc ddd ...",
+ "keyInfo": {
+ "privateKey": "65f3...",
+ "publicKey": "03a3...",
+ "address": "SP1G...",
+ "btcAddress": "19tg...",
+ "wif": "Kzdt...",
+ "index": 0
+ }
+}
+```
+
+From this file, you'll need the `privateKey` value.
+{% endstep %}
+
+{% step %}
+### Set Up Your Stacks Signer
+
+#### Download the stacks-signer binary
+
+Official binaries are available from the [Stacks Core releases page on Github](https://github.com/stacks-network/stacks-core/releases). Each release includes pre-built binaries. Download the [latest signer release ZIP file](https://github.com/stacks-network/stacks-core/releases/latest) for your server’s architecture and decompress it. Inside of that folder is a `stacks-signer` binary.
+
+Assuming a `Linux x64 glibc` machine, the commands to download and uncompress the signer binary look like this:
+
+```bash
+# The CLI examples below may show outdated release versions.
+# Enter the signer directory
+cd ~/stacks-signer
+
+# Download the signer binary zip
+wget https://github.com/stacks-network/stacks-core/releases/latest/download/linux-glibc-x64.zip
+
+# Unzip the signer binary archive
+unzip linux-glibc-x64.zip
+```
+
+#### Create the configuration file
+
+Create the configuration file required to start the signer (be sure to replace `` and `` with your auth token and private key values):
+
+{% tabs %}
+{% tab title="Mainnet" %}
+```bash
+# The CLI examples below may show outdated release versions.
+# Set environment variables
+AUTH_TOKEN= # Used for signer-node authentication
+PRIVATE_KEY= # privateKey from Step 1, this is the signer's private key
+
+# Create the signer's configuration file
+cat < ~/stacks-signer/signer-config.toml
+node_host = "127.0.0.1:20443"
+endpoint = "127.0.0.1:30000"
+network = "mainnet"
+db_path = "$HOME/stacks-signer/data/signer.sqlite"
+auth_password = "$AUTH_TOKEN"
+stacks_private_key = "$PRIVATE_KEY"
+metrics_endpoint = "127.0.0.1:9154"
+block_proposal_timeout_ms = 180000
+tenure_idle_timeout_secs = 120
+EOF
+```
+{% endtab %}
+
+{% tab title="Testnet" %}
+```bash
+# Set environment variables
+AUTH_TOKEN= # Used for signer-node authentication
+PRIVATE_KEY= # privateKey from Step 1, this is the signer's private key
+
+# Create the signer's configuration file
+cat < ~/stacks-signer/signer-config.toml
+node_host = "127.0.0.1:20443"
+endpoint = "127.0.0.1:30000"
+network = "testnet"
+db_path = "$HOME/stacks-signer/data/signer.sqlite"
+auth_password = "$AUTH_TOKEN"
+stacks_private_key = "$PRIVATE_KEY"
+metrics_endpoint = "127.0.0.1:9154"
+block_proposal_timeout_ms = 180000
+EOF
+```
+{% endtab %}
+{% endtabs %}
+
+#### Verify the setup
+
+To ensure the signer has been set up correctly, you can run the following commands:
+
+```bash
+# The CLI examples below may show outdated release versions.
+# Verify the signer's version
+~/stacks-signer/stacks-signer --version
+
+# Output:
+stacks-signer stacks-signer signer-3.1.0.0.5.0 (release/signer-3.1.0.0.5.0:513dbc5, release build, linux [x86_64])
+
+# Verify the config file
+~/stacks-signer/stacks-signer check-config -c ~/stacks-signer/signer-config.toml
+
+# Output:
+Config:
+Stacks node host: 127.0.0.1:20443
+Signer endpoint: 127.0.0.1:30000
+Stacks address: SP1G... # address from keychain file
+Public key: 03a3... # publicKey from keychain file
+Network: mainnet # or testnet
+Chain ID: 0x1 # or 0x80000000 for testnet
+Database path: /home/admin/stacks-signer/data/signer.sqlite
+Metrics endpoint: 127.0.0.1:9154
+```
+
+#### Start the signer
+
+If the outputs of the previous commands are correct, you can proceed and start the signer:
+
+```bash
+~/stacks-signer/stacks-signer run -c ~/stacks-signer/signer-config.toml
+```
+{% endstep %}
+
+{% step %}
+### Optional: Set up a Bitcoin node (strongly recommended)
+
+In order to optimize signer health and performance, we highly recommend setting up your own Bitcoin node rather than relying on a third-party node.
+
+We have created guides for running both a [full Bitcoin node](../run-a-node/run-a-bitcoin-node.md) and a [pruned Bitcoin node](../run-a-node/run-a-pruned-bitcoin-node.md) you can follow.
+{% endstep %}
+
+{% step %}
+### Set Up Your Stacks Node
+
+#### Download the stacks-node binary
+
+Official binaries are available from the [Stacks Core releases page on Github](https://github.com/stacks-network/stacks-core/releases). Each release includes pre-built binaries. Download the [latest node release ZIP file](https://github.com/stacks-network/stacks-core/releases/latest) for your server’s architecture and decompress it. Inside of that folder is a `stacks-node` binary.
+
+Assuming a `Linux x64 glibc` machine, the commands to download and uncompress the node binary look like this:
+
+```bash
+# The CLI examples below may show outdated release versions.
+# Enter the node directory
+cd ~/stacks-node
+
+# Download the node binary zip
+wget https://github.com/stacks-network/stacks-core/releases/latest/download/linux-glibc-x64.zip
+
+# Unzip the node binary archive
+unzip linux-glibc-x64.zip
+```
+
+#### Create the configuration file
+
+Create the configuration file required to start the node (be sure to replace `` with your auth token value):
+
+{% tabs %}
+{% tab title="Mainnet" %}
+{% hint style="warning" %}
+For mainnet, we strongly recommended that you run your own bitcoin node (you can follow guides on how to run a [full Bitcoin node](https://docs.stacks.co/guides-and-tutorials/nodes-and-miners/run-a-bitcoin-node) or a [pruned Bitcoin node](https://docs.stacks.co/guides-and-tutorials/nodes-and-miners/run-a-pruned-bitcoin-node)) in order to ensure you have no connection issues when downloading bitcoin blocks. A hosted bitcoin node may cause your stacks node to fall behind tip and remain unsynced.
+
+If you run your own bitcoin node, you'll have to update `peer_host` and optionally add `rpc_port`, `peer_port`, `username` and `password` fields under the `[burnchain]` section of the node's configuration file.
+{% endhint %}
+
+```bash
+# The CLI examples below may show outdated release versions.
+# Set environment variables
+AUTH_TOKEN= # Used for signer-node authentication, same token as the one set up in the signer configuration
+
+# Create the node's configuration file
+cat < ~/stacks-node/node-config.toml
+[node]
+working_dir = "$HOME/stacks-node/data"
+rpc_bind = "127.0.0.1:20443"
+p2p_bind = "0.0.0.0:20444"
+prometheus_bind = "127.0.0.1:9153"
+bootstrap_node = "02196f005965cebe6ddc3901b7b1cc1aa7a88f305bb8c5893456b8f9a605923893@seed.mainnet.hiro.so:20444,02539449ad94e6e6392d8c1deb2b4e61f80ae2a18964349bc14336d8b903c46a8c@cet.stacksnodes.org:20444,02ececc8ce79b8adf813f13a0255f8ae58d4357309ba0cedd523d9f1a306fcfb79@sgt.stacksnodes.org:20444,0303144ba518fe7a0fb56a8a7d488f950307a4330f146e1e1458fc63fb33defe96@est.stacksnodes.org:20444"
+stacker = true
+
+[burnchain]
+chain = "bitcoin"
+mode = "mainnet"
+peer_host = "bitcoin.mainnet.stacks.org"
+
+[connection_options]
+auth_token = "$AUTH_TOKEN"
+
+[[events_observer]]
+endpoint = "127.0.0.1:30000"
+events_keys = ["stackerdb", "block_proposal", "burn_blocks"]
+EOF
+```
+{% endtab %}
+
+{% tab title="Testnet" %}
+```bash
+# Set environment variables
+AUTH_TOKEN= # Used for signer-node authentication, same token as the one set up in the signer configuration
+
+# Create the node's configuration file
+cat < ~/stacks-node/node-config.toml
+[node]
+working_dir = "$HOME/stacks-node/data"
+rpc_bind = "127.0.0.1:20443"
+p2p_bind = "0.0.0.0:20444"
+bootstrap_node = "029266faff4c8e0ca4f934f34996a96af481df94a89b0c9bd515f3536a95682ddc@seed.testnet.hiro.so:30444"
+prometheus_bind = "127.0.0.1:9153"
+stacker = true
+pox_sync_sample_secs = 30
+always_use_affirmation_maps = true
+require_affirmed_anchor_blocks = true
+
+[burnchain]
+mode = "krypton"
+peer_host = "bitcoin.regtest.hiro.so"
+peer_port = 18444
+pox_prepare_length = 100
+pox_reward_length = 900
+
+[connection_options]
+auth_token = "$AUTH_TOKEN"
+private_neighbors = false
+
+[[events_observer]]
+endpoint = "127.0.0.1:30000"
+events_keys = ["stackerdb", "block_proposal", "burn_blocks"]
+
+[[ustx_balance]]
+address = "ST2QKZ4FKHAH1NQKYKYAYZPY440FEPK7GZ1R5HBP2"
+amount = 10000000000000000
+
+[[ustx_balance]]
+address = "ST319CF5WV77KYR1H3GT0GZ7B8Q4AQPY42ETP1VPF"
+amount = 10000000000000000
+
+[[ustx_balance]]
+address = "ST221Z6TDTC5E0BYR2V624Q2ST6R0Q71T78WTAX6H"
+amount = 10000000000000000
+
+[[ustx_balance]]
+address = "ST2TFVBMRPS5SSNP98DQKQ5JNB2B6NZM91C4K3P7B"
+amount = 10000000000000000
+
+[[burnchain.epochs]]
+epoch_name = "1.0"
+start_height = 0
+
+[[burnchain.epochs]]
+epoch_name = "2.0"
+start_height = 0
+
+[[burnchain.epochs]]
+epoch_name = "2.05"
+start_height = 1
+
+[[burnchain.epochs]]
+epoch_name = "2.1"
+start_height = 2
+
+[[burnchain.epochs]]
+epoch_name = "2.2"
+start_height = 3
+
+[[burnchain.epochs]]
+epoch_name = "2.3"
+start_height = 4
+
+[[burnchain.epochs]]
+epoch_name = "2.4"
+start_height = 5
+
+[[burnchain.epochs]]
+epoch_name = "2.5"
+start_height = 6
+
+[[burnchain.epochs]]
+epoch_name = "3.0"
+start_height = 1_900
+
+[[burnchain.epochs]]
+epoch_name = "3.1"
+start_height = 2_000
+EOF
+```
+{% endtab %}
+{% endtabs %}
+
+#### Optional: Start the node with a data archive
+
+You can [download a chainstate archive](https://archive.hiro.so/) in order to quickly sync your node, otherwise it will take a long time to get up-to-date with the other nodes.
+
+{% tabs %}
+{% tab title="Mainnet" %}
+```bash
+# Enter the node's datadir
+cd ~/stacks-node/data
+
+# Download the archive
+wget https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz
+
+# Decompress the archive
+tar -xvf mainnet-stacks-blockchain-latest.tar.gz
+
+# Remove the archive
+rm mainnet-stacks-blockchain-latest.tar.gz
+```
+{% endtab %}
+
+{% tab title="Testnet" %}
+```bash
+# Enter the node's datadir
+cd ~/stacks-node/data
+
+# Download the archive
+wget https://archive.hiro.so/testnet/stacks-blockchain/testnet-stacks-blockchain-latest.tar.gz
+
+# Decompress the archive
+tar -xvf testnet-stacks-blockchain-latest.tar.gz
+
+# Remove the archive
+rm testnet-stacks-blockchain-latest.tar.gz
+```
+{% endtab %}
+{% endtabs %}
+
+#### Verify the setup
+
+To ensure the node has been set up correctly, you can run the following commands:
+
+```bash
+# The CLI examples below may show outdated release versions.
+# Verify the node's version
+~/stacks-node/stacks-node version
+
+# Output:
+INFO [1738695915.769633] [testnet/stacks-node/src/main.rs:278] [main] stacks-node 3.1.0.0.5 (release/3.1.0.0.5:513dbc5, release build, linux [x86_64])
+stacks-node 3.1.0.0.5 (release/3.1.0.0.5:513dbc5, release build, linux [x86_64])
+
+# Verify the node's config
+~/stacks-node/stacks-node check-config --config ~/stacks-node/node-config.toml
+
+# Output:
+INFO [1738695915.769633] [testnet/stacks-node/src/main.rs:278] [main] stacks-node 3.1.0.0.5 (release/3.1.0.0.5:513dbc5, release build, linux [x86_64])
+INFO [1729788064.913175] [testnet/stacks-node/src/main.rs:318] [main] Loading config at path /home/admin/stacks-node/node-config.toml
+INFO [1729788064.969551] [testnet/stacks-node/src/main.rs:331] [main] Loaded config!
+```
+
+#### Start the node
+
+If the outputs of the previous commands are correct, you can proceed and start the node:
+
+```bash
+~/stacks-node/stacks-node start --config ~/stacks-node/node-config.toml
+```
+{% endstep %}
+
+{% step %}
+### Generate your signer signature
+
+In order to stack, you'll need your signer signature. The fields required are further explained in the [Generate a signer key signature](https://docs.stacks.co/guides-and-tutorials/stack-stx/stacking-flow#step-2-generate-a-signer-key-signature) guide.
+
+The command to generate a signature looks like this:
+
+```bash
+~/stacks-signer/stacks-signer generate-stacking-signature \
+ --method stack-stx \
+ --max-amount 1000000000000 \
+ --auth-id 195591226970828652622091037492597751808 \
+ --period 12 \
+ --reward-cycle 100 \
+ --pox-address 19tg... \
+ --config ~/stacks-signer/signer-config.toml \
+ --json
+```
+
+The generated JSON can be then copy-pasted directly in the [Leather Earn](https://earn.leather.io/) website mentioned in the next step.
+{% endstep %}
+
+{% step %}
+### Start stacking
+
+The simplest route is to solo stack. You can do that by using [Leather Earn](https://earn.leather.io/). Click on the 'Stack Independently' button and follow the instructions there.
+
+If you would like to learn more about solo stacking or running a pool operator, take a look at the [Stack STX](https://docs.stacks.co/guides-and-tutorials/stack-stx) guide.
+{% endstep %}
+
+{% step %}
+### Monitoring
+
+If you would like to learn more about monitoring your signer and its corresponding node, you can check the [How to Monitor a Signer](https://docs.stacks.co/guides-and-tutorials/running-a-signer/how-to-monitor-signer) guide.
+{% endstep %}
+{% endstepper %}
diff --git a/docs/operate/snapshot-the-chainstate.md b/docs/operate/snapshot-the-chainstate.md
new file mode 100644
index 0000000000..9486830d0c
--- /dev/null
+++ b/docs/operate/snapshot-the-chainstate.md
@@ -0,0 +1,222 @@
+# Snapshot the Chainstate
+
+{% hint style="info" %}
+**Intended audience**: Solo Stackers, Stacking pool operators, and node operators who need to create reliable chainstate backups.
+{% endhint %}
+
+Regular snapshots of your Stacks chainstate help you recover quickly when things go wrong. This guide shows you how to create and manage chainstate snapshots properly.
+
+{% hint style="warning" %}
+**Critical**: Always shut down your Stacks node properly before creating a snapshot. Creating snapshots while the node is running will result in corrupted chainstate data.
+{% endhint %}
+
+### Shutdown Procedure
+
+To produce a valid chainstate backup, the node should be stopped gracefully before making a copy. The following steps will correctly shutdown the Stacks node:
+
+{% stepper %}
+{% step %}
+### Check node status before shutdown
+
+```bash
+# Verify if the node is responsive
+curl http://localhost:20443/v2/info
+```
+{% endstep %}
+
+{% step %}
+### Initiate graceful shutdown
+
+* For Docker: `docker stop stacks-node` (allows at least 10 seconds for graceful shutdown)
+* For systemd: `systemctl stop stacks-node`
+* For manual processes:
+
+```bash
+kill $(ps aux | grep stacks-node | grep -v grep | awk '{print $2}')
+```
+{% endstep %}
+
+{% step %}
+### Verify complete shutdown
+
+```bash
+# Ensure no stacks-node processes are running
+ps aux | grep stacks-node
+```
+{% endstep %}
+{% endstepper %}
+
+### Overview of Snapshot Methods
+
+There are two primary approaches for creating Stacks chainstate snapshots:
+
+1. **File-based snapshots** - compress up the chainstate folder
+2. **Volume snapshots** - snapshot the entire disk/volume
+
+Each method has its advantages depending on your infrastructure setup and recovery requirements.
+
+### File-Based Snapshots
+
+This method involves compressing the chainstate directory and storing it locally, or uploading to a cloud storage service.
+
+#### Steps (see [Example Automation Code section](snapshot-the-chainstate.md#example-automation-code) below)
+
+1. **Stop the Stacks node gracefully**
+2. **Create compressed archive**
+3. **Upload to cloud storage or save it locally**
+4. **Restart the Stacks node**
+
+### Volume-Based Snapshots
+
+This method creates block-level snapshots of the entire storage volume containing the chainstate. Different filesystems have different tools:
+
+* **ZFS**: Use `zfs snapshot` - [OpenZFS documentation](https://openzfs.github.io/openzfs-docs/man/v2.3/8/zfs-snapshot.8.html)
+* **XFS**: Use `xfsdump` - [XFS documentation](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/storage_administration_guide/xfsbackuprestore)
+* **ext4**: Use LVM snapshots - [LVM guide](https://kerneltalks.com/disk-management/how-to-guide-lvm-snapshot/)
+
+You can also use cloud provider snapshot tools (AWS EBS, Azure Disk, GCP Persistent Disk).
+
+#### Steps
+
+1. **Stop the Stacks node gracefully**
+2. **Create volume snapshot** using ZFS or cloud provider tools
+3. **Restart the Stacks node**
+
+### How to Restore
+
+After restoring the chainstate, you can check for corruption by waiting for a few blocks to download and ensuring the node syncs correctly.
+
+#### From File Snapshots
+
+1. Stop the Stacks node
+2. Download and extract the snapshot
+3. Replace the chainstate directory
+4. Restart the node
+
+#### From Volume Snapshots
+
+1. Stop the Stacks node
+2. Create a new volume from the snapshot
+3. Attach the volume to your instance
+4. Update mount points if necessary
+5. Restart the node
+
+### Example Automation Code
+
+Here's a simple script that handles both file and volume snapshots on AWS.
+
+{% code title="snapshot.sh" %}
+```
+#!/bin/bash
+set -euo pipefail
+
+# Configuration variables - modify these for your setup
+SERVICE_NAME="stacks-node" # systemd service name
+SNAPSHOT_DIR="/var/stacks/mainnet" # path to chainstate directory
+SNAPSHOT_BASE="/tmp" # temporary directory for archives
+EBS_VOLUME_ID="vol-1234567890abcdef0" # EBS volume ID containing chainstate
+S3_BUCKET="s3://my-stacks-snapshots" # S3 bucket for archive storage
+SNAPSHOT_TYPE="archive" # Options: ebs, archive, or both
+
+# Stop the Stacks node service gracefully
+stop_service() {
+ echo "Stopping $SERVICE_NAME..."
+ sudo systemctl stop "$SERVICE_NAME"
+}
+
+# Start the Stacks node service
+start_service() {
+ echo "Starting $SERVICE_NAME..."
+ sudo systemctl start "$SERVICE_NAME"
+}
+
+# Create compressed archive and upload to S3
+snapshot_archive() {
+ echo "Creating archive snapshot..."
+
+ # Generate timestamp and version info for filename
+ TIMESTAMP=$(date +"%Y%m%d")
+ DIR_NAME=$(basename "$SNAPSHOT_DIR")
+ VERSION=$(stacks-node version 2>&1 | tail -n 1 | awk '{print $2}')
+ DEST="$SNAPSHOT_BASE/$DIR_NAME-$VERSION-$TIMESTAMP.tar.zst"
+
+ # Create compressed archive (using zstd for better compression)
+ tar -cf - -C "$(dirname $SNAPSHOT_DIR)" "$(basename $SNAPSHOT_DIR)" | pzstd -o "$DEST"
+ echo "Archive created at: $DEST"
+
+ # Upload to S3
+ echo "Uploading to S3..."
+ aws s3 cp "$DEST" "$S3_BUCKET/"
+ echo "S3 upload complete: $S3_BUCKET/$(basename "$DEST")"
+
+ # Clean up local archive
+ rm "$DEST"
+}
+
+# Create EBS volume snapshot
+snapshot_ebs() {
+ echo "Creating EBS snapshot of $EBS_VOLUME_ID..."
+
+ # Generate description with timestamp
+ TIMESTAMP=$(date +"%Y%m%d")
+ DESC="Stacks Node Snapshot - $TIMESTAMP"
+
+ # Create snapshot with tags
+ SNAPSHOT_ID=$(aws ec2 create-snapshot \
+ --volume-id "$EBS_VOLUME_ID" \
+ --description "$DESC" \
+ --tag-specifications "ResourceType=snapshot,Tags=[{Key=Name,Value=Stacks Snapshot},{Key=type,Value=chainstate}]" \
+ --query 'SnapshotId' --output text)
+
+ echo "EBS Snapshot ID: $SNAPSHOT_ID"
+}
+
+# Main execution function
+main() {
+ case "$SNAPSHOT_TYPE" in
+ ebs)
+ stop_service
+ snapshot_ebs
+ start_service
+ ;;
+ archive)
+ stop_service
+ snapshot_archive
+ start_service
+ ;;
+ both)
+ stop_service
+ snapshot_archive # Create archive first
+ snapshot_ebs # Then EBS snapshot
+ start_service
+ ;;
+ *)
+ echo "Invalid snapshot type: $SNAPSHOT_TYPE. Available options: ebs, archive, or both."
+ exit 1
+ ;;
+ esac
+
+ echo "Snapshot process completed successfully!"
+}
+
+# Execute main function
+main
+```
+{% endcode %}
+
+#### How to Use
+
+1. **Edit the variables** at the top of the script for your setup
+2. **Make it executable**: `chmod +x snapshot.sh`
+3. **Run it**: `./snapshot.sh`
+4. **Schedule it with cron** for daily backups:
+
+ ```
+ # Daily snapshot at 2 AM
+ 0 2 * * * /path/to/snapshot.sh
+ ```
+
+#### What You Need
+
+* AWS CLI set up with the right permissions
+* `pzstd` installed (comes with the zstd package)
diff --git a/docs/operate/stacking-stx/README.md b/docs/operate/stacking-stx/README.md
new file mode 100644
index 0000000000..e6c3a1167c
--- /dev/null
+++ b/docs/operate/stacking-stx/README.md
@@ -0,0 +1,128 @@
+# Stacking STX
+
+Stacking is an essential component of Stacks.
+
+There are three different ways you can potentially stack your STX tokens and we have a dedicated guide for each of these scenarios.
+
+If you aren't familiar with how stacking works, especially as it relates to signing after the Nakamoto upgrade, be sure to check out the following concept guides:
+
+* [Stackers and signing](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/block-production/signing)
+* [Stacking](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/block-production/stacking)
+
+In Nakamoto, stacking flows have significant changes in comparison to previous versions of Stacks. Because Nakamoto requires stackers to run a signer, which validates blocks produced by Stacks miners, stackers need to provide new information when making Stacking transactions.
+
+These changes affect both solo Stacking and delegated Stacking. This document outlines the new flows for solo stacking. The next doc outlines the flow and steps for operating a pool.
+
+The following sections will walk you through how to begin operating as a solo stacker.
+
+Stacking utilizes the `pox-4` contract. There is a detailed [walkthrough of the stacking contract](https://app.gitbook.com/s/GVj1Z9vMuEOMe7oH7Wnq/clarity/example-contracts/stacking) that you can look at to see what functions are being called at each phase and some common errors you may encounter. This will be especially useful for pool operators who need to call these functions.
+
+This doc is also useful if you run into errors when calling stacking functions, as it both walks through several common error scenarios and walks through each function call so you can more easily trace what might be happening.
+
+Before we get into the step-by-step of how to actually stack, it's important to make sure you have an understanding of the different roles, processes and functions involved in Stacking.
+
+### Definitions and Roles
+
+* **Stacker**: an entity locking their STX to receive PoX rewards. This is a broad term including solo Stackers and Stackers who use pools.
+* **Solo stacker**: an entity that locks their own STX and runs a signer. They don’t receive delegation.
+* **Delegator**: a stacker who locks their STX by delegating to a pool operator that runs a signer. They don’t run the signer.
+* **Pool operator**: an entity that runs a Signer and allows others to delegate their STX to them. A pool operator doesn’t need to Stack their own STX, but they can. They will also run a signer, but the pool operator and signer address may be different
+* **Signer**: an entity that runs the stacks-signer software and participates in block validation. This can be either a solo Stacker or an entity receiving delegated STX. Depending on context, this may also refer to the signer software that validates blocks.
+
+{% hint style="info" %}
+It's important to understand that in the context of the pool operator and signer, these are likely the same _entity_ but may not be the same Stacks address.
+
+This distinction will be discussed further as we cover the step-by-step process below.
+{% endhint %}
+
+Below are the primary ways you can stack:
+
+{% stepper %}
+{% step %}
+### Solo stacking
+
+If you meet the minimum and want to [solo stack](solo-stack.md), you will either need to run a signer, collaborate with an existing one, or use [stacking.tools](https://stacking.tools/). This guide will walk you through all options.
+{% endstep %}
+
+{% step %}
+### Operate a pool
+
+You can also [operate a pool](operate-a-stacking-pool.md) and have others delegate their STX to you. If you are a pool operator, you will need to run a signer, collaborate with an existing one, or use [stacking.tools](https://stacking.tools/).
+{% endstep %}
+
+{% step %}
+### Stack with a pool
+
+If you do not meet the minimum amount of STX to solo stack, you can [delegate your STX to a pool operator ](stack-with-a-pool.md)and have them stack on your behalf. The minimum stacking amount is dynamic and can be found by visiting the https://api.hiro.so/v2/pox endpoint and looking at the `min_threshold_ustx` field. Note it is denoted in uSTX (1 STX = 1,000,000 uSTX). This is the most common stacking scenario.
+{% endstep %}
+{% endstepper %}
+
+As you read through these, it may be helpful to follow along with the functions in the [pox-4 contract](https://explorer.hiro.so/txid/SP000000000000000000002Q6VF78.pox-4?chain=mainnet) to get an idea of what each function is doing.
+
+### Relationship between manual stacking transactions and the running signer
+
+This section describes the various transactions that signer entities need to make in order to be registered as a signer for a certain reward cycle. The order of operations between the automated signer and the stacking transactions that need to be done “manually” is important for ensuring that a signer is fully set up for a certain reward cycle.
+
+#### Prerequisite: ensure the signer is hosted and running
+
+It's important to emphasize the importance of getting the signer running in a hosted environment before making Stacking transactions. If the signer doesn’t do that, they run the risk of being registered as a signer without their signer software being ready to run DKG and other important consensus mechanisms.
+
+Some of the important things to double check to ensure the signer is “running” are:
+
+* The signer software is configured with a private key that the user can access (either through SSH or other means). This is important because their signer needs to utilize this private key to generate signer key signatures that are used in Stacking transactions.
+* The signer software is properly configured to make RPC calls to a Stacks node. This refers to the `endpoint` signer configuration field. If properly configured, there should be logs in the Stacks node that show the RPC calls being made from the signer.
+* The stacks node is properly configured to send events to the signer. This refers to the \[`event_observers`] field in the Stacks Node’s configuration. If properly configured, the signer should have logs indicating that it’s receiving events from the Stacks node.
+
+### How a signer becomes registered in the signer set
+
+Each of the stacking transactions described above are done “manually”. More specifically, this means that none of these transactions are executed automatically by the signer software. The transactions must be done “out of band”.
+
+In order for a signer to actually be registered in a reward cycle, there need to be manual transactions made in the `pox-4` contract. While the signer software is running, it is continually polling the Stacks node and asking “am I a signer in reward cycle N?”.
+
+If these manual transactions are confirmed, and the signer has enough STX associated with the signer’s public key, the signer will be registered as a signer in the signer set.
+
+#### Solo stacking
+
+The workflow for solo stackers is simpler, because there are less stacking transactions that need to be made.
+
+For solo stacking, the only transaction that needs to be made is `stack-stx`. Included in this transaction’s payload is the signer’s public key.
+
+In order for the signer to be registered in reward cycle N+1, the `stack-stx` transaction must be confirmed during the first 2000 blocks of reward cycle N. The last 100 blocks of cycle N (the “prepare phase”) is where DKG occurs.
+
+The start of the prepare phase is when Stacks nodes determine the official signer set of the next reward cycle.
+
+#### Delegated Stacking
+
+The workflow for delegated signers is more complex, because it requires more transactions.
+
+This workflow is explained more in detail in the [operate a pool](operate-a-stacking-pool.md) guide, but the high-level workflow is:
+
+{% stepper %}
+{% step %}
+### Stackers delegate their STX to a pool operator
+
+Stackers delegate their STX to a pool operator.
+{% endstep %}
+
+{% step %}
+### The pool operator approves specific stackers
+
+The pool operator makes `delegate-stack-stx` transactions to “approve” specific stackers. This needs to be called for every individual stacker that delegates to them.
+{% endstep %}
+
+{% step %}
+### The pool operator commits delegated STX
+
+The pool operator makes a `stack-aggregation-commit` transaction to “commit” all of its delegated STX up to this point.
+{% endstep %}
+{% endstepper %}
+
+Similar to solo stacking, these steps must be made before the prepare phase of an upcoming reward cycle.
+
+### Once a signer is registered in the signer set
+
+During the prepare phase before a reward cycle, Stacks nodes automatically determine the signer set for the upcoming cycle. When this occurs, the Stacks nodes make an “internal” transaction to update the `.signers` contract with the list of signers.
+
+The signer software is continuously polling the Stacks node to see if it is registered for a cycle. If the signer software finds that it is registered (by matching its public key to the signers stored in the `signers` contract) it begins performing its duties as a signer.
+
+During the prepare phase, the signers perform DKG through StackerDB messages. Once an aggregate public key is determined, the signer automatically makes a `vote-for-aggregate-key` transaction. No out-of-band action is needed to be taken for this to occur.
diff --git a/docs/operate/stacking-stx/increase-stacked-position.md b/docs/operate/stacking-stx/increase-stacked-position.md
new file mode 100644
index 0000000000..6ba205b031
--- /dev/null
+++ b/docs/operate/stacking-stx/increase-stacked-position.md
@@ -0,0 +1,495 @@
+# Increase Stacked Position
+
+This guide explains how to increase your stacked STX position. The process depends on your role:
+
+* **Solo Stackers** use the `stack-increase` function.
+* **Delegators** must first revoke their current delegation using `revoke-delegate-stx` and then re-delegate with a higher amount to the same pool operator using `delegate-stx`.
+* **Pool Operators** increase their delegators' locked amount by calling `delegate-stack-increase` and then stacking the increased amount with either `stack-aggregation-commit-indexed` (if not already committed) or `stack-aggregation-increase` (if the commit has already been made).
+
+## Solo Stackers
+
+Solo stackers can add more STX to their active stacking position by calling the `stack-increase` function. The new amount takes effect from the next stacking cycle.
+
+The `stack-increase` function locks an additional amount of STX from your account. Your account must be actively stacking and not delegating, and you must have enough unlocked STX to cover the increase.
+
+
+
+Function source code
+
+```clojure
+;; Increase the number of STX locked.
+;; *New in Stacks 2.1*
+;; This method locks up an additional amount of STX from `tx-sender`'s, indicated
+;; by `increase-by`. The `tx-sender` must already be Stacking & must not be
+;; straddling more than one signer-key for the cycles effected.
+;; Refer to `verify-signer-key-sig` for more information on the authorization parameters
+;; included here.
+(define-public (stack-increase
+ (increase-by uint)
+ (signer-sig (optional (buff 65)))
+ (signer-key (buff 33))
+ (max-amount uint)
+ (auth-id uint))
+ (let ((stacker-info (stx-account tx-sender))
+ (amount-stacked (get locked stacker-info))
+ (amount-unlocked (get unlocked stacker-info))
+ (unlock-height (get unlock-height stacker-info))
+ (cur-cycle (current-pox-reward-cycle))
+ (first-increased-cycle (+ cur-cycle u1))
+ (stacker-state (unwrap! (map-get? stacking-state
+ { stacker: tx-sender })
+ (err ERR_STACK_INCREASE_NOT_LOCKED)))
+ (cur-pox-addr (get pox-addr stacker-state))
+ (cur-period (get lock-period stacker-state)))
+ ;; tx-sender must be currently locked
+ (asserts! (> amount-stacked u0)
+ (err ERR_STACK_INCREASE_NOT_LOCKED))
+ ;; must be called with positive `increase-by`
+ (asserts! (>= increase-by u1)
+ (err ERR_STACKING_INVALID_AMOUNT))
+ ;; stacker must have enough stx to lock
+ (asserts! (>= amount-unlocked increase-by)
+ (err ERR_STACKING_INSUFFICIENT_FUNDS))
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+ ;; stacker must be directly stacking
+ (asserts! (> (len (get reward-set-indexes stacker-state)) u0)
+ (err ERR_STACKING_IS_DELEGATED))
+ ;; stacker must not be delegating
+ (asserts! (is-none (get delegated-to stacker-state))
+ (err ERR_STACKING_IS_DELEGATED))
+
+ ;; Validate that amount is less than or equal to `max-amount`
+ (asserts! (>= max-amount (+ increase-by amount-stacked)) (err ERR_SIGNER_AUTH_AMOUNT_TOO_HIGH))
+
+ ;; Verify signature from delegate that allows this sender for this cycle
+ (try! (consume-signer-key-authorization cur-pox-addr cur-cycle "stack-increase" cur-period signer-sig signer-key increase-by max-amount auth-id))
+
+ ;; update reward cycle amounts
+ (asserts! (is-some (fold increase-reward-cycle-entry
+ (get reward-set-indexes stacker-state)
+ (some { first-cycle: first-increased-cycle,
+ reward-cycle: (get first-reward-cycle stacker-state),
+ stacker: tx-sender,
+ add-amount: increase-by,
+ signer-key: signer-key })))
+ (err ERR_INVALID_INCREASE))
+ ;; NOTE: stacking-state map is unchanged: it does not track amount-stacked in PoX-4
+ (ok { stacker: tx-sender, total-locked: (+ amount-stacked increase-by)})))
+```
+
+
+
+Arguments:
+
+* Increase by: the amount of uSTX to add to your lock amount.
+* Signer public key: the public key used for signing. This can stay the same, or you can use a new key.
+* Signer signature: a signature proving control of your signing key.
+* Max Amount: used to validate the signer signature provided. It represents the maximum number of uSTX (1 STX = 1,000,000 uSTX) that can be stacked in this transaction.
+* Auth Id: used to validate the signer signature provided. It is a random integer that prevents re-use of this particular signer signature.
+
+## Delegators
+
+Delegators have to increase their delegated amount in two steps.
+
+{% stepper %}
+{% step %}
+### Revoke Your Current Delegation
+
+Before increasing your delegation, cancel your current delegation through the `revoke-delegate-stx` function, so that you can delegate an increased amount of STX afterwards.
+
+
+
+Function source code
+
+```clojure
+;; Revokes the delegation to the current stacking pool.
+;; New in pox-4: Fails if the delegation was already revoked.
+;; Returns the last delegation state.
+(define-public (revoke-delegate-stx)
+ (let ((last-delegation-state (get-check-delegation tx-sender)))
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+ (asserts! (is-some last-delegation-state) (err ERR_DELEGATION_ALREADY_REVOKED))
+ (asserts! (map-delete delegation-state { stacker: tx-sender }) (err ERR_DELEGATION_ALREADY_REVOKED))
+ (ok last-delegation-state)))
+```
+
+
+{% endstep %}
+
+{% step %}
+### Delegate with a Higher Amount
+
+After revoking, call the `delegate-stx` function with your new, higher amount. This function does not directly delegate the STX, but rather allows the pool operator to issue the stacking lock on behalf of the user calling this function.
+
+
+
+Function source code
+
+```clojure
+;; Delegate to `delegate-to` the ability to stack from a given address.
+;; This method _does not_ lock the funds, rather, it allows the delegate
+;; to issue the stacking lock.
+;; The caller specifies:
+;; * amount-ustx: the total amount of ustx the delegate may be allowed to lock
+;; * until-burn-ht: an optional burn height at which this delegation expires
+;; * pox-addr: an optional address to which any rewards *must* be sent
+(define-public (delegate-stx (amount-ustx uint)
+ (delegate-to principal)
+ (until-burn-ht (optional uint))
+ (pox-addr (optional { version: (buff 1), hashbytes: (buff 32) })))
+
+ (begin
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+
+ ;; delegate-stx no longer requires the delegator to not currently
+ ;; be stacking.
+ ;; delegate-stack-* functions assert that
+ ;; 1. users can't swim in two pools at the same time.
+ ;; 2. users can't switch pools without cool down cycle.
+ ;; Other pool admins can't increase or extend.
+ ;; 3. users can't join a pool while already directly stacking.
+
+ ;; pox-addr, if given, must be valid
+ (match pox-addr
+ address
+ (asserts! (check-pox-addr-version (get version address))
+ (err ERR_STACKING_INVALID_POX_ADDRESS))
+ true)
+
+ ;; tx-sender must not be delegating
+ (asserts! (is-none (get-check-delegation tx-sender))
+ (err ERR_STACKING_ALREADY_DELEGATED))
+
+ ;; add delegation record
+ (map-set delegation-state
+ { stacker: tx-sender }
+ { amount-ustx: amount-ustx,
+ delegated-to: delegate-to,
+ until-burn-ht: until-burn-ht,
+ pox-addr: pox-addr })
+
+ (ok true)))
+```
+
+
+
+Arguments:
+
+* Amount: Denoted in uSTX (1 STX = 1,000,000 uSTX).
+* Delegate to: the STX address of the pool operator they're delegating to.
+* Until burn height: optional BTC block height when the delegation expires.
+* Pox Address: optional BTC address that, if specified, the signer must use to accept this delegation.
+
+{% hint style="info" %}
+Make sure the revocation is successful before initiating a new delegation. Otherwise, the `delegate-stx` transaction will fail.
+{% endhint %}
+{% endstep %}
+{% endstepper %}
+
+## Pool Operators
+
+Pool operators can increase the total stacking amount through a two-step process. First, update the delegation's locked amount with `delegate-stack-increase`. Then, stack the increased amount by committing it in a future cycle, or increasing an already committed position.
+
+### Increase the Locked Amount
+
+The `delegate-stack-increase` function allows a pool operator to add more STX to the existing locked position for a given delegator. It performs necessary checks and updates the delegation state with the increased amount.
+
+
+
+Function source code
+
+```clojure
+;; As a delegator, increase an active Stacking lock, issuing a "partial commitment" for the
+;; increased cycles.
+;; *New in Stacks 2.1*
+;; This method increases `stacker`'s current lockup and partially commits the additional
+;; STX to `pox-addr`
+(define-public (delegate-stack-increase
+ (stacker principal)
+ (pox-addr { version: (buff 1), hashbytes: (buff 32) })
+ (increase-by uint))
+ (let ((stacker-info (stx-account stacker))
+ (existing-lock (get locked stacker-info))
+ (available-stx (get unlocked stacker-info))
+ (unlock-height (get unlock-height stacker-info)))
+
+ ;; must be called with positive `increase-by`
+ (asserts! (>= increase-by u1)
+ (err ERR_STACKING_INVALID_AMOUNT))
+
+ (let ((unlock-in-cycle (burn-height-to-reward-cycle unlock-height))
+ (cur-cycle (current-pox-reward-cycle))
+ (first-increase-cycle (+ cur-cycle u1))
+ (last-increase-cycle (- unlock-in-cycle u1))
+ (cycle-count (try! (if (<= first-increase-cycle last-increase-cycle)
+ (ok (+ u1 (- last-increase-cycle first-increase-cycle)))
+ (err ERR_STACKING_INVALID_LOCK_PERIOD))))
+ (new-total-locked (+ increase-by existing-lock))
+ (stacker-state
+ (unwrap! (map-get? stacking-state { stacker: stacker })
+ (err ERR_STACK_INCREASE_NOT_LOCKED))))
+
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+
+ ;; stacker must not be directly stacking
+ (asserts! (is-eq (len (get reward-set-indexes stacker-state)) u0)
+ (err ERR_STACKING_NOT_DELEGATED))
+
+ ;; stacker must be delegated to tx-sender
+ (asserts! (is-eq (unwrap! (get delegated-to stacker-state)
+ (err ERR_STACKING_NOT_DELEGATED))
+ tx-sender)
+ (err ERR_STACKING_PERMISSION_DENIED))
+
+ ;; stacker must be currently locked
+ (asserts! (> existing-lock u0)
+ (err ERR_STACK_INCREASE_NOT_LOCKED))
+
+ ;; stacker must have enough stx to lock
+ (asserts! (>= available-stx increase-by)
+ (err ERR_STACKING_INSUFFICIENT_FUNDS))
+
+ ;; stacker must have delegated to the caller
+ (let ((delegation-info (unwrap! (get-check-delegation stacker) (err ERR_STACKING_PERMISSION_DENIED)))
+ (delegated-to (get delegated-to delegation-info))
+ (delegated-amount (get amount-ustx delegation-info))
+ (delegated-pox-addr (get pox-addr delegation-info))
+ (delegated-until (get until-burn-ht delegation-info)))
+ ;; must have delegated to tx-sender
+ (asserts! (is-eq delegated-to tx-sender)
+ (err ERR_STACKING_PERMISSION_DENIED))
+ ;; must have delegated enough stx
+ (asserts! (>= delegated-amount new-total-locked)
+ (err ERR_DELEGATION_TOO_MUCH_LOCKED))
+ ;; if pox-addr is set, must be equal to pox-addr
+ (asserts! (match delegated-pox-addr
+ specified-pox-addr (is-eq pox-addr specified-pox-addr)
+ true)
+ (err ERR_DELEGATION_POX_ADDR_REQUIRED))
+ ;; delegation must not expire before lock period
+ (asserts! (match delegated-until
+ until-burn-ht
+ (>= until-burn-ht unlock-height)
+ true)
+ (err ERR_DELEGATION_EXPIRES_DURING_LOCK)))
+
+ ;; delegate stacking does minimal-can-stack-stx
+ (try! (minimal-can-stack-stx pox-addr new-total-locked first-increase-cycle (+ u1 (- last-increase-cycle first-increase-cycle))))
+
+ ;; register the PoX address with the amount stacked via partial stacking
+ ;; before it can be included in the reward set, this must be committed!
+ (add-pox-partial-stacked pox-addr first-increase-cycle cycle-count increase-by)
+
+ ;; stacking-state is unchanged, so no need to update
+
+ ;; return the lock-up information, so the node can actually carry out the lock.
+ (ok { stacker: stacker, total-locked: new-total-locked}))))
+```
+
+
+
+Arguments:
+
+* Stacker: the STX address of the delegator.
+* Pox Address: the BTC address of the pool operator where they will receive the BTC rewards. If the delegator has set his own BTC address in the `delegate-stx` call, this address will have to be the same one.
+* Increase by: the amount of uSTX to add to the delegator's locked amount.
+
+
+
+## Stack the Increased Amount
+
+Once the locked amount is updated, the operator must commit the change. There are two functions that can be used to stack the increased amount:
+
+{% stepper %}
+{% step %}
+#### If the Commit Has Not Yet Been Made: stack-aggregation-commit-indexed
+
+This function stacks the total locked amount for an upcoming reward cycle. Note that the `stack-aggregation-commit-indexed` function wraps the `inner-stack-aggregation-commit` function. The wrapped inner function is included here.
+
+
+
+Function source code
+
+```clojure
+;; Commit partially stacked STX and allocate a new PoX reward address slot.
+;; This allows a stacker/delegate to lock fewer STX than the minimal threshold in multiple transactions,
+;; so long as: 1. The pox-addr is the same.
+;; 2. This "commit" transaction is called _before_ the PoX anchor block.
+;; This ensures that each entry in the reward set returned to the stacks-node is greater than the threshold,
+;; but does not require it be all locked up within a single transaction
+;;
+;; Returns (ok uint) on success, where the given uint is the reward address's index in the list of reward
+;; addresses allocated in this reward cycle. This index can then be passed to `stack-aggregation-increase`
+;; to later increment the STX this PoX address represents, in amounts less than the stacking minimum.
+;;
+;; *New in Stacks 2.1.*
+(define-private (inner-stack-aggregation-commit (pox-addr { version: (buff 1), hashbytes: (buff 32) })
+ (reward-cycle uint)
+ (signer-sig (optional (buff 65)))
+ (signer-key (buff 33))
+ (max-amount uint)
+ (auth-id uint))
+ (let ((partial-stacked
+ ;; fetch the partial commitments
+ (unwrap! (map-get? partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })
+ (err ERR_STACKING_NO_SUCH_PRINCIPAL))))
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+ (let ((amount-ustx (get stacked-amount partial-stacked)))
+ (try! (consume-signer-key-authorization pox-addr reward-cycle "agg-commit" u1 signer-sig signer-key amount-ustx max-amount auth-id))
+ (try! (can-stack-stx pox-addr amount-ustx reward-cycle u1))
+ ;; Add the pox addr to the reward cycle, and extract the index of the PoX address
+ ;; so the delegator can later use it to call stack-aggregation-increase.
+ (let ((add-pox-addr-info
+ (add-pox-addr-to-ith-reward-cycle
+ u0
+ { pox-addr: pox-addr,
+ first-reward-cycle: reward-cycle,
+ num-cycles: u1,
+ reward-set-indexes: (list),
+ stacker: none,
+ signer: signer-key,
+ amount-ustx: amount-ustx,
+ i: u0 }))
+ (pox-addr-index (unwrap-panic
+ (element-at (get reward-set-indexes add-pox-addr-info) u0))))
+
+ ;; don't update the stacking-state map,
+ ;; because it _already has_ this stacker's state
+ ;; don't lock the STX, because the STX is already locked
+ ;;
+ ;; clear the partial-stacked state, and log it
+ (map-delete partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })
+ (map-set logged-partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle } partial-stacked)
+ (ok pox-addr-index)))))
+```
+
+
+
+Arguments:
+
+* Pox Address: the BTC address to receive rewards.
+* Reward-cycle: a reward cycle in the future.
+* Signer public key: the public key of your signer.
+* Signer signature: a signature proving control of your signing key.
+* Max Amount: used to validate the signer signature provided.
+* Auth Id: used to validate the signer signature provided.
+{% endstep %}
+
+{% step %}
+#### If the Commit Has Already Been Made: stack-aggregation-increase
+
+If you have previously committed an amount, you can further increase the stacked position by calling `stack-aggregation-increase`. This function adds an additional amount of STX to the already committed delegation.
+
+
+
+Function source code
+
+```clojure
+;; Commit partially stacked STX to a PoX address which has already received some STX (more than the Stacking min).
+;; This allows a delegator to lock up marginally more STX from new delegates, even if they collectively do not
+;; exceed the Stacking minimum, so long as the target PoX address already represents at least as many STX as the
+;; Stacking minimum.
+;;
+;; The `reward-cycle-index` is emitted as a contract event from `stack-aggregation-commit` when the initial STX are
+;; locked up by this delegator. It must be passed here to add more STX behind this PoX address. If the delegator
+;; called `stack-aggregation-commit` multiple times for the same PoX address, then any such `reward-cycle-index` will
+;; work here.
+;;
+;; *New in Stacks 2.1*
+;;
+(define-public (stack-aggregation-increase (pox-addr { version: (buff 1), hashbytes: (buff 32) })
+ (reward-cycle uint)
+ (reward-cycle-index uint))
+ (let ((partial-stacked
+ ;; fetch the partial commitments
+ (unwrap! (map-get? partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })
+ (err ERR_STACKING_NO_SUCH_PRINCIPAL))))
+
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+
+ ;; reward-cycle must be in the future
+ (asserts! (> reward-cycle (current-pox-reward-cycle))
+ (err ERR_STACKING_INVALID_LOCK_PERIOD))
+
+ (let ((amount-ustx (get stacked-amount partial-stacked))
+ ;; reward-cycle must point to an existing record in reward-cycle-total-stacked
+ ;; infallible; getting something from partial-stacked-by-cycle succeeded so this must succeed
+ (existing-total (unwrap-panic (map-get? reward-cycle-total-stacked { reward-cycle: reward-cycle })))
+ ;; reward-cycle and reward-cycle-index must point to an existing record in reward-cycle-pox-address-list
+ (existing-entry (unwrap! (map-get? reward-cycle-pox-address-list { reward-cycle: reward-cycle, index: reward-cycle-index })
+ (err ERR_DELEGATION_NO_REWARD_SLOT)))
+ (increased-ustx (+ (get total-ustx existing-entry) amount-ustx))
+ (total-ustx (+ (get total-ustx existing-total) amount-ustx)))
+
+ ;; must be stackable
+ (try! (minimal-can-stack-stx pox-addr total-ustx reward-cycle u1))
+
+ ;; new total must exceed the stacking minimum
+ (asserts! (<= (get-stacking-minimum) total-ustx)
+ (err ERR_STACKING_THRESHOLD_NOT_MET))
+
+ ;; there must *not* be a stacker entry (since this is a delegator)
+ (asserts! (is-none (get stacker existing-entry))
+ (err ERR_DELEGATION_WRONG_REWARD_SLOT))
+
+ ;; the given PoX address must match the one on record
+ (asserts! (is-eq pox-addr (get pox-addr existing-entry))
+ (err ERR_DELEGATION_WRONG_REWARD_SLOT))
+
+ ;; update the pox-address list -- bump the total-ustx
+ (map-set reward-cycle-pox-address-list
+ { reward-cycle: reward-cycle, index: reward-cycle-index }
+ { pox-addr: pox-addr,
+ total-ustx: increased-ustx,
+ stacker: none,
+ ;; TODO: this must be authorized with a signature, or tx-sender allowance!
+ signer: (get signer existing-entry) })
+
+ ;; update the total ustx in this cycle
+ (map-set reward-cycle-total-stacked
+ { reward-cycle: reward-cycle }
+ { total-ustx: total-ustx })
+
+ ;; don't update the stacking-state map,
+ ;; because it _already has_ this stacker's state
+ ;; don't lock the STX, because the STX is already locked
+ ;;
+ ;; clear the partial-stacked state, and log it
+ (map-delete partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })
+ (map-set logged-partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle } partial-stacked)
+ (ok true))))
+```
+
+
+
+Arguments:
+
+* Pox Address: the BTC address to receive rewards.
+* Reward Cycle: a reward cycle in the future.
+* Reward Cycle Index: the index returned by `stack-aggregation-commit-indexed`.
+* Signer signature: a signature proving control of your signing key.
+* Signer public key: the public key of your signer.
+* Max Amount: used to validate the signer signature provided.
+* Auth Id: used to validate the signer signature provided.
+{% endstep %}
+{% endstepper %}
+
+{% hint style="warning" %}
+* Sequential Process: First call `delegate-stack-increase` to update the locked amount of a delegation. Then, commit the change:
+ * Use `stack-aggregation-commit-indexed` if this is the first commit in the given cycle.
+ * Use `stack-aggregation-increase` if you have already committed in the cycle you want to increase.
+
+Failing to commit (or properly increase after a commit) will result in the increased delegation not taking effect in upcoming stacking cycles.
+{% endhint %}
diff --git a/docs/operate/stacking-stx/operate-a-stacking-pool.md b/docs/operate/stacking-stx/operate-a-stacking-pool.md
new file mode 100644
index 0000000000..8633a40328
--- /dev/null
+++ b/docs/operate/stacking-stx/operate-a-stacking-pool.md
@@ -0,0 +1,589 @@
+# Operate a Stacking Pool
+
+This doc assumes you are familiar with stacking at a conceptual level. If not, you may want to read the [Stacking](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/block-production/stacking) concept guide.
+
+The guide below applies to those who want to operate a pool, meaning they want to have stackers delegate STX tokens to them. If you choose to operate a pool you will either need to run your own signer or collaborate with one.
+
+### Pool Operator Stacking Flow
+
+For pool operators, the flow is a bit different than solo stacking. Remember that as a pool operator, other stackers are delegating their STX to you to stack on behalf of them. This additional role adds a couple of extra steps to your stacking flow if operating as a pool operator.
+
+Similar to the changes to solo Stacking, the big difference for delegation flows is the inclusion of signer keys and signatures. Because pool operators need to make transactions to “finalize” a delegation, these new arguments add new complexities to the stacking flow.
+
+#### Delegator initiates delegation
+
+{% hint style="info" %}
+This step is not required to apply to pool operators/signers. It is included here to illustrate the end-to-end flow, but if you are operating as a pool operator/signer you will not have to perform this step. Instead, users delegate their STX to you as the pool operator.
+{% endhint %}
+
+The first step, where the delegator sets up their delegation to a pool operator, is to call `delegate-stx`. This function does not directly delegate the STX, but rather allows the pool operator to issue the stacking lock on behalf of the user calling this function. You can think of calling this function as the delegator giving permission to the pool operator to stack on their behalf.
+
+
+
+Function source code
+
+```clojure
+;; Delegate to `delegate-to` the ability to stack from a given address.
+;; This method _does not_ lock the funds, rather, it allows the delegate
+;; to issue the stacking lock.
+;; The caller specifies:
+;; * amount-ustx: the total amount of ustx the delegate may be allowed to lock
+;; * until-burn-ht: an optional burn height at which this delegation expires
+;; * pox-addr: an optional address to which any rewards *must* be sent
+(define-public (delegate-stx (amount-ustx uint)
+ (delegate-to principal)
+ (until-burn-ht (optional uint))
+ (pox-addr (optional { version: (buff 1), hashbytes: (buff 32) })))
+
+ (begin
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+
+ ;; delegate-stx no longer requires the delegator to not currently
+ ;; be stacking.
+ ;; delegate-stack-* functions assert that
+ ;; 1. users can't swim in two pools at the same time.
+ ;; 2. users can't switch pools without cool down cycle.
+ ;; Other pool admins can't increase or extend.
+ ;; 3. users can't join a pool while already directly stacking.
+
+ ;; pox-addr, if given, must be valid
+ (match pox-addr
+ address
+ (asserts! (check-pox-addr-version (get version address))
+ (err ERR_STACKING_INVALID_POX_ADDRESS))
+ true)
+
+ ;; tx-sender must not be delegating
+ (asserts! (is-none (get-check-delegation tx-sender))
+ (err ERR_STACKING_ALREADY_DELEGATED))
+
+ ;; add delegation record
+ (map-set delegation-state
+ { stacker: tx-sender }
+ { amount-ustx: amount-ustx,
+ delegated-to: delegate-to,
+ until-burn-ht: until-burn-ht,
+ pox-addr: pox-addr })
+
+ (ok true)))
+```
+
+
+
+The arguments here are unchanged from previous versions of PoX:
+
+* Amount: Denoted in uSTX (1 STX = 1,000,000 uSTX)
+* Delegate to: the STX address of the pool operator they're delegating to. Note that this is different from the “signer key” used. Instead, this is the STX address that is used to make PoX transactions.
+* Until burn height: an optional argument representing the BTC block height when the delegation expires. If none is used, the delegation permission expires only when explicitly revoked.
+* Pox Address: an optional BTC address that, if specified, the signer must use to accept this delegation
+
+#### Pool operator “activates” the delegation
+
+Just as in the older PoX contract, after a delegator calls the `delegate-stx` function, the pool operator calls `delegate-stack-stx` to commit the delegator’s STX.
+
+
+
+Function source code
+
+```clojure
+;; As a delegate, stack the given principal's STX using partial-stacked-by-cycle
+;; Once the delegate has stacked > minimum, the delegate should call stack-aggregation-commit
+(define-public (delegate-stack-stx (stacker principal)
+ (amount-ustx uint)
+ (pox-addr { version: (buff 1), hashbytes: (buff 32) })
+ (start-burn-ht uint)
+ (lock-period uint))
+ ;; this stacker's first reward cycle is the _next_ reward cycle
+ (let ((first-reward-cycle (+ u1 (current-pox-reward-cycle)))
+ (specified-reward-cycle (+ u1 (burn-height-to-reward-cycle start-burn-ht)))
+ (unlock-burn-height (reward-cycle-to-burn-height (+ (current-pox-reward-cycle) u1 lock-period))))
+ ;; the start-burn-ht must result in the next reward cycle, do not allow stackers
+ ;; to "post-date" their `stack-stx` transaction
+ (asserts! (is-eq first-reward-cycle specified-reward-cycle)
+ (err ERR_INVALID_START_BURN_HEIGHT))
+
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+
+ ;; stacker must have delegated to the caller
+ (let ((delegation-info (unwrap! (get-check-delegation stacker) (err ERR_STACKING_PERMISSION_DENIED))))
+ ;; must have delegated to tx-sender
+ (asserts! (is-eq (get delegated-to delegation-info) tx-sender)
+ (err ERR_STACKING_PERMISSION_DENIED))
+ ;; must have delegated enough stx
+ (asserts! (>= (get amount-ustx delegation-info) amount-ustx)
+ (err ERR_DELEGATION_TOO_MUCH_LOCKED))
+ ;; if pox-addr is set, must be equal to pox-addr
+ (asserts! (match (get pox-addr delegation-info)
+ specified-pox-addr (is-eq pox-addr specified-pox-addr)
+ true)
+ (err ERR_DELEGATION_POX_ADDR_REQUIRED))
+ ;; delegation must not expire before lock period
+ (asserts! (match (get until-burn-ht delegation-info)
+ until-burn-ht (>= until-burn-ht
+ unlock-burn-height)
+ true)
+ (err ERR_DELEGATION_EXPIRES_DURING_LOCK))
+ )
+
+ ;; stacker principal must not be stacking
+ (asserts! (is-none (get-stacker-info stacker))
+ (err ERR_STACKING_ALREADY_STACKED))
+
+ ;; the Stacker must have sufficient unlocked funds
+ (asserts! (>= (stx-get-balance stacker) amount-ustx)
+ (err ERR_STACKING_INSUFFICIENT_FUNDS))
+
+ ;; ensure that stacking can be performed
+ (try! (minimal-can-stack-stx pox-addr amount-ustx first-reward-cycle lock-period))
+
+ ;; register the PoX address with the amount stacked via partial stacking
+ ;; before it can be included in the reward set, this must be committed!
+ (add-pox-partial-stacked pox-addr first-reward-cycle lock-period amount-ustx)
+
+ ;; add stacker record
+ (map-set stacking-state
+ { stacker: stacker }
+ { pox-addr: pox-addr,
+ first-reward-cycle: first-reward-cycle,
+ reward-set-indexes: (list),
+ lock-period: lock-period,
+ delegated-to: (some tx-sender) })
+
+ ;; return the lock-up information, so the node can actually carry out the lock.
+ (ok { stacker: stacker,
+ lock-amount: amount-ustx,
+ unlock-burn-height: unlock-burn-height })))
+```
+
+
+
+The arguments are:
+
+* Stacker: the STX address of the delegator
+* Amount: denoted in uSTX (1 STX = 1,000,000 uSTX)
+* Pox Address: The BTC address of the pool operator where they will receive the BTC rewards. If the delegator has set his own BTC address in the `delegate-stx` call, this address will have to be the same one, otherwise the contract call will fail.
+* Start burn height: The BTC block height in which delegation can begin. This field is used to ensure that an old transaction intended for an earlier cycle will fail, and also prevents callers from "post-dating" the call to a future cycle. The best option here is to add 1 or 2 to the current BTC block height when you initiate this transaction. Note that the delegation will not actively be stacked at this block height, but whatever reward cycle is passed in the aggregation commit function (explained below).
+* Lock period: number of cycles to lock for. If the delegator provided the until burn height argument, then the end of these cycles cannot be past the expiration provided. The maximum lock period that a pool operator can provide in this function call is 12.
+
+This step also allows the pool operator to proactively choose which Stackers they’ll accept delegation from. For “closed” pools, the pool operator will only call this function for approved Stackers. It is up to each pool operator who runs a closed pool to implement this process.
+
+This step can be repeated for multiple Stackers before going to the next step.
+
+{% hint style="info" %}
+If you look at the function source code, you'll see that the `delegate-stack-stx` function sets the stacker's first reward cycle to be the _next_ reward cycle.
+
+When generating your signature and your `stack-aggregation-commit-indexed` transaction, you'll want to make sure that the reward cycles match.
+
+So if you are in cycle 557 when you call the `delegate-stack-stx` function, you'll want to pass in cycle 558 or higher when you generate your signature and your `stack-aggregation-commit-indexed` transaction.
+
+With `stack-aggregation-commit-indexed`, the `reward-cycle` arg is saying "I'm committing these stacks to be stacked in cycle N". But the `delegate-stack-stx` transaction gets you setup for next cycles, aka 558 and higher.
+
+Also make sure that, when you generate your signature, you use 558 or higher as the reward cycle. In solo stacking methods, you use the current reward cycle in the signature, but not for `stack-aggregation-commit-indexed`. This is because with `stack-aggregation-commit-indexed` you can commit stacks for future cycles, not just the N+1 cycle.
+{% endhint %}
+
+#### Pool operator “commits” delegated STX
+
+The next step is for the pool operator to call `stack-aggregation-commit-indexed`.
+
+{% hint style="info" %}
+In the contract source code, you'll notice a similarly named function called `stack-aggregation-commit`. This is a legacy function that makes it difficult to increase the stacking amount, as it does not return the reward index of the stacking slot, which is required in order to call the `stack-aggregation-increase` function. We recommend using `stack-aggregation-commit-indexed`.
+{% endhint %}
+
+
+
+Function source code
+
+Note that the `stack-aggregation-commit-indexed` function wraps the `inner-stack-aggregation-commit` function. The wrapped inner function is included here.
+
+Check out the [deployed contract](https://explorer.hiro.so/txid/SP000000000000000000002Q6VF78.pox-4?chain=mainnet) to see the flow of contract calls.
+
+```clojure
+;; Commit partially stacked STX and allocate a new PoX reward address slot.
+;; This allows a stacker/delegate to lock fewer STX than the minimal threshold in multiple transactions,
+;; so long as: 1. The pox-addr is the same.
+;; 2. This "commit" transaction is called _before_ the PoX anchor block.
+;; This ensures that each entry in the reward set returned to the stacks-node is greater than the threshold,
+;; but does not require it be all locked up within a single transaction
+;;
+;; Returns (ok uint) on success, where the given uint is the reward address's index in the list of reward
+;; addresses allocated in this reward cycle. This index can then be passed to `stack-aggregation-increase`
+;; to later increment the STX this PoX address represents, in amounts less than the stacking minimum.
+;;
+;; *New in Stacks 2.1.*
+(define-private (inner-stack-aggregation-commit (pox-addr { version: (buff 1), hashbytes: (buff 32) })
+ (reward-cycle uint)
+ (signer-sig (optional (buff 65)))
+ (signer-key (buff 33))
+ (max-amount uint)
+ (auth-id uint))
+ (let ((partial-stacked
+ ;; fetch the partial commitments
+ (unwrap! (map-get? partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })
+ (err ERR_STACKING_NO_SUCH_PRINCIPAL))))
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+ (let ((amount-ustx (get stacked-amount partial-stacked)))
+ (try! (consume-signer-key-authorization pox-addr reward-cycle "agg-commit" u1 signer-sig signer-key amount-ustx max-amount auth-id))
+ (try! (can-stack-stx pox-addr amount-ustx reward-cycle u1))
+ ;; Add the pox addr to the reward cycle, and extract the index of the PoX address
+ ;; so the delegator can later use it to call stack-aggregation-increase.
+ (let ((add-pox-addr-info
+ (add-pox-addr-to-ith-reward-cycle
+ u0
+ { pox-addr: pox-addr,
+ first-reward-cycle: reward-cycle,
+ num-cycles: u1,
+ reward-set-indexes: (list),
+ stacker: none,
+ signer: signer-key,
+ amount-ustx: amount-ustx,
+ i: u0 }))
+ (pox-addr-index (unwrap-panic
+ (element-at (get reward-set-indexes add-pox-addr-info) u0))))
+
+ ;; don't update the stacking-state map,
+ ;; because it _already has_ this stacker's state
+ ;; don't lock the STX, because the STX is already locked
+ ;;
+ ;; clear the partial-stacked state, and log it
+ (map-delete partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })
+ (map-set logged-partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle } partial-stacked)
+ (ok pox-addr-index)))))
+```
+
+
+
+At this point, the STX are committed to the pool operator, and the pool operator has some “aggregate balance” of committed STX. The pool operator is not actually eligible for reward slots and signer initialization until this step is finished.
+
+The pool operator cannot call this function until the total number of STX committed is larger than the minimum threshold required to Stack. This minimum stacking threshold is a function of the total number of STX stacked divided by the available number of reward slots.
+
+{% hint style="info" %}
+This number varies and can be found by visiting the pox endpoint of Hiro's API at [https://api.hiro.so/v2/pox](https://api.hiro.so/v2/pox) and looking at the `min_threshold_ustx` field. (1 STX = 1,000,000 uSTX).
+{% endhint %}
+
+Once the threshold is reached, the pool operator calls `stack-aggregation-commit-indexed`. This is the point where you as the pool operator must provide your signer key and signer key signature. The arguments are:
+
+* Pox Address: the BTC address to receive rewards
+* Reward-cycle: a reward cycle in the future (see the note above on passing the correct reward cycle)
+* Signer public key: the public key of your signer (remember that this may be different than the address you are using to operate the pool, but this step is how you associate the two together)
+* Signer signature: A signature proving control of your signing key (details on how to do this are below)
+* Max Amount: This parameter is used to validate the signer signature provided. It represents the maximum number of uSTX (1 STX = 1,000,000 uSTX) that can be stacked in this transaction.
+* Auth Id: This parameter is used to validate the signer signature provided. It is a random integer that prevents the re-use of this particular signer signature.
+
+{% hint style="info" %}
+In the Definitions and Roles section in the previous document, we described how the pool operator and signer may be the same entity, but not necessarily have the same address.
+
+Signers who are also pool operators and wish to have STX delegated to them should have a separate keychain associated with their pool operator account in order to make Stacking transactions such as `delegate-stack-stx` and `stack-aggregation-commit-indexed`.
+
+So, as a signing entity operating a pool, you should have two accounts:
+
+* Your pool operator account, which you will use to conduct all of the stacking operations we have covered here.
+* Your signer account, which is what you used to set up your signer. This signer public key is what you will pass in to the above aggregation commit function, and is also the key you will use when generating your signer signature.
+
+If you are operating as a signer and a pool operator, you should have a separate key because you might need to rotate your signer key when necessary.
+
+The PoX contract is designed to support rotating the signer key without needing your Stackers to un-stack and re-stack later. You cannot rotate a pool operator key without needing to wait for all delegated Stackers to un-stack and finally re-stack to the new pool operator address.
+
+Because of this limitation of being unable to rotate pool operator addresses, it’s highly recommended to have a separate pool operator key. The benefit of a separate pool operator key is that it can easily be used in existing wallets, including hardware wallets.
+{% endhint %}
+
+Once this succeeds, the signer is eligible for reward slots. The number of reward slots depends on the amount of STX committed to this signer. Even if the signer commits more than the “global minimum”, the minimum amount to receive a slot depends on the amount of STX locked for each cycle.
+
+To act as a signer, each step up to this point must be taken before the prepare phase of the next cycle begins. It is crucial that the signer software is running.
+
+#### Pool operator increases amount committed
+
+Even after the signer commits to a certain amount of STX in the previous step, the signer can increase this amount once more delegations are received. The initial steps must be taken for each Stacker (`delegate-stx` and then `delegate-stack-stx`), and then `stack-aggregation-increase` can be called with the index returned from the first `stack-aggregation-commit-indexed` call and a new signature.
+
+
+
+Function source code
+
+```
+;; Commit partially stacked STX to a PoX address which has already received some STX (more than the Stacking min).
+;; This allows a delegator to lock up marginally more STX from new delegates, even if they collectively do not
+;; exceed the Stacking minimum, so long as the target PoX address already represents at least as many STX as the
+;; Stacking minimum.
+;;
+;; The `reward-cycle-index` is emitted as a contract event from `stack-aggregation-commit` when the initial STX are
+;; locked up by this delegator. It must be passed here to add more STX behind this PoX address. If the delegator
+;; called `stack-aggregation-commit` multiple times for the same PoX address, then any such `reward-cycle-index` will
+;; work here.
+;;
+;; *New in Stacks 2.1*
+;;
+(define-public (stack-aggregation-increase (pox-addr { version: (buff 1), hashbytes: (buff 32) })
+ (reward-cycle uint)
+ (reward-cycle-index uint))
+ (let ((partial-stacked
+ ;; fetch the partial commitments
+ (unwrap! (map-get? partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })
+ (err ERR_STACKING_NO_SUCH_PRINCIPAL))))
+
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+
+ ;; reward-cycle must be in the future
+ (asserts! (> reward-cycle (current-pox-reward-cycle))
+ (err ERR_STACKING_INVALID_LOCK_PERIOD))
+
+ (let ((amount-ustx (get stacked-amount partial-stacked))
+ ;; reward-cycle must point to an existing record in reward-cycle-total-stacked
+ ;; infallible; getting something from partial-stacked-by-cycle succeeded so this must succeed
+ (existing-total (unwrap-panic (map-get? reward-cycle-total-stacked { reward-cycle: reward-cycle })))
+ ;; reward-cycle and reward-cycle-index must point to an existing record in reward-cycle-pox-address-list
+ (existing-entry (unwrap! (map-get? reward-cycle-pox-address-list { reward-cycle: reward-cycle, index: reward-cycle-index })
+ (err ERR_DELEGATION_NO_REWARD_SLOT)))
+ (increased-ustx (+ (get total-ustx existing-entry) amount-ustx))
+ (total-ustx (+ (get total-ustx existing-total) amount-ustx)))
+
+ ;; must be stackable
+ (try! (minimal-can-stack-stx pox-addr total-ustx reward-cycle u1))
+
+ ;; new total must exceed the stacking minimum
+ (asserts! (<= (get-stacking-minimum) total-ustx)
+ (err ERR_STACKING_THRESHOLD_NOT_MET))
+
+ ;; there must *not* be a stacker entry (since this is a delegator)
+ (asserts! (is-none (get stacker existing-entry))
+ (err ERR_DELEGATION_WRONG_REWARD_SLOT))
+
+ ;; the given PoX address must match the one on record
+ (asserts! (is-eq pox-addr (get pox-addr existing-entry))
+ (err ERR_DELEGATION_WRONG_REWARD_SLOT))
+
+ ;; update the pox-address list -- bump the total-ustx
+ (map-set reward-cycle-pox-address-list
+ { reward-cycle: reward-cycle, index: reward-cycle-index }
+ { pox-addr: pox-addr,
+ total-ustx: increased-ustx,
+ stacker: none,
+ ;; TODO: this must be authorized with a signature, or tx-sender allowance!
+ signer: (get signer existing-entry) })
+
+ ;; update the total ustx in this cycle
+ (map-set reward-cycle-total-stacked
+ { reward-cycle: reward-cycle }
+ { total-ustx: total-ustx })
+
+ ;; don't update the stacking-state map,
+ ;; because it _already has_ this stacker's state
+ ;; don't lock the STX, because the STX is already locked
+ ;;
+ ;; clear the partial-stacked state, and log it
+ (map-delete partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })
+ (map-set logged-partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle } partial-stacked)
+ (ok true))))
+```
+
+
+
+***
+
+## Step by Step Stacking Guide
+
+Now that you are familiar with the overall stacking flow and the different roles played, let's dive into the step-by-step guide for actually conducting the stacking process as a pool operator.
+
+{% hint style="info" %}
+There are several ways you can go about stacking. This guide will cover using [Leather Earn](https://earn.leather.io/), which is a stacking web application and the simplest option.
+
+Additionally, you can choose to call the stacking functions directly from the [deployed contract](https://explorer.hiro.so/txid/SP000000000000000000002Q6VF78.pox-4?chain=mainnet) in the explorer.
+
+The fields and process will be the same, but the UI will differ.
+
+Finally, you can stack using JS and the [@stacks/stacking](https://github.com/hirosystems/stacks.js/tree/main/packages/stacking) package if you prefer. Again, the functions and parameters will be the same, you will just be writing your JS code directly instead of using a UI.
+
+If you are interested in using this method, you'll want to follow the [stacking guide](https://docs.hiro.so/stacks.js/guides/how-to-integrate-stacking) created by Hiro, and be sure to integrate the new parameters described in [Hiro's Nakamoto update doc](https://docs.hiro.so/nakamoto/stacks-js).
+{% endhint %}
+
+### Step 1: Run or work with a signer
+
+This is a necessary prerequisite to stacking as a pool operator. You will either need to run your own signer or work with one and have them conduct step 2 on your behalf and give you their signer signature.
+
+Running a signer involves setting up a hosted production environment that includes both a Stacks Node and the Stacks Signer. For more information, refer to the [running a signer doc](../run-a-signer/signer-quickstart.md).
+
+Once the signer software is running, you'll to keep track of the `stacks_private_key` that you used when configuring your signer software. This will be used in subsequent Stacking transactions.
+
+{% hint style="info" %}
+In the note above about pool operator vs signer keys, this corresponds to your signer key, not your pool operator wallet
+{% endhint %}
+
+### Step 2: Generate a signer key signature
+
+#### Overview of signer keys and signatures
+
+The main difference with Stacking in Nakamoto is that the Signer needs to include new parameters in their Stacking transactions. These are Clarity transactions that pool operators will call when interacting with the `pox-4.clar` contract. Interacting with that contract is how you as a pool operator actually stack the delegated STX tokens.
+
+{% hint style="info" %}
+The current pox-4 contract address can be found by visiting the following endpoint of the Hiro API: [https://api.hiro.so/v2/pox](https://api.hiro.so/v2/pox).
+
+You can then visit the [Stacks Explorer](https://explorer.hiro.so/) to view the contract and pass in the contract id.
+
+You may want to review this contract to familiarize yourself with it.
+{% endhint %}
+
+Here is an overview of the new fields you will need to pass in some of your stacking transactions:
+
+1. `signer-key`: the public key that corresponds to the `stacks_private_key` your signer is using.
+2. `signer-signature`: a signature that demonstrates that you actually control your `signer-key`. Because signer keys need to be unique, this is also a safety check to ensure that other Stackers can’t use someone else’s signer key.
+3. `max-amount`: The maximum amount of uSTX (1 STX = 1,000,000 uSTX) that can be locked in the transaction that uses this signature. For example, if calling `stack-aggregation-increase`, then this parameter dictates the maximum amount of uSTX that can be used to add more locked STX to the already committed position.
+4. `auth-id`: a random integer that prevents re-use of a particular signature, similar to how nonces are used with transactions.
+
+Signer signatures are signatures created using a particular signer key. They demonstrate that the controller of that signer key is allowing a Stacker to use their signer's public key. The signer signature’s message hash is created using the following data:
+
+* `method`: a string that indicates the Stacking method that is allowed to utilize this signature. The valid options are `stack-stx`, `stack-extend`, `stack-increase`, `agg-commit` (for `stack-aggregation-commit-indexed`) and `agg-increase` (for `stack-aggregation-increase`).
+* `max-amount`: described above.
+* `auth-id`: described above.
+* `period`: a value between 1 and 12, which indicates how long the Stacker is allowed to lock their STX for in this particular Stacking transaction. For `agg-commit`, this must be equal to 1.
+* `reward-cycle`: This represents the reward cycle in which the Stacking transaction can be confirmed (for `stack-aggregation-commit-indexed`, this has to be set to 1).
+* `pox-address`: The Bitcoin address that is allowed to be used for receiving rewards. This corresponds to the Bitcoin address associated with your signer
+* `config`: This represents the signer configuration file path where the `stacks_private_key` is located, and it is used for signing the generated signature.
+
+Now that we have an overview of role and contents of signatures, let's see how to actually generate them. You have several options available.
+
+Generating your signature with Degen Lab's stacks.tools
+
+* Degen Lab has a signature generation tool that will generate a signature using their signer. This is the quickest and simplest option. To generate a signature using this method, all you need to do is visit their [signature tool](https://signature.stacking.tools/) and pass in the relevant information as covered on the page.
+
+Generating your signature with stacks.js
+
+* The [@stacks/stacking](https://www.npmjs.com/package/@stacks/stacking) NPM package provides interfaces to generate and use signer signatures.
+* There is a function called `signPoxSignature` that will allow you to generate this signature and pass it in to the stacking function.
+* More information and code samples can be found on [Hiro's Nakamoto docs](https://docs.hiro.so/nakamoto/stacks-js).
+
+Generating your signature using the stacks-signer CLI
+
+* If you already have your signer configured and set up, you can use the `stacks-signer` CLI to generate this signature. You can either SSH into your running signer or use the `stacks-signer` CLI locally. If using the CLI locally, you will need to ensure you have a matching configuration file located on your filesystem. Having a matching configuration file is important to ensure that the signer public key you make in Stacking transactions is the same as in your hosted signer.
+
+The CLI command is:
+
+```
+```
+
+These arguments match those described in section [Overview of signer keys and signatures](solo-stack.md#overview-of-signer-keys-and-signatures), with the addition of:
+
+* `--json`, to optionally output the resulting signature in JSON.
+
+You can use the following command to generate a random `32` bit integer as `auth-id`:
+
+```
+```
+
+Once the `generate-stacking-signature` command is run, the CLI will output a JSON:
+
+```json
+{"authId":"12345","maxAmount":"1234","method":"agg-commit","period":1,"poxAddress":"bc1...","rewardCycle":100,"signerKey":"aaaaaaaa","signerSignature":"bbbbbbbbbbb"}
+```
+
+You will use the JSON when calling Stacking transactions from your pool operator address as outlined above. Remember that this may be different than your signer address.
+
+Generating your signature with Leather Earn
+
+* Leather Earn is a web application that provides an easy-to-use interface for stacking and generating signatures. We'll cover using Leather Earn for stacking at the end of this document, here we will cover how to use it to generate a signature.
+
+{% hint style="info" %}
+At the time of writing, this has only been tested using the [Leather](https://leather.io/) wallet.
+{% endhint %}
+
+You can visit [earn.leather.io](https://earn.leather.io/) to generate a signer key signature. Make sure you’re connected to the correct network.\
+To generate a signer key signature, it’s important that you’ve logged in Leather with the same secret key that was used to generate your signer key, not the account that will serve as your pool operator address. Once you’ve setup that account on Leather, you can log in to Leather Earn.\
+Click the link “Signer key signature” at the bottom of the page. This will open the “generate a signer key signature” page.
+
+The fields are:
+
+* Reward cycle:
+ * For all solo stacking transactions, this must equal the current reward cycle, not the cycle in which they will start stacking. The field defaults to the current reward cycle.
+ * For stack-aggregation-commit-indexed, this field must equal the cycle used in that function’s “reward cycle” argument. Typically, that equates to current\_cycle + 1.
+* Bitcoin address: the PoX reward address that can be used
+* Topic: the stacking function that will use this signature
+* Max amount: max amount of STX that can be used. Defaults to “max possible amount”
+* Auth ID: defaults to random int
+* Duration: must match the number of cycles used in the stacking transaction. For `stack-aggregation-commit-indexed`, use “1”.
+
+{% hint style="warning" %}
+Each of these fields must be exactly matched in order for the Stacking transaction to work. Future updates to Leather Earn will verify the signature before the transaction is made.
+{% endhint %}
+
+Click the “generate signature” button to popup a Leather page where you can generate the signature. Once you submit that popup, Leather Earn will have the signer key and signature you generated.
+
+After you sign that message, you'll see the information you can use in your Stacking transactions, including the signer public key and signature.
+
+You can click the “copy” icon next to “signer details to share with stackers”. This will copy a JSON string, which can be directly pasted into the Leather Earn page where you make your Stacking transaction. Alternatively, this information can be entered manually.
+
+We'll cover the Leather Earn pages for actually making those transactions in the next section of this document.
+
+#### Using a hardware or software wallet to generate signatures
+
+When the signer is configured with a `stacks_private_key`, the signer may want to be able to use that key in a wallet to make stacking signatures.
+
+If the signer uses a tool like [@stacks/cli](https://docs.hiro.so/get-started/command-line-interface) to generate the key, the CLI also outputs a mnemonic (aka “seed phrase”) that can be imported into a wallet. Because the Stacks CLI uses the standard derivation path for generating Stacks keys, any Stacks wallet will default to having that same private key when the wallet is imported from a derivation path. Similarly, if a hardware wallet is setup with that mnemonic, then the Signer can use a wallet like Leather to make stacking signatures.
+
+Use the following stepper for the recommended workflow for setting up a wallet to generate signatures:
+
+{% stepper %}
+{% step %}
+### Generate the keypair and configure signer
+
+1. Use @stacks/cli to generate the keychain and private key.
+ * Typically, when using a hardware wallet, it’s better to generate the mnemonic on the hardware wallet. For this use case, however, the signer software needs the private key, and hardware wallets (by design) don’t allow exporting private keys.
+2. Take the `privateKey` from the CLI output and add it to your signer’s configuration.
+3. Take the mnemonic (24 words) and either:
+ * Setup a new hardware wallet with this mnemonic
+ * Store it somewhere securely, like a password manager. When the signer needs to generate signatures for Stacking transactions, they can import it into either Leather or XVerse.
+{% endstep %}
+
+{% step %}
+### When you need to generate signatures
+
+1. Setup your wallet with your signer key’s private key. Either:
+ * Setup your Leather wallet with a Ledger hardware wallet
+ * Import your mnemonic into Leather, XVerse, or another Stacks wallet
+2. Open an app that has stacking signature functionality built-in
+3. Connect your wallet to the app (aka sign in)
+4. In the app, enter your PoX address and “submit”
+ * The app will popup a window in your wallet that prompts you to sign the information
+ * The app will show clear information about what you’re signing
+5. Create the signature
+ * If using a Ledger, confirm on your device
+6. The app will display two results:
+ * Your signer key, which is the public key associated with your signer’s key
+ * Your signer signature
+7. Finally, make a Stacking transaction using the signer key and signer signature.
+{% endstep %}
+{% endstepper %}
+
+Now that you have your signer signature generated, it's time to start stacking. This process will vary depending on your chosen method. We've included instructions for pool stacking using [Leather Earn](https://earn.leather.io/) below.
+
+### Step 3: Stack as a pool operator
+
+The first step with delegated stacking involves a stacker delegating their Stacks to a specific pool operator. Stackers can do this by visiting the “Stack in a pool” page on Leather Earn.
+
+As the pool operator, you must provide a STX address (a “pool admin address”) that will manage delegations. As discussed in previous sections, this is a separate address from the signer’s private key, and this can be any address. This address is what will be used when making transactions to confirm and aggregate delegated STX.
+
+Pool operators can log in to Leather Earn and visit [https://earn.leather.io/pool-admin](https://earn.leather.io/pool-admin) to make pool management transactions.
+
+#### delegate-stack-stx
+
+Once a user has delegated to a pool operator, the pool operator must call `delegate-stack-stx` for each individual stacker.
+
+#### stack-aggregation-commit
+
+Once a pool has enough delegated STX to become a signer, the pool admin needs to visit the `Stack Aggregation Commit` page on Leather Earn. The pool operator enters the following information:
+
+* Reward cycle: the reward cycle where the operator is “committing” delegated STX. This must be done for every individual reward cycle where the pool will be acting as a signer.
+* BTC address
+* New fields:
+ * Signer public key
+ * Signer key signature (generated in a previous step using the signer key)
+ * Auth ID
+ * Max amount
+
+Once this transaction has been confirmed, the pool operator is eligible to be a signer for an upcoming reward cycle.
+
+For more on the relationship between automated signing and manual stacking transactions, be sure to check out the main [Stack STX](file:///) doc.
diff --git a/docs/operate/stacking-stx/solo-stack.md b/docs/operate/stacking-stx/solo-stack.md
new file mode 100644
index 0000000000..f98bb796f3
--- /dev/null
+++ b/docs/operate/stacking-stx/solo-stack.md
@@ -0,0 +1,614 @@
+# Solo Stack
+
+This doc assumes you are familiar with stacking at a conceptual level. If not, you may want to read the [Stacking](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/block-production/stacking) concept guide.
+
+The guide below applies to those who want to solo stack, meaning they meet the minimum stacking requirement and need to either run a signer or collaborate with a signer.
+
+{% hint style="info" %}
+There is a dapp created by Degen Lab for [solo stacking](https://solo.stacking.tools/) without needing a signer, as Degen Lab operates a signer. This is likely the easiest option for solo stacking. We'll cover this option below.
+{% endhint %}
+
+If you prefer to participate in a pool by delegating your STX, you do not need to operate a signer either. If you fall into this category, check out the [Stack with a Pool](stack-with-a-pool.md) guide.
+
+### Solo Stacker Flow
+
+{% hint style="info" %}
+Note that in order to solo stack, you need to have the minimum number of STX tokens. This number can be found by visiting the pox endpoint of Hiro's API at [https://api.mainnet.hiro.so/v2/pox](https://api.mainnet.hiro.so/v2/pox) and looking at the `min_threshold_ustx` field. (1 STX = 1,000,000 uSTX)
+{% endhint %}
+
+#### Call the function `stack-stx`
+
+
+
+Function source code
+
+```clojure
+;; Lock up some uSTX for stacking! Note that the given amount here is in micro-STX (uSTX).
+;; The STX will be locked for the given number of reward cycles (lock-period).
+;; This is the self-service interface. tx-sender will be the Stacker.
+;;
+;; * The given stacker cannot currently be stacking.
+;; * You will need the minimum uSTX threshold. This will be determined by (get-stacking-minimum)
+;; at the time this method is called.
+;; * You may need to increase the amount of uSTX locked up later, since the minimum uSTX threshold
+;; may increase between reward cycles.
+;; * You need to provide a signer key to be used in the signer DKG process.
+;; * The Stacker will receive rewards in the reward cycle following `start-burn-ht`.
+;; Importantly, `start-burn-ht` may not be further into the future than the next reward cycle,
+;; and in most cases should be set to the current burn block height.
+;;
+;; To ensure that the Stacker is authorized to use the provided `signer-key`, the stacker
+;; must provide either a signature have an authorization already saved. Refer to
+;; `verify-signer-key-sig` for more information.
+;;
+;; The tokens will unlock and be returned to the Stacker (tx-sender) automatically.
+(define-public (stack-stx (amount-ustx uint)
+ (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32))))
+ (start-burn-ht uint)
+ (lock-period uint)
+ (signer-sig (optional (buff 65)))
+ (signer-key (buff 33))
+ (max-amount uint)
+ (auth-id uint))
+ ;; this stacker's first reward cycle is the _next_ reward cycle
+ (let ((first-reward-cycle (+ u1 (current-pox-reward-cycle)))
+ (specified-reward-cycle (+ u1 (burn-height-to-reward-cycle start-burn-ht))))
+ ;; the start-burn-ht must result in the next reward cycle, do not allow stackers
+ ;; to "post-date" their `stack-stx` transaction
+ (asserts! (is-eq first-reward-cycle specified-reward-cycle)
+ (err ERR_INVALID_START_BURN_HEIGHT))
+
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+
+ ;; tx-sender principal must not be stacking
+ (asserts! (is-none (get-stacker-info tx-sender))
+ (err ERR_STACKING_ALREADY_STACKED))
+
+ ;; tx-sender must not be delegating
+ (asserts! (is-none (get-check-delegation tx-sender))
+ (err ERR_STACKING_ALREADY_DELEGATED))
+
+ ;; the Stacker must have sufficient unlocked funds
+ (asserts! (>= (stx-get-balance tx-sender) amount-ustx)
+ (err ERR_STACKING_INSUFFICIENT_FUNDS))
+
+ ;; Validate ownership of the given signer key
+ (try! (consume-signer-key-authorization pox-addr (- first-reward-cycle u1) "stack-stx" lock-period signer-sig signer-key amount-ustx max-amount auth-id))
+
+ ;; ensure that stacking can be performed
+ (try! (can-stack-stx pox-addr amount-ustx first-reward-cycle lock-period))
+
+ ;; register the PoX address with the amount stacked
+ (let ((reward-set-indexes (try! (add-pox-addr-to-reward-cycles pox-addr first-reward-cycle lock-period amount-ustx tx-sender signer-key))))
+ ;; add stacker record
+ (map-set stacking-state
+ { stacker: tx-sender }
+ { pox-addr: pox-addr,
+ reward-set-indexes: reward-set-indexes,
+ first-reward-cycle: first-reward-cycle,
+ lock-period: lock-period,
+ delegated-to: none })
+
+ ;; return the lock-up information, so the node can actually carry out the lock.
+ (ok { stacker: tx-sender, lock-amount: amount-ustx, signer-key: signer-key, unlock-burn-height: (reward-cycle-to-burn-height (+ first-reward-cycle lock-period)) }))))
+```
+
+
+
+The first thing solo stackers will need to do is call the `stack-stx` function.
+
+Just like in previous versions of PoX, Stackers call `stack-stx`, but with the new arguments added in Nakamoto. The arguments are:
+
+* Amount: Denoted in uSTX (1 STX = 1,000,000 uSTX)
+* PoX Address: the BTC wallet address where to receive Stacking rewards
+* Start burn height: the current BTC block height
+* Lock period: the number of cycles to lock for (between 1 and 12)
+* Signer key: the public key that your signer is using
+* Signer signature: the signature that proves control of this signer key
+* Max Amount: This parameter is used to validate the signer signature provided. It represents the maximum number of uSTX that can be stacked in this transaction.
+* Auth Id: This parameter is used to validate the signer signature provided. It is a random integer that prevents the re-use of this particular signer signature.
+
+Solo stackers have two choices when it comes to operating as a signer. They can choose to run a signer themselves or work with a signer on their behalf.
+
+#### Option 1: Act as a signer
+
+In the “prepare phase” before the next stacking cycle (last 100 blocks), the exact set of Stackers will be selected based on the amount of STX stacked. Just like in previous versions of PoX, each Stacker will have some number of reward slots based on the amount of STX locked.
+
+It is critical that solo stackers have their signer running during this period. The prepare phase is when distributed key generation (DKG) occurs, which is used when validating blocks by signers.
+
+In general, you don’t need to do anything actively during this period, other than monitoring your signer software to ensure it’s running properly.
+
+#### Option 2: Work with a signer
+
+If you do not want to operate a signer on your own, you can work with another signer. To do this, you will need to collaborate with them to get their signer key and signer signature (details in the following sections), which will have to be passed when calling the stacking functions.
+
+Rather than needing to find a signer to collaborate with, you can use the solo stacking dapp created by Degen Lab in order to use their signer to solo stack. They've created a UI that makes this process really simple.
+
+They also have a tool for you to generate a signer signature if you prefer to call the stacking functions yourself.
+
+#### Extending the stacking period
+
+Just like in the current version of PoX, you can extend your lock period while still Stacking. The function called is `stack-extend`.
+
+
+
+Function source code
+
+```clojure
+;; Extend an active Stacking lock.
+;; *New in Stacks 2.1*
+;; This method extends the `tx-sender`'s current lockup for an additional `extend-count`
+;; and associates `pox-addr` with the rewards, The `signer-key` will be the key
+;; used for signing. The `tx-sender` can thus decide to change the key when extending.
+;;
+;; Because no additional STX are locked in this function, the `amount` field used
+;; to verify the signer key authorization is zero. Refer to `verify-signer-key-sig` for more information.
+(define-public (stack-extend (extend-count uint)
+ (pox-addr { version: (buff 1), hashbytes: (buff 32) })
+ (signer-sig (optional (buff 65)))
+ (signer-key (buff 33))
+ (max-amount uint)
+ (auth-id uint))
+ (let ((stacker-info (stx-account tx-sender))
+ ;; to extend, there must already be an etry in the stacking-state
+ (stacker-state (unwrap! (get-stacker-info tx-sender) (err ERR_STACK_EXTEND_NOT_LOCKED)))
+ (amount-ustx (get locked stacker-info))
+ (unlock-height (get unlock-height stacker-info))
+ (cur-cycle (current-pox-reward-cycle))
+ ;; first-extend-cycle will be the cycle in which tx-sender *would have* unlocked
+ (first-extend-cycle (burn-height-to-reward-cycle unlock-height))
+ ;; new first cycle should be max(cur-cycle, stacker-state.first-reward-cycle)
+ (cur-first-reward-cycle (get first-reward-cycle stacker-state))
+ (first-reward-cycle (if (> cur-cycle cur-first-reward-cycle) cur-cycle cur-first-reward-cycle)))
+
+ ;; must be called with positive extend-count
+ (asserts! (>= extend-count u1)
+ (err ERR_STACKING_INVALID_LOCK_PERIOD))
+
+ ;; stacker must be directly stacking
+ (asserts! (> (len (get reward-set-indexes stacker-state)) u0)
+ (err ERR_STACKING_IS_DELEGATED))
+
+ ;; stacker must not be delegating
+ (asserts! (is-none (get delegated-to stacker-state))
+ (err ERR_STACKING_IS_DELEGATED))
+
+ ;; Verify signature from delegate that allows this sender for this cycle
+ (try! (consume-signer-key-authorization pox-addr cur-cycle "stack-extend" extend-count signer-sig signer-key u0 max-amount auth-id))
+
+ ;; TODO: add more assertions to sanity check the `stacker-info` values with
+ ;; the `stacker-state` values
+
+ (let ((last-extend-cycle (- (+ first-extend-cycle extend-count) u1))
+ (lock-period (+ u1 (- last-extend-cycle first-reward-cycle)))
+ (new-unlock-ht (reward-cycle-to-burn-height (+ u1 last-extend-cycle))))
+
+ ;; first cycle must be after the current cycle
+ (asserts! (> first-extend-cycle cur-cycle) (err ERR_STACKING_INVALID_LOCK_PERIOD))
+ ;; lock period must be positive
+ (asserts! (> lock-period u0) (err ERR_STACKING_INVALID_LOCK_PERIOD))
+
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+
+ ;; tx-sender must be locked
+ (asserts! (> amount-ustx u0)
+ (err ERR_STACK_EXTEND_NOT_LOCKED))
+
+ ;; tx-sender must not be delegating
+ (asserts! (is-none (get-check-delegation tx-sender))
+ (err ERR_STACKING_ALREADY_DELEGATED))
+
+ ;; standard can-stack-stx checks
+ (try! (can-stack-stx pox-addr amount-ustx first-extend-cycle lock-period))
+
+ ;; register the PoX address with the amount stacked
+ ;; for the new cycles
+ (let ((extended-reward-set-indexes (try! (add-pox-addr-to-reward-cycles pox-addr first-extend-cycle extend-count amount-ustx tx-sender signer-key)))
+ (reward-set-indexes
+ ;; use the active stacker state and extend the existing reward-set-indexes
+ (let ((cur-cycle-index (- first-reward-cycle (get first-reward-cycle stacker-state)))
+ (old-indexes (get reward-set-indexes stacker-state))
+ ;; build index list by taking the old-indexes starting from cur cycle
+ ;; and adding the new indexes to it. this way, the index is valid starting from the current cycle
+ (new-list (concat (default-to (list) (slice? old-indexes cur-cycle-index (len old-indexes)))
+ extended-reward-set-indexes)))
+ (unwrap-panic (as-max-len? new-list u12)))))
+ ;; update stacker record
+ (map-set stacking-state
+ { stacker: tx-sender }
+ { pox-addr: pox-addr,
+ reward-set-indexes: reward-set-indexes,
+ first-reward-cycle: first-reward-cycle,
+ lock-period: lock-period,
+ delegated-to: none })
+
+ ;; return lock-up information
+ (ok { stacker: tx-sender, unlock-burn-height: new-unlock-ht })))))
+```
+
+
+
+You can “rotate” your signing key when extending your lock period.
+
+The arguments are:
+
+* Extend count: the number of cycles to add to your lock period. The resulting lock period cannot be larger than 12. For example, if you're currently locked with 6 cycles remaining, the maximum number you can extend is 6.
+* Pox Address: the BTC address to receive rewards
+* Signer public key: the public key used for signing. This can stay the same, or you can use a new key.
+* Signer signature: a signature proving control of your signing key
+* Max Amount: This parameter is used to validate the signer signature provided. It represents the maximum number of uSTX (1 stx = 1,000,000 uSTX) that can be stacked in this transaction.
+* Auth Id: This parameter is used to validate the signer signature provided. It is a random integer that prevents the re-use of this particular signer signature.
+
+#### Increasing the stacking amount
+
+The stacking amount can also be increased while actively Stacking. The increased position will take effect starting with the next Stacking cycle. The function called is `stack-increase`.
+
+
+
+Function source code
+
+```clojure
+;; Increase the number of STX locked.
+;; *New in Stacks 2.1*
+;; This method locks up an additional amount of STX from `tx-sender`'s, indicated
+;; by `increase-by`. The `tx-sender` must already be Stacking & must not be
+;; straddling more than one signer-key for the cycles effected.
+;; Refer to `verify-signer-key-sig` for more information on the authorization parameters
+;; included here.
+(define-public (stack-increase
+ (increase-by uint)
+ (signer-sig (optional (buff 65)))
+ (signer-key (buff 33))
+ (max-amount uint)
+ (auth-id uint))
+ (let ((stacker-info (stx-account tx-sender))
+ (amount-stacked (get locked stacker-info))
+ (amount-unlocked (get unlocked stacker-info))
+ (unlock-height (get unlock-height stacker-info))
+ (cur-cycle (current-pox-reward-cycle))
+ (first-increased-cycle (+ cur-cycle u1))
+ (stacker-state (unwrap! (map-get? stacking-state
+ { stacker: tx-sender })
+ (err ERR_STACK_INCREASE_NOT_LOCKED)))
+ (cur-pox-addr (get pox-addr stacker-state))
+ (cur-period (get lock-period stacker-state)))
+ ;; tx-sender must be currently locked
+ (asserts! (> amount-stacked u0)
+ (err ERR_STACK_INCREASE_NOT_LOCKED))
+ ;; must be called with positive `increase-by`
+ (asserts! (>= increase-by u1)
+ (err ERR_STACKING_INVALID_AMOUNT))
+ ;; stacker must have enough stx to lock
+ (asserts! (>= amount-unlocked increase-by)
+ (err ERR_STACKING_INSUFFICIENT_FUNDS))
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+ ;; stacker must be directly stacking
+ (asserts! (> (len (get reward-set-indexes stacker-state)) u0)
+ (err ERR_STACKING_IS_DELEGATED))
+ ;; stacker must not be delegating
+ (asserts! (is-none (get delegated-to stacker-state))
+ (err ERR_STACKING_IS_DELEGATED))
+
+ ;; Validate that amount is less than or equal to `max-amount`
+ (asserts! (>= max-amount (+ increase-by amount-stacked)) (err ERR_SIGNER_AUTH_AMOUNT_TOO_HIGH))
+
+ ;; Verify signature from delegate that allows this sender for this cycle
+ (try! (consume-signer-key-authorization cur-pox-addr cur-cycle "stack-increase" cur-period signer-sig signer-key increase-by max-amount auth-id))
+
+ ;; update reward cycle amounts
+ (asserts! (is-some (fold increase-reward-cycle-entry
+ (get reward-set-indexes stacker-state)
+ (some { first-cycle: first-increased-cycle,
+ reward-cycle: (get first-reward-cycle stacker-state),
+ stacker: tx-sender,
+ add-amount: increase-by,
+ signer-key: signer-key })))
+ (err ERR_INVALID_INCREASE))
+ ;; NOTE: stacking-state map is unchanged: it does not track amount-stacked in PoX-4
+ (ok { stacker: tx-sender, total-locked: (+ amount-stacked increase-by)})))
+```
+
+
+
+The arguments are:
+
+* Increase by: the amount of uSTX to add to your lock amount.
+* Signer public key: the public key used for signing. This can stay the same, or you can use a new key.
+* Signer signature: a signature proving control of your signing key
+* Max Amount: This parameter is used to validate the signer signature provided. It represents the maximum number of uSTX (1 stx = 1,000,000 uSTX) that can be stacked in this transaction.
+* Auth Id: This parameter is used to validate the signer signature provided. It is a random integer that prevents the re-use of this particular signer signature.
+
+### Step by Step Stacking Guide
+
+Now that you are familiar with the overall stacking flow and the different roles played, let's dive into the step-by-step guide for actually conducting the stacking process.
+
+{% hint style="info" %}
+There are several ways you can go about stacking. This guide will cover using Leather Earn, which is a stacking web application and the simplest option.
+
+Additionally, you can choose to call the stacking functions directly from the [deployed contract](https://explorer.hiro.so/txid/SP000000000000000000002Q6VF78.pox-4?chain=mainnet) in the explorer.
+
+The fields and process will be the same, but the UI will differ.
+
+Finally, you can stack using JS and the [@stacks/stacking](https://github.com/hirosystems/stacks.js/tree/main/packages/stacking) package if you prefer. Again, the functions and parameters will be the same, you will just be writing your JS code directly instead of using a UI.
+
+If you are interested in using this method, you'll want to follow the [stacking guide](https://docs.hiro.so/stacks.js/guides/how-to-integrate-stacking) created by Hiro, and be sure to integrate the new parameters described in [Hiro's Nakamoto update doc](https://docs.hiro.so/nakamoto/stacks-js).
+{% endhint %}
+
+### Step 1: Run or work with a signer
+
+This is a necessary prerequisite to stacking as a solo stacker or pool operator.
+
+Running a signer involves setting up a hosted production environment that includes both a Stacks Node and the Stacks Signer. For more information, refer to the [running a signer doc](../run-a-signer/).
+
+Once the signer software is running, you'll have to keep track of the `stacks_private_key` that you used when configuring your signer software. This will be used in subsequent Stacking transactions.
+
+{% hint style="info" %}
+In the note above about pool operator vs signer keys, this corresponds to your signer key, not your pool operator wallet
+{% endhint %}
+
+Alternatively, you can work with a signer and have them perform step 2 below on your behalf.
+
+### Step 2: Generate a signer key signature
+
+#### Overview of signer keys and signatures
+
+The main difference with Stacking in Nakamoto is that the Signer (either solo Stacker or signer running a pool) needs to include new parameters in their Stacking transactions. These are Clarity transactions that Stackers will call when interacting with the `pox-4.clar` contract. Interacting with this contract is how you as a Stacker actually stack your STX tokens.
+
+{% hint style="info" %}
+The current pox-4 contract address can be found by visiting the following endpoint of the Hiro API: [https://api.mainnet.hiro.so/v2/pox](https://api.mainnet.hiro.so/v2/pox).
+
+You can then visit the [Explorer](https://explorer.hiro.so/?chain=mainnet) to view the contract and pass in the contract id.
+
+You may want to review this contract to familiarize yourself with it.
+{% endhint %}
+
+Here is an overview of the fields you will need to pass. We'll cover how to get and pass these fields as we dive further into this doc:
+
+{% stepper %}
+{% step %}
+### signer-key
+
+The public key that corresponds to the `stacks_private_key` your signer is using.
+{% endstep %}
+
+{% step %}
+### signer-signature
+
+A signature that demonstrates that you actually control your `signer-key`. Because signer keys need to be unique, this is also a safety check to ensure that other Stackers can’t use someone else’s public key.
+{% endstep %}
+
+{% step %}
+### max-amount
+
+The maximum amount of uSTX (1 STX = 1,000,000 uSTX) that can be locked in the transaction that uses this signature. For example, if calling `stack-increase`, this parameter dictates the maximum amount of uSTX that can be used to add more locked STX.
+{% endstep %}
+
+{% step %}
+### auth-id
+
+A random integer that prevents the re-use of a particular signature, similar to how nonces are used with transactions. Must be less than 14 characters.
+{% endstep %}
+{% endstepper %}
+
+Signer signatures are signatures created using a particular signer key. They demonstrate that the controller of that signer key is allowing a Stacker to use their signing key. The signer signature’s message hash is created using the following data:
+
+* `method`: a string that indicates the Stacking method that is allowed to utilize this signature. The valid options are `stack-increase`, `stack-stx`, `stack-extend`, `agg-commit` (for stack-aggregation-commit-indexed), or `agg-increase` (for stack-aggregation-increase)
+* `max-amount`: described above
+* `auth-id`: described above
+* `period`: a value between 1 and 12, which indicates the number of cycles that the Stacker is allowed to lock their STX for in this particular Stacking transaction. For `agg-commit`, this must be equal to 1
+* `reward-cycle`: This represents the reward cycle in which the Stacking transaction can be confirmed. For solo stacking operations (`stack-stx`, `stack-extend` and `stack-increase`), this has to be set as the current cycle.
+* `pox-address`: The Bitcoin address that is allowed to be used for receiving rewards. This can be set to any Bitcoin address that you have access to.
+* `config`: This represents the signer configuration file path where the `stacks_private_key` is located, and it is used for signing the generated signature.
+
+Now that we have an overview of role and contents of signatures, let's see how to actually generate them. You have several options available.
+
+Generating your signature with Degen Lab's stacks.tools
+
+Degen Lab has a signature generation tool that will generate a signature using their signer. This is the quickest and simplest option. To generate a signature using this method, all you need to do is visit their [signature tool](https://signature.stacking.tools/) and pass in the relevant information as covered on this page.
+
+#### Generating your signature with stacks.js
+
+The [@stacks/stacking](https://www.npmjs.com/package/@stacks/stacking) NPM package provides interfaces to generate and use signer signatures.
+
+There is a function called `signPoxSignature` that will allow you to generate this signature and pass it in to the stacking function.
+
+More information and code samples can be found on [Hiro's Nakamoto docs](https://docs.hiro.so/nakamoto/stacks-js).
+
+#### Generating your signature using the stacks-signer CLI
+
+If you already have your signer configured and set up, you can use the `stacks-signer` CLI to generate this signature. You can either SSH into your running signer or use the `stacks-signer` CLI locally. If using the CLI locally, you will need to ensure you have a matching configuration file located on your filesystem. Having a matching configuration file is important to ensure that the signer public key you make in Stacking transactions is the same as in your hosted signer.
+
+The CLI command is:
+
+```bash
+# Max Amount equivallent to 1M STX
+
+# Auth Id should be a random string less than 14 characters
+stacks-signer generate-stacking-signature \
+ --method stack-stx \
+ --max-amount 1000000000000 \
+ --auth-id 71948271489 \
+ --period 1 \
+ --reward-cycle 100 \
+ --pox-address bc1... \
+ --config ./config.toml \
+ --json
+```
+
+These arguments match those described in section [Overview of signer keys and signatures](solo-stack.md#overview-of-signer-keys-and-signatures), with the addition of:
+
+* `--json`, to optionally output the resulting signature in JSON
+
+You can use the following command to generate a random `32` bit integer as `auth-id`:
+
+```bash
+python3 -c 'import secrets; print(secrets.randbits(32))'
+```
+
+Once the `generate-stacking-signature` command is run, the CLI will output a JSON:
+
+```json
+{"authId":"1234","maxAmount":"12345","method":"stack-stx","period":1,"poxAddress":"bc1...","rewardCycle":100,"signerKey":"aaaaaaaa","signerSignature":"bbbbbbbbbbb"}
+```
+
+You will use the JSON when calling Stacking transactions from your Stacker address as outlined above. Remember that this may be different than your signer address.
+
+#### Generating your signature with Leather Earn
+
+Leather Earn is a web application that provides an easy-to-use interface for stacking and generating signatures. We'll cover using Leather Earn for stacking at the end of this document, here we will cover how to use it to generate a signature.
+
+{% hint style="info" %}
+At the time of writing, this has only been tested using the [Leather](https://leather.io/) wallet.
+{% endhint %}
+
+You can visit [earn.leather.io](https://earn.leather.io/) to generate a signer key signature. Make sure you’re connected to the correct network.\
+To generate a signer key signature, it’s important that you’ve logged in Leather with the same secret key that was used to [generate your signer key](broken-reference), not the account that will serve as your pool operator address. Once you’ve setup that account on Leather, you can log in to Leather Earn.\
+Click the link “Signer key signature” at the bottom of the page. This will open the “generate a signer key signature” page.
+
+The fields are:
+
+* Reward cycle:
+ * For all solo stacking transactions, this must equal the current reward cycle, not the cycle in which they will start stacking. The field defaults to the current reward cycle.
+ * For stack-aggregation-commit-indexed, this field must equal the cycle used in that function’s “reward cycle” argument. Typically, that equates to current\_cycle + 1.
+* Bitcoin address: the PoX reward address that can be used
+* Topic: the stacking function that will use this signature
+* Max amount: max amount of STX that can be used. Defaults to “max possible amount”
+* Auth ID: defaults to random int
+* Duration: must match the number of cycles used in the stacking transaction. For stack-aggregation-commit-indexed, use “1”.
+
+{% hint style="warning" %}
+Each of these fields must be exactly matched in order for the Stacking transaction to work. Future updates to Leather Earn will verify the signature before the transaction is made.
+{% endhint %}
+
+Click the “generate signature” button to popup a Leather page where you can generate the signature. Once you submit that popup, Leather Earn will have the signer key and signature you generated.
+
+After you sign that message, you'll see the information you can use in your Stacking transactions, including the signer public key and signature.
+
+You can click the “copy” icon next to “signer details to share with stackers”. This will copy a JSON string, which can be directly pasted into the Leather Earn page where you make your Stacking transaction. Alternatively, this information can be entered manually.
+
+We'll cover the Leather Earn pages for actually making those transactions in the next section of this document.
+
+#### Using a hardware or software wallet to generate signatures
+
+When the signer is configured with a `stacks_private_key`, the signer may want to be able to use that key in a wallet to make stacking signatures.
+
+If the signer uses a tool like [@stacks/cli](https://docs.hiro.so/get-started/command-line-interface) to generate the key, the CLI also outputs a mnemonic (aka “seed phrase”) that can be imported into a wallet. Because the Stacks CLI uses the standard derivation path for generating Stacks keys, any Stacks wallet will default to having that same private key when the wallet is imported from a derivation path. Similarly, if a hardware wallet is setup with that mnemonic, then the Signer can use a wallet like Leather to make stacking signatures.
+
+The workflow for setting up a wallet to generate signatures:
+
+{% stepper %}
+{% step %}
+Use @stacks/cli to generate the keychain and private key.
+
+* Typically, when using a hardware wallet, it’s better to generate the mnemonic on the hardware wallet. For this use case, however, the signer software needs the private key, and hardware wallets (by design) don’t allow exporting private keys.
+{% endstep %}
+
+{% step %}
+Take the `privateKey` from the CLI output and add it to your signer’s configuration.
+{% endstep %}
+
+{% step %}
+Take the mnemonic (24 words) and either:
+
+* Setup a new hardware wallet with this mnemonic, or
+* Store it somewhere securely, like a password manager. When the signer needs to generate signatures for Stacking transactions, they can import it into either Leather or XVerse.
+{% endstep %}
+{% endstepper %}
+
+When the user needs to generate signatures:
+
+{% stepper %}
+{% step %}
+Set up your wallet with your signer key’s private key. Either:
+
+* Setup your Leather wallet with a Ledger hardware wallet, or
+* Import your mnemonic into Leather, XVerse, or another Stacks wallet.
+{% endstep %}
+
+{% step %}
+Open an app that has stacking signature functionality built-in.
+{% endstep %}
+
+{% step %}
+Connect your wallet to the app (aka sign in).
+{% endstep %}
+
+{% step %}
+In the app, enter your PoX address and “submit”.
+
+* The app will popup a window in your wallet that prompts you to sign the information and will show clear information about what you’re signing.
+{% endstep %}
+
+{% step %}
+Create the signature.
+
+* If using a Ledger, confirm on your device.
+{% endstep %}
+
+{% step %}
+The app will display two results:
+
+* Your signer key, which is the public key associated with your signer’s key.
+* Your signer signature.
+{% endstep %}
+
+{% step %}
+Finally, make a Stacking transaction using the signer key and signer signature.
+{% endstep %}
+{% endstepper %}
+
+Now that you have your signer signature generated, it's time to start stacking. This process will vary depending on your chosen method. We've included instructions for solo stacking using [Leather Earn](https://earn.leather.io/) below.
+
+### Step 3: Stack your STX
+
+#### stack-stx
+
+To start, you'll visit [Leather Earn](https://earn.leather.io/) and click the “Stack independently” button on the home page.
+
+This page will allow you to input the following input:
+
+* The amount of STX you want to lock
+* The duration (in number of cycles) to lock for
+* Your BTC address where you will receive Stacking rewards
+* New fields:
+ * Your signer public key
+ * Your signer key signature (this is what you generated in the previous step)
+ * Auth ID
+ * Max amount
+
+#### stack-extend
+
+If you want to extend the time that your STX will be locked for, you can use the stack-extend page on Leather Earn.
+
+If you’re already stacking, the home page will provide a link to “view stacking details”. From there, you can choose to extend.
+
+On this page are the following fields:
+
+* The number of cycles you want to extend for
+* Your BTC address to receive rewards
+* New fields:
+ * Signer public key
+ * Signer key signature
+ * Auth ID
+ * Max amount
+
+#### stack-increase
+
+If you want to increase the amount of STX locked, you can use the stack-increase page on Leather Earn.
+
+If you’re already stacking, the home page will provide a link to “view stacking details”. From there, you can choose to increase.
+
+On this page are the following fields:
+
+* The amount of STX you want to increase by
+* New fields:
+ * Signer public key
+ * Signer key signature
+ * Auth ID
+ * Max amount
diff --git a/docs/operate/stacking-stx/stack-with-a-pool.md b/docs/operate/stacking-stx/stack-with-a-pool.md
new file mode 100644
index 0000000000..138c8f2984
--- /dev/null
+++ b/docs/operate/stacking-stx/stack-with-a-pool.md
@@ -0,0 +1,65 @@
+# Stack with a Pool
+
+The most common stacking scenario is to be an individual stacker that does not meet the stacking minimum and to stack with a pool.
+
+This is also the least complex version and is very easy to accomplish.
+
+Be sure you are familiar with the [concept of stacking](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/block-production/stacking) before digging into this.
+
+The dynamic minimum required to stack STX changes based on the total liquid supply of STX in the network and can be found by looking at the `pox` endpoint of the Hiro API: [https://api.hiro.so/v2/pox](https://api.hiro.so/v2/pox).
+
+If you do not meet this minimum, you'll need to delegate your STX to a pool operator.
+
+This is a non-custodial delegation, meaning that your STX do not actually leave your wallet.
+
+{% hint style="info" %}
+Pool operators have a lot of control over exactly how they implement stacking. Usually users will be interacting with a wrapper contract that the pool operator has created to utilize the core stacking contract.
+{% endhint %}
+
+Delegating your STX to a pool operator involves a few steps:
+
+{% stepper %}
+{% step %}
+### Find a pool
+
+The first step is to find a stacking pool you would like to stack with. Pool operators have a lot of control over exactly how they implement stacking and reward distribution, and they all do things a bit differently, so it's important to do your research. The Stacks website has a great [page on stacking](https://www.stacks.co/learn/stacking) that links to several pool operators for you to research.
+{% endstep %}
+
+{% step %}
+### Use the pool's UI to call the delegate function
+
+After you've chosen your pool operator, you'll need to get set up with a [Stacks-compatible wallet](https://www.stacks.co/explore/ecosystem?category=All+Teams#wallets) like Leather, Xverse, or Asigna.
+
+Then you'll use your chosen pool operator's UI to call their delegation function. You may need to pass a couple of parameters here like how long you want to grant delegation permission for.
+{% endstep %}
+
+{% step %}
+### Pool operator stacks tokens
+
+Once you grant permission for the pool operator to delegate, they will take over and call a separate function in the stacking contract to actually stack those delegated tokens. At this point your STX will be locked.
+
+Depending on how the pool operator handles things, they may offer the option to automatically continue to stack your STX for up to 12 continuous cycles.
+{% endstep %}
+
+{% step %}
+### Pool operator allocates rewards
+
+Next, the pool operator will track what proportion of rewards you should earn based on the proportion of STX you delegated. If distributing rewards directly in Bitcoin, the pool operator will need to take custody of the Bitcoin and manually distribute it.
+
+This is why it is important to do your research and stack with a pool operator whose reward distribution mechanism you trust. Different operators have different methods to make this process transparent and as trust-minimized as possible.
+{% endstep %}
+
+{% step %}
+### Pool operator distributes rewards
+
+Finally, the pool operator will distribute those rewards to you in either BTC or STX, depending on the model they use.
+{% endstep %}
+{% endstepper %}
+
+If you want to learn more about the specific functions and the contract that handles the stacking process, be sure to take a look at the [stacking contract walkthrough](https://app.gitbook.com/s/GVj1Z9vMuEOMe7oH7Wnq/clarity/example-contracts/stacking).
+
+### Liquid Stacking
+
+Liquid stacking is when you delegate your STX tokens to a liquid stacking provider and they issue you a new token such as stSTX that you can then use in the ecosystem. This makes it so that stackers can still use their STX to participate in DeFi protocols and other apps even while their STX are locked.
+
+This works a bit differently than traditional stacking and links to liquid stacking providers for you to research can be found on the [Stacks website](https://www.stacks.co/learn/stacking).
diff --git a/docs/operate/stacking-stx/stop-stacking.md b/docs/operate/stacking-stx/stop-stacking.md
new file mode 100644
index 0000000000..fcca8c5d8f
--- /dev/null
+++ b/docs/operate/stacking-stx/stop-stacking.md
@@ -0,0 +1,67 @@
+# Stop Stacking
+
+When you decide it's time to stop stacking your STX tokens, the process depends on whether you are stacking solo or delegating your tokens to a pool operator. This guide explains the steps for both scenarios.
+
+***
+
+## Stopping Solo Stacking
+
+When stacking solo using the `stack-stx` function, your STX is locked for a fixed period (the lock period) defined when you initiated stacking or when you extended the lock period. **No additional action is required to stop stacking**, you simply have to wait until the lock period expires.
+
+{% hint style="info" %}
+In solo stacking, both the `stack-stx` and `stack-extend` functions emits an event that includes the `unlock-burn-height` field. This is the burn block height at which your tokens will be automatically unlocked.
+{% endhint %}
+
+## Stopping Pooled Stacking
+
+If you're stacking with a pool (where you delegate your STX via the `delegate-stx` function), the process to stop stacking requires one extra step before your STX is eventually unlocked.
+
+{% stepper %}
+{% step %}
+### Revoke Delegation
+
+Before your STX can be unlocked, you must cancel the delegation with the pool operator. This is done by calling the `revoke-delegate-stx` function through the pool's interface, or within the [pox-4](https://explorer.hiro.so/txid/SP000000000000000000002Q6VF78.pox-4?chain=mainnet) contract.
+
+
+
+Function source code
+
+```clojure
+;; Revokes the delegation to the current stacking pool.
+;; New in pox-4: Fails if the delegation was already revoked.
+;; Returns the last delegation state.
+(define-public (revoke-delegate-stx)
+ (let ((last-delegation-state (get-check-delegation tx-sender)))
+ ;; must be called directly by the tx-sender or by an allowed contract-caller
+ (asserts! (check-caller-allowed)
+ (err ERR_STACKING_PERMISSION_DENIED))
+ (asserts! (is-some last-delegation-state) (err ERR_DELEGATION_ALREADY_REVOKED))
+ (asserts! (map-delete delegation-state { stacker: tx-sender }) (err ERR_DELEGATION_ALREADY_REVOKED))
+ (ok last-delegation-state)))
+```
+
+
+
+Calling `revoke-delegate-stx` cancels your STX delegation, revoking the pool operator's access to further lock/stack your funds. Even after revoking the delegation, your STX will remain locked until the end of the last stacking cycle chosen by the pool (can be at most 12 cycles in the future).
+
+{% hint style="warning" %}
+Failing to revoke your delegation will mean that you continue to allow the pool to stack your STX until the reach of the burn block height mentioned in the delegate function (`delegate-stx`). Ensure that you have successfully called `revoke-delegate-stx` if you want to stop stacking sooner.
+{% endhint %}
+{% endstep %}
+
+{% step %}
+### Wait for Funds to Unlock
+
+After revoking your delegation, your STX tokens will still remain locked until the last stacking cycle chosen by the pool operator completes. The unlock occurs automatically at the predefined unlock burn height for that cycle.
+
+{% hint style="info" %}
+Even in pooled stacking, the unlocking mechanism follows the same blockchain timing as solo stacking. Revoking delegation only stops future stacking actions, it does not immediately unlock your tokens.
+{% endhint %}
+{% endstep %}
+{% endstepper %}
+
+## Considerations
+
+* Monitor Your Stacking Status: Use your wallet's interface or the [Hiro Explorer](https://explorer.hiro.so/?chain=mainnet) to track the status of your lock period and confirm when your tokens are available.
+* Using the API: Hiro's API offers an endpoint to [Get account STX balance](https://docs.hiro.so/stacks/api/accounts/stx-balances), which contains the `burnchain_unlock_height` height, representing the burn block height where your STX unlocks.
+* Plan Ahead: Since the unlocking is bound to cycle's timing, plan your stacking period or revocation accordingly to minimize delays in accessing your funds.
diff --git a/docs/press-and-reports/.gitbook.yaml b/docs/press-and-reports/.gitbook.yaml
new file mode 100644
index 0000000000..77d87e4766
--- /dev/null
+++ b/docs/press-and-reports/.gitbook.yaml
@@ -0,0 +1,30 @@
+root: ./
+
+redirects:
+ bitcoin-theses-and-reports/bitcoin-theses: README.md
+ bitcoin-theses-and-reports/bitcoin-reports: bitcoin-theses-and-reports/bitcoin-reports.md
+
+ # 2024 press-and-top-links redirects
+ press-and-top-links/2024/january-2024: press-and-top-links/2024/january-2024.md
+ press-and-top-links/2024/february-2024: press-and-top-links/2024/february-2024.md
+ press-and-top-links/2024/march-2024: press-and-top-links/2024/march-2024.md
+ press-and-top-links/2024/april-2024: press-and-top-links/2024/april-2024.md
+ press-and-top-links/2024/may-2024: press-and-top-links/2024/may-2024.md
+ press-and-top-links/2024/june-2024: press-and-top-links/2024/june-2024.md
+ press-and-top-links/2024/july-2024: press-and-top-links/2024/july-2024.md
+ press-and-top-links/2024/august-2024: press-and-top-links/2024/august-2024.md
+ press-and-top-links/2024/september-2024: press-and-top-links/2024/september-2024.md
+ press-and-top-links/2024/october-2024: press-and-top-links/2024/october-2024.md
+ press-and-top-links/2024/november-2024: press-and-top-links/2024/november-2024.md
+ press-and-top-links/2024/december-2024: press-and-top-links/2024/december-2024.md
+
+ # 2025 press-and-top-links redirects
+ press-and-top-links/2025/january-2025: press-and-top-links/2025/january-2025.md
+ press-and-top-links/2025/february-2025: press-and-top-links/2025/february-2025.md
+ press-and-top-links/2025/march-2025: press-and-top-links/2025/march-2025.md
+ press-and-top-links/2025/april-2025: press-and-top-links/2025/april-2025.md
+ press-and-top-links/2025/may-2025: press-and-top-links/2025/may-2025.md
+ press-and-top-links/2025/june-2025: press-and-top-links/2025/june-2025.md
+ press-and-top-links/2025/july-2025: press-and-top-links/2025/july-2025.md
+ press-and-top-links/2025/august-2025: press-and-top-links/2025/august-2025.md
+ press-and-top-links/2025/september-2025: press-and-top-links/2025/september-2025.md
diff --git a/docs/press-and-reports/.gitbook/assets/theses.svg b/docs/press-and-reports/.gitbook/assets/theses.svg
new file mode 100644
index 0000000000..779857b113
--- /dev/null
+++ b/docs/press-and-reports/.gitbook/assets/theses.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/press-and-reports/README.md b/docs/press-and-reports/README.md
new file mode 100644
index 0000000000..d057fa03ee
--- /dev/null
+++ b/docs/press-and-reports/README.md
@@ -0,0 +1,26 @@
+---
+description: >-
+ This list will be updated monthly and capture notable investor theses or
+ industry commentary on Stacks and the Bitcoin ecosystem.
+cover: .gitbook/assets/theses.svg
+coverY: 0
+---
+
+# Bitcoin Theses
+
+| Title | Outlet / Author | Date |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ------------: |
+| [TradFi Tomorrow: DeFi and the Rise of Extensible Finance](https://www.paradigm.xyz/2025/03/tradfi-tomorrow-defi-and-the-rise-of-extensible-finance) | Paradigm | March 2025 |
+| 💭 [It's time to make your It’s time to make your BTC productive again](https://medium.com/@aspendigitalAMP/its-time-to-make-your-btc-productive-again-7532ea788a32) | Aspen Digital | March 2025 |
+| 💭 [The Bitcoin Renaissance: Unlocking Trillions in Value](https://www.forbes.com/sites/leeorshimron/2024/08/13/the-bitcoin-renaissance-unlocking-trillions-in-value/) | Leeor Shimron, Forbes | August 2024 |
+| 💭 [My journey with the Blockchain Ecosystem and why do I like Stacks?](https://www.linkedin.com/pulse/my-journey-blockchain-ecosystem-why-do-i-like-stacks-ali-farid-khwaja-wkybf?ref=stacksblog) | Ali Farid Khwaja | July 2024 |
+| 🖋️ [Bitcoin and Future Infracon Highlights](https://arkstreamcapital.medium.com/arkstream-capital-bitcoin-and-future-infracon-highlights-b9b3ac4777cd) | Arkstream Capital | June 2024 |
+| 📊 [The Build on Bitcoin Era is Here](https://mythofmoney.substack.com/p/build-on-bitcoin-era-is-here) | Myth of Money | February 2024 |
+| 📊 [2024 Bitcoin Halving: This Time It's Different](https://www.grayscale.com/research/reports/2024-halving-this-time-its-actually-different) | Grayscale | February 2024 |
+| 🌱 [The Year Ahead](https://panteracapital.com/blockchain-letter/the-year-ahead-2024/) | Pantera | January 2024 |
+| 🌱 [State of Bitcoin Q4 2023](https://messari.io/report/state-of-bitcoin-q4-2023) | Messari | January 2024 |
+| 🖋️ [Notable Moments for Bitcoin in 2024](https://trustmachines.co/blog/notable-moments-for-bitcoin-in-2024/?ref=stacksblog) | Trust Machines | January 2024 |
+| 📙 [Bitcoin Layers: Tapestry of a Trustless Financial Era](https://bitcoinlayersreport.com/) | Spartan Group | December 2023 |
+| 🧪 [A Technical History of Blockchain Design, Innovation, and Narratives](https://foundationcapital.com/a-technical-history-of-blockchain-design-innovation-and-narratives-part-i/) | Foundation Capital | December 2023 |
+| 📊 [2024 Crypto Market Outlook](https://www.coinbase.com/nl/institutional/research-insights/research/market-intelligence/2024-crypto-market-outlook) | Coinbase | December 2023 |
+| 👀 [STX Thesis Update](https://medium.com/@halp1120/stx-thesis-update-cd09b7f2cce8) | Hal Press | December 2023 |
diff --git a/docs/press-and-reports/SUMMARY.md b/docs/press-and-reports/SUMMARY.md
new file mode 100644
index 0000000000..d80ddfa89b
--- /dev/null
+++ b/docs/press-and-reports/SUMMARY.md
@@ -0,0 +1,32 @@
+# Table of contents
+
+## Bitcoin Theses & Reports
+
+* [Bitcoin Theses](README.md)
+* [Bitcoin Reports](bitcoin-theses-and-reports/bitcoin-reports.md)
+
+## Press & Top Links
+
+* [2024](press-and-top-links/2024/README.md)
+ * [January 2024](press-and-top-links/2024/january-2024.md)
+ * [February 2024](press-and-top-links/2024/february-2024.md)
+ * [March 2024](press-and-top-links/2024/march-2024.md)
+ * [April 2024](press-and-top-links/2024/april-2024.md)
+ * [May 2024](press-and-top-links/2024/may-2024.md)
+ * [June 2024](press-and-top-links/2024/june-2024.md)
+ * [July 2024](press-and-top-links/2024/july-2024.md)
+ * [August 2024](press-and-top-links/2024/august-2024.md)
+ * [September 2024](press-and-top-links/2024/september-2024.md)
+ * [October 2024](press-and-top-links/2024/october-2024.md)
+ * [November 2024](press-and-top-links/2024/november-2024.md)
+ * [December 2024](press-and-top-links/2024/december-2024.md)
+* [2025](press-and-top-links/2025/README.md)
+ * [January 2025](press-and-top-links/2025/january-2025.md)
+ * [February 2025](press-and-top-links/2025/february-2025.md)
+ * [March 2025](press-and-top-links/2025/march-2025.md)
+ * [April 2025](press-and-top-links/2025/april-2025.md)
+ * [May 2025](press-and-top-links/2025/may-2025.md)
+ * [June 2025](press-and-top-links/2025/june-2025.md)
+ * [July 2025](press-and-top-links/2025/july-2025.md)
+ * [August 2025](press-and-top-links/2025/august-2025.md)
+ * [September 2025](press-and-top-links/2025/september-2025.md)
diff --git a/docs/press-and-reports/bitcoin-theses-and-reports/bitcoin-reports.md b/docs/press-and-reports/bitcoin-theses-and-reports/bitcoin-reports.md
new file mode 100644
index 0000000000..83f5cb18cf
--- /dev/null
+++ b/docs/press-and-reports/bitcoin-theses-and-reports/bitcoin-reports.md
@@ -0,0 +1,31 @@
+---
+description: >-
+ This list will be updated monthly and capture notable investor theses or
+ industry commentary on Stacks and the Bitcoin ecosystem.
+---
+
+# Bitcoin Reports
+
+| Title | Outlet / Author | Date |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------- |
+| 🧪 [Unlocking Bitcoin \[Presentation\]: The Bitcoin Tipping Point](https://syphercapital.substack.com/p/unlocking-bitcoin-presentation-the) | Sypher Capital | March 2025 |
+| 📊 [State of Crypto: 2025 Market Outlet](https://www.globalxetfs.com.au/state-of-crypto-2025-market-outlook/) | Global X | February 2025 |
+| 🟧 [Stacks Q4 2024 Brief](https://messari.io/report/stacks-q4-2024-brief) | Messari | February 2025 |
+| 📈 [Top 'Made in USA' Coins by MarketCap](https://x.com/Stacks/status/1881640502149390473?utm_source=stackssnacks.com\&utm_medium=newsletter\&utm_campaign=stacks-thrives-amid-regulatory-changes-stacking-dao-unveils-sbtc-product&_bhlid=42f17e5c11b1222a7ddd2cf3de42eb1c121496bc) | CoinGecko | January 2025 |
+| 📙 [GTM in Asia Report: The Driving Force Behind Crypto Market Growth](https://www.theblock.co/post/333733/foresight-ventures-and-primitive-ventures-unveil-game-changing-apac-crypto-go-to-market-insights) | Primitive Ventures | January 2025 |
+| 📈 [Top 10 Digital Assets Market Predictions](https://x.com/AspenDigitalAMP/status/1877289981166731741) | Aspen Digital | January 2025 |
+| 📙 [State of Tokenized BTC: A $1 Trillion Opportunity](https://app.gitbook.com/s/H74xqoobupBWwBsVMJhK/sbtc/sbtc-operations/deposit) | Bitcoin Builders Association | December 2024 |
+| 🟧 [Our Thesis on Stacks](https://candidcontemplation.substack.com/p/our-thesis-on-stx) | Portal Ventures | December 2024 |
+| 📊 [Scaling Bitcoin](https://www.gsr.io/reports/scaling-bitcoin/) | GSR | November 2024 |
+| 📊 [Bitcoin L2s: A Modular Future](https://www.galaxy.com/insights/research/bitcoin-layer-2-modular-future/) | Galaxy Digital | November 2024 |
+| 📊 [Crypto Sectors in Q4 2024](https://www.grayscale.com/research/market-commentary/grayscale-research-insights-crypto-sectors-in-q4-2024) | Grayscale | September 2024 |
+| 📈 [Stacks August 2024 Snapshot](https://x.com/signal21btc/status/1833117479024963728) | Signal21 | August 2024 |
+| 🟧 [Building Block: Stacks](https://www.grayscale.com/research/reports/building-block-stacks?ref=stacksblog) | Grayscale | August 2024 |
+| 📙 [Bitcoin Layer 2 Ecosystems](https://unhashed.aarna.ai/p/bitcoin-layer2-ecosystems?ref=stacksblog) | Alpha Unhashed | June 2024 |
+| 📙 [Stacks Snapshot June 2024](https://app.signal21.io/reports/stacks-snapshot-june-2024) | Signal21 | June 2024 |
+| 🧪 [The Future of Bitcoin #3: Scaling Bitcoin](https://www.binance.com/en/research/analysis/the-future-of-bitcoin-3-scaling-bitcoin?ref=stacksblog) | Binance Research | May 2024 |
+| 🟧 [Q4 2023: No Denying Demand For Bitcoin L2s](https://newsletters.stacks.org/p/q4-2023) | Stacks Foundation | January 2024 |
+| 📊 [Stacks established developers up 51%](https://flight.beehiiv.net/v2/clicks/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJodHRwczovL3R3aXR0ZXIuY29tL0tlblRoZVJvZ2Vycy9zdGF0dXMvMTc0ODA2MDU5OTcwMjE5MjYyNj9zPTIwJnJlZj1zdGFja3NibG9nJnV0bV9zb3VyY2U9c3RhY2tzc25hY2tzLmNvbSZ1dG1fbWVkaXVtPXJlZmVycmFsJnV0bV9jYW1wYWlnbj1kaXNjb3Zlci1zdGFja3MtaW4tc3BhcnRhbi1ncm91cC1iaXRjb2luLWwyLXJlcG9ydC1lbGVjdHJpYy1jYXBpdGFsLWRldmVsb3Blci1yZXBvcnQiLCJwb3N0X2lkIjoiZTdmYWFkODEtZmI3Ni00MjBmLTk3YWItNGJjMjdmM2RiYjdiIiwicHVibGljYXRpb25faWQiOiIzY2ZhYmZjYy0xNDU5LTQ0NTAtODI3MC1iOGJmM2RkMmFiOTciLCJ2aXNpdF90b2tlbiI6ImQxNDQwNWJiLWMxOWEtNDJiYi05NGQxLTY4MmRiNzZkOWQ3ZSIsImlhdCI6MTcwODA5NzQyMSwiaXNzIjoib3JjaGlkIn0.t0UBYmIXoMyGWCemN_n36kslOn35rIcv2v7LQR3nMLs) | Electric Capital | January 2024 |
+| 📙 [Binance Research: Top 10 Narratives to Follow in 2024](https://public.bnbstatic.com/static/files/research/top-10-narratives.pdf) | Binance Research | December 2023 |
+| 📙 [Bitcoin Layers Report: Tapestry of a Trustless Financial Era](https://bitcoinlayersreport.com/) | Spartan Group | December 2023 |
+
diff --git a/docs/press-and-reports/press-and-top-links/2024/README.md b/docs/press-and-reports/press-and-top-links/2024/README.md
new file mode 100644
index 0000000000..c3aad38838
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/README.md
@@ -0,0 +1,57 @@
+---
+description: >-
+ This page indexes top stories, press, and reports related to Stacks on a
+ monthly basis.
+---
+
+# 2024
+
+For weekly stories delivered to your inbox, subscribe to [Stacks Snacks](https://stackssnacks.com/). For quarterly ecosystem recaps, subscribe to the [Stacks Foundation newsletter](https://newsletters.stacks.org/).
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
+
+{% content-ref url="broken-reference" %}
+[Broken link](broken-reference)
+{% endcontent-ref %}
diff --git a/docs/press-and-reports/press-and-top-links/2024/april-2024.md b/docs/press-and-reports/press-and-top-links/2024/april-2024.md
new file mode 100644
index 0000000000..345d3349e1
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/april-2024.md
@@ -0,0 +1,20 @@
+# April 2024
+
+| Title | Outlet/Author |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
+| 👀 [Disruptor To Disruptee: Bitcoin Institutionalization Needs L2 Shakeup](https://www.forbes.com/sites/nimrodlehavi/2024/04/11/disruptor-to-disruptee-bitcoin-institutionalization-needs-l2-shakeup/?sh=1745f76c629b) | Forbes |
+| 🟪 [Q\&A: What will the Bitcoin halving mean for Bitcoin L2s?](https://blockworks.co/news/bitcoin-halving-layer-2-impact-stacks) | Blockworks |
+| [Bitcoin Layer 2 Stacks Prepares for Nakamoto Upgrade, its Largest Hard-Fork Ever](https://thedefiant.io/news/blockchains/bitcoin-layer-2-stacks-prepares-for-nakamoto-upgrade-its-largest-hard-fork-ever) | The Defiant |
+| 🟧 [Stacks, Bitcoin Layers, and the Nakamoto Upgrade: Here’s What’s Going On](https://decrypt.co/225801/stacks-stx-nakamoto-upgrade-bitvm-rollups-defi) | Decrypt |
+| 📈 [BTCFi is an ‘enormous opportunity’ to make Bitcoin a productive asset — Stacks](https://cointelegraph.com/news/btcfi-opportunity-make-bitcoin-productive-asset) | Cointelegraph |
+| ₿ [‘Real opportunity’ for Bitcoin Runes will come after first wave of investor hype](https://cointelegraph.com/news/real-opportunity-bitcoin-runes-after-first-wave-investor-hype) | Cointelegraph |
+| 🟧 [OG Bitcoin L2 Stacks Is Getting a Major Overhaul](https://www.coindesk.com/tech/2024/04/16/og-bitcoin-l2-stacks-is-getting-a-major-overhaul/) | Coindesk |
+| 📻 [Bitcoin L2 with Muneeb Ali of Stacks and Andy Fajar Handika of Loka Mining](https://www.charlieshrem.com/bitcoin-l2-with-muneeb-ali-of-stacks-and-andy-fajar-handika-of-loka-mining/) | Charlie Shrem Show |
+| 📧 [April 15th Newsletter](https://milkroad.com/daily/what-happened-to-prices-this-weekend/?ref=stacksblog) | Milroad |
+| 🗞️ [TEAMZ Web3/AI Summit2024 Day 1 has ended successfully!](https://prtimes.jp/main/html/rd/p/000000143.000031083.html?ref=stacksblog) | PR Times (Japan) |
+| 👀 [The Bitcoin Halving's Degen Bets](https://www.bankless.com/the-bitcoin-halvings-degen-bets) | Bankless |
+| 🌱 [Top 5 Pioneering Bitcoin Projects Poised For Growth Post-2024 Halving](https://cryptodaily.co.uk/2024/04/top-5-pioneering-bitcoin-projects-poised-for-growth-post-2024-halving) | Crypto Daily UK |
+| 💰 [Spartan Capital leads $10 million strategic funding round for Bitcoin DeFi developer ALEX](https://www.theblock.co/post/284556/spartan-capital-leads-10-million-funding-round-for-bitcoin-defi-developer-alex) | The Block |
+| ₿ [‘Bitcoin has as many functionalities as other blockchains’: Trust Machines member weighs in Bitcoin DeFi](https://cryptobriefing.com/bitcoin-functionality-other-blockchains/?ref=stacksblog) | Crypto Briefing |
+| 🗞️ [A Look into The Upcoming Bitcoin Halving & Bitcoin Layer 2s](https://figment.io/insights/a-look-into-the-upcoming-bitcoin-halving-bitcoin-layer-2s/?ref=stacksblog) | Figment |
+| 📕 [Bitcoin could gain new smart-contract superpowers](https://links.coinbase.com/e/evib?_t=3aca56371967418192255878e9689713&_m=fde47e8c40c24182b7cab3a6b10c9d3a&_e=DT1gXnNeiWLsEoKsYDSIAUCWVJr21XSvYbLTlg_uJ63W2CLdvG0Q8MPxsoVG5vCKM9SLV_5n-owzOqH_yPS9iQ%3D%3D\&utm_source=stackssnacks.com\&utm_medium=referral\&utm_campaign=stacks-apps-celebrate-all-time-tvl-high-as-new-defi-protocols-emerge) with the Lightning Network and Stacks. | Coinbase Bytes |
diff --git a/docs/press-and-reports/press-and-top-links/2024/august-2024.md b/docs/press-and-reports/press-and-top-links/2024/august-2024.md
new file mode 100644
index 0000000000..4e40c6dfe7
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/august-2024.md
@@ -0,0 +1,20 @@
+# August 2024
+
+| Title | Outlet/Author |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- |
+| 🧩 [Deploy Stacks nodes on AWS with the AWS Blockchain Node Runners](https://aws.amazon.com/blogs/database/how-to-deploy-stacks-blockchain-nodes-on-aws-with-the-aws-blockchain-node-runners-stacks-blueprint/?ref=stacksblog) | Amazon Web Services |
+| 🗞️ [Bitflow and Leather Wallet Join Forces to Simplify Bitcoin L2 Asset Swaps](https://hackernoon.com/bitflow-and-leather-wallet-join-forces-to-simplify-bitcoin-l2-asset-swaps) | Hackernoon |
+| 🤝 [Aptos and Stacks Forge New Partnership for Bitcoin Innovation](https://www.altcoinbuzz.io/cryptocurrency-news/aptos-and-stacks-forge-new-partnership-for-bitcoin-innovation/) | Altcoin Buzz |
+| 🖊 [Millions of Dollars Worth of BTC Earned by New Institutional Signers Since Nakamoto Instantiation](https://stacks.org/institutional-signers-earn-millions) | Stacks Foundation |
+| 💲[Liquidium Raises $2.5M, Accelerating L1 Borrowing and Lending](https://subscribe.bitcoinbuildersassociation.com/p/liquidium-raises-25m-accelerating?ref=stacksblog) | Bitcoin Builders Association |
+| 🧡[Bitcoin Network Stacks Begins Rollout of Speed-Boosting Nakamoto Upgrade](https://decrypt.co/246543/bitcoin-stacks-rollout-speed-boosting-nakamoto-upgrade) | Decrypt |
+| 📙[Bitcoin Network Stacks Devs 'Can See the Finish Line' With Nakamoto Upgrade](https://decrypt.co/247247/bitcoin-network-stacks-devs-see-finish-line-nakamoto-upgrade) | Decrypt |
+| 📙[Stacks co-creator on how the Nakamoto upgrade will drive a $70bn market for Bitcoin DeFi](https://www.dlnews.com/articles/defi/stacks-nakamoto-upgrade-brings-bitcoin-defi-with-sbtc-token/?utm_source=telegram\&utm_medium=organic_social\&utm_campaign=) | DL News |
+| 🗞️[Bitcoin Layer-2 Network Stacks Begins Nakamoto Upgrade](https://www.coindesk.com/tech/2024/08/28/bitcoin-layer-2-network-stacks-begins-nakamoto-upgrade/amp/) | Coindesk |
+| 🗞️[Bitcoin Layer 2 Stacks readies for Nakamoto upgrade activation](https://crypto.news/bitcoin-layer-2-stacks-readies-for-nakamoto-upgrade-activation/) | Crypto News |
+| [Stacks (STX) prepares for Nakamoto upgrade: here’s what to expect](https://coinjournal.net/news/stacks-stx-prepares-for-nakamoto-upgrade-heres-what-to-expect/) 🗞️ | Coin Journal |
+| 🗞️[Stacks (STX) poised for recovery as game-changer Nakamoto upgrade approaches](https://invezz.com/news/2024/08/26/stacks-stx-poised-for-recovery-as-game-changer-nakamoto-upgrade-approaches/) | Invezz |
+| 🗞️[Bitcoin Layer-2 Stacks Set to Receive Its Nakamoto Upgrade, Will Enhance DeFi on Bitcoin](https://www.livebitcoinnews.com/bitcoin-layer-2-stacks-set-to-receive-its-nakamoto-upgrade-will-enhance-defi-on-bitcoin/) | Live Bitcoin News |
+| 🗞️[Nakamoto Activation Begins: Leading L2 Stacks Sets the Stage for a Bitcoin-Led Future](https://markets.businessinsider.com/news/currencies/nakamoto-activation-begins-leading-l2-stacks-sets-the-stage-for-a-bitcoin-led-future-1033729689) | Markets Insider |
+| 🧡 [Bitcoin L2s Are Eating the World](https://hackernoon.com/bitcoin-l2s-are-eating-the-world) | Hackernoon |
+| 💰 [The Bitcoin Renaissance: Unlocking Trillions in Value](https://www.forbes.com/sites/leeorshimron/2024/08/13/the-bitcoin-renaissance-unlocking-trillions-in-value/?ref=stacksblog) | Forbes |
diff --git a/docs/press-and-reports/press-and-top-links/2024/december-2024.md b/docs/press-and-reports/press-and-top-links/2024/december-2024.md
new file mode 100644
index 0000000000..cfd6bdf387
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/december-2024.md
@@ -0,0 +1,20 @@
+# December 2024
+
+| Article | Outlet / Author |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- |
+| 🧡 [Portal Ventures, the Leading Pre-seed VC Firm and the First to Call the Bitcoin Thesis, to Back sBTC](https://www.theblock.co/post/329292/portal-ventures-the-leading-pre-seed-vc-firm-and-the-first-to-call-the-bitcoin-thesis-to-back-sbtc?ref=stacksblog) | The Block |
+| 🧡 [LearnWeb3, the Largest Educational Platform for Web3, Set to Onboard New Wave of sBTC Developers](https://www.theblock.co/post/330037/learnweb3-the-largest-educational-platform-for-web3-set-to-onboard-new-wave-of-sbtc-developers) | The Block |
+| 🧡 [Xverse, Leading Bitcoin Ecosystem Wallet, Adopts sBTC as Preferred Scaling Solution for the Bitcoin Economy](https://www.theblock.co/post/330649/xverse-leading-bitcoin-ecosystem-wallet-adopts-sbtc-as-preferred-scaling-solution-for-the-bitcoin-economy) | The Block |
+| 🧡 [Hex Trust Expands Collaboration with Stacks Asia Foundation to Bolster sBTC Adoption](https://blockchainreporter.net/hex-trust-expands-collaboration-with-stacks-asia-foundation-to-bolster-sbtc-adoption/) | Blockchain Reporter |
+| 🧡 [Fordefi, the First MPC Wallet to Fully Support Bitcoin DeFi, Joins Cohort of sBTC Backers](https://www.theblock.co/post/331016/fordefi-the-first-mpc-wallet-to-fully-support-bitcoin-defi-joins-cohort-of-sbtc-backers) | The Block |
+| 🧡 [Travala, The #1 Bitcoin and Crypto Travel Booking Portal, Announces Support for sBTC and STX](https://www.theblock.co/post/331020/travala-the-1-bitcoin-and-crypto-travel-booking-portal-announces-support-for-sbtc-and-stx) | The Block |
+| 🚀 [Double-dipping with sBTC on Stacks](https://blockworks.co/news/stacks-sbtc-double-dipping) | Blockworks |
+| 🚀 [Bitcoin Gets DeFi Upgrade: Stacks Launches Bitcoin-Backed sBTC for Smart Contracts](https://hackernoon.com/bitcoin-gets-defi-upgrade-stacks-launches-bitcoin-backed-sbtc-for-smart-contracts) | Hackernoon |
+| 🚀 [sBTC Launches on Stacks Mainnet, Bringing Bitcoin DeFi to Life](https://beincrypto.com/sbtc-launches-on-stacks-mainnet/) | BeInCrypto |
+| 🚀 [sBTC Launches on Stacks Mainnet With Deposit-Only Functionality](https://cryptopotato.com/sbtc-launches-on-stacks-mainnet-with-deposit-only-functionality/?amp) | Crypto Potato |
+| 🚀 [Stacks Launches sBTC on Mainnet with 1,000 BTC Cap, Offering 5% Yield and Up to 60% APY Staking](https://thedefiant.io/news/blockchains/stacks-launches-sbtc-on-mainnet-1000-btc-cap-offering-5-yield-up-to-60-apy-b70deae1) | The Defiant |
+| 🚀 [sBTC Kicks Off on Stacks Mainnet: Details](https://u.today/sbtc-kicks-off-on-stacks-mainnet-details) | Crypto Economy |
+| 🟧 [Bitcoin's Memecoin-Like 'Runes' Get a Boost With AMM Launch on Stacks](https://www.coindesk.com/tech/2024/12/18/bitcoins-memecoin-like-runes-get-a-boost-with-amm-launch-on-stacks) | Coindesk |
+| 🧡 [Ankr, the #1 Provider of Bitcoin-Secured, Physical Infrastructure, Becomes Signer for Stacks as sBTC Launches](https://www.theblock.co/post/331411/ankr-the-1-provider-of-bitcoin-secured-physical-infrastructure-becomes-signer-for-stacks-as-sbtc-launches) | The Block |
+| 📙 [New Report Finds Tokenized BTC Landscape Worth $1T (18 Dec)](https://coinmarketcap.com/community/articles/6762f62b09984e48933a1ec1/) | CoinMarketCap |
+| 📙 [New Report Finds Tokenized BTC Landscape Worth $1T (18 Dec)](https://www.binance.com/en/square/post/17739664161346) | Binance |
diff --git a/docs/press-and-reports/press-and-top-links/2024/february-2024.md b/docs/press-and-reports/press-and-top-links/2024/february-2024.md
new file mode 100644
index 0000000000..a2a259bca6
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/february-2024.md
@@ -0,0 +1,33 @@
+# February 2024
+
+_For weekly stories delivered to your inbox, subscribe to_ [Stacks Snacks](https://stackssnacks.com/). _For quarterly ecosystem recaps, subscribe to the_ [Stacks Foundation newsletter](https://newsletters.stacks.org/).
+
+
+
+📊 Messari's Q4 2023 'State of Stacks' Report
+
+[https://messari.io/report/state-of-stacks-q4-2023](https://messari.io/report/state-of-stacks-q4-2023)
+
+**Key Insights**
+
+* **Stacks revenue (USD) increased 3,386% QoQ and 3,028% YoY to $637,000.** Much of this revenue was driven by inscription protocol STX20.
+* **STX’s market cap increased 203% QoQ and 598% YoY to $2.0 billion.** STX’s growth outpaced BTC and the overall crypto market.
+* **DeFi TVL (USD) increased 363% QoQ and 763% YoY to $61 million.** ALEX firmly remained the leader in TVL, but Arkadiko and StackingDAO considerably increased their own TVL dominance in Q3 and Q4.
+* **Average daily miner revenue increased 1,015% YoY to $78,000.** STX’s price increase and Stacks’ increased revenue made it significantly more profitable for Bitcoin miners to participate in Stacks’ consensus.
+* **The Nakamoto upgrade is expected in April 2024.** This update will enable faster blocks, give transactions 100% Bitcoin finality, reduce MEV, and eliminate forking on the Stacks layer to set the stage for the upcoming sBTC release.
+
+
+
+| Title | Outlet/Author |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- |
+| 🌱 [The Year Ahead](https://panteracapital.com/blockchain-letter/the-year-ahead-2024/) | Pantera Blockchain Letter |
+| 📊 [Q1 2024 Bitcoin ecosystem map](https://flight.beehiiv.net/v2/clicks/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJodHRwczovL3R3aXR0ZXIuY29tL3NvcmFfdmVudHVyZXMvc3RhdHVzLzE3NTQ2ODc4ODg3NTgwODM5MjI_dXRtX3NvdXJjZT1zdGFja3NzbmFja3MuY29tJnV0bV9tZWRpdW09cmVmZXJyYWwmdXRtX2NhbXBhaWduPWFsZXgtZ292ZXJuYW5jZS1wcm9wb3NhbC1mb3IteGxuay1zdGFja2luZy1kYW8taGl0cy0zNW0taW4tdHZsIiwicG9zdF9pZCI6IjQ1NTY3YzAzLWFkZDUtNGQzNi1iZGM2LTk4Y2YwYzkyMDA5YyIsInB1YmxpY2F0aW9uX2lkIjoiM2NmYWJmY2MtMTQ1OS00NDUwLTgyNzAtYjhiZjNkZDJhYjk3IiwidmlzaXRfdG9rZW4iOiJkMTQ0MDViYi1jMTlhLTQyYmItOTRkMS02ODJkYjc2ZDlkN2UiLCJpYXQiOjE3MDgwOTcxMjksImlzcyI6Im9yY2hpZCJ9.Ga_H469MIGKuovy5WVHfd3Fit9x6IiqAr0qhNCW575E) | Sora Ventures |
+| 🪴 [Peak Total Value Locked (TVL) and Rising Developer Engagement on Stacks](https://twitter.com/HouseofChimera/status/1757792122692911207?ref=stacksblog) | House of Chimera |
+| 📊 [40% of Bitcoin developers are working on Bitcoin L2s](https://twitter.com/MohamedFFouda/status/1752407779640295480?s=20\&utm_source=stackssnacks.com\&utm_medium=referral\&utm_campaign=nakamoto-release-launch-date-velar-raises-3-5m-in-funding-round) | Mohamed Fouda |
+| 📈 [Bitcoin is 25% below its record high -- but Layer 2 Stacks is even closer](https://blockworks.co/news/layer-2-stacks-approaching-bitcoin?ref=stacksblog) | Blockworks |
+| 👛 Stacks L2 DeFi protocol [Velar raises $3.5M](https://flight.beehiiv.net/v2/clicks/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJodHRwczovL3d3dy5jb2luZGVzay5jb20vYnVzaW5lc3MvMjAyNC8wMi8wMS9jcnlwdG8tc3RhcnR1cC12ZWxhci1wbGFucy1wZXJwZXR1YWwtc3dhcHMtZXhjaGFuZ2UtZm9yLWJpdGNvaW4tZGVmaS1hZnRlci1yYWlzaW5nLTMtNW0vPXR1dG1fc291cmNlPXN0YWNrc3NuYWNrcy5jb20mdXRtX21lZGl1bT1yZWZlcnJhbCZ1dG1fY2FtcGFpZ249bmFrYW1vdG8tcmVsZWFzZS1sYXVuY2gtZGF0ZS12ZWxhci1yYWlzZXMtMy01bS1pbi1mdW5kaW5nLXJvdW5kIiwicG9zdF9pZCI6ImYxODVmMmM4LTM0ZTQtNDM0My1hMWFkLTM4YmRlODAyYzY0OCIsInB1YmxpY2F0aW9uX2lkIjoiM2NmYWJmY2MtMTQ1OS00NDUwLTgyNzAtYjhiZjNkZDJhYjk3IiwidmlzaXRfdG9rZW4iOiJkMTQ0MDViYi1jMTlhLTQyYmItOTRkMS02ODJkYjc2ZDlkN2UiLCJpYXQiOjE3MDgwOTcyNDUsImlzcyI6Im9yY2hpZCJ9.FjGMmkbPat9qWNoUR5SJsfnwDWqfUQutXW-ScvveCjc) | Coindesk |
+| 📊 Report: [Stacks could present a $90 Billion opportunity](https://flight.beehiiv.net/v2/clicks/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJodHRwczovL3R3aXR0ZXIuY29tL1RhbmdDaGFuMHgvc3RhdHVzLzE3NTM0MTcyNDMxMzUwMTMwMTA_dD05N19DMkItaTJqZi11OGgwZEpWV2NBJnM9MzMmdXRtX3NvdXJjZT1zdGFja3NzbmFja3MuY29tJnV0bV9tZWRpdW09cmVmZXJyYWwmdXRtX2NhbXBhaWduPW5ha2Ftb3RvLXJlbGVhc2UtbGF1bmNoLWRhdGUtdmVsYXItcmFpc2VzLTMtNW0taW4tZnVuZGluZy1yb3VuZCIsInBvc3RfaWQiOiJmMTg1ZjJjOC0zNGU0LTQzNDMtYTFhZC0zOGJkZTgwMmM2NDgiLCJwdWJsaWNhdGlvbl9pZCI6IjNjZmFiZmNjLTE0NTktNDQ1MC04MjcwLWI4YmYzZGQyYWI5NyIsInZpc2l0X3Rva2VuIjoiZDE0NDA1YmItYzE5YS00MmJiLTk0ZDEtNjgyZGI3NmQ5ZDdlIiwiaWF0IjoxNzA4MDk3MjQ1LCJpc3MiOiJvcmNoaWQifQ.dons_3VaS_GyWvr5OZs-StFlDP-PX2ToMqIVB9pGVCQ) | Tang Chan |
+| 📊 [ABCDE 2024 BTC Recap](https://flight.beehiiv.net/v2/clicks/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJodHRwczovL3R3aXR0ZXIuY29tL0FCQ0RFTGFicy9zdGF0dXMvMTc0MDYyNzc3NTg2MDcyNzkxOT90PUo1ODlrWGtMNGlOblFJRXZyRW55TXcmcz0zMyZ1dG1fc291cmNlPXN0YWNrc3NuYWNrcy5jb20mdXRtX21lZGl1bT1yZWZlcnJhbCZ1dG1fY2FtcGFpZ249bmFrYW1vdG8tcmVsZWFzZS1sYXVuY2gtZGF0ZS12ZWxhci1yYWlzZXMtMy01bS1pbi1mdW5kaW5nLXJvdW5kIiwicG9zdF9pZCI6ImYxODVmMmM4LTM0ZTQtNDM0My1hMWFkLTM4YmRlODAyYzY0OCIsInB1YmxpY2F0aW9uX2lkIjoiM2NmYWJmY2MtMTQ1OS00NDUwLTgyNzAtYjhiZjNkZDJhYjk3IiwidmlzaXRfdG9rZW4iOiJkMTQ0MDViYi1jMTlhLTQyYmItOTRkMS02ODJkYjc2ZDlkN2UiLCJpYXQiOjE3MDgwOTcyNDUsImlzcyI6Im9yY2hpZCJ9.qhu0w9pHUMhY5ASnL74i7ixBbVw7LRrF3MJGJDbcoAs) | ABCDE Labs |
+| 👀 [2024 Halving: This Time It’s Actually Different](https://www.grayscale.com/research/reports/2024-halving-this-time-its-actually-different?ref=stacksblog) | Grayscale |
+| 📈 [While everyone theorizes about when $BTC will make new highs, $STX...](https://x.com/cburniske/status/1757951005654978872?t=_cLI0sby6lmp9V1Yj6-6kQ\&s=33\&ref=stacksblog) | Chris Burniske |
+| [What Are Bitcoin Layer 2 Networks?](https://academy.binance.com/en/articles/what-are-bitcoin-layer-2-networks?viastacksblog\&ref=stacksblog) | Binance Academy |
diff --git a/docs/press-and-reports/press-and-top-links/2024/january-2024.md b/docs/press-and-reports/press-and-top-links/2024/january-2024.md
new file mode 100644
index 0000000000..773d8ffad9
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/january-2024.md
@@ -0,0 +1,15 @@
+# January 2024
+
+For weekly stories delivered to your inbox, subscribe to [Stacks Snacks](https://stackssnacks.com/). For quarterly ecosystem recaps, subscribe to the [Stacks Foundation newsletter](https://newsletters.stacks.org/).
+
+
+
+📙 Bitcoin Layers Report by Spartan Group
+
+**Tapestry of a Trustless Financial Era**
+
+Diving deep into the layers of Bitcoin's blossoming ecosystem, the first edition of the Bitcoin Layers Report unveils the emerging reality of a financial world where trust is embedded in technology rather than institutions. As Bitcoin evolves beyond a Store of Value, we stand on the cusp of a revolution in trustless finance and a new era of economic possibilities. [https://bitcoinlayersreport.com/](https://bitcoinlayersreport.com/)
+
+
+
+
diff --git a/docs/press-and-reports/press-and-top-links/2024/july-2024.md b/docs/press-and-reports/press-and-top-links/2024/july-2024.md
new file mode 100644
index 0000000000..9738d92a0d
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/july-2024.md
@@ -0,0 +1,21 @@
+---
+description: >-
+ Bitcoin Summer continued in July: BitGo stepped up to join the Stacks signer
+ network, Stacks teams Bitflow and Hermetica landed their own media and
+ builders everywhere convened in Nashville.
+---
+
+# July 2024
+
+| Title | Outlet / Author |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- |
+| 📈 [All Time High in Monthly Active Accounts for Stacks](https://app.signal21.io/stacks?utm_source=stackssnacks.com\&utm_medium=referral\&utm_campaign=all-time-high-in-monthly-active-accounts-for-stacks) | Signal21 |
+| 💎 [Bitflow Unveils Liquidity Hub Upgrade, Enabling Functionality Like Ethereum DeFi](https://blockchainreporter.net/bitflow-unveils-liquidity-hub-upgrade-enabling-functionality-like-ethereum-defi/) | Blockchain Reporter |
+| 💎 [Bitflow’s Liquidity Hub Elevates Bitcoin DeFi to Ethereum DeFi Ecosystem Standard](https://coinmarketcap.com/community/articles/667c6188dd97c85264ba1fc1/) | CoinMarketCap |
+| [Hermetica's Synthetic Dollar Sparks DeFi Revolution](https://hackernoon.com/hermeticas-synthetic-dollar-sparks-defi-revolution?ref=stacksblog) | Hackernoon |
+| 🛡️ [Hypernative Bolsters Bitcoin L2 Security as Stacks Ecosystem Gets Real-Time Protection](https://hackernoon.com/hypernative-bolsters-bitcoin-l2-security-as-stacks-ecosystem-gets-real-time-protection) | Hackernoon |
+| 🎫 [Bitcoin Builders Conference Set to Spotlight Innovation and the Future of the Bitcoin Economy](https://decrypt.co/239086/bitcoin-builders-conference-set-to-spotlight-innovation-and-the-future-of-the-bitcoin-economy) | Decrypt |
+| 🪙 [Bitcoin Developers Launch BTC-Backed Stablecoin As Rune Token](https://decrypt.co/239925/bitcoin-developers-launch-btc-backed-stablecoin-as-rune-token) | Decrypt |
+| 📰 [BitGo integrates Stacks for Bitcoin rewards, following institutional Bitcoin demand](https://cointelegraph.com/news/bitgo-stacks-bitcoin-rewards-institutional-bitcoin-demand) | CoinTelegraph |
+| 📰 [BitGo Launches Support for Bitcoin L2 Stacks and sBTC](https://cryptopotato.com/bitgo-launches-support-for-bitcoin-l2-stacks-and-sbtc/?amp) | Crypto Potato |
+| 🟧 [Protocol Village: Bitrue Ventures Launches $40M Fund for 'Nascent Web3 Companies'](https://www.coindesk.com/tech/2024/07/17/protocol-village/) | Coindesk |
diff --git a/docs/press-and-reports/press-and-top-links/2024/june-2024.md b/docs/press-and-reports/press-and-top-links/2024/june-2024.md
new file mode 100644
index 0000000000..35069d5129
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/june-2024.md
@@ -0,0 +1,13 @@
+# June 2024
+
+| Title | Outlet/Author |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- |
+| 📊 [Layer-2 Networks Mark The Dawn Of A New Golden Age For Bitcoin](https://www.analyticsinsight.net/cryptocurrency-analytics-insight/layer-2-networks-mark-the-dawn-of-a-new-golden-age-for-bitcoin?ref=stacksblog) | Analytics Insight |
+| 📈 [Stacks Layer 2 for Bitcoin already hosts projects, STX token among top gainers](https://www.cryptopolitan.com/stacks-layer-2-bitcoin-stx-token-top-gainers/?ref=stacksblog) | Cryptopolitan |
+| 📖 [Top Bitcoin Layer 2 Projects & Coins in 2024](https://cryptonews.com/cryptocurrency/bitcoin-layer-2-projects/?ref=stacksblog/) | Cryptonews |
+| 📖 [Layer-2 Networks Mark The Dawn Of A New Golden Age For Bitcoin](https://www.analyticsinsight.net/cryptocurrency-analytics-insight/layer-2-networks-mark-the-dawn-of-a-new-golden-age-for-bitcoin) | Analytics Insight |
+| 🧩 [Haruko Integrates Stacks to Deliver Institutional Asset Management on Bitcoin L2](https://www.financemagnates.com/thought-leadership/haruko-integrates-stacks-to-deliver-institutional-asset-management-on-bitcoin-l2/) | Finance Magnates |
+| 🧩 [Haruko to enhance digital asset management with Stacks integration](https://finbold.com/haruko-to-enhance-digital-asset-management-with-stacks-integration/) | Finbold |
+| 🧩 [Haruko to Streamline Bitcoin Asset Management With Stacks Integration](https://u.today/haruko-to-streamline-bitcoin-asset-management-with-stacks-integration) | U Today |
+| 💲 [Stacking DAO Bi-Weekly Update: $560k in Stacking rewards over two cycles](https://medium.com/@stackingdao/stacking-dao-bi-weekly-update-560k-in-stacking-rewards-over-two-cycles-c012256c1622) | Medium |
+| 🧩 [Kiln: We're thrilled to unveil our latest integration](https://x.com/Kiln_finance/status/1797612820537729354?ref=stacksblog) | Kiln |
diff --git a/docs/press-and-reports/press-and-top-links/2024/march-2024.md b/docs/press-and-reports/press-and-top-links/2024/march-2024.md
new file mode 100644
index 0000000000..c135319f4c
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/march-2024.md
@@ -0,0 +1,9 @@
+# March 2024
+
+* 🔏 [Bitcoin layer-2 Stacks partners with eight companies ahead of its Nakamoto upgrade](https://cryptobriefing.com/stacks-network-expansion-new-signers/) — Crypto Briefing
+* 🤝 [Stacks expands with Blockdaemon, Near Foundation amid Bitcoin surge](https://cointelegraph.com/news/stacks-welcomes-new-signers-blockdaemon-near-foundation-bitcoin-surge) — Cointelegraph
+* 📈 [More Validation for Bitcoin Builders: Industry Leaders to Integrate Stacks, the Leading Bitcoin L2](https://www.benzinga.com/pressreleases/24/03/37487866/more-validation-for-bitcoin-builders-industry-leaders-to-integrate-stacks-the-leading-bitcoin-l2) — Benzinga
+* 💼 [Bitcoin layer-2 Stacks partners with eight companies ahead of its Nakamoto upgrade](https://www.coindesk.com/tech/2024/04/16/og-bitcoin-l2-stacks-is-getting-a-major-overhaul/) — Coindesk
+* 🔏 [Stacks L2 Bolsters Network Security with 8 New Signers](https://www.cryptotimes.io/2024/03/06/stacks-l2-bolsters-network-security-with-8-new-signers/) — The Crypto Times
+* 📈 [Stacks: The Nakamoto Upgrade](https://twitter.com/FTI_DA/status/1771166481880944693?utm_source=stackssnacks.com\&utm_medium=referral\&utm_campaign=franklin-templeton-highlights-the-nakamoto-release-velar-amm-mainnet) — Franklin Templeton
+* 🪴 [Stacks reaches 1,000,000 unique wallets](https://flight.beehiiv.net/v2/clicks/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJodHRwczovL3R3aXR0ZXIuY29tL1N0YWNrcy9zdGF0dXMvMTc2NTg2NTQzOTc2OTMwNTU3MT91dG1fc291cmNlPXN0YWNrc3NuYWNrcy5jb20mdXRtX21lZGl1bT1yZWZlcnJhbCZ1dG1fY2FtcGFpZ249bmFrYW1vdG8tcmVsZWFzZS12b3RpbmctcGVyaW9kLWVuZHMtY2VsZWJyYXRpbmctb25lLW1pbGxpb24tdW5pcXVlLXdhbGxldHMiLCJwb3N0X2lkIjoiYTY0NTBlYTAtY2U4MC00ZjRlLTg0YjMtNjNmNWFhNzRiMTY1IiwicHVibGljYXRpb25faWQiOiIzY2ZhYmZjYy0xNDU5LTQ0NTAtODI3MC1iOGJmM2RkMmFiOTciLCJ2aXNpdF90b2tlbiI6ImRhZTNjOGUxLWVkZTUtNDQxMC1hNWFkLTU3MTc2NmYyMGQ3OSIsImlhdCI6MTcxMzcyNTM5MiwiaXNzIjoib3JjaGlkIn0.allLoCyKRwaGltRK4_zwV80JFbHr6s8SGxr7zPwSZ44) — Signal21
diff --git a/docs/press-and-reports/press-and-top-links/2024/may-2024.md b/docs/press-and-reports/press-and-top-links/2024/may-2024.md
new file mode 100644
index 0000000000..393a1a7ef7
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/may-2024.md
@@ -0,0 +1,20 @@
+# May 2024
+
+| Title | Outlet/Author |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
+| [👀 Stacks active accounts reach record high amid growing interest in Bitcoin DeFi](https://cointelegraph.com/news/bitcoin-defi-surge-stacks-l2-record-users) | Cointelegraph |
+| [🗞️ Newsletter: BTC’s Streak Is Coming To An End](https://milkroad.com/daily/btcs-streak-is-coming-to-an-end-%EF%B8%8F/?ref=stacksblog) | Milkroad |
+| [📕 The Imperative for Bitcoin Layers](https://chorus.one/articles/the-imperative-for-bitcoin-layers-2?ref=stacksblog) | Chorus One |
+| [First Bitcoin-backed synthetic dollar to launch with 25% yield](https://cointelegraph.com/news/hermetica-usdh-bitcoin-backed-synthetic-dollar) | Cointelegraph |
+| [🔗 Stacks, Moonriver, Hedera Network and Iron Fish Join Axelar’s Interchain Amplifier](https://cryptonews.com/news/stacks-hedera-network-and-iron-fish-join-axelar-interchain.htm) | Crypto News |
+| [🔗 Axelar Integrates With Stacks To Bridge Bitcoin Across Over 65 Blockchains](https://cryptodaily.co.uk/news-in-crypto/coincodex:axelar-integrates-with-stacks-to-bridge-bitcoin-across-over-65-blockchains) | Crypto Daily UK |
+| 🌱 [LunarCrush Unveils AI-Driven Web3 Platform for Creators](https://www.altcoinbuzz.io/cryptocurrency-news/lunarcrush-unveils-ai-driven-web3-platform-for-creators/) | Altcoin Buzz |
+| [Despite Bitcoin price volatility, factors point to BTC’s long-term success](https://cointelegraph.com/news/bitcoin-price-volatility-btc-success) | CoinTelegraph |
+| [Satoshi’s Vision Or Not, Bitcoin DeFi Is Here To Stay](https://www.thestreet.com/crypto/markets/satoshis-vision-or-not-bitcoin-defi-is-here-to-stay-) | The Street |
+| [📣 Stacks Foundation joins Uphold to drive Bitcoin adoption](https://www.binance.com/en/square/post/8093584158561) | Binance Square |
+| [Stacks & Uphold Team Up to Boost Bitcoin Beyond Just a Store of Value](https://coinpaper.com/4190/stacks-and-uphold-team-up-to-boost-bitcoin-beyond-just-a-store-of-value) | Coinpaper |
+| [Stacks and Uphold Partner Up to Boost Bitcoin Adoption](https://coinmarketcap.com/community/articles/66437419d7905c7145a4c38e/) | CoinMarketCap |
+| [Stacks & Uphold Team Up to Boost Bitcoin Beyond Just a Store of Value](https://coinstats.app/news/e879f032aa90aad3a51213254a35691ddc897bbfc7200d3d95b95ff87bb4ca0e_Stacks-%26-Uphold-Team-Up-to-Boost-Bitcoin-Beyond-Just-a-Store-of-Value/) | CoinStats |
+| [Stacks Foundation joins Uphold to drive Bitcoin adoption](https://www.coinlive.com/id/news-flash/514530) | CoinLive |
+| [Stacks Partners With Uphold To Further Increase Bitcoin Adoption](https://www.investingcube.com/stacks-partners-with-uphold-to-further-increase-bitcoin-adoption/) | InvestingCube |
+| [Stacks and Uphold Partner Up to Boost Bitcoin Adoption](https://www.cryptotimes.io/2024/05/14/stacks-and-uphold-partner-up-to-boost-bitcoin-adoption/) | Crypto Times |
diff --git a/docs/press-and-reports/press-and-top-links/2024/november-2024.md b/docs/press-and-reports/press-and-top-links/2024/november-2024.md
new file mode 100644
index 0000000000..feb35d0bdf
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/november-2024.md
@@ -0,0 +1,8 @@
+# November 2024
+
+| Article | Outlet / Author |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
+| 🧡 [CoinFlip, the #1 Global Bitcoin ATM Network Is Making Programmable Bitcoin More Accessible with Stacks, the Leading Bitcoin L2](https://www.theblock.co/post/327328/coinflip-the-1-global-bitcoin-atm-network-is-making-programmable-bitcoin-more-accessible-with-stacks-the-leading-bitcoin-l2) | TheBlock |
+| 🧡 [Leading Crowdsourced Security Platform Immunefi Teams Up with Asymmetric Research & Bitcoin L2 Labs to Bolster sBTC Security](https://www.theblock.co/post/326835/leading-crowdsourced-security-platform-immunefi-teams-up-with-asymmetric-research-bitcoin-l2-labs-to-bolster-sbtc-security) | TheBlock |
+| 🧡 [CoinFlip, the #1 Global Bitcoin ATM Network Is Making Programmable Bitcoin More Accessible with Stacks, the Leading Bitcoin L2](https://coinmarketcap.com/community/articles/673e0069c291c94bd18e68fb/) | CoinMarketCap |
+| 🧡 [Bitcoin Frontier Fund, Home of the Top Bitcoin Accelerator, To Invest in Teams Built on sBTC](https://www.theblock.co/post/328240/bitcoin-frontier-fund-home-of-the-top-bitcoin-accelerator-to-invest-in-teams-built-on-sbtc) | TheBlock |
diff --git a/docs/press-and-reports/press-and-top-links/2024/october-2024.md b/docs/press-and-reports/press-and-top-links/2024/october-2024.md
new file mode 100644
index 0000000000..9997e79848
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/october-2024.md
@@ -0,0 +1,11 @@
+# October 2024
+
+| Article | Outlet/Author |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------- |
+| 🚀 [Stacks fortifies Bitcoin ties with Nakamoto upgrade](https://blockworks.co/news/stacks-sbtc-bitcoin-alignment-nakamoto?ref=stacksblog) | Blockworks |
+| 🚀 [Stacks, Prominent Bitcoin Layer-2 Project, Activates Long-Awaited 'Nakamoto' Upgrade](https://www.coindesk.com/tech/2024/10/29/stacks-prominent-bitcoin-layer-2-project-activates-long-awaited-nakamoto-upgrade/?ref=stacksblog) | Coindesk |
+| 🤝 [Asymmetric Research Joins Stacks Ecosystem as Security Contributor to Bitcoin L2](https://hackernoon.com/asymmetric-research-joins-stacks-ecosystem-as-security-contributor-to-bitcoin-l2) | Hackernoon |
+| 🟧 [A Beginner's Guide to Bitcoin Layers](https://www.hiro.so/blog/read-a-beginners-guide-to-bitcoin-layers?ref=stacksblog) | Hiro |
+| 🌱 [Bitcoin-backed stablecoin developer Hermetica raises $1.7M in seed funding](https://www.theblock.co/post/321141/bitcoin-backed-stablecoin-developer-hermetica-raises-1-7-million-in-seed-funding?ref=stacksblog) | The Block |
+| 🌱 [Blockstream raises $210M to accelerate Bitcoin adoption](https://subscribe.bitcoinbuildersassociation.com/p/blockstream-raises-210m-to-accelerate?ref=stacksblog) | Bitcoin Builders Association |
+| 🟧 [BoostVC, Draper Associates, and Thesis Announce BitcoinFi Accelerator](https://subscribe.bitcoinbuildersassociation.com/p/boostvc-draper-associates-and-thesis?ref=stacksblog) | Bitcoin Builders Association |
diff --git a/docs/press-and-reports/press-and-top-links/2024/september-2024.md b/docs/press-and-reports/press-and-top-links/2024/september-2024.md
new file mode 100644
index 0000000000..571e6f2805
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2024/september-2024.md
@@ -0,0 +1,16 @@
+# September 2024
+
+| Article | Outlet / Author |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- |
+| 📈 [New Milestone for Bitcoin DeFi: Over 1,400 Smart Contracts Deployed on Stacks](https://coinchapter.com/new-milestone-for-bitcoin-defi-over-1400-smart-contracts-deployed-on-stacks-even-before-major-upgrade/) | Coin Chapter |
+| 📈 [Bitcoin layer-2 Stacks witnessed 1,400 smart contract deployments month over month](https://www.livebitcoinnews.com/stacks-registers-unseen-smart-contract-deployment-days-away-from-its-nakamoto-upgrade/) | Live Bitcoin News |
+| 🗞️ [Stacks' smart contracts reach record high ahead of Nakamoto upgrade](https://cointelegraph.com/news/stacks-record-smart-contracts-nakamoto-upgrade?ref=stacksblog) | Cointelegraph |
+| 🤝🏻 [Anchorage Digital Announces Custody Support for Stacks](https://x.com/Stacks/status/1831335327300309174?utm_source=stackssnacks.com\&utm_medium=referral\&utm_campaign=anchorage-digital-supporting-stacks-btc-bash-and-other-highlights) | X / Anchorage Digital |
+| 🚀 [Hermetica Labs Launches USDh, the first Bitcoin-native synthetic USD](https://cryptobriefing.com/bitcoin-synthetic-dollar-25-percent-yield/?ref=stacksblog) | Crypto Briefing |
+| 💡 [What is sBTC? A Guide to the Non-Custodial Native Bitcoin DeFi](https://www.xverse.app/blog/what-is-sbtc?ref=stacksblog) | Xverse |
+| ₿ [Over $1.5B worth of BTC is now locked in Bitcoin Layers](https://subscribe.bitcoinbuildersassociation.com/p/over-15b-worth-of-btc-is-now-locked?ref=stacksblog) | Bitcoin Builders Association |
+| 🤝 [Stacks x Aptos Foundations Join Forces to Bring Bitcoin to Aptos Network via sBTC](https://decrypt.co/249825/bitcoin-stacks-l2-brings-its-sbtc-to-the-aptos-network) | Decrypt |
+| 🖼️ [Gamma's United Bitcoin Ordinals and Stacks Platform Enters Beta](https://nftinsider.io/gamma-bitcoin-beta/?ref=stacksblog) | NFT Insider |
+| 🤝 [Tokensoft partners with Stacks Foundation and Bitcoin Frontier Fund to Accelerate Bitcoin Builders](https://cryptobriefing.com/bitcoin-builders-acceleration-partnership/?ref=stacksblog) | Crypto Briefing |
+| 🗞️ [Stacks Asia Foundation Launches with $15M in Funding to Boost Bitcoin Layer-2 Adoption](https://coinmarketcap.com/community/articles/66e2998ae0c16b2dea22b4f1/?ref=stacksblog) | CoinMarketCap |
+| 🚀 [Zest Introduces BTCz, leveraging Babylon and Stacks](https://subscribe.bitcoinbuildersassociation.com/p/zest-introduces-btcz-leveraging-babylon?ref=stacksblog) | Zest |
diff --git a/docs/press-and-reports/press-and-top-links/2025/README.md b/docs/press-and-reports/press-and-top-links/2025/README.md
new file mode 100644
index 0000000000..9c23c326da
--- /dev/null
+++ b/docs/press-and-reports/press-and-top-links/2025/README.md
@@ -0,0 +1,5 @@
+# 2025
+
+For weekly stories delivered to your inbox, subscribe to [Stacks Snacks](https://stackssnacks.com/). For quarterly ecosystem recaps, subscribe to the [Stacks Foundation newsletter](https://newsletters.stacks.org/).
+
+