From dac8d93a85549084e028efb13cc792d799e279f4 Mon Sep 17 00:00:00 2001 From: b5 Date: Fri, 25 Apr 2025 09:45:28 +0200 Subject: [PATCH] feat: logo cloud --- public/img/user-logos/delta_chat.png | Bin 0 -> 4477 bytes public/img/user-logos/nous.png | Bin 0 -> 5708 bytes public/img/user-logos/rave.png | Bin 0 -> 2244 bytes public/img/user-logos/recall.png | Bin 0 -> 1945 bytes public/img/user-logos/shaga.png | Bin 0 -> 1040 bytes public/img/user-logos/spacedrive.png | Bin 0 -> 9600 bytes .../blog/a-new-direction-for-iroh/page.mdx | 3 +- src/app/page.jsx | 184 +++++++++++++++ src/app/page.mdx | 210 ------------------ src/app/proto/protocols.js | 9 + src/components/Libraries.jsx | 6 +- src/components/LogoCloud.jsx | 34 +++ src/images/{logos => language-logos}/go.svg | 0 .../{logos => language-logos}/kotlin.svg | 0 src/images/{logos => language-logos}/node.svg | 0 src/images/{logos => language-logos}/php.svg | 0 .../{logos => language-logos}/python.svg | 0 src/images/{logos => language-logos}/ruby.svg | 0 src/images/{logos => language-logos}/rust.svg | 0 .../{logos => language-logos}/swift.svg | 0 20 files changed, 229 insertions(+), 217 deletions(-) create mode 100644 public/img/user-logos/delta_chat.png create mode 100644 public/img/user-logos/nous.png create mode 100644 public/img/user-logos/rave.png create mode 100644 public/img/user-logos/recall.png create mode 100644 public/img/user-logos/shaga.png create mode 100644 public/img/user-logos/spacedrive.png create mode 100644 src/app/page.jsx delete mode 100644 src/app/page.mdx create mode 100644 src/components/LogoCloud.jsx rename src/images/{logos => language-logos}/go.svg (100%) rename src/images/{logos => language-logos}/kotlin.svg (100%) rename src/images/{logos => language-logos}/node.svg (100%) rename src/images/{logos => language-logos}/php.svg (100%) rename src/images/{logos => language-logos}/python.svg (100%) rename src/images/{logos => language-logos}/ruby.svg (100%) rename src/images/{logos => language-logos}/rust.svg (100%) rename src/images/{logos => language-logos}/swift.svg (100%) diff --git a/public/img/user-logos/delta_chat.png b/public/img/user-logos/delta_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..1c42062842bc7d0a04a969ac5055d08dbffdf325 GIT binary patch literal 4477 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 auZ1bEr^~sgY|`&n6!n{0%Ee0N{{I0~=kXc< literal 0 HcmV?d00001 diff --git a/public/img/user-logos/nous.png b/public/img/user-logos/nous.png new file mode 100644 index 0000000000000000000000000000000000000000..5aaa31bacffab415b88089904b72d7a05f9d75a2 GIT binary patch literal 5708 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 PxQ(;DyItcC=;Z$bYD08v literal 0 HcmV?d00001 diff --git a/public/img/user-logos/shaga.png b/public/img/user-logos/shaga.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbb96701c01ea3e5915607b606a80a652a5b377 GIT binary patch literal 1040 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1VASDY28w7rwp{|Gj01c^T-^(N=FVL@d-mcv zbC%4XKY#ArC3EI11+$j`#lh^Q^XD%IiUYZG=Pm}4O%sKu0ksR11o;IsG&md(_;4Y? zU_rnJg$WM|*mY$0F)%RKc)B=-RK&eGz{m+ydC1`RadEH&eSc-X|3PcnlOyb3}$-ipW<#$IrZ#*`>^IE$2 zcG={4YgnwUBDO>wT-9E#m7H$0WkV73>_-oG>^r^7bPeOO4NVN*mU)(SyIomzZeKq3 zxN!F2rujVG)0>|suo_2*E#GU`{&a)Pw8KRae5VsFb=sfK=aQXvc##}XXj9I@!_$_u zsvbEYB|SBbeYL38;l$X;)4xjh+pgKT{_2dv*dNTAn>o3R)(HO3jbk{SI`hDz7M8Ra zJ|Ai3>^E|(5of}zvJ!2Xf&~+HuF+0Bskk{QCM9CRDe=UUjMGm?txYr(3e%2wy>HjE zM8i!o({k5dNc?y^@u12n(KQK?vT6c2ohaL{Ezfm2@geJmnx)0e5ucqC zE6+-VZEF>^7nx?>lXz5~_w`4$h&Zid8>YR^zxPx1>WQ}Hr4fubtCkgS2urBCai~fo zaqX7y53Wz&%u}>nBhEW%wil=DjvzZmZS%4_YKJbpPiPXlCNgcqzW{-Cd{&&X1#4QS z&i?R_$ya_`z+1oFr<-=0@vb*n@MOcPgx0%PKU%Q#>ioXUwMppC*1YFj0X6m6k*wL- zk1SZG>Kwkzb~N+71Q-9;z%LRCS4{-cCM{*TFr{i+5$ozV8+dmVGSAfdb13NO_1-Vb tWi1qdIl)2T%Kxjpf?}*x%M}a^2N<7o@9*1k==oicp`NaOF6*2UngE58mJk2{ literal 0 HcmV?d00001 diff --git a/public/img/user-logos/spacedrive.png b/public/img/user-logos/spacedrive.png new file mode 100644 index 0000000000000000000000000000000000000000..6685a83184ff6cad895ed798e322ae8788619600 GIT binary patch literal 9600 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 Update (2022-02-23): This post originally read that we were "breaking from the IPFS spec", which isn't accurate. IPFS is a bunch of specs, and we're not breaking from all of them. Iroh is still an IPFS implementation: it continues to use CIDs. We've updated this post to reflect the change. Original text of this article can be found here. - \ No newline at end of file + diff --git a/src/app/page.jsx b/src/app/page.jsx new file mode 100644 index 00000000..32b4c92f --- /dev/null +++ b/src/app/page.jsx @@ -0,0 +1,184 @@ +import Image from 'next/image' +import Link from 'next/link' +import clsx from 'clsx' +import { BookOpenIcon, ArrowRightIcon } from '@heroicons/react/24/outline' + +import {FooterMarketing} from '@/components/FooterMarketing'; +import {HeaderSparse} from '@/components/HeaderSparse'; +import {HomeHero} from '@/components/HomeHero'; +import {UsersShowcase} from '@/components/UsersShowcase'; +import {FromTheBlog} from '@/components/FromTheBlog'; +import {WrenchCodeIcon} from '@/components/icons/WrenchCodeIcon'; +import {PerfChartIllustration} from '@/components/PerfChartIllustration'; +import {ConnectDevicesIllustration} from '@/components/ConnectDevicesIllustration'; +import {ProtocolHeroList} from '@/components/ProtocolHeroList'; +import {LogoCloud} from '@/components/LogoCloud'; + +import logoRust from '@/images/language-logos/rust.svg'; +import { Code, CodeGroup } from '@/components/Code'; + +export const metadata = { + title: 'Iroh', + description: + 'less net work for networks', +}; + +export default function Page() { + return ( +
+ + +
+
+ {/* hero */} +
+
+
+
+
+
+
+ +
+
+
+

+ p2p that just works +

+

Iroh is a library for building on direct connections between devices, putting more control in the hands of your users.

+ +
+
+
+
+ +
+
+ +

Connect any two devices on the planet

+

Iroh gives you an API for dialing by public key. You say “connect to that phone”, iroh will find & maintain the fastest connection for you, regardless of where it is.

+
+
+

“In stark contrast to other p2p & dweb technologies we've played with - which are exciting due to their implications for the future - Iroh brought instant gains in our present."

+

- weird.one

+
+
+ + + + {/* iroh protocols */} +
+
+
+

Compose your own tailor-made protocol stack

+

An ecosystem of ready-made, composable protocols are built on top of iroh.
Mix & match to get the feature set you need.

+
+ +
+
+ +
+
+ +

Build your own protocol

+

Don't see a protocol you need? Build your own! Iroh gives you a reliable foundation for building distributed systems that reach the edge. The rest is up to you.

+ + Protocol Docs + +
+
+ +

Continuously Measured

+

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

+ + Iroh Perf Site + +
+
+ + {/* use cases */} +
+
+
+
+
+
+
+

Real World Use

+

Iroh is running in production on hundreds of thousands of devices, on all major platforms.

+
+
+ +
+
+ + {/* build in your language */} +
+
+
+
+
+ +
+
+

Build something amazing, today.

+ + Start Building + +
+
+ + {`// a program that creates two endpoints & sends a ping between them +use anyhow::Result; +use iroh::{Endpoint, protocol::Router}; +use iroh_ping::{ALPN as PingALPN, Ping}; + +#[tokio::main] +async fn main() -> Result<()> { + // create the receive side + let recv_ep = Endpoint::builder().discovery_n0().bind().await?; + let recv_router = Router::builder(recv_ep) + .accept(PingALPN, Ping::new()) + .spawn(); + + let addr = recv_router.endpoint().node_addr().await?; + + // create a send side & send a ping + let send_ep = Endpoint::builder().discovery_n0().bind().await?; + let send_pinger = Ping::new(); + send_pinger.ping(&send_ep, addr).await?; + + // ok! + Ok(()) +}`} + + + +
+
+
+
+
+

From the Blog

+
+ +
+
+ +
+
+ ) +} diff --git a/src/app/page.mdx b/src/app/page.mdx deleted file mode 100644 index b56d1344..00000000 --- a/src/app/page.mdx +++ /dev/null @@ -1,210 +0,0 @@ -import Image from 'next/image' -import Link from 'next/link' -import clsx from 'clsx' -import { BookOpenIcon, ArrowRightIcon } from '@heroicons/react/24/outline' - -import {FooterMarketing} from '@/components/FooterMarketing'; -import {HeaderSparse} from '@/components/HeaderSparse'; -import {HomeHero} from '@/components/HomeHero'; -import {UsersShowcase} from '@/components/UsersShowcase'; -import {GlowCard} from '@/components/GlowCard'; -import {FromTheBlog} from '@/components/FromTheBlog'; -import {WrenchCodeIcon} from '@/components/icons/WrenchCodeIcon'; -import {PerfChartIllustration} from '@/components/PerfChartIllustration'; -import {ConnectDevicesIllustration} from '@/components/ConnectDevicesIllustration'; -import {ProtocolHeroList} from '@/components/ProtocolHeroList'; - -import logoRust from '@/images/logos/rust.svg'; - -export const metadata = { - title: 'Iroh', - description: - 'less net work for networks', -}; - - - -
-
- {/* hero */} -
-
-
-
-
-
-
- -
-
-
-

- p2p that just works -

-

Iroh is a library for building on direct connections between devices, putting more control in the hands of your users.

- -
-
-
-
- -
-
- -

Connect any two devices on the planet

-

Iroh gives you an API for dialing by public key. You say “connect to that phone”, iroh will find & maintain the fastest connection for you, regardless of where it is.

-
-
-

“In stark contrast to other p2p & dweb technologies we've played with - which are exciting due to their implications for the future - Iroh brought instant gains in our present."

-

- weird.one

-
-
- - {/* iroh protocols */} -
-
-
-

Compose your own tailor-made protocol stack

-

An ecosystem of ready-made, composable protocols are built on top of iroh.
Mix & match to get the feature set you need.

-
- -
-
- -
-
- -

Build your own protocol

-

Don't see a protocol you need? Build your own! Iroh gives you a reliable foundation for building distributed systems that reach the edge. The rest is up to you.

- - Protocol Docs - -
-
- -

Continuously Measured

-

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

- - Iroh Perf Site - -
-
- - {/* use cases */} -
-
-
-
-
-
-
-

Real World Use

-

Iroh is running in production on hundreds of thousands of devices, on all major platforms.

-
-
- -
-
- - {/* build in your language */} -
-
-
-
-
- -
-
-

Build something amazing, today.

- - Start Building - -
-
- - -```rust {{ title: 'rust' }} -use std::{env, str::FromStr}; - -use iroh::base::ticket::BlobTicket; -use iroh::node::Node; - -// serve & fetch data with iroh, from any two devices in the world -// run this example from any two computers, and iroh will connect them! -#[tokio::main] -async fn main() -> anyhow::Result<()> { - // create a new node with default protocols - let node = Node::memory().spawn().await?; - - // Choose between client & server roles based on a download argument - if let Some(ticket) = env::args().collect::>().get(1) { - // we have a download argument. Fetch some data! - let ticket = BlobTicket::from_str(&ticket).expect("failed to parse blob ticket"); - - let response = node - .blobs() - .download(ticket.hash(), ticket.node_addr().clone()) - .await? - .await - .expect("unable to download hash"); - - println!( - "downloaded {} bytes from node {}", - response.downloaded_size, - ticket.node_addr().node_id - ); - - let bytes = node.blobs().read_to_bytes(ticket.hash()).await?; - let s = std::str::from_utf8(&bytes).expect("unable to parse blob as as utf-8 string"); - println!("{s}"); - } else { - // no download argument, serve some data that says "Hello, world!" - let res = node.blobs().add_bytes("Hello, world!").await?; - - // create a "ticket" for sharing data with a peer - let ticket = node - .blobs() - .share(res.hash, res.format, Default::default()) - .await?; - - // print the ticket, containing all the above information - println!("Serving data! In another terminal, run:"); - println!("cargo run --example hello {}", ticket); - tokio::signal::ctrl_c().await?; - node.shutdown().await?; - } - - Ok(()) -} - -``` - - - - - -
-
-
-
-
-

From the Blog

-
- -
-
- -
diff --git a/src/app/proto/protocols.js b/src/app/proto/protocols.js index 48954141..956b765e 100644 --- a/src/app/proto/protocols.js +++ b/src/app/proto/protocols.js @@ -37,5 +37,14 @@ export const protocols = [ "documentation": "https://docs.rs/iroh-roq/latest/iroh_roq/", "repository": "https://github.com/n0-computer/iroh-roq", "version": "v0.1.0" + }, + { + "icon": "", + "title": "Godot iroh", + "tagline": "A peer-to-peer multiplayer extension for Godot based on Iroh.", + "slug": "godot-iroh", + "documentation": "https://godotengine.org/asset-library/asset/3948", + "repository": "https://github.com/tipragot/godot-iroh", + "version": "v0.1.5" } ] diff --git a/src/components/Libraries.jsx b/src/components/Libraries.jsx index 15d7a07f..961d5a45 100644 --- a/src/components/Libraries.jsx +++ b/src/components/Libraries.jsx @@ -3,11 +3,7 @@ import { ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid' import {Button} from '@/components/Button'; import {Heading} from '@/components/Heading'; -import logoKotlin from '@/images/logos/kotlin.svg'; -import logoPython from '@/images/logos/python.svg'; -import logoRust from '@/images/logos/rust.svg'; -import logoSwift from '@/images/logos/swift.svg'; -import logoNodeJs from '@/images/logos/node.svg'; +import logoRust from '@/images/language-logos/rust.svg'; import { Tag } from '@/components/Tag'; const libraries = [ diff --git a/src/components/LogoCloud.jsx b/src/components/LogoCloud.jsx new file mode 100644 index 00000000..fed5dc59 --- /dev/null +++ b/src/components/LogoCloud.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import {ThemeImage} from '@/components/ThemeImage' + +const companies = [ + "spacedrive", + "nous", + "shaga", + "rave", + "delta_chat", + "recall" +]; + +export function LogoCloud() { + return ( +
+
+

Trusted by the world’s most innovative teams

+
+
+ {companies.map((co)=> ( + + ))} +
+
+ ) +} diff --git a/src/images/logos/go.svg b/src/images/language-logos/go.svg similarity index 100% rename from src/images/logos/go.svg rename to src/images/language-logos/go.svg diff --git a/src/images/logos/kotlin.svg b/src/images/language-logos/kotlin.svg similarity index 100% rename from src/images/logos/kotlin.svg rename to src/images/language-logos/kotlin.svg diff --git a/src/images/logos/node.svg b/src/images/language-logos/node.svg similarity index 100% rename from src/images/logos/node.svg rename to src/images/language-logos/node.svg diff --git a/src/images/logos/php.svg b/src/images/language-logos/php.svg similarity index 100% rename from src/images/logos/php.svg rename to src/images/language-logos/php.svg diff --git a/src/images/logos/python.svg b/src/images/language-logos/python.svg similarity index 100% rename from src/images/logos/python.svg rename to src/images/language-logos/python.svg diff --git a/src/images/logos/ruby.svg b/src/images/language-logos/ruby.svg similarity index 100% rename from src/images/logos/ruby.svg rename to src/images/language-logos/ruby.svg diff --git a/src/images/logos/rust.svg b/src/images/language-logos/rust.svg similarity index 100% rename from src/images/logos/rust.svg rename to src/images/language-logos/rust.svg diff --git a/src/images/logos/swift.svg b/src/images/language-logos/swift.svg similarity index 100% rename from src/images/logos/swift.svg rename to src/images/language-logos/swift.svg