From 9d93c759c10fe674c734698400c436d2648022b9 Mon Sep 17 00:00:00 2001 From: Rae McKelvey <633012+okdistribute@users.noreply.github.com> Date: Tue, 16 Jun 2026 12:13:06 -0700 Subject: [PATCH 1/8] Add tabbed code component and platform logo assets - CodeBlockTabs renders multiple syntax-highlighted snippets as a tabbed CodeGroup (the multi-language version of CodeBlock). - public/img/platform-logos: monochrome CC0 simple-icons SVGs for Apple, Android, AWS, Azure, Cloudflare, Espressif, Linux, Raspberry Pi, and Windows, recolored via CSS mask so they follow the text color in light and dark mode. Co-Authored-By: Claude Opus 4.8 (1M context) --- public/img/platform-logos/AWS.svg | 1 + public/img/platform-logos/Android.svg | 1 + public/img/platform-logos/Apple.svg | 1 + public/img/platform-logos/Azure.svg | 1 + public/img/platform-logos/Cloudflare.svg | 1 + public/img/platform-logos/Espressif.svg | 1 + public/img/platform-logos/Linux.svg | 1 + public/img/platform-logos/RaspberryPi.svg | 1 + public/img/platform-logos/Windows.svg | 1 + src/components/CodeBlockTabs.jsx | 43 +++++++++++++++++++++++ 10 files changed, 52 insertions(+) create mode 100644 public/img/platform-logos/AWS.svg create mode 100644 public/img/platform-logos/Android.svg create mode 100644 public/img/platform-logos/Apple.svg create mode 100644 public/img/platform-logos/Azure.svg create mode 100644 public/img/platform-logos/Cloudflare.svg create mode 100644 public/img/platform-logos/Espressif.svg create mode 100644 public/img/platform-logos/Linux.svg create mode 100644 public/img/platform-logos/RaspberryPi.svg create mode 100644 public/img/platform-logos/Windows.svg create mode 100644 src/components/CodeBlockTabs.jsx diff --git a/public/img/platform-logos/AWS.svg b/public/img/platform-logos/AWS.svg new file mode 100644 index 00000000..9fd688c4 --- /dev/null +++ b/public/img/platform-logos/AWS.svg @@ -0,0 +1 @@ +Amazon AWS \ No newline at end of file diff --git a/public/img/platform-logos/Android.svg b/public/img/platform-logos/Android.svg new file mode 100644 index 00000000..3f44ef6b --- /dev/null +++ b/public/img/platform-logos/Android.svg @@ -0,0 +1 @@ +Android \ No newline at end of file diff --git a/public/img/platform-logos/Apple.svg b/public/img/platform-logos/Apple.svg new file mode 100644 index 00000000..de4b0d17 --- /dev/null +++ b/public/img/platform-logos/Apple.svg @@ -0,0 +1 @@ +Apple \ No newline at end of file diff --git a/public/img/platform-logos/Azure.svg b/public/img/platform-logos/Azure.svg new file mode 100644 index 00000000..69a264e2 --- /dev/null +++ b/public/img/platform-logos/Azure.svg @@ -0,0 +1 @@ +Microsoft Azure \ No newline at end of file diff --git a/public/img/platform-logos/Cloudflare.svg b/public/img/platform-logos/Cloudflare.svg new file mode 100644 index 00000000..a1cf2d6d --- /dev/null +++ b/public/img/platform-logos/Cloudflare.svg @@ -0,0 +1 @@ +Cloudflare \ No newline at end of file diff --git a/public/img/platform-logos/Espressif.svg b/public/img/platform-logos/Espressif.svg new file mode 100644 index 00000000..36c82bcc --- /dev/null +++ b/public/img/platform-logos/Espressif.svg @@ -0,0 +1 @@ +Espressif \ No newline at end of file diff --git a/public/img/platform-logos/Linux.svg b/public/img/platform-logos/Linux.svg new file mode 100644 index 00000000..381d3d8a --- /dev/null +++ b/public/img/platform-logos/Linux.svg @@ -0,0 +1 @@ +Linux \ No newline at end of file diff --git a/public/img/platform-logos/RaspberryPi.svg b/public/img/platform-logos/RaspberryPi.svg new file mode 100644 index 00000000..1325a023 --- /dev/null +++ b/public/img/platform-logos/RaspberryPi.svg @@ -0,0 +1 @@ +Raspberry Pi \ No newline at end of file diff --git a/public/img/platform-logos/Windows.svg b/public/img/platform-logos/Windows.svg new file mode 100644 index 00000000..aca1d539 --- /dev/null +++ b/public/img/platform-logos/Windows.svg @@ -0,0 +1 @@ +Windows \ No newline at end of file diff --git a/src/components/CodeBlockTabs.jsx b/src/components/CodeBlockTabs.jsx new file mode 100644 index 00000000..a7496fe6 --- /dev/null +++ b/src/components/CodeBlockTabs.jsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { getHighlighter, renderToHtml } from 'shiki'; +import { CodeGroup } from '@/components/Code'; + +let highlighter; + +// Several syntax-highlighted snippets rendered as a single tabbed CodeGroup. +// `snippets` is an array of { title, label, language, code }. The sibling +// `CodeBlock` component is the single-snippet version of this. +export async function CodeBlockTabs({ snippets }) { + highlighter = + highlighter ?? + (await getHighlighter({ + theme: 'css-variables', + langs: ['rust', 'swift', 'javascript', 'kotlin'], + })); + + const rendered = snippets.map((snippet) => { + const tokens = highlighter.codeToThemedTokens(snippet.code, snippet.language); + const html = renderToHtml(tokens, { + elements: { + pre: ({ children }) => children, + code: ({ children }) => children, + line: ({ children }) => `${children}`, + }, + }); + return { ...snippet, html }; + }); + + return ( + + {rendered.map((snippet) => ( + + ))} + + ); +} From 116c7e0a19a1762cfc5b39d3c0bd568a457a0efa Mon Sep 17 00:00:00 2001 From: Rae McKelvey <633012+okdistribute@users.noreply.github.com> Date: Tue, 16 Jun 2026 12:13:06 -0700 Subject: [PATCH 2/8] Redesign the homepage landing page - Hero: turn the subheadings into a checklist and add a readability scrim so the text stays legible over the animated grid. - Add a platform logo strip (Raspberry Pi, Espressif, Linux, Windows, Apple, Android, Cloudflare, AWS, Azure). - Replace the 3-tab feature scroller with a single 'Reach every device' section built around the cost-savings graphic. - Render 'How are people using iroh?' as a 2-column card grid and add a File Transfer & Sync card. - Turn 'Deploy, Monitor, Fix' into scannable bullets. - Start building: show per-language code snippets (Swift, Rust, JavaScript, Kotlin) in tabs instead of a single Rust sample. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/app/page.jsx | 327 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 238 insertions(+), 89 deletions(-) diff --git a/src/app/page.jsx b/src/app/page.jsx index b4133184..e013cf3f 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -1,7 +1,7 @@ import Image from 'next/image' import Link from 'next/link' import { ArrowRightIcon } from '@heroicons/react/24/outline' -import { Cpu } from 'lucide-react' +import { SquareCheck } from 'lucide-react' import {FooterMarketing} from '@/components/FooterMarketing'; import {HeaderSparse} from '@/components/HeaderSparse'; @@ -13,10 +13,13 @@ import { IrohEverywhere } from '@/components/IrohEverywhere'; import {ProtocolHeroList} from '@/components/ProtocolHeroList'; import {LogoCloud} from '@/components/home/LogoCloud'; -import {HomeFeatureTabs} from '@/components/HomeFeatureTabs'; +import { OpenSourceIllustration } from '@/components/OpenSourceIllustration'; import logoRust from '@/images/language-logos/rust.svg'; -import { CodeBlock } from '@/components/CodeBlock'; +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 { CodeBlockTabs } from '@/components/CodeBlockTabs'; export const metadata = { title: 'Iroh', @@ -36,14 +39,26 @@ export default function Page() {
+ {/* readability scrim: opaque under the text, fading to reveal the grid */} +

IP addresses break, dial keys instead

- -

Add peer-to-peer connectivity to your app, anywhere: servers, mobile apps, agents, desktops, and embedded systems.

+

+

+

+

+

+

@@ -52,8 +67,39 @@ export default function Page() {
-
- + {/* connect between platforms */} +
+
+ {[ + { name: 'Raspberry Pi', file: 'RaspberryPi' }, + { name: 'Espressif', file: 'Espressif' }, + { name: 'Linux', file: 'Linux' }, + { name: 'Windows', file: 'Windows' }, + { name: 'Apple', file: 'Apple' }, + { name: 'Android', file: 'Android' }, + { name: 'Cloudflare', file: 'Cloudflare' }, + { name: 'AWS', file: 'AWS' }, + { name: 'Azure', file: 'Azure' }, + ].map(({ name, file }) => ( +
+
+ ))} +
@@ -66,7 +112,6 @@ export default function Page() { Forever.

- No VPNs, user accounts, or proprietary networks. The core peer-to-peer technology is open source and built on open standards, so you're never locked in: connect over our free community relays, self-host your own, or let us run them for you, and switch between them whenever you want.

@@ -95,67 +140,80 @@ export default function Page() {
- + {/* reach every device */} +
+
+
+

Reach every device, on any network

+

Write your app once and connect it everywhere, with one API.

+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+ +
+
+
{/* Solutions */}

How are people using iroh?

-
- -
-
-

Distributed AI Training

-

Train foundation LLMs with compute distributed around the world, across AWS, GCP, Azure, and self-hosted infrastructure.

-
-
- Nous logo -
+
+ +
+
+ +
+

Distributed AI Training

+

Train foundation LLMs with compute distributed around the world, across AWS, GCP, Azure, and self-hosted infrastructure.

- -
-
-

Video Streaming

-

Stream video between devices, using peer to peer technology. Create encrypted connections built on open standards, across the globe or across the room.

-
-
- Rave logo -
+ +
+

Video Streaming

+

Stream video between devices, using peer to peer technology. Create encrypted connections built on open standards, across the globe or across the room.

- -
-
-

Real-time Sync for Mobile Applications

-

Powers apps for hundreds of thousands of devices around the world, even when internet access is precarious.

-
-
- Delta Chat logo -
+ +
+

Real-time Sync for Mobile Applications

+

Powers apps for hundreds of thousands of devices around the world, even when internet access is precarious.

- -
-
-

Point of Sale Payments

-

Connect payment terminals directly to point of sale systems over Bluetooth, LAN, or Wi-Fi with full PCI compliance and no additional servers.

-
-
- Paycode logo -
+ +
+

Point of Sale Payments

+

Connect payment terminals directly to point of sale systems over Bluetooth, LAN, or Wi-Fi with full PCI compliance and no additional servers.

- -
-
-

IoT & Embedded Devices

-

Run iroh on ESP32, Raspberry Pi, and Linux with the same API. Devices discover each other automatically — no brokers, no gateways.

-
-
- -
+ +
+

IoT & Embedded Devices

+

Run iroh on ESP32, Raspberry Pi, and Linux with the same API. Devices discover each other automatically. No brokers, no gateways.

+
+ + +
+

File Transfer & Sync

+

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

@@ -164,16 +222,27 @@ export default function Page() {
-

Deploy, Monitor, Fix

-

All commits to iroh's main branch run through a growing set of simulations & tests.

-

- iroh provides opt-in - observability and - network diagnostics. Track connection health and throughput across all your devices and services. -

-

- You'll see how much of your traffic goes direct versus through a relay: a fallback server iroh uses when two devices can't reach each other directly, always end-to-end encrypted. Compare plans. -

+

Ready for production

+
    +
  • +
  • +
  • +
  • +
  • +
  • +
Monitor your App @@ -197,14 +266,20 @@ export default function Page() {
-
+ {[ + { logo: logoSwift, name: 'Swift' }, + { logo: logoRust, name: 'Rust' }, + { logo: logoJavascript, name: 'JavaScript' }, + { logo: logoKotlin, name: 'Kotlin' }, + ].map(({ logo, name }) => ( -
+ /> + ))}

Start building.

@@ -212,7 +287,7 @@ export default function Page() {
- +
@@ -230,26 +305,100 @@ export default function Page() { } -const codeSample = `// a program that creates two endpoints & sends a ping between them -use anyhow::Result; -use iroh::{Endpoint, protocol::Router}; -use iroh_ping::Ping; +// Minimal "dial a peer and echo a message" flow in each language. +// APIs match the iroh-ffi endpoint tests and the Rust quickstart docs. +const codeSnippets = [ + { + title: 'Swift', + label: 'App.swift', + language: 'swift', + code: `import IrohLib + +@main +struct App { + static func main() async throws { + // Dial a peer and echo a message over a bidirectional stream. + let endpoint = try await Endpoint.bind( + options: EndpointOptions(preset: presetN0()) + ) + + let conn = try await endpoint.connect(addr: serverAddr, alpn: ALPN) + let bi = try await conn.openBi() + + try await bi.send().writeAll(buf: Data("hello iroh".utf8)) + try await bi.send().finish() + + let echoed = try await bi.recv().readToEnd(sizeLimit: 64) + print(String(decoding: echoed, as: UTF8.self)) + } +}`, + }, + { + title: 'Rust', + label: 'main.rs', + language: 'rust', + code: `use anyhow::Result; +use iroh::{Endpoint, endpoint::presets}; #[tokio::main] async fn main() -> Result<()> { - // create the receive side - let recv_ep = Endpoint::builder().bind().await?; - let recv_router = Router::builder(recv_ep.clone()) - .accept(iroh_ping::ALPN, Ping::new()) - .spawn(); - recv_ep.online().await; - let addr = recv_router.endpoint().addr(); - - // create a send side & send a ping - let send_ep = Endpoint::builder().bind().await?; - let send_pinger = Ping::new(); - let rtt = send_pinger.ping(&send_ep, addr).await?; - println!("ping took: {rtt:?} to complete"); + // Dial a peer and echo a message over a bidirectional stream. + let endpoint = Endpoint::bind(presets::N0).await?; + + let conn = endpoint.connect(server_addr, ALPN).await?; + let (mut send, mut recv) = conn.open_bi().await?; + + send.write_all(b"hello iroh").await?; + send.finish()?; + let echoed = recv.read_to_end(64).await?; + println!("{}", String::from_utf8_lossy(&echoed)); Ok(()) -}` +}`, + }, + { + title: 'JavaScript', + label: 'index.js', + language: 'javascript', + code: `const { Endpoint } = require('@number0/iroh') + +async function main() { + // Dial a peer and echo a message over a bidirectional stream. + const builder = Endpoint.builder() + builder.applyN0() + const endpoint = await builder.bind() + + const conn = await endpoint.connect(serverAddr, ALPN) + const bi = await conn.openBi() + + await bi.send.writeAll(Array.from(Buffer.from('hello iroh'))) + await bi.send.finish() + + const echoed = await bi.recv.readToEnd(64) + console.log(Buffer.from(echoed).toString()) +} + +main()`, + }, + { + title: 'Kotlin', + label: 'Main.kt', + language: 'kotlin', + code: `import computer.iroh.* +import kotlinx.coroutines.runBlocking + +fun main() = runBlocking { + // Dial a peer and echo a message over a bidirectional stream. + val endpoint = Endpoint.bind(EndpointOptions(preset = presetN0())) + + val conn = endpoint.connect(serverAddr, ALPN) + val bi = conn.openBi() + + bi.send().writeAll("hello iroh".toByteArray()) + bi.send().finish() + + val echoed = bi.recv().readToEnd(64u) + println(String(echoed)) +}`, + }, +] From f2e23d1ee3ddf6f76321789500d92b0db027a3e2 Mon Sep 17 00:00:00 2001 From: Rae McKelvey <633012+okdistribute@users.noreply.github.com> Date: Tue, 16 Jun 2026 16:58:34 -0700 Subject: [PATCH 3/8] Fix hero text not wrapping on mobile The hero copy lived in an absolutely-positioned container with no width, so on narrow screens it shrink-wrapped to its content (up to max-w-7xl) and overflowed instead of wrapping. Let it flow and wrap on mobile, and keep the exact desktop overlay via md: overrides (md:absolute, md:w-auto, md:h-[600px]). Co-Authored-By: Claude Opus 4.8 (1M context) --- src/app/page.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/page.jsx b/src/app/page.jsx index e013cf3f..f79e277f 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -35,15 +35,15 @@ export default function Page() {
{/* hero */} -
+
{/* readability scrim: opaque under the text, fading to reveal the grid */}
-
-
+
+

IP addresses break, dial keys instead

From db74939687ecccfa9210cf23cfb271776639e951 Mon Sep 17 00:00:00 2001 From: Rae McKelvey <633012+okdistribute@users.noreply.github.com> Date: Wed, 17 Jun 2026 12:29:03 -0700 Subject: [PATCH 4/8] Add supported languages to the homepage logo strip Prepend Swift, Rust, JavaScript, and Kotlin (monochrome simple-icons) to the top strip so it shows both the supported languages and platforms, all recolored via CSS mask to match. Includes in-progress hero/section copy tweaks (low-latency framing). Co-Authored-By: Claude Opus 4.8 (1M context) --- public/img/platform-logos/JavaScript.svg | 1 + public/img/platform-logos/Kotlin.svg | 1 + public/img/platform-logos/Rust.svg | 1 + public/img/platform-logos/Swift.svg | 1 + src/app/page.jsx | 64 ++++++++++++------------ 5 files changed, 35 insertions(+), 33 deletions(-) create mode 100644 public/img/platform-logos/JavaScript.svg create mode 100644 public/img/platform-logos/Kotlin.svg create mode 100644 public/img/platform-logos/Rust.svg create mode 100644 public/img/platform-logos/Swift.svg diff --git a/public/img/platform-logos/JavaScript.svg b/public/img/platform-logos/JavaScript.svg new file mode 100644 index 00000000..91e51623 --- /dev/null +++ b/public/img/platform-logos/JavaScript.svg @@ -0,0 +1 @@ +JavaScript \ No newline at end of file diff --git a/public/img/platform-logos/Kotlin.svg b/public/img/platform-logos/Kotlin.svg new file mode 100644 index 00000000..adf2975b --- /dev/null +++ b/public/img/platform-logos/Kotlin.svg @@ -0,0 +1 @@ +Kotlin \ No newline at end of file diff --git a/public/img/platform-logos/Rust.svg b/public/img/platform-logos/Rust.svg new file mode 100644 index 00000000..b95ce42a --- /dev/null +++ b/public/img/platform-logos/Rust.svg @@ -0,0 +1 @@ +Rust \ No newline at end of file diff --git a/public/img/platform-logos/Swift.svg b/public/img/platform-logos/Swift.svg new file mode 100644 index 00000000..ffaf098e --- /dev/null +++ b/public/img/platform-logos/Swift.svg @@ -0,0 +1 @@ +Swift \ No newline at end of file diff --git a/src/app/page.jsx b/src/app/page.jsx index f79e277f..d6325065 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -53,11 +53,11 @@ export default function Page() {

Read the Docs @@ -71,6 +71,10 @@ export default function Page() {
{[ + { name: 'Swift', file: 'Swift' }, + { name: 'Rust', file: 'Rust' }, + { name: 'JavaScript', file: 'JavaScript' }, + { name: 'Kotlin', file: 'Kotlin' }, { name: 'Raspberry Pi', file: 'RaspberryPi' }, { name: 'Espressif', file: 'Espressif' }, { name: 'Linux', file: 'Linux' }, @@ -102,21 +106,6 @@ export default function Page() {
-
-
-

- Fast connections. -
- Anywhere. -
- Forever. -

-

- The core peer-to-peer technology is open source and built on open standards, so you're never locked in: connect over our free community relays, self-host your own, or let us run them for you, and switch between them whenever you want. -

-
-
-
@@ -144,24 +133,20 @@ export default function Page() {
-

Reach every device, on any network

+

Low-latency everywhere

Write your app once and connect it everywhere, with one API.

  • -
  • -
@@ -176,9 +161,6 @@ export default function Page() {

How are people using iroh?

-
- -
@@ -253,12 +235,20 @@ export default function Page() {
- {/* iroh protocols */} +
-

Modular toolkit

-

- Dozens of open-source, composable protocols built on top of iroh. Mix & match to get the feature set you need.

- +
+

+ Fast connections. +
+ Anywhere. +
+ Forever. +

+

+ The core peer-to-peer technology is open source and built on open standards, so you're never locked in: connect over our free community relays, self-host your own, let us run them for you, and switch between them whenever you want. +

+
{/* build in your language */} @@ -291,6 +281,14 @@ export default function Page() {
+ + {/* iroh protocols */} +
+

Modular toolkit

+

+ Dozens of open-source, composable protocols built on top of iroh. Mix & match to get the feature set you need.

+ +

From the Blog

From 76d90937c6011a3b162043e719de88daedc2b946 Mon Sep 17 00:00:00 2001 From: Rae McKelvey <633012+okdistribute@users.noreply.github.com> Date: Thu, 18 Jun 2026 11:49:43 -0700 Subject: [PATCH 5/8] Refine homepage logo strip and testimonial - Drop cloud-provider logos (AWS/Azure/Cloudflare) from the strip - Link language logos to their docs.iroh.computer/languages pages - Split languages and platforms onto separate rows - Give the testimonial section a light-mode variant Co-Authored-By: Claude Opus 4.8 (1M context) --- src/app/page.jsx | 90 ++++++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/src/app/page.jsx b/src/app/page.jsx index d6325065..3625dcc4 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -27,6 +27,45 @@ export const metadata = { 'less net work for networks', }; +const languages = [ + { name: 'Swift', file: 'Swift', href: 'https://docs.iroh.computer/languages/swift' }, + { name: 'Rust', file: 'Rust', href: 'https://docs.iroh.computer/languages/rust' }, + { name: 'JavaScript', file: 'JavaScript', href: 'https://docs.iroh.computer/languages/javascript' }, + { name: 'Kotlin', file: 'Kotlin', href: 'https://docs.iroh.computer/languages/kotlin' }, +]; + +const platforms = [ + { name: 'Raspberry Pi', file: 'RaspberryPi' }, + { name: 'Espressif', file: 'Espressif' }, + { name: 'Linux', file: 'Linux' }, + { name: 'Windows', file: 'Windows' }, + { name: 'Apple', file: 'Apple' }, + { name: 'Android', file: 'Android' }, +]; + +function PlatformLogo({ name, file, href }) { + const Wrapper = href ? 'a' : 'div'; + return ( + + + ); +} + export default function Page() { return (
@@ -70,58 +109,33 @@ export default function Page() { {/* connect between platforms */}
- {[ - { name: 'Swift', file: 'Swift' }, - { name: 'Rust', file: 'Rust' }, - { name: 'JavaScript', file: 'JavaScript' }, - { name: 'Kotlin', file: 'Kotlin' }, - { name: 'Raspberry Pi', file: 'RaspberryPi' }, - { name: 'Espressif', file: 'Espressif' }, - { name: 'Linux', file: 'Linux' }, - { name: 'Windows', file: 'Windows' }, - { name: 'Apple', file: 'Apple' }, - { name: 'Android', file: 'Android' }, - { name: 'Cloudflare', file: 'Cloudflare' }, - { name: 'AWS', file: 'AWS' }, - { name: 'Azure', file: 'Azure' }, - ].map(({ name, file }) => ( -
-
+ {languages.map((logo) => ( + + ))} +
+
+ {platforms.map((logo) => ( + ))}
-
+
-
+
-
+

“Doubling the network speed halves our compute budget.”

-
Ari Lotter
-
Ari Lotter
+ -
Principal Engineer at Nous
+
Principal Engineer at Nous
Read the Case Study
From 7794188225633b44c758bdf05b0d5e4ddfd7a0a3 Mon Sep 17 00:00:00 2001 From: Rae McKelvey <633012+okdistribute@users.noreply.github.com> Date: Thu, 18 Jun 2026 12:09:20 -0700 Subject: [PATCH 6/8] Color and tighten the homepage logo strip - Use full-color language logos for the languages row - Tint platform icons with their brand colors (Apple stays neutral) - Reduce the top spacing above the languages row Co-Authored-By: Claude Opus 4.8 (1M context) --- src/app/page.jsx | 55 ++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/app/page.jsx b/src/app/page.jsx index 3625dcc4..2b3fff0b 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -28,39 +28,44 @@ export const metadata = { }; const languages = [ - { name: 'Swift', file: 'Swift', href: 'https://docs.iroh.computer/languages/swift' }, - { name: 'Rust', file: 'Rust', href: 'https://docs.iroh.computer/languages/rust' }, - { name: 'JavaScript', file: 'JavaScript', href: 'https://docs.iroh.computer/languages/javascript' }, - { name: 'Kotlin', file: 'Kotlin', href: 'https://docs.iroh.computer/languages/kotlin' }, + { name: 'Swift', logo: logoSwift, href: 'https://docs.iroh.computer/languages/swift' }, + { name: 'Rust', logo: logoRust, href: 'https://docs.iroh.computer/languages/rust' }, + { name: 'JavaScript', logo: logoJavascript, href: 'https://docs.iroh.computer/languages/javascript' }, + { name: 'Kotlin', logo: logoKotlin, href: 'https://docs.iroh.computer/languages/kotlin' }, ]; const platforms = [ - { name: 'Raspberry Pi', file: 'RaspberryPi' }, - { name: 'Espressif', file: 'Espressif' }, - { name: 'Linux', file: 'Linux' }, - { name: 'Windows', file: 'Windows' }, + { name: 'Raspberry Pi', file: 'RaspberryPi', color: '#A22846' }, + { name: 'Espressif', file: 'Espressif', color: '#E7352C' }, + { name: 'Linux', file: 'Linux', color: '#FCC624' }, + { name: 'Windows', file: 'Windows', color: '#0078D4' }, { name: 'Apple', file: 'Apple' }, - { name: 'Android', file: 'Android' }, + { name: 'Android', file: 'Android', color: '#34A853' }, ]; -function PlatformLogo({ name, file, href }) { +function PlatformLogo({ name, file, href, color, logo }) { const Wrapper = href ? 'a' : 'div'; return ( - ); @@ -107,7 +112,7 @@ export default function Page() {
{/* connect between platforms */} -
+
{languages.map((logo) => ( From 0a81e505e222de26815a134a5ee9497436662838 Mon Sep 17 00:00:00 2001 From: Rae McKelvey <633012+okdistribute@users.noreply.github.com> Date: Thu, 18 Jun 2026 12:12:15 -0700 Subject: [PATCH 7/8] Use a readable Linux brand color in light mode #FCC624 was near-invisible on the light background (1.59:1 contrast); #B8860B reads clearly in both light and dark. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/app/page.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/page.jsx b/src/app/page.jsx index 2b3fff0b..cb2a527c 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -37,7 +37,7 @@ const languages = [ const platforms = [ { name: 'Raspberry Pi', file: 'RaspberryPi', color: '#A22846' }, { name: 'Espressif', file: 'Espressif', color: '#E7352C' }, - { name: 'Linux', file: 'Linux', color: '#FCC624' }, + { name: 'Linux', file: 'Linux', color: '#B8860B' }, { name: 'Windows', file: 'Windows', color: '#0078D4' }, { name: 'Apple', file: 'Apple' }, { name: 'Android', file: 'Android', color: '#34A853' }, From 6138191e54b86d7685f7538cef8cdd3cd9fcf6e3 Mon Sep 17 00:00:00 2001 From: Rae McKelvey <633012+okdistribute@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:08:02 -0700 Subject: [PATCH 8/8] Homepage redesign + dark mode Homepage: - Logo strip: link each logo (new tab), add Mesh LLM / Strada / Ottomatic, drop Holochain, muted labels, color language + platform logos - Reorder sections: real-world logos after hero, supported platforms as its own section, quote and "Open source. Forever." dark bands - Simplify hero copy; remove cloud-provider logos; add Python (strip, "Start building" logos, and a Python code tab) Dark mode: - Restore the theme toggle (top-right) and stop forcing light site-wide - Use black backgrounds across header, home, blog, and other page wrappers - Keep accent bands as dark navy so they read against the black - Keep the Read the Docs button bright purple Fixes: - Register python with shiki so the Python snippet renders - Blog dark-mode contrast (slate-toned muted text) - Point Paycode logo at paycode.com.mx Co-Authored-By: Claude Opus 4.8 (1M context) --- public/img/user-logos/meshllm.svg | 15 ++++ public/img/user-logos/ottomatic.png | Bin 0 -> 6144 bytes public/img/user-logos/strada.png | Bin 0 -> 1245 bytes src/app/blog/layout.jsx | 4 +- src/app/blog/page.jsx | 2 +- src/app/layout.jsx | 2 +- src/app/legal/page.jsx | 2 +- src/app/page.jsx | 115 ++++++++++++++---------- src/app/pricing/page.jsx | 2 +- src/app/providers.jsx | 2 +- src/app/services/enterprise/page.tsx | 2 +- src/app/services/hosting/page.jsx | 2 +- src/app/services/observability/page.jsx | 2 +- src/app/solutions/delta-chat/page.jsx | 2 +- src/app/solutions/iot/page.jsx | 2 +- src/app/solutions/nous/page.jsx | 2 +- src/app/solutions/page.jsx | 2 +- src/app/solutions/pos/page.jsx | 2 +- src/app/solutions/video/page.jsx | 4 +- src/components/BlogPostLayout.jsx | 4 +- src/components/CodeBlockTabs.jsx | 2 +- src/components/Header.jsx | 2 +- src/components/HeaderSparse.jsx | 8 +- src/components/home/LogoCloud.jsx | 56 +++++++----- 24 files changed, 141 insertions(+), 95 deletions(-) create mode 100644 public/img/user-logos/meshllm.svg create mode 100644 public/img/user-logos/ottomatic.png create mode 100644 public/img/user-logos/strada.png diff --git a/public/img/user-logos/meshllm.svg b/public/img/user-logos/meshllm.svg new file mode 100644 index 00000000..f5bf350c --- /dev/null +++ b/public/img/user-logos/meshllm.svg @@ -0,0 +1,15 @@ + + mesh-llm + + + + + + + + + + + mesh-llm + + diff --git a/public/img/user-logos/ottomatic.png b/public/img/user-logos/ottomatic.png new file mode 100644 index 0000000000000000000000000000000000000000..80958cd70c04ef709eff9a14728f2faee9606b11 GIT binary patch literal 6144 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 Sq;jhO0000zwtTZI9Am8V0;rR|2*L{0}@H z{;-+;*$}6i#_$(j!NJOi_GywW-y&F94IHaK63?PS^Y3tXkz&;);>z%F>Irr&=}q%V zbtNo3b*-3(a4?Kj;j5;@I2)nrah4W|P5Ha{c7AO(EY2(zl-Dm_myH9wSA8Eg*hNpmzU9+i{WRrM&dyv4rskM}m@JNGEN zW`Axu+@RU^6|3;-qk&^&Nwy;47pJcD*65kvKaOyn8t%FF`AEHy|kf2s86 zMxhkznuDaWvZNxsq>{y?0?(v!*rej&Pm)?E6{aVZ@h83XpuZhobVVfTg_@Mtk09%1 zEpZjW;Hs-_#glHyMHc}%=e0@Fljh&OEH1rdDppnFwO4Y - {children} +
+ {children} +
); } \ No newline at end of file diff --git a/src/app/blog/page.jsx b/src/app/blog/page.jsx index d7ccc646..d90496f7 100644 --- a/src/app/blog/page.jsx +++ b/src/app/blog/page.jsx @@ -50,7 +50,7 @@ export default async function ArticlesIndex() {

Blog

-

all things iroh & development

+

all things iroh & development

diff --git a/src/app/layout.jsx b/src/app/layout.jsx index 19dadc88..07e7bbcf 100644 --- a/src/app/layout.jsx +++ b/src/app/layout.jsx @@ -44,7 +44,7 @@ export default async function RootLayout({children}) { - +
diff --git a/src/app/legal/page.jsx b/src/app/legal/page.jsx index 0cb97277..6659c668 100644 --- a/src/app/legal/page.jsx +++ b/src/app/legal/page.jsx @@ -11,7 +11,7 @@ export default function LegalPage() {
-
+
{/* Hero */}
diff --git a/src/app/page.jsx b/src/app/page.jsx index cb2a527c..25128721 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -19,6 +19,7 @@ import logoRust from '@/images/language-logos/rust.svg'; 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 { CodeBlockTabs } from '@/components/CodeBlockTabs'; export const metadata = { @@ -32,6 +33,7 @@ const languages = [ { name: 'Rust', logo: logoRust, href: 'https://docs.iroh.computer/languages/rust' }, { 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' }, ]; const platforms = [ @@ -76,71 +78,51 @@ export default function Page() {
-
+
{/* hero */} -
+
- {/* readability scrim: opaque under the text, fading to reveal the grid */} -

IP addresses break, dial keys instead

-

-

-

-

-

-

- {/* connect between platforms */} -
-
- {languages.map((logo) => ( - - ))} -
-
- {platforms.map((logo) => ( - - ))} -
+ {/* real-world use */} +
+
-
+
-
+
-
+

“Doubling the network speed halves our compute budget.”

-
Ari Lotter
-
Ari Lotter
+ -
Principal Engineer at Nous
+
Principal Engineer at Nous
Read the Case Study
@@ -148,13 +130,27 @@ export default function Page() {
+ {/* supported platforms */} +
+ +
+ {languages.map((logo) => ( + + ))} +
+
+ {platforms.map((logo) => ( + + ))} +
+
+ {/* reach every device */}
-

Low-latency everywhere

-

Write your app once and connect it everywhere, with one API.

-
    +

    Built for environments where connectivity is unreliable or intermittent

    +
@@ -234,18 +230,18 @@ export default function Page() {
  • - - Monitor your App + + Get help from the pros
    @@ -255,16 +251,14 @@ export default function Page() {
    -
    -
    -

    - Fast connections. -
    - Anywhere. +

    +
    +

    + Open source.
    Forever.

    -

    +

    The core peer-to-peer technology is open source and built on open standards, so you're never locked in: connect over our free community relays, self-host your own, let us run them for you, and switch between them whenever you want.

    @@ -280,6 +274,7 @@ export default function Page() { { logo: logoRust, name: 'Rust' }, { logo: logoJavascript, name: 'JavaScript' }, { logo: logoKotlin, name: 'Kotlin' }, + { logo: logoPython, name: 'Python' }, ].map(({ logo, name }) => ( -
    +
    {/* Hero */}
    diff --git a/src/app/providers.jsx b/src/app/providers.jsx index d659167d..79bb19f5 100644 --- a/src/app/providers.jsx +++ b/src/app/providers.jsx @@ -7,7 +7,7 @@ export const AppContext = createContext({}) export function Providers({ children }) { return ( - + {children} ); diff --git a/src/app/services/enterprise/page.tsx b/src/app/services/enterprise/page.tsx index b5d68710..701d41c9 100644 --- a/src/app/services/enterprise/page.tsx +++ b/src/app/services/enterprise/page.tsx @@ -28,7 +28,7 @@ export default function EnterprisePage() {
    -
    +
    {/* Hero */}
    diff --git a/src/app/services/hosting/page.jsx b/src/app/services/hosting/page.jsx index 208395c3..80c0f9d1 100644 --- a/src/app/services/hosting/page.jsx +++ b/src/app/services/hosting/page.jsx @@ -17,7 +17,7 @@ export default function HostingPage() {
    -
    +
    {/* Hero Section */}
    diff --git a/src/app/services/observability/page.jsx b/src/app/services/observability/page.jsx index 29eface4..4d61a644 100644 --- a/src/app/services/observability/page.jsx +++ b/src/app/services/observability/page.jsx @@ -15,7 +15,7 @@ export default function MetricsPage() {
    -
    +
    {/* Hero Section */}
    diff --git a/src/app/solutions/delta-chat/page.jsx b/src/app/solutions/delta-chat/page.jsx index ae6003a4..9295f7d7 100644 --- a/src/app/solutions/delta-chat/page.jsx +++ b/src/app/solutions/delta-chat/page.jsx @@ -14,7 +14,7 @@ export default function DeltaChatSolutionPage() {
    -
    +
    {/* Hero Section */}
    {/* Background Logo */} diff --git a/src/app/solutions/iot/page.jsx b/src/app/solutions/iot/page.jsx index cbcc181d..0fbcffbf 100644 --- a/src/app/solutions/iot/page.jsx +++ b/src/app/solutions/iot/page.jsx @@ -58,7 +58,7 @@ export default function IoTUseCasePage() {
    -
    +
    {/* Hero */}
    diff --git a/src/app/solutions/nous/page.jsx b/src/app/solutions/nous/page.jsx index 4d42adef..58d41f79 100644 --- a/src/app/solutions/nous/page.jsx +++ b/src/app/solutions/nous/page.jsx @@ -15,7 +15,7 @@ export default function NousUseCasePage() {
    -
    +
    {/* Hero Section */}
    {/* Background Logo */} diff --git a/src/app/solutions/page.jsx b/src/app/solutions/page.jsx index 70b03c8d..49592118 100644 --- a/src/app/solutions/page.jsx +++ b/src/app/solutions/page.jsx @@ -57,7 +57,7 @@ export default function SolutionsPage() {
    -
    +
    {/* Hero Section */}
    diff --git a/src/app/solutions/pos/page.jsx b/src/app/solutions/pos/page.jsx index 77a5f6ba..5510dd58 100644 --- a/src/app/solutions/pos/page.jsx +++ b/src/app/solutions/pos/page.jsx @@ -18,7 +18,7 @@ export default function PaycodeUseCasePage() {
    -
    +
    {/* Hero Section */}
    diff --git a/src/app/solutions/video/page.jsx b/src/app/solutions/video/page.jsx index d89186ac..e567f42e 100644 --- a/src/app/solutions/video/page.jsx +++ b/src/app/solutions/video/page.jsx @@ -14,7 +14,7 @@ export default function VideoSolutionsPage() {
    -
    +
    {/* Hero Section */}
    {/* Background Logo */} @@ -132,7 +132,7 @@ export default function VideoSolutionsPage() {

    - “Media over QUIC has real legs. It works on mobile and handles packet loss so much better.” + “Media over QUIC has real legs. It works on mobile and handles packet loss so much better than WebRTC.”

    diff --git a/src/components/BlogPostLayout.jsx b/src/components/BlogPostLayout.jsx index 121e4fa1..d9865c36 100644 --- a/src/components/BlogPostLayout.jsx +++ b/src/components/BlogPostLayout.jsx @@ -28,7 +28,7 @@ export function BlogPostLayout({ article, references = [], children }) {

    {article.title}

    - + @@ -40,7 +40,7 @@ export function BlogPostLayout({ article, references = [], children }) { {references.length > 0 && ( )} -
    +
    Iroh is a dial-any-device networking library that just works. Compose from an ecosystem of ready-made protocols to get the features you need, or go fully custom on a clean abstraction over dumb pipes. Iroh is open source, and already running in production on hundreds of thousands of devices.
    To get started, take a look at our docs, dive directly into the code, or chat with us in our discord channel.
    diff --git a/src/components/CodeBlockTabs.jsx b/src/components/CodeBlockTabs.jsx index a7496fe6..53a6e3ef 100644 --- a/src/components/CodeBlockTabs.jsx +++ b/src/components/CodeBlockTabs.jsx @@ -12,7 +12,7 @@ export async function CodeBlockTabs({ snippets }) { highlighter ?? (await getHighlighter({ theme: 'css-variables', - langs: ['rust', 'swift', 'javascript', 'kotlin'], + langs: ['rust', 'swift', 'javascript', 'kotlin', 'python'], })); const rendered = snippets.map((snippet) => { diff --git a/src/components/Header.jsx b/src/components/Header.jsx index b86f300e..05a77fc9 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -98,7 +98,7 @@ export const Header = forwardRef(function Header({className, sidebar = []}, ref) className={clsx( className, 'fixed inset-x-0 top-[var(--v1-banner-height,0px)] z-50 flex h-14 items-center justify-between gap-12 px-4 transition sm:px-6 lg:left-72 lg:z-30 lg:px-8 xl:left-80', - 'bg-white dark:bg-zinc-900', + 'bg-white dark:bg-black', !isInsideMobileNavigation && 'backdrop-blur-sm dark:backdrop-blur lg:left-72 xl:left-80', )} diff --git a/src/components/HeaderSparse.jsx b/src/components/HeaderSparse.jsx index 6447e53f..5b2e35d0 100644 --- a/src/components/HeaderSparse.jsx +++ b/src/components/HeaderSparse.jsx @@ -6,6 +6,7 @@ import Link from 'next/link'; import {navItems} from '@/components/Header'; import GithubStars from './GithubStars'; import { Button } from './Button'; +import {ThemeToggle} from './ThemeToggle'; function TopLevelNavItem({ href, children }) { return ( @@ -100,7 +101,7 @@ export function HeaderSparse() { return (
    @@ -142,7 +146,7 @@ export function HeaderSparse() {
    {/* Mobile menu, show/hide based on menu state. */} -