diff --git a/frontend/custom-xxi-config.json b/frontend/custom-xxi-config.json
new file mode 100644
index 000000000..6d3135aa0
--- /dev/null
+++ b/frontend/custom-xxi-config.json
@@ -0,0 +1,48 @@
+{
+ "theme": "wiz",
+ "enterprise": "xxi",
+ "branding": {
+ "name": "xxi",
+ "title": "Twenty One",
+ "site_id": 23,
+ "header_img": "/resources/xxi/xxilogo.png",
+ "footer_img": "/resources/xxi/xxilogo.png"
+ },
+ "dashboard": {
+ "widgets": [
+ {
+ "component": "fees",
+ "mobileOrder": 4
+ },
+ {
+ "component": "walletBalance",
+ "mobileOrder": 1,
+ "props": {
+ "wallet": "xxi"
+ }
+ },
+ {
+ "component": "goggles",
+ "mobileOrder": 5
+ },
+ {
+ "component": "wallet",
+ "mobileOrder": 2,
+ "props": {
+ "wallet": "xxi",
+ "period": "all"
+ }
+ },
+ {
+ "component": "blocks"
+ },
+ {
+ "component": "walletTransactions",
+ "mobileOrder": 3,
+ "props": {
+ "wallet": "xxi"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/index.mempool.xxi.html b/frontend/src/index.mempool.xxi.html
new file mode 100644
index 000000000..7163e7804
--- /dev/null
+++ b/frontend/src/index.mempool.xxi.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+ Twenty One
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/resources/xxi/favicons/android-chrome-192x192.png b/frontend/src/resources/xxi/favicons/android-chrome-192x192.png
new file mode 100644
index 000000000..c435b91da
Binary files /dev/null and b/frontend/src/resources/xxi/favicons/android-chrome-192x192.png differ
diff --git a/frontend/src/resources/xxi/favicons/android-chrome-512x512.png b/frontend/src/resources/xxi/favicons/android-chrome-512x512.png
new file mode 100644
index 000000000..8421218be
Binary files /dev/null and b/frontend/src/resources/xxi/favicons/android-chrome-512x512.png differ
diff --git a/frontend/src/resources/xxi/favicons/apple-touch-icon.png b/frontend/src/resources/xxi/favicons/apple-touch-icon.png
new file mode 100644
index 000000000..7b4c8a622
Binary files /dev/null and b/frontend/src/resources/xxi/favicons/apple-touch-icon.png differ
diff --git a/frontend/src/resources/xxi/favicons/favicon-16x16.png b/frontend/src/resources/xxi/favicons/favicon-16x16.png
new file mode 100644
index 000000000..63d8ccf1a
Binary files /dev/null and b/frontend/src/resources/xxi/favicons/favicon-16x16.png differ
diff --git a/frontend/src/resources/xxi/favicons/favicon-32x32.png b/frontend/src/resources/xxi/favicons/favicon-32x32.png
new file mode 100644
index 000000000..bc275639c
Binary files /dev/null and b/frontend/src/resources/xxi/favicons/favicon-32x32.png differ
diff --git a/frontend/src/resources/xxi/favicons/favicon.ico b/frontend/src/resources/xxi/favicons/favicon.ico
new file mode 100644
index 000000000..b7ea1f5cd
Binary files /dev/null and b/frontend/src/resources/xxi/favicons/favicon.ico differ
diff --git a/frontend/src/resources/xxi/favicons/site.webmanifest b/frontend/src/resources/xxi/favicons/site.webmanifest
new file mode 100644
index 000000000..45dc8a206
--- /dev/null
+++ b/frontend/src/resources/xxi/favicons/site.webmanifest
@@ -0,0 +1 @@
+{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
\ No newline at end of file
diff --git a/frontend/src/resources/xxi/xxi-preview.jpg b/frontend/src/resources/xxi/xxi-preview.jpg
new file mode 100644
index 000000000..ce1d822cf
Binary files /dev/null and b/frontend/src/resources/xxi/xxi-preview.jpg differ
diff --git a/frontend/src/resources/xxi/xxilogo.png b/frontend/src/resources/xxi/xxilogo.png
new file mode 100644
index 000000000..a6a594150
Binary files /dev/null and b/frontend/src/resources/xxi/xxilogo.png differ
diff --git a/production/mempool-build-all b/production/mempool-build-all
index 204da4f92..3c566d4ef 100755
--- a/production/mempool-build-all
+++ b/production/mempool-build-all
@@ -131,7 +131,7 @@ export NVM_DIR="${HOME}/.nvm"
source "${NVM_DIR}/nvm.sh"
# what to look for
-frontends=(mainnet liquid onbtc bitb meta river strategy)
+frontends=(mainnet liquid onbtc bitb meta river strategy xxi)
backends=(mainnet testnet testnet4 signet liquid liquidtestnet onbtc bitb)
frontend_repos=()
backend_repos=()
diff --git a/production/mempool-frontend-config.xxi.json b/production/mempool-frontend-config.xxi.json
new file mode 100644
index 000000000..2aa4645a1
--- /dev/null
+++ b/production/mempool-frontend-config.xxi.json
@@ -0,0 +1,19 @@
+{
+ "OFFICIAL_MEMPOOL_SPACE": true,
+ "TESTNET_ENABLED": true,
+ "TESTNET4_ENABLED": true,
+ "LIQUID_ENABLED": true,
+ "LIQUID_TESTNET_ENABLED": true,
+ "BISQ_ENABLED": true,
+ "BISQ_SEPARATE_BACKEND": true,
+ "SIGNET_ENABLED": true,
+ "MEMPOOL_WEBSITE_URL": "https://mempool.space",
+ "LIQUID_WEBSITE_URL": "https://liquid.network",
+ "BISQ_WEBSITE_URL": "https://bisq.markets",
+ "ITEMS_PER_PAGE": 25,
+ "LIGHTNING": true,
+ "ACCELERATOR": true,
+ "PUBLIC_ACCELERATIONS": true,
+ "AUDIT": true,
+ "CUSTOMIZATION": "custom-xxi-config.json"
+}
diff --git a/production/mempool-start-all b/production/mempool-start-all
index 3d7f425ab..a108c783c 100755
--- a/production/mempool-start-all
+++ b/production/mempool-start-all
@@ -16,7 +16,7 @@ screen -dmS x startx
sleep 3
# start unfurlers for each frontend
-for site in mainnet liquid onbtc bitb meta river strategy;do
+for site in mainnet liquid onbtc bitb meta river strategy xxi;do
cd "$HOME/${site}/unfurler" && \
echo "starting mempool unfurler: ${site}" && \
screen -dmS "unfurler-${site}" sh -c 'while true;do npm run unfurler;sleep 2;done'
diff --git a/production/unfurler-config.xxi.json b/production/unfurler-config.xxi.json
new file mode 100644
index 000000000..4112ec47d
--- /dev/null
+++ b/production/unfurler-config.xxi.json
@@ -0,0 +1,17 @@
+{
+ "SERVER": {
+ "HOST": "https://xxi.tk7.mempool.space",
+ "HTTP_PORT": 8009
+ },
+ "MEMPOOL": {
+ "HTTP_HOST": "http://127.0.0.1",
+ "HTTP_PORT": 89,
+ "NETWORK": "xxi"
+ },
+ "PUPPETEER": {
+ "CLUSTER_SIZE": 2,
+ "EXEC_PATH": "/usr/local/bin/chrome",
+ "MAX_PAGE_AGE": 86400,
+ "RENDER_TIMEOUT": 3000
+ }
+}
diff --git a/unfurler/src/routes.ts b/unfurler/src/routes.ts
index 76d104d63..3e10bf954 100644
--- a/unfurler/src/routes.ts
+++ b/unfurler/src/routes.ts
@@ -377,6 +377,28 @@ export const networks = {
routes: routes.lightning.routes,
}
}
+ },
+ xxi: {
+ networkName: 'XXI',
+ title: 'Twenty One | The Institutional Standard for Bitcoin',
+ description: 'The Institutional Standard for Bitcoin',
+ fallbackImg: '/resources/xxi/xxi-preview.png',
+ routes: { // only dynamic routes supported
+ block: routes.block,
+ address: routes.address,
+ wallet: routes.wallet,
+ tx: routes.tx,
+ mining: {
+ title: "Mining",
+ routes: {
+ pool: routes.mining.routes.pool,
+ }
+ },
+ lightning: {
+ title: "Lightning",
+ routes: routes.lightning.routes,
+ }
+ }
}
};