diff --git a/src/components/Badge.tsx b/src/components/Badge.tsx
new file mode 100644
index 0000000..6722de7
--- /dev/null
+++ b/src/components/Badge.tsx
@@ -0,0 +1,28 @@
+const variants = {
+ red: 'bg-red3 text-red11',
+ amber: 'bg-amber3 text-amber11',
+ green: 'bg-green3 text-green11',
+ blue: 'bg-accentTint text-accent',
+ violet: 'bg-violet3 text-violet11',
+ gray: 'bg-gray3 text-gray11',
+} as const
+
+type BadgeVariant = keyof typeof variants
+
+export function Badge({
+ variant = 'gray',
+ children,
+}: {
+ variant?: BadgeVariant
+ children: React.ReactNode
+}) {
+ return (
+
+ {children}
+
+ )
+}
+
+export default Badge
diff --git a/src/pages/guide/node/index.mdx b/src/pages/guide/node/index.mdx
index d2eceae..bba72eb 100644
--- a/src/pages/guide/node/index.mdx
+++ b/src/pages/guide/node/index.mdx
@@ -35,6 +35,12 @@ Prebuilt binaries are available for:
icon="lucide:play"
title="Running an RPC Node"
/>
+
:::info
diff --git a/src/pages/guide/node/network-upgrades.mdx b/src/pages/guide/node/network-upgrades.mdx
new file mode 100644
index 0000000..b83d1ee
--- /dev/null
+++ b/src/pages/guide/node/network-upgrades.mdx
@@ -0,0 +1,39 @@
+---
+description: Timeline and details for Tempo network upgrades and important releases for node operators.
+---
+
+import { Badge } from '../../../components/Badge'
+
+# Network Upgrades and Releases
+
+Tempo uses scheduled network upgrades to introduce protocol changes. Each upgrade goes through testnet activation before mainnet. This page also tracks important releases that node operators should be aware of.
+
+For detailed release notes and binaries, see the [Changelog](/changelog).
+
+## Required Node Operator Updates
+
+| Release | Date | Network | Description | Priority |
+|---------|------|---------|-------------|----------|
+| [v1.2.0](https://github.com/tempoxyz/tempo/releases/tag/v1.2.0) | Feb 13, 2026 | Mainnet only | Fixes validation bug rejecting transactions with gas limits above ~16.7M, blocking large contract deployments | Required |
+
+---
+
+## T1 (Bach)
+
+| | |
+|---|---|
+| **Scope** | Mainnet-ready gas economics, expiring nonces, and security hardening |
+| **TIPs** | [TIP-1000: State Creation Cost Increase](https://docs.tempo.xyz/protocol/tips/tip-1000), [TIP-1009: Expiring Nonces](https://docs.tempo.xyz/protocol/tips/tip-1009), [TIP-1010: Mainnet Gas Parameters](https://docs.tempo.xyz/protocol/tips/tip-1010) |
+| **Testnet** | Feb 5, 2026 15:00 UTC (unix: 1770303600) — Release: [v1.1.0](https://github.com/tempoxyz/tempo/releases/tag/v1.1.0) |
+| **Mainnet** | Feb 12, 2026 15:00 UTC (unix: 1770908400) — Release: [v1.1.1](https://github.com/tempoxyz/tempo/releases/tag/v1.1.1) |
+| **Priority** | Required |
+
+---
+
+## T0 (Genesis)
+
+| | |
+|---|---|
+| **Scope** | Initial mainnet launch |
+| **Mainnet** | Jan 16, 2026 (genesis) — Release: [v1.0.0](https://github.com/tempoxyz/tempo/releases/tag/v1.0.0) |
+| **Priority** | Required |
diff --git a/vite.config.ts b/vite.config.ts
index 7af2318..31194ff 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -26,6 +26,40 @@ function tempoNode(): Plugin {
}
}
+/**
+ * Escape angle brackets in prose so MDX does not interpret them as JSX.
+ * Preserves content inside fenced code blocks and inline code spans.
+ */
+function escapeAngleBrackets(source: string): string {
+ const lines = source.split('\n')
+ const result: string[] = []
+ let inCodeBlock = false
+
+ for (const line of lines) {
+ if (/^```/.test(line)) {
+ inCodeBlock = !inCodeBlock
+ result.push(line)
+ continue
+ }
+ if (inCodeBlock) {
+ result.push(line)
+ continue
+ }
+ // Split by inline code spans to avoid escaping inside them
+ const parts = line.split(/(`[^`]*`)/)
+ for (let i = 0; i < parts.length; i++) {
+ if (i % 2 === 0) {
+ // Escape < > that would be misread as JSX. Use backslash escapes
+ // which MDX/micromark supports.
+ parts[i] = parts[i].replace(//g, '>')
+ }
+ }
+ result.push(parts.join(''))
+ }
+
+ return result.join('\n')
+}
+
function syncTips(): Plugin {
const repo = 'tempoxyz/tempo'
const outputDir = 'src/pages/protocol/tips'
@@ -57,6 +91,9 @@ function syncTips(): Plugin {
/\(tips\/ref-impls\/src\/interfaces\/(\w+\.sol)\)/g,
'(https://github.com/tempoxyz/tempo-std/blob/master/src/interfaces/$1)',
)
+ // Escape angle brackets outside of code blocks/inline code so MDX doesn't
+ // treat them as JSX (e.g. `Mapping` in prose).
+ content = escapeAngleBrackets(content)
const outputPath = path.join(outputDir, file.name.replace('.md', '.mdx'))
await fs.writeFile(outputPath, content)
}),
diff --git a/vocs.config.ts b/vocs.config.ts
index 14eabbd..6e3d4a7 100644
--- a/vocs.config.ts
+++ b/vocs.config.ts
@@ -544,6 +544,10 @@ export default defineConfig({
text: 'Operating your validator',
link: '/guide/node/operate-validator',
},
+ {
+ text: 'Network Upgrades and Releases',
+ link: '/guide/node/network-upgrades',
+ },
],
},
// {