diff --git a/packages/website/public/social-proof/aadtyn.jpg b/packages/website/public/social-proof/aadtyn.jpg new file mode 100644 index 000000000..2e5e63200 Binary files /dev/null and b/packages/website/public/social-proof/aadtyn.jpg differ diff --git a/packages/website/public/social-proof/amankumarjagdev.jpg b/packages/website/public/social-proof/amankumarjagdev.jpg new file mode 100644 index 000000000..d805409d6 Binary files /dev/null and b/packages/website/public/social-proof/amankumarjagdev.jpg differ diff --git a/packages/website/public/social-proof/arnoldgamboa.jpg b/packages/website/public/social-proof/arnoldgamboa.jpg new file mode 100644 index 000000000..5967fa8e8 Binary files /dev/null and b/packages/website/public/social-proof/arnoldgamboa.jpg differ diff --git a/packages/website/public/social-proof/bevstratov.jpg b/packages/website/public/social-proof/bevstratov.jpg new file mode 100644 index 000000000..ee9bced56 Binary files /dev/null and b/packages/website/public/social-proof/bevstratov.jpg differ diff --git a/packages/website/public/social-proof/ceeebeeebeee.jpg b/packages/website/public/social-proof/ceeebeeebeee.jpg new file mode 100644 index 000000000..fa98d1177 Binary files /dev/null and b/packages/website/public/social-proof/ceeebeeebeee.jpg differ diff --git a/packages/website/public/social-proof/dongnaebi.jpg b/packages/website/public/social-proof/dongnaebi.jpg new file mode 100644 index 000000000..c7797f691 Binary files /dev/null and b/packages/website/public/social-proof/dongnaebi.jpg differ diff --git a/packages/website/public/social-proof/erikksherman.jpg b/packages/website/public/social-proof/erikksherman.jpg new file mode 100644 index 000000000..15e0c73a8 Binary files /dev/null and b/packages/website/public/social-proof/erikksherman.jpg differ diff --git a/packages/website/public/social-proof/jasontorres.jpg b/packages/website/public/social-proof/jasontorres.jpg new file mode 100644 index 000000000..fa0f39de0 Binary files /dev/null and b/packages/website/public/social-proof/jasontorres.jpg differ diff --git a/packages/website/public/social-proof/tietougongshiba.jpg b/packages/website/public/social-proof/tietougongshiba.jpg new file mode 100644 index 000000000..8a493fc0c Binary files /dev/null and b/packages/website/public/social-proof/tietougongshiba.jpg differ diff --git a/packages/website/src/components/landing-page.tsx b/packages/website/src/components/landing-page.tsx index 0ca30f49d..78963b675 100644 --- a/packages/website/src/components/landing-page.tsx +++ b/packages/website/src/components/landing-page.tsx @@ -38,7 +38,7 @@ import { getDownloadOptions, useDetectedPlatform, AppleIcon, - AndroidIcon, + PlayStoreIcon, TerminalIcon, GlobeIcon, } from "~/downloads"; @@ -87,6 +87,7 @@ export function LandingPage({ title, subtitle }: LandingPageProps) {
+ @@ -129,6 +130,88 @@ const PI_BADGE_ICON = ; const FEATURED_AGENT_COUNT = 5; const ADDITIONAL_AGENT_COUNT = AGENT_PAGES.length - FEATURED_AGENT_COUNT; +const SOCIAL_PROOF_TWEETS = [ + { + name: "Cam", + handle: "@ceeebeeebeee", + date: "Apr 6, 2026", + avatar: "/social-proof/ceeebeeebeee.jpg", + url: "https://x.com/ceeebeeebeee/status/2041008798798864537", + text: "without a doubt the most slept on orchestrator right now. Open source, every OS, and a mobile experience that truly blew me away.", + }, + { + name: "Erik Sherman", + handle: "@erikksherman", + date: "Apr 11, 2026", + avatar: "/social-proof/erikksherman.jpg", + url: "https://x.com/erikksherman/status/2043011630590751008", + text: "control agents from anywhere - mac, phone, web. one simple change transformed my health while INCREASING productivity", + }, + { + name: "Aman Kumar Jagdev", + handle: "@amankumarjagdev", + date: "Apr 16, 2026", + avatar: "/social-proof/amankumarjagdev.jpg", + url: "https://x.com/amankumarjagdev/status/2044815258414674307", + text: "I have tried 100s of agent orchestrator, cli and gui. the best one i have found. Please give it a try! it's really good", + }, + { + name: "RUI", + handle: "@tietougongshiba", + date: "May 3, 2026", + avatar: "/social-proof/tietougongshiba.jpg", + url: "https://x.com/tietougongshiba/status/2050886374941925754", + text: "Being able to check and manage agent progress from my phone while I'm out is so convenient.", + }, + { + name: "Jason Torres", + handle: "@jasontorres", + date: "May 11, 2026", + avatar: "/social-proof/jasontorres.jpg", + url: "https://x.com/jasontorres/status/2053875385515790731", + text: "Can interchange between Codex, Claude Code, Opencode, Pi. Stable mobile and desktop apps connected through a secure relay from your VMs.", + }, + { + name: "A9", + handle: "@aadtyn", + date: "May 29, 2026", + avatar: "/social-proof/aadtyn.jpg", + url: "https://x.com/aadtyn/status/2060371229773803943", + text: "cross platform agent orchestration with inbuilt relay and tailscale / self host daemon options + the best UI ive seen in this segment", + }, + { + name: "boris evstratov", + handle: "@bevstratov", + date: "May 30, 2026", + avatar: "/social-proof/bevstratov.jpg", + url: "https://x.com/bevstratov/status/2060733983042781550", + text: "It’s an incredible piece of software. The last building block I needed to fully work from my phone. everything super smooth.", + }, + { + name: "Arnold Gamboa", + handle: "@arnoldgamboa", + date: "May 28, 2026", + avatar: "/social-proof/arnoldgamboa.jpg", + url: "https://x.com/arnoldgamboa/status/2059832028099436921", + text: "Paseo is a really good interface for Pi. It’s not the only thing it does, but that’s my current use case for now.", + }, + { + name: "Dong", + handle: "@dongnaebi", + date: "Apr 12, 2026", + avatar: "/social-proof/dongnaebi.jpg", + url: "https://x.com/dongnaebi/status/2043162391941398735", + text: "Paseo is the best software I've used this year. Absolutely amazing!", + }, +] as const; + +const SOCIAL_PROOF_ROWS = [ + { id: "top", tweets: SOCIAL_PROOF_TWEETS.slice(0, 5), reverse: false }, + { id: "bottom", tweets: SOCIAL_PROOF_TWEETS.slice(5), reverse: true }, +] as const; + +type SocialProofTweet = (typeof SOCIAL_PROOF_TWEETS)[number]; + function AgentBadge({ name, icon }: { name: string; icon: React.ReactNode }) { const [hovered, setHovered] = React.useState(false); const handleMouseEnter = React.useCallback(() => setHovered(true), []); @@ -173,17 +256,100 @@ function FeatureSection({ whileInView={FADE_IN} viewport={VIEWPORT_60} transition={EASE_OUT_05} - className="space-y-8" > -
-

{title}

-

{description}

-
+ {children} ); } +function SectionTitle({ title, description }: { title: string; description: string }) { + return ( +
+

{title}

+

{description}

+
+ ); +} + +function SocialProofWall() { + return ( + + + +
+ {SOCIAL_PROOF_ROWS.map((row) => ( + + ))} +
+
+ ); +} + +function SocialProofRow({ + tweets, + reverse, +}: { + tweets: readonly SocialProofTweet[]; + reverse: boolean; +}) { + return ( +
+
+
+ {tweets.map((tweet) => ( + + ))} +
+ +
+
+ ); +} + +function SocialProofCard({ tweet, inert }: { tweet: SocialProofTweet; inert?: boolean }) { + return ( + +
+
+ +

{tweet.handle}

+
+

+ {tweet.text} +

+
+
+ ); +} + function MultiProviderSection() { const providers = [ { name: "Claude Code", icon: }, @@ -198,19 +364,8 @@ function MultiProviderSection() { title="Use the best agent for the job" description="Run multiple providers from a single interface. Paseo runs the native agent harness as you'd normally run it, with your skills, config and MCP servers intact." > -
- {providers.slice(0, 3).map((p) => ( -
- {p.icon} - {p.name} -
- ))} -
-
- {providers.slice(3).map((p) => ( +
+ {providers.map((p) => (
- +
@@ -1422,7 +1577,7 @@ function CLISection() { title="Fully scriptable" description="Everything you can do in the app, you can do from the terminal." > -
+
{cliExamples.map((example, i) => ( -
+
{active.code}
diff --git a/packages/website/src/downloads.tsx b/packages/website/src/downloads.tsx index 0583ad46e..5f6bcbb65 100644 --- a/packages/website/src/downloads.tsx +++ b/packages/website/src/downloads.tsx @@ -120,6 +120,26 @@ export function AndroidIcon(props: React.SVGProps) { ); } +export function PlayStoreIcon(props: React.SVGProps) { + return ( + + ); +} + export function WindowsIcon(props: React.SVGProps) { return (