diff --git a/public/img/user-logos/datum.svg b/public/img/user-logos/datum.svg new file mode 100644 index 00000000..e2ec5587 --- /dev/null +++ b/public/img/user-logos/datum.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/user-logos/fedimint.png b/public/img/user-logos/fedimint.png new file mode 100644 index 00000000..53c7c75d Binary files /dev/null and b/public/img/user-logos/fedimint.png differ diff --git a/public/img/user-logos/rayfish.png b/public/img/user-logos/rayfish.png new file mode 100644 index 00000000..ddc0b02e Binary files /dev/null and b/public/img/user-logos/rayfish.png differ diff --git a/src/app/page.jsx b/src/app/page.jsx index 25128721..bfaf3907 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -20,6 +20,8 @@ import logoSwift from '@/images/language-logos/swift.svg'; import logoJavascript from '@/images/language-logos/node.svg'; import logoKotlin from '@/images/language-logos/kotlin.svg'; import logoPython from '@/images/language-logos/python.svg'; +import logoGo from '@/images/language-logos/go.svg'; +import logoC from '@/images/language-logos/c.svg'; import { CodeBlockTabs } from '@/components/CodeBlockTabs'; export const metadata = { @@ -34,6 +36,8 @@ const languages = [ { name: 'JavaScript', logo: logoJavascript, href: 'https://docs.iroh.computer/languages/javascript' }, { name: 'Kotlin', logo: logoKotlin, href: 'https://docs.iroh.computer/languages/kotlin' }, { name: 'Python', logo: logoPython, href: 'https://docs.iroh.computer/languages/python' }, + { name: 'Go', logo: logoGo, href: 'https://docs.iroh.computer/languages/go' }, + { name: 'C', logo: logoC, href: 'https://docs.iroh.computer/languages/c' }, ]; const platforms = [ @@ -213,6 +217,12 @@ export default function Page() {

Move files and large blobs directly between devices with content-addressed, resumable transfers that verify every byte.

+ +
+

Built-in VPN

+

Reach your devices directly, with no VPN to configure and no ports to open.

+
+ @@ -275,6 +285,8 @@ export default function Page() { { logo: logoJavascript, name: 'JavaScript' }, { logo: logoKotlin, name: 'Kotlin' }, { logo: logoPython, name: 'Python' }, + { logo: logoGo, name: 'Go' }, + { logo: logoC, name: 'C' }, ].map(({ logo, name }) => ( + + + ) + } + return ( + + + + ) +} + +export default function VPNUseCasePage() { + return ( +
+ + +
+ {/* Hero Section */} +
+
+
+
+

Use Case: Networking

+

+ Reach Any Device, No VPN Required +

+

+ Teams are replacing Tailscale, WireGuard, and reverse SSH tunnels with iroh—dial + a device's public key and get a direct, encrypted connection. No coordination + server to run, no ports to open. +

+
+ + + + + Talk to Us + +
+
+
+ +
+
+
+
+ + {/* Highlights */} +
+
+
+
+

Direct

+

Peer-to-peer connections, no relay in the hot path

+
+
+

Encrypted

+

Every connection encrypted end-to-end by default

+
+
+

Embedded

+

A library in your app, not a client to install

+
+
+

Anywhere

+

Automatic NAT & firewall traversal, with relay fallback

+
+
+
+
+ + {/* The Problem */} +
+
+

The Problem: VPNs Are Infrastructure You Didn't Want to Own

+

+ Reaching a device that isn't sitting on the public internet usually means standing up + a VPN: a coordination server to run and secure, client software to distribute, and firewall + rules to get right. Or it means reverse SSH tunnels and all the operational shenanigans + that come with them. +

+
+

+ “Thinking about implementing a SOCKS proxy on top of iroh to get into my self-hosted + service at home without WireGuard infra and all the related network shenanigans.” +

+
+

+ But what if your app could just dial the other device directly—no separate network + to join, no client to install, no infrastructure to babysit? +

+
+
+ + {/* The Solution */} +
+
+
+
+

The Solution: Dial Keys, Not IPs

+

+ Every iroh node has a public key as its address. To reach a device, you dial that key + directly from inside your own application—there's no separate VPN client for + your users to install, and no central network your traffic has to join. +

+

+ One developer building an agentic coding app described swapping out planned reverse SSH + tunnel infrastructure for iroh in about a day: +

+
+
+
+ +
+

Dial Keys, Not IPs

+

+ Every node has a cryptographic identity. Connect to a device by its public key, wherever it is. +

+
+
+
+ +
+

Direct Connections

+

+ Iroh punches through NATs and firewalls automatically to connect devices directly. +

+
+
+
+ +
+

Encrypted by Default

+

+ Every connection is end-to-end encrypted, so your platform can't see or modify traffic between devices. +

+
+
+
+ +
+

A Library, Not a Client

+

+ Iroh ships inside your app, so the connection is just part of your product—not a separate piece of software your users manage. +

+
+
+
+
+
+

+ “I read iroh's headline ‘dial keys, not IPs’…I think that was + last Tuesday. By Wednesday it was in our app as one of the most load-bearing pieces.” +

+
+
+
+ + {/* Why Relays Matter */} +
+
+

Why Relays Matter

+

+ Iroh automatically establishes direct connections when possible, for the lowest latency + and highest throughput. When a direct connection isn't possible—due to symmetric + NATs, restrictive firewalls, or carrier-grade NAT—traffic falls back to an encrypted + relay, so the connection stays up either way. +

+

+ Use n0's hosted relays, + or run your own for full control over that part of the stack. +

+
+
+ + {/* Comparison */} +
+
+
+

Why iroh

+

iroh vs. Tailscale & WireGuard

+
+
+ + + + + + + + + + {comparison.map((row) => ( + + + + + + ))} + +
irohTailscale / WireGuard
{row.feature}
+
+

+ Iroh connects your app's own devices directly—it's not a general-purpose + replacement for joining a whole network of unrelated machines. +

+
+
+ + {/* CTA */} +
+
+

+ Ready to Skip the VPN Infrastructure? +

+

+ Get started with iroh in minutes. No complex configuration required. +

+
+ + + + + + +
+
+
+ + +
+
+ ) +} diff --git a/src/components/Header.jsx b/src/components/Header.jsx index 05a77fc9..f7aa54e3 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -27,6 +27,7 @@ export const navItems = [ {label: 'Real-time Sync', href: '/solutions/delta-chat'}, {label: 'Payments & POS', href: '/solutions/pos'}, {label: 'IoT & Embedded', href: '/solutions/iot'}, + {label: 'Built-in VPN', href: '/solutions/vpn'}, ]}, {content: 'Docs', href: 'https://docs.iroh.computer/'}, {content: 'Blog', href: '/blog'}, diff --git a/src/components/home/LogoCloud.jsx b/src/components/home/LogoCloud.jsx index 2236b78d..936f4e45 100644 --- a/src/components/home/LogoCloud.jsx +++ b/src/components/home/LogoCloud.jsx @@ -8,11 +8,15 @@ const companies = [ { name: "spacedrive", ext: "png", href: "https://www.spacedrive.com" }, { name: "nous", ext: "png", href: "https://nousresearch.com" }, { name: "meshllm", ext: "svg", imgClassName: "max-h-12 grayscale", href: "https://meshllm.cloud" }, - { name: "strada", ext: "png", label: "Strada", href: "https://strada.tech" }, + { name: "strada", ext: "png", label: "strada", labelClassName: "font-black", imgClassName: "max-h-6", href: "https://strada.tech" }, { name: "paycode", ext: "svg", href: "https://www.paycode.com.mx" }, { name: "rave", ext: "png", href: "https://rave.io" }, { name: "delta_chat", ext: "png", href: "https://delta.chat" }, - { name: "ottomatic", ext: "png", label: "Ottomatic", href: "https://ottomatic.io" }, + { name: "ottomatic", ext: "png", label: "Ottomatic", imgClassName: "max-h-6", href: "https://ottomatic.io" }, + { name: "rayfish", ext: "png", label: "Rayfish", imgClassName: "max-h-6", href: "https://rayfish.xyz" }, + { name: "outl", label: "Outl", href: "https://outl.app" }, + { name: "datum", ext: "svg", href: "https://www.datum.net" }, + { name: "fedimint", ext: "png", href: "https://fedimint.org" }, ]; // interface LogoCloudProps { @@ -69,27 +73,28 @@ export function LogoCloud({ speed = 0.85, height = 100 }) { {/* Scroller container */}
- {companies.map(({ name, ext, imgClassName, label, href }, index) => ( + {companies.map(({ name, ext, imgClassName, label, labelClassName, href }, index) => ( - {label ? ( - {label} - ) : ( + {ext && ( )} + {label && ( + {label} + )} ))}
diff --git a/src/images/language-logos/c.svg b/src/images/language-logos/c.svg new file mode 100644 index 00000000..e70d71c6 --- /dev/null +++ b/src/images/language-logos/c.svg @@ -0,0 +1 @@ +C \ No newline at end of file