From 0d44178ad92e65c542510d4ad135cd2869a7da20 Mon Sep 17 00:00:00 2001 From: Benjamin Shafii Date: Thu, 18 Jun 2026 08:16:57 -0700 Subject: [PATCH 1/6] feat(landing): add /cloud page with conversational control demo - New /cloud route explaining the Cloud offering (control plane for shared skills, members, providers) with a looping chat animation showing the Cloud MCP inviting a teammate and sharing skills from plain English. - Mark hosted workers as 'Coming soon' and drop all 'always-on' messaging. - Slim the home page down to a teaser that links to /cloud instead of bouncing visitors straight to app.openworklabs.com. - Point nav + footer 'Cloud' links at the internal /cloud route. --- ee/apps/landing/app/cloud/page.tsx | 29 ++ .../components/landing-cloud-chat-demo.tsx | 172 ++++++++++++ .../components/landing-cloud-section.tsx | 33 +++ ee/apps/landing/components/landing-cloud.tsx | 256 ++++++++++++++++++ ee/apps/landing/components/landing-home.tsx | 29 ++ ee/apps/landing/components/site-footer.tsx | 9 +- ee/apps/landing/components/site-nav.tsx | 2 +- 7 files changed, 522 insertions(+), 8 deletions(-) create mode 100644 ee/apps/landing/app/cloud/page.tsx create mode 100644 ee/apps/landing/components/landing-cloud-chat-demo.tsx create mode 100644 ee/apps/landing/components/landing-cloud-section.tsx create mode 100644 ee/apps/landing/components/landing-cloud.tsx diff --git a/ee/apps/landing/app/cloud/page.tsx b/ee/apps/landing/app/cloud/page.tsx new file mode 100644 index 000000000..8be7c89cb --- /dev/null +++ b/ee/apps/landing/app/cloud/page.tsx @@ -0,0 +1,29 @@ +import { LandingCloud } from "../../components/landing-cloud"; +import { getGithubData } from "../../lib/github"; +import { baseOpenGraph } from "../../lib/seo"; + +export const metadata = { + title: "OpenWork Cloud — Control your team's AI workspace from a conversation", + description: + "OpenWork Cloud is the control plane for shared skills, plugins, members, and providers — runnable from plain English. Local-first by default, cloud-ready when your team needs it.", + alternates: { + canonical: "/cloud" + }, + openGraph: { + ...baseOpenGraph, + url: "https://openworklabs.com/cloud" + } +}; + +export default async function CloudPage() { + const github = await getGithubData(); + const cal = process.env.NEXT_PUBLIC_CAL_URL ?? ""; + + return ( + + ); +} diff --git a/ee/apps/landing/components/landing-cloud-chat-demo.tsx b/ee/apps/landing/components/landing-cloud-chat-demo.tsx new file mode 100644 index 000000000..4fb2aca22 --- /dev/null +++ b/ee/apps/landing/components/landing-cloud-chat-demo.tsx @@ -0,0 +1,172 @@ +"use client"; +import { AnimatePresence, motion } from "framer-motion"; +import { Check, Terminal, Wrench } from "lucide-react"; +import { useEffect, useState } from "react"; + +type Step = + | { kind: "user"; content: string } + | { kind: "tool"; name: string; result: string } + | { kind: "agent"; content: string }; + +const script: Step[] = [ + { kind: "user", content: "Hey, invite Omar to my team." }, + { + kind: "tool", + name: "invite_member", + result: "Invited omar@acme.com as Member" + }, + { + kind: "agent", + content: + "Done — Omar's been added to your team. He'll get an email to join the workspace." + }, + { + kind: "user", + content: + "Now let's add these skills I have on my computer and share them with him." + }, + { + kind: "tool", + name: "share_skills", + result: "Shared 3 skills · Meeting Brief, Contract Reviewer, Outreach CRM" + }, + { + kind: "agent", + content: + "Shared. Omar will see Meeting Brief, Contract Reviewer, and Outreach CRM in his workspace the moment he joins." + } +]; + +const STEP_MS = 1700; +const LOOP_PAUSE_MS = 4200; + +export function LandingCloudChatDemo() { + const [visible, setVisible] = useState(1); + + useEffect(() => { + let timer: ReturnType; + const total = script.length; + + const tick = (i: number) => { + if (i < total) { + setVisible(i + 1); + timer = setTimeout(() => tick(i + 1), STEP_MS); + } else { + timer = setTimeout(() => { + setVisible(0); + timer = setTimeout(() => tick(1), 500); + }, LOOP_PAUSE_MS); + } + }; + + tick(1); + return () => clearTimeout(timer); + }, []); + + return ( +
+ {/* App chrome */} +
+
+
+
+
+
+
+ + OpenWork Cloud Control +
+ + + + + + Live + +
+ + {/* Chat */} +
+ + {script.slice(0, visible).map((step, i) => { + if (step.kind === "user") { + return ( + + {step.content} + + ); + } + + if (step.kind === "tool") { + return ( + +
+ + + {step.name} + + +
+
+ {step.result} +
+
+ ); + } + + return ( + + {step.content} + + ); + })} +
+ + {visible < script.length ? ( + + + + + + ) : null} +
+ + {/* Composer */} +
+
+ + Ask anything about your Cloud… + + + Send + +
+
+
+ ); +} diff --git a/ee/apps/landing/components/landing-cloud-section.tsx b/ee/apps/landing/components/landing-cloud-section.tsx new file mode 100644 index 000000000..ca1f3b768 --- /dev/null +++ b/ee/apps/landing/components/landing-cloud-section.tsx @@ -0,0 +1,33 @@ +"use client"; +import { Cloud } from "lucide-react"; +import Link from "next/link"; + +export function LandingCloudSection() { + return ( +
+
+ + OpenWork Cloud +
+

+ Control your team's AI +
+ workspace from a conversation. +

+

+ OpenWork Cloud is the control plane for shared skills, plugins, + members, and providers — runnable from plain English. Local-first by + default, cloud-ready when your team needs it. +

+ +
+ + Explore Cloud + + + Local-first by default. Cloud when you need it. + +
+
+ ); +} diff --git a/ee/apps/landing/components/landing-cloud.tsx b/ee/apps/landing/components/landing-cloud.tsx new file mode 100644 index 000000000..065b2f3c4 --- /dev/null +++ b/ee/apps/landing/components/landing-cloud.tsx @@ -0,0 +1,256 @@ +"use client"; +import { + ArrowRight, + BrainCircuit, + Cloud, + PlugZap, + Send, + ShieldCheck, + Sparkles +} from "lucide-react"; +import { LandingBackground } from "./landing-background"; +import { LandingCloudChatDemo } from "./landing-cloud-chat-demo"; +import { SiteFooter } from "./site-footer"; +import { SiteNav } from "./site-nav"; + +type Props = { + stars: string; + downloadHref: string; + callHref: string; +}; + +const CLOUD_SIGNUP_URL = "https://app.openworklabs.com?mode=sign-up"; + +const externalLinkProps = (href: string) => + /^https?:\/\//.test(href) + ? { rel: "noreferrer", target: "_blank" as const } + : {}; + +function ComingSoonBadge() { + return ( + + + Coming soon + + ); +} + +const features = [ + { + icon: Cloud, + title: "Hosted workers", + comingSoon: true, + body: "Deploy a worker on sandboxed infrastructure, reachable from desktop, browser, or chat. Each workspace gets its own subdomain." + }, + { + icon: Send, + title: "Share & import", + body: "Package skills, MCPs, plugins, and configs into a single link. Teammates import the whole setup in one click — no terminal, no setup guide, no technical knowledge needed." + }, + { + icon: BrainCircuit, + title: "Managed models", + body: "Give every teammate instant model access. OpenWork Models hosts frontier open-source models for $10 a seat — no provider accounts, no key juggling, every member provisioned automatically." + }, + { + icon: PlugZap, + title: "Extension marketplace", + body: "Ship reusable skills, MCPs, and plugins to your team through a marketplace. Import from the built-in OpenWork Marketplace or any GitHub repo in a couple of clicks." + }, + { + icon: ShieldCheck, + title: "Org controls", + body: "SSO/SAML, SCIM provisioning, RBAC, and desktop policies. Decide which providers, models, and extensions your team can use — enforced automatically by the desktop app." + }, + { + icon: Sparkles, + title: "Cloud MCP", + body: "Talk to your Cloud org from any MCP client — or right inside OpenWork. Invite teammates, share skills, and manage your workspace from plain English." + } +]; + +const steps = [ + { + n: "01", + title: "Build locally", + body: "Create skills, MCPs, plugins, and configs in the desktop app. Test on your own files with your own keys." + }, + { + n: "02", + title: "Share to Cloud", + body: "Spin up a shared workspace or send a link. Your team imports the setup in one click — no setup guide required." + }, + { + n: "03", + title: "Run & govern", + body: "Manage members, providers, and policy from one dashboard — or just ask in plain English through the Cloud MCP." + } +]; + +export function LandingCloud(props: Props) { + const callLinkProps = externalLinkProps(props.callHref); + const primaryCtaHref = CLOUD_SIGNUP_URL; + const primaryCtaLabel = "Get Started for free"; + const primaryCtaLinkProps = externalLinkProps(primaryCtaHref); + + return ( +
+ + +
+
+ +
+ +
+ {/* Hero */} +
+
+
+
+ + OpenWork Cloud +
+

+ Control your team's AI workspace from a conversation. +

+

+ OpenWork Cloud is the control plane for shared skills, + plugins, members, and providers — and you can run it all from + plain English. Local-first by default, cloud-ready when your + team needs it. +

+ + +
+ +
+ +
+
+
+ + {/* Features */} +
+
+

+ Everything you get with Cloud. +

+

+ A complete control plane for team access, shared runtime state, + and reusable agent setups — on top of the open-source core. +

+
+ +
+ {features.map((feature) => { + const Icon = feature.icon; + return ( +
+
+
+ +
+ {feature.comingSoon ? : null} +
+

+ {feature.title} +

+

+ {feature.body} +

+
+ ); + })} +
+
+ + {/* How it works */} +
+
+

+ Local-first. Cloud-ready. +

+

+ Start on your machine. Move to the cloud when your team needs + shared setups or org-wide governance. +

+
+ +
+ {steps.map((step) => ( +
+
+ {step.n} +
+

+ {step.title} +

+

+ {step.body} +

+
+ ))} +
+
+ + {/* Closing CTA */} +
+

+ Start free. Upgrade when your team's ready. +

+

+ Run OpenWork locally for free, or spin up a shared cloud workspace + in minutes. No credit card to start. +

+ +
+ + +
+
+
+ ); +} diff --git a/ee/apps/landing/components/landing-home.tsx b/ee/apps/landing/components/landing-home.tsx index 52a63d5a7..ac439452e 100644 --- a/ee/apps/landing/components/landing-home.tsx +++ b/ee/apps/landing/components/landing-home.tsx @@ -5,6 +5,7 @@ import { useMemo, useRef, useState } from "react"; import { LandingAppDemoPanel } from "./landing-app-demo-panel"; import { LandingBackground } from "./landing-background"; +import { LandingCloudSection } from "./landing-cloud-section"; import { LandingCloudWorkersCard } from "./landing-cloud-workers-card"; import { defaultLandingDemoFlowId, @@ -416,8 +417,36 @@ export function LandingHome(props: Props) {
+ + +
+

+ Start free. Upgrade when your team's ready. +

+

+ Run OpenWork locally for free, or spin up a shared cloud workspace + in minutes. No credit card to start. +

+ +
+
diff --git a/ee/apps/landing/components/site-footer.tsx b/ee/apps/landing/components/site-footer.tsx index 5337528d2..f666f0a6d 100644 --- a/ee/apps/landing/components/site-footer.tsx +++ b/ee/apps/landing/components/site-footer.tsx @@ -27,14 +27,9 @@ export function SiteFooter() { Desktop - + Cloud - + Enterprise diff --git a/ee/apps/landing/components/site-nav.tsx b/ee/apps/landing/components/site-nav.tsx index 80ee5816a..0dcee52b4 100644 --- a/ee/apps/landing/components/site-nav.tsx +++ b/ee/apps/landing/components/site-nav.tsx @@ -34,7 +34,7 @@ export function SiteNav(props: Props) { { href: "/docs", label: "Docs", key: "docs", newTab: true }, { href: "/pricing", label: "Pricing", key: "pricing" }, { href: "/download", label: "Desktop", key: "download" }, - { href: "https://app.openworklabs.com", label: "Cloud", key: "cloud" }, + { href: "/cloud", label: "Cloud", key: "cloud" }, { href: "/enterprise", label: "Enterprise", key: "enterprise" } ] as const; From 68f8c661a98622b472bd74e20aba5269f486db61 Mon Sep 17 00:00:00 2001 From: Benjamin Shafii Date: Thu, 18 Jun 2026 11:02:39 -0700 Subject: [PATCH 2/6] feat(landing): introduce OpenWork Coworker with /coworker page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New /coworker page announcing OpenWork Coworker: design AI coworkers from the desktop chat, connect the tools that matter, and deploy to Slack, email, and beyond — no infra to host, no platform lock-in. - Auto-playing chat demo showing the full create → connect → deploy flow. - Problem framing (self-host vs locked-in SaaS) followed by the OpenWork way (design it your way, connect what matters, deploy from chat). - Beta CTA with note that OpenWork Models / Cloud teams get access first. - Home page teaser section linking to /coworker. --- ee/apps/landing/app/coworker/page.tsx | 29 ++ .../components/landing-coworker-chat-demo.tsx | 179 +++++++++++ .../components/landing-coworker-section.tsx | 35 +++ .../landing/components/landing-coworker.tsx | 291 ++++++++++++++++++ ee/apps/landing/components/landing-home.tsx | 3 + 5 files changed, 537 insertions(+) create mode 100644 ee/apps/landing/app/coworker/page.tsx create mode 100644 ee/apps/landing/components/landing-coworker-chat-demo.tsx create mode 100644 ee/apps/landing/components/landing-coworker-section.tsx create mode 100644 ee/apps/landing/components/landing-coworker.tsx diff --git a/ee/apps/landing/app/coworker/page.tsx b/ee/apps/landing/app/coworker/page.tsx new file mode 100644 index 000000000..be359e67a --- /dev/null +++ b/ee/apps/landing/app/coworker/page.tsx @@ -0,0 +1,29 @@ +import { LandingCoworker } from "../../components/landing-coworker"; +import { getGithubData } from "../../lib/github"; +import { baseOpenGraph } from "../../lib/seo"; + +export const metadata = { + title: "OpenWork Coworker — Design and deploy AI coworkers from chat", + description: + "Design a full AI coworker right from the OpenWork desktop chat, connect the tools that matter, and deploy to Slack, email, and beyond. Available in private beta.", + alternates: { + canonical: "/coworker" + }, + openGraph: { + ...baseOpenGraph, + url: "https://openworklabs.com/coworker" + } +}; + +export default async function CoworkerPage() { + const github = await getGithubData(); + const cal = process.env.NEXT_PUBLIC_CAL_URL ?? ""; + + return ( + + ); +} diff --git a/ee/apps/landing/components/landing-coworker-chat-demo.tsx b/ee/apps/landing/components/landing-coworker-chat-demo.tsx new file mode 100644 index 000000000..10a9c12c7 --- /dev/null +++ b/ee/apps/landing/components/landing-coworker-chat-demo.tsx @@ -0,0 +1,179 @@ +"use client"; +import { AnimatePresence, motion } from "framer-motion"; +import { Bot, Check, Rocket, Wrench } from "lucide-react"; +import { useEffect, useState } from "react"; + +type Step = + | { kind: "user"; content: string } + | { kind: "tool"; name: string; result: string } + | { kind: "agent"; content: string }; + +const script: Step[] = [ + { kind: "user", content: "Create a coworker for our sales team." }, + { + kind: "tool", + name: "create_coworker", + result: "Created coworker · Sales Assistant" + }, + { + kind: "agent", + content: + "Done. I've created a new coworker called Sales Assistant. Want to connect some tools to it?" + }, + { + kind: "user", + content: "Yes — connect it to Slack and HubSpot." + }, + { + kind: "tool", + name: "connect_tools", + result: "Connected Slack + HubSpot" + }, + { + kind: "agent", + content: + "Slack and HubSpot are connected. It can read your CRM, draft outreach, and post updates to your sales channel." + }, + { kind: "user", content: "Deploy it." }, + { + kind: "tool", + name: "deploy_coworker", + result: "Deployed · live in #sales" + }, + { + kind: "agent", + content: + "Sales Assistant is live. It's monitoring inbound leads and posting summaries to your #sales Slack channel now." + } +]; + +const STEP_MS = 1700; +const LOOP_PAUSE_MS = 4500; + +export function LandingCoworkerChatDemo() { + const [visible, setVisible] = useState(1); + + useEffect(() => { + let timer: ReturnType; + const total = script.length; + + const tick = (i: number) => { + if (i < total) { + setVisible(i + 1); + timer = setTimeout(() => tick(i + 1), STEP_MS); + } else { + timer = setTimeout(() => { + setVisible(0); + timer = setTimeout(() => tick(1), 500); + }, LOOP_PAUSE_MS); + } + }; + + tick(1); + return () => clearTimeout(timer); + }, []); + + return ( +
+ {/* App chrome */} +
+
+
+
+
+
+
+ + OpenWork · Coworker +
+ + + Private beta + +
+ + {/* Chat */} +
+ + {script.slice(0, visible).map((step, i) => { + if (step.kind === "user") { + return ( + + {step.content} + + ); + } + + if (step.kind === "tool") { + return ( + +
+ + + {step.name} + + +
+
+ {step.result} +
+
+ ); + } + + return ( + + {step.content} + + ); + })} +
+ + {visible < script.length ? ( + + + + + + ) : null} +
+ + {/* Composer */} +
+
+ + Design and deploy your coworker… + + + Send + +
+
+
+ ); +} diff --git a/ee/apps/landing/components/landing-coworker-section.tsx b/ee/apps/landing/components/landing-coworker-section.tsx new file mode 100644 index 000000000..646b4e363 --- /dev/null +++ b/ee/apps/landing/components/landing-coworker-section.tsx @@ -0,0 +1,35 @@ +"use client"; +import { ArrowRight, Bot, Rocket } from "lucide-react"; +import Link from "next/link"; + +export function LandingCoworkerSection() { + return ( +
+
+ + Introducing +
+

+ OpenWork Coworker. +
+ Design, connect, and deploy AI coworkers from chat. +

+

+ Build a full coworker experience right from the OpenWork desktop + interface, connect the tools that matter to you, and deploy it to Slack, + email, and beyond — without hosting infrastructure or surrendering + control. +

+ +
+ + Learn more + +
+ + Private beta +
+
+
+ ); +} diff --git a/ee/apps/landing/components/landing-coworker.tsx b/ee/apps/landing/components/landing-coworker.tsx new file mode 100644 index 000000000..6c3bfc2a9 --- /dev/null +++ b/ee/apps/landing/components/landing-coworker.tsx @@ -0,0 +1,291 @@ +"use client"; +import { motion } from "framer-motion"; +import { + ArrowRight, + Bot, + Mail, + MessageSquare, + Rocket, + Settings2, + Terminal, + Wrench, + X +} from "lucide-react"; +import { LandingBackground } from "./landing-background"; +import { LandingCoworkerChatDemo } from "./landing-coworker-chat-demo"; +import { SiteFooter } from "./site-footer"; +import { SiteNav } from "./site-nav"; + +type Props = { + stars: string; + downloadHref: string; + callHref: string; +}; + +const CLOUD_SIGNUP_URL = "https://app.openworklabs.com?mode=sign-up"; + +const externalLinkProps = (href: string) => + /^https?:\/\//.test(href) + ? { rel: "noreferrer", target: "_blank" as const } + : {}; + +const problemPaths = [ + { + label: "Option A · Self-host", + title: "Run the entire stack yourself", + body: "Provision servers, write code, maintain infrastructure, handle updates and downtime. You become the platform team.", + bad: true + }, + { + label: "Option B · Locked-in SaaS", + title: "Let the platform decide for you", + body: "Restricted tool selection, rigid workflows, and someone else's idea of how your team should work. It doesn't fit.", + bad: true + } +]; + +const ourWay = [ + { + icon: Settings2, + title: "Design it your way", + body: "Build the full coworker experience right from the OpenWork desktop chat. Pick the skills, MCPs, and tools that matter to you — no code, no infra." + }, + { + icon: Wrench, + title: "Connect what matters", + body: "Slack, HubSpot, Notion, email, your internal tools — anything with an MCP server. You choose the connections, not the platform." + }, + { + icon: Rocket, + title: "Deploy from chat", + body: "When it's ready, deploy straight from the conversation. Your coworker goes live on Slack, email, or wherever your team works." + } +]; + +const channels = [ + { name: "Slack", icon: MessageSquare, tone: "bg-gradient-to-br from-violet-400 to-purple-500" }, + { name: "Email", icon: Mail, tone: "bg-gradient-to-br from-sky-400 to-blue-500" }, + { name: "Telegram", icon: MessageSquare, tone: "bg-gradient-to-br from-amber-400 to-orange-400" } +]; + +export function LandingCoworker(props: Props) { + const callLinkProps = externalLinkProps(props.callHref); + const primaryCtaHref = CLOUD_SIGNUP_URL; + const primaryCtaLabel = "Join the private beta"; + const primaryCtaLinkProps = externalLinkProps(primaryCtaHref); + + return ( +
+ + +
+
+ +
+ +
+ {/* Hero */} +
+
+
+
+ + Introducing +
+

+ OpenWork Coworker +

+

+ Design a full AI coworker right from the OpenWork desktop chat, + connect the tools that matter to you, and deploy it to Slack, + email, and beyond — without hosting infrastructure or + surrendering control. +

+ +
+ + Available in private beta +
+ + + +

+ Teams using OpenWork Models or OpenWork Cloud get access first. +

+
+ +
+ +
+
+
+ + {/* The problem */} +
+
+

+ Teams deploying AI coworkers face two bad options. +

+

+ We talked to many teams who deploy AI coworkers onto Slack, + email, and beyond. They all hit the same wall. +

+
+ +
+ {problemPaths.map((path) => ( +
+
+ + {path.label} +
+

+ {path.title} +

+

+ {path.body} +

+
+ ))} +
+
+ + {/* Our way */} +
+
+
+ + The OpenWork way +
+

+ You design it. You connect it. You deploy it. +

+

+ All from the desktop chat interface. No infrastructure to host, + no platform making decisions for you. +

+
+ +
+ {ourWay.map((item, i) => { + const Icon = item.icon; + return ( + +
+ +
+

+ {item.title} +

+

+ {item.body} +

+
+ ); + })} +
+ + {/* Channels strip */} +
+
+ Deploy to where your team already works +
+
+ {channels.map((channel) => { + const Icon = channel.icon; + return ( +
+ + + + + {channel.name} + +
+ ); + })} +
+ + + + any MCP server + +
+
+
+
+ + {/* Beta CTA */} +
+
+ + Private beta · available now +
+

+ Be the first to get access. +

+

+ Sign up at openworklabs.com to join the private beta. Teams using + OpenWork Models or OpenWork Cloud get access first. +

+ +
+ + +
+
+
+ ); +} diff --git a/ee/apps/landing/components/landing-home.tsx b/ee/apps/landing/components/landing-home.tsx index ac439452e..19c849a3a 100644 --- a/ee/apps/landing/components/landing-home.tsx +++ b/ee/apps/landing/components/landing-home.tsx @@ -6,6 +6,7 @@ import { useMemo, useRef, useState } from "react"; import { LandingAppDemoPanel } from "./landing-app-demo-panel"; import { LandingBackground } from "./landing-background"; import { LandingCloudSection } from "./landing-cloud-section"; +import { LandingCoworkerSection } from "./landing-coworker-section"; import { LandingCloudWorkersCard } from "./landing-cloud-workers-card"; import { defaultLandingDemoFlowId, @@ -419,6 +420,8 @@ export function LandingHome(props: Props) { + +
From 812698713da0fa6bda6ad3a152070f007073b390 Mon Sep 17 00:00:00 2001 From: Benjamin Shafii Date: Thu, 18 Jun 2026 14:21:56 -0700 Subject: [PATCH 3/6] feat(landing): strengthen homepage conversion proof - Rework the homepage hero around outcome-driven copy, direct desktop download, and a zero-friction install snippet. - Add crawlable proof above the fold: GitHub stars, downloads, providers, YC, and real user logos/counts for Toyota, Lenovo, IBM, Tesla, Stanford, and MIT. - Add an OpenWork vs Claude Cowork comparison section for buyer-intent SEO/AEO. - Update homepage metadata, sitemap, and markdown responses for Cloud/Coworker discoverability. --- ee/apps/landing/app/page.tsx | 5 +- ee/apps/landing/app/sitemap.ts | 2 + ee/apps/landing/components/landing-home.tsx | 172 ++++++++++++++++++-- ee/apps/landing/lib/agent-markdown.ts | 49 +++++- ee/apps/landing/middleware.ts | 2 +- 5 files changed, 207 insertions(+), 23 deletions(-) diff --git a/ee/apps/landing/app/page.tsx b/ee/apps/landing/app/page.tsx index ad766a176..7bcdf5c69 100644 --- a/ee/apps/landing/app/page.tsx +++ b/ee/apps/landing/app/page.tsx @@ -6,6 +6,9 @@ import { homeFaq } from "../lib/faq"; import { baseOpenGraph } from "../lib/seo"; export const metadata = { + title: "OpenWork — Open-source Claude Cowork alternative", + description: + "Run AI agents on your own files with an open-source desktop app. OpenWork supports 50+ LLM providers, BYO keys, local-first files, and one-link team sharing.", alternates: { canonical: "/" }, @@ -20,7 +23,7 @@ const softwareApplicationSchema = { "@type": "SoftwareApplication", name: "OpenWork", description: - "Open source Claude Cowork alternative. Desktop app that lets teams use 50+ LLMs, bring their own provider keys, and ship reusable agent setups with guardrails.", + "Open-source Claude Cowork alternative. Desktop app that lets teams run AI agents on local files, use 50+ LLM providers with BYO keys, and share reusable agent setups in one link.", url: "https://openworklabs.com", applicationCategory: "BusinessApplication", operatingSystem: "macOS, Windows, Linux", diff --git a/ee/apps/landing/app/sitemap.ts b/ee/apps/landing/app/sitemap.ts index f5d835d0f..9632074f5 100644 --- a/ee/apps/landing/app/sitemap.ts +++ b/ee/apps/landing/app/sitemap.ts @@ -5,6 +5,8 @@ const BASE_URL = "https://openworklabs.com"; const paths: { path: string; priority: number }[] = [ { path: "/", priority: 1 }, { path: "/download", priority: 0.7 }, + { path: "/cloud", priority: 0.7 }, + { path: "/coworker", priority: 0.7 }, { path: "/enterprise", priority: 0.7 }, { path: "/pricing", priority: 0.7 }, { path: "/trust", priority: 0.7 }, diff --git a/ee/apps/landing/components/landing-home.tsx b/ee/apps/landing/components/landing-home.tsx index 19c849a3a..026b2e7cb 100644 --- a/ee/apps/landing/components/landing-home.tsx +++ b/ee/apps/landing/components/landing-home.tsx @@ -32,6 +32,44 @@ const externalLinkProps = (href: string) => : {}; const CLOUD_SIGNUP_URL = "https://app.openworklabs.com?mode=sign-up"; +const DOWNLOAD_SNIPPET = "open https://openworklabs.com/download"; + +const proofLogos = [ + { name: "Toyota", users: "4", src: "https://logo.clearbit.com/toyota.com" }, + { name: "Lenovo", users: "4", src: "https://logo.clearbit.com/lenovo.com" }, + { name: "IBM", users: "3", src: "https://logo.clearbit.com/ibm.com" }, + { name: "Tesla", users: "2", src: "https://logo.clearbit.com/tesla.com" }, + { name: "Stanford", users: "2", src: "https://logo.clearbit.com/stanford.edu" }, + { name: "MIT", users: "1", src: "https://logo.clearbit.com/mit.edu" } +]; + +const comparisonRows = [ + { + feature: "Source model", + openwork: "Open source desktop app", + claude: "Closed Anthropic product" + }, + { + feature: "Model choice", + openwork: "50+ LLM providers, including local models", + claude: "Claude only" + }, + { + feature: "Files and workspace", + openwork: "Local-first. Your files stay on your machine by default.", + claude: "Hosted workspace flow" + }, + { + feature: "Team sharing", + openwork: "Package skills, MCPs, plugins, and configs into one link", + claude: "Built around Anthropic's managed experience" + }, + { + feature: "Deployment control", + openwork: "Desktop, Cloud, or enterprise/self-hosted paths", + claude: "Anthropic-hosted" + } +]; export function LandingHome(props: Props) { const [activeDemoId, setActiveDemoId] = useState(defaultLandingDemoFlowId); @@ -48,8 +86,8 @@ export function LandingHome(props: Props) { ); const callLinkProps = externalLinkProps(props.callHref); - const primaryCtaHref = CLOUD_SIGNUP_URL; - const primaryCtaLabel = "Get Started for free"; + const primaryCtaHref = props.downloadHref; + const primaryCtaLabel = "Download free — no sign-in"; const primaryCtaLinkProps = externalLinkProps(primaryCtaHref); return ( @@ -71,17 +109,18 @@ export function LandingHome(props: Props) {

- The open source + Run AI agents on
- Claude Cowork + your own files —
- alternative. + open source.

- OpenWork is the desktop app that lets you use 50+ LLMs, bring your - own keys, and share your setups seamlessly with your team. + OpenWork is the free desktop app that runs 50+ LLM providers with + your own keys, keeps your files local by default, and lets your + whole team share agent setups in one link.

@@ -102,20 +141,61 @@ export function LandingHome(props: Props) {
-
- - Backed by - -
-
- Y +
+ +
+ + Try it + + + {DOWNLOAD_SNIPPET} + +
+ +
+ {[ + { value: props.stars, label: "GitHub stars" }, + { value: "~200k", label: "downloads" }, + { value: "50+", label: "LLM providers" }, + { value: "YC", label: "backed" } + ].map((stat) => ( +
+
+ {stat.value} +
+
+ {stat.label}
- - Combinator -
-
+ ))} +
+
+
+ Used by people at teams and universities including +
+
+ {proofLogos.map((logo) => ( +
+ {`${logo.name} +
+ {logo.users} {logo.users === "1" ? "user" : "users"} +
+
+ ))} +
@@ -215,6 +295,62 @@ export function LandingHome(props: Props) {
+
+
+
+ OpenWork vs Claude Cowork +
+

+ Built for teams that want control, not another locked-down AI workspace. +

+

+ Claude Cowork is a managed Anthropic experience. OpenWork is an + open-source desktop app for teams that want local files, model + choice, BYO keys, and shareable agent setups. +

+
+ +
+
+
Capability
+
OpenWork
+
Claude Cowork
+
+ {comparisonRows.map((row) => ( +
+
+ {row.feature} +
+
+ + ✓ + + {row.openwork} +
+
+ {row.claude} +
+
+ ))} +
+ + +
+
The open-source Claude Cowork alternative. OpenWork is a desktop app that lets teams chat with 50+ LLMs, bring their own provider keys, and ship reusable agent setups with guardrails. +> The open-source Claude Cowork alternative. OpenWork is a free desktop app that lets teams run AI agents on their own files, use 50+ LLM providers with their own keys, and share reusable agent setups in one link. ## What it is @@ -8,13 +8,16 @@ const home = `# OpenWork - Bring your own model and provider (OpenAI, Anthropic, local models, 50+ supported) - Skills, plugins, and MCP servers extend what the agent can do - Shared agent setups for teams, with policy and guardrails +- Local-first desktop mode keeps files on the user's machine by default - Free and open source ## Primary calls-to-action -- **Try it free** — [Get Started for free](https://app.openworklabs.com?mode=sign-up) +- **Download desktop** — [Download OpenWork](https://openworklabs.com/download) +- **Try Cloud** — [Get Started for free](https://app.openworklabs.com?mode=sign-up) - **Team plans** — [Pricing](https://openworklabs.com/pricing) (first 5 seats free, then \\$10 per seat/mo) -- **Sign in to the hosted workspace** — [Cloud](https://app.openworklabs.com) +- **Cloud control plane** — [Cloud](https://openworklabs.com/cloud) +- **Private beta** — [OpenWork Coworker](https://openworklabs.com/coworker) - **SSO / audit / procurement** — [Enterprise](https://openworklabs.com/enterprise) - **Docs** — [openworklabs.com/docs](https://openworklabs.com/docs) @@ -166,9 +169,49 @@ const trust = `# Trust & Security Omar McAdam — team+security@openworklabs.com ` +const cloud = `# OpenWork Cloud + +> The control plane for shared skills, plugins, members, providers, and team governance — local-first by default, cloud-ready when a team needs shared setup and access. + +## What Cloud adds + +- Shared skills, MCPs, plugins, and configs for teams +- Managed models through OpenWork Models +- Organization controls: members, roles, SSO/SAML, SCIM, provider policy, and desktop policies +- Cloud MCP: manage the organization from plain English in any MCP client +- Hosted workers are marked coming soon + +## CTA + +- [Get Started for free](https://app.openworklabs.com?mode=sign-up) +- [Contact sales](https://openworklabs.com/enterprise#book) +` + +const coworker = `# OpenWork Coworker + +> Private beta: design an AI coworker from the OpenWork desktop chat, connect the tools that matter, and deploy it to Slack, email, and beyond. + +## Why it exists + +Teams deploying AI coworkers today usually choose between hosting the whole infra themselves or using a locked-down SaaS that decides too much for them. + +## The OpenWork way + +- Design the coworker from desktop chat +- Connect skills, MCPs, Slack, email, HubSpot, Notion, and internal tools +- Deploy from the conversation without hosting your own infrastructure +- Teams using OpenWork Models or OpenWork Cloud get access first + +## CTA + +- [Join the private beta](https://app.openworklabs.com?mode=sign-up) +` + export const agentMarkdown: Record = { "/": home, "/pricing": pricing, + "/cloud": cloud, + "/coworker": coworker, "/enterprise": enterprise, "/download": download, "/trust": trust, diff --git a/ee/apps/landing/middleware.ts b/ee/apps/landing/middleware.ts index edd2d0fbe..cdc5ab4e6 100644 --- a/ee/apps/landing/middleware.ts +++ b/ee/apps/landing/middleware.ts @@ -2,7 +2,7 @@ import { NextResponse, type NextRequest } from "next/server" import { agentMarkdown } from "./lib/agent-markdown" export const config = { - matcher: ["/", "/pricing", "/enterprise", "/download", "/trust"], + matcher: ["/", "/pricing", "/cloud", "/coworker", "/enterprise", "/download", "/trust"], } export function middleware(request: NextRequest) { From 12b13541f5c93c61fe8c15c9dc6ed907f6b59855 Mon Sep 17 00:00:00 2001 From: Benjamin Shafii Date: Thu, 18 Jun 2026 14:27:26 -0700 Subject: [PATCH 4/6] fix(landing): replace heavy homepage proof with compact marquee --- ee/apps/landing/app/page.tsx | 5 +- ee/apps/landing/components/landing-home.tsx | 172 ++++---------------- 2 files changed, 31 insertions(+), 146 deletions(-) diff --git a/ee/apps/landing/app/page.tsx b/ee/apps/landing/app/page.tsx index 7bcdf5c69..ad766a176 100644 --- a/ee/apps/landing/app/page.tsx +++ b/ee/apps/landing/app/page.tsx @@ -6,9 +6,6 @@ import { homeFaq } from "../lib/faq"; import { baseOpenGraph } from "../lib/seo"; export const metadata = { - title: "OpenWork — Open-source Claude Cowork alternative", - description: - "Run AI agents on your own files with an open-source desktop app. OpenWork supports 50+ LLM providers, BYO keys, local-first files, and one-link team sharing.", alternates: { canonical: "/" }, @@ -23,7 +20,7 @@ const softwareApplicationSchema = { "@type": "SoftwareApplication", name: "OpenWork", description: - "Open-source Claude Cowork alternative. Desktop app that lets teams run AI agents on local files, use 50+ LLM providers with BYO keys, and share reusable agent setups in one link.", + "Open source Claude Cowork alternative. Desktop app that lets teams use 50+ LLMs, bring their own provider keys, and ship reusable agent setups with guardrails.", url: "https://openworklabs.com", applicationCategory: "BusinessApplication", operatingSystem: "macOS, Windows, Linux", diff --git a/ee/apps/landing/components/landing-home.tsx b/ee/apps/landing/components/landing-home.tsx index 026b2e7cb..b640c57ac 100644 --- a/ee/apps/landing/components/landing-home.tsx +++ b/ee/apps/landing/components/landing-home.tsx @@ -32,43 +32,14 @@ const externalLinkProps = (href: string) => : {}; const CLOUD_SIGNUP_URL = "https://app.openworklabs.com?mode=sign-up"; -const DOWNLOAD_SNIPPET = "open https://openworklabs.com/download"; const proofLogos = [ - { name: "Toyota", users: "4", src: "https://logo.clearbit.com/toyota.com" }, - { name: "Lenovo", users: "4", src: "https://logo.clearbit.com/lenovo.com" }, - { name: "IBM", users: "3", src: "https://logo.clearbit.com/ibm.com" }, - { name: "Tesla", users: "2", src: "https://logo.clearbit.com/tesla.com" }, - { name: "Stanford", users: "2", src: "https://logo.clearbit.com/stanford.edu" }, - { name: "MIT", users: "1", src: "https://logo.clearbit.com/mit.edu" } -]; - -const comparisonRows = [ - { - feature: "Source model", - openwork: "Open source desktop app", - claude: "Closed Anthropic product" - }, - { - feature: "Model choice", - openwork: "50+ LLM providers, including local models", - claude: "Claude only" - }, - { - feature: "Files and workspace", - openwork: "Local-first. Your files stay on your machine by default.", - claude: "Hosted workspace flow" - }, - { - feature: "Team sharing", - openwork: "Package skills, MCPs, plugins, and configs into one link", - claude: "Built around Anthropic's managed experience" - }, - { - feature: "Deployment control", - openwork: "Desktop, Cloud, or enterprise/self-hosted paths", - claude: "Anthropic-hosted" - } + { name: "Toyota", users: "4", src: "https://logo.clearbit.com/toyota.com", type: "Company" }, + { name: "Lenovo", users: "4", src: "https://logo.clearbit.com/lenovo.com", type: "Company" }, + { name: "IBM", users: "3", src: "https://logo.clearbit.com/ibm.com", type: "Company" }, + { name: "Tesla", users: "2", src: "https://logo.clearbit.com/tesla.com", type: "Company" }, + { name: "Stanford", users: "2", src: "https://logo.clearbit.com/stanford.edu", type: "University" }, + { name: "MIT", users: "1", src: "https://logo.clearbit.com/mit.edu", type: "University" } ]; export function LandingHome(props: Props) { @@ -86,8 +57,8 @@ export function LandingHome(props: Props) { ); const callLinkProps = externalLinkProps(props.callHref); - const primaryCtaHref = props.downloadHref; - const primaryCtaLabel = "Download free — no sign-in"; + const primaryCtaHref = CLOUD_SIGNUP_URL; + const primaryCtaLabel = "Get Started for free"; const primaryCtaLinkProps = externalLinkProps(primaryCtaHref); return ( @@ -109,18 +80,17 @@ export function LandingHome(props: Props) {

- Run AI agents on + The open source
- your own files — + Claude Cowork
- open source. + alternative.

- OpenWork is the free desktop app that runs 50+ LLM providers with - your own keys, keeps your files local by default, and lets your - whole team share agent setups in one link. + OpenWork is the desktop app that lets you use 50+ LLMs, bring your + own keys, and share your setups seamlessly with your team.

@@ -143,59 +113,33 @@ export function LandingHome(props: Props) {
-
- - Try it - - - {DOWNLOAD_SNIPPET} - -
- -
- {[ - { value: props.stars, label: "GitHub stars" }, - { value: "~200k", label: "downloads" }, - { value: "50+", label: "LLM providers" }, - { value: "YC", label: "backed" } - ].map((stat) => ( -
-
- {stat.value} -
-
- {stat.label} -
-
- ))} -
- -
-
- Used by people at teams and universities including +
+
+ Used by people at
-
- {proofLogos.map((logo) => ( + + {[...proofLogos, ...proofLogos].map((logo, index) => (
{`${logo.name} -
- {logo.users} {logo.users === "1" ? "user" : "users"} -
+ {logo.name} + {logo.users}
))} -
+
@@ -295,62 +239,6 @@ export function LandingHome(props: Props) {
-
-
-
- OpenWork vs Claude Cowork -
-

- Built for teams that want control, not another locked-down AI workspace. -

-

- Claude Cowork is a managed Anthropic experience. OpenWork is an - open-source desktop app for teams that want local files, model - choice, BYO keys, and shareable agent setups. -

-
- -
-
-
Capability
-
OpenWork
-
Claude Cowork
-
- {comparisonRows.map((row) => ( -
-
- {row.feature} -
-
- - ✓ - - {row.openwork} -
-
- {row.claude} -
-
- ))} -
- - -
-
Date: Thu, 18 Jun 2026 14:31:49 -0700 Subject: [PATCH 5/6] fix(landing): make proof marquee self-contained --- ee/apps/landing/components/landing-home.tsx | 41 ++++++++++----------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/ee/apps/landing/components/landing-home.tsx b/ee/apps/landing/components/landing-home.tsx index b640c57ac..7205d251b 100644 --- a/ee/apps/landing/components/landing-home.tsx +++ b/ee/apps/landing/components/landing-home.tsx @@ -34,12 +34,12 @@ const externalLinkProps = (href: string) => const CLOUD_SIGNUP_URL = "https://app.openworklabs.com?mode=sign-up"; const proofLogos = [ - { name: "Toyota", users: "4", src: "https://logo.clearbit.com/toyota.com", type: "Company" }, - { name: "Lenovo", users: "4", src: "https://logo.clearbit.com/lenovo.com", type: "Company" }, - { name: "IBM", users: "3", src: "https://logo.clearbit.com/ibm.com", type: "Company" }, - { name: "Tesla", users: "2", src: "https://logo.clearbit.com/tesla.com", type: "Company" }, - { name: "Stanford", users: "2", src: "https://logo.clearbit.com/stanford.edu", type: "University" }, - { name: "MIT", users: "1", src: "https://logo.clearbit.com/mit.edu", type: "University" } + { name: "Toyota", users: "4", className: "font-semibold tracking-[0.14em]" }, + { name: "Lenovo", users: "4", className: "font-semibold tracking-tight" }, + { name: "IBM", users: "3", className: "font-black tracking-[0.22em]" }, + { name: "Tesla", users: "2", className: "font-medium tracking-[0.28em]" }, + { name: "Stanford", users: "2", className: "font-serif font-semibold tracking-tight" }, + { name: "MIT", users: "1", className: "font-black tracking-[0.18em]" } ]; export function LandingHome(props: Props) { @@ -113,30 +113,29 @@ export function LandingHome(props: Props) {
-
-
- Used by people at +
+
+ Used by people at +
{[...proofLogos, ...proofLogos].map((logo, index) => (
- {`${logo.name} - {logo.name} - {logo.users} + + {logo.name} + + + {logo.users} +
))}
From f6c42618117e02d9b2ec25afd38248daa6e9533e Mon Sep 17 00:00:00 2001 From: Benjamin Shafii Date: Thu, 18 Jun 2026 14:38:08 -0700 Subject: [PATCH 6/6] fix(landing): use local logos only in proof marquee --- ee/apps/landing/components/landing-home.tsx | 26 +++++++++---------- ee/apps/landing/public/proof-logos/ibm.svg | 1 + ee/apps/landing/public/proof-logos/lenovo.svg | 1 + ee/apps/landing/public/proof-logos/mit.svg | 1 + .../landing/public/proof-logos/stanford.svg | 1 + ee/apps/landing/public/proof-logos/tesla.svg | 1 + ee/apps/landing/public/proof-logos/toyota.svg | 1 + 7 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 ee/apps/landing/public/proof-logos/ibm.svg create mode 100644 ee/apps/landing/public/proof-logos/lenovo.svg create mode 100644 ee/apps/landing/public/proof-logos/mit.svg create mode 100644 ee/apps/landing/public/proof-logos/stanford.svg create mode 100644 ee/apps/landing/public/proof-logos/tesla.svg create mode 100644 ee/apps/landing/public/proof-logos/toyota.svg diff --git a/ee/apps/landing/components/landing-home.tsx b/ee/apps/landing/components/landing-home.tsx index 7205d251b..95278b1f2 100644 --- a/ee/apps/landing/components/landing-home.tsx +++ b/ee/apps/landing/components/landing-home.tsx @@ -34,12 +34,12 @@ const externalLinkProps = (href: string) => const CLOUD_SIGNUP_URL = "https://app.openworklabs.com?mode=sign-up"; const proofLogos = [ - { name: "Toyota", users: "4", className: "font-semibold tracking-[0.14em]" }, - { name: "Lenovo", users: "4", className: "font-semibold tracking-tight" }, - { name: "IBM", users: "3", className: "font-black tracking-[0.22em]" }, - { name: "Tesla", users: "2", className: "font-medium tracking-[0.28em]" }, - { name: "Stanford", users: "2", className: "font-serif font-semibold tracking-tight" }, - { name: "MIT", users: "1", className: "font-black tracking-[0.18em]" } + { name: "Toyota", users: "4", src: "/proof-logos/toyota.svg", className: "h-6 w-16" }, + { name: "Lenovo", users: "4", src: "/proof-logos/lenovo.svg", className: "h-6 w-20" }, + { name: "IBM", users: "3", src: "/proof-logos/ibm.svg", className: "h-7 w-16" }, + { name: "Tesla", users: "2", src: "/proof-logos/tesla.svg", className: "h-7 w-10" }, + { name: "Stanford", users: "2", src: "/proof-logos/stanford.svg", className: "h-7 w-24" }, + { name: "MIT", users: "1", src: "/proof-logos/mit.svg", className: "h-7 w-16" } ]; export function LandingHome(props: Props) { @@ -127,15 +127,15 @@ export function LandingHome(props: Props) { {[...proofLogos, ...proofLogos].map((logo, index) => (
- - {logo.name} - - - {logo.users} - + {logo.name}
))} diff --git a/ee/apps/landing/public/proof-logos/ibm.svg b/ee/apps/landing/public/proof-logos/ibm.svg new file mode 100644 index 000000000..56ef21d23 --- /dev/null +++ b/ee/apps/landing/public/proof-logos/ibm.svg @@ -0,0 +1 @@ +IBMIBM diff --git a/ee/apps/landing/public/proof-logos/lenovo.svg b/ee/apps/landing/public/proof-logos/lenovo.svg new file mode 100644 index 000000000..e00ec07bb --- /dev/null +++ b/ee/apps/landing/public/proof-logos/lenovo.svg @@ -0,0 +1 @@ +Lenovo diff --git a/ee/apps/landing/public/proof-logos/mit.svg b/ee/apps/landing/public/proof-logos/mit.svg new file mode 100644 index 000000000..c82c185e4 --- /dev/null +++ b/ee/apps/landing/public/proof-logos/mit.svg @@ -0,0 +1 @@ +MIT diff --git a/ee/apps/landing/public/proof-logos/stanford.svg b/ee/apps/landing/public/proof-logos/stanford.svg new file mode 100644 index 000000000..18824fb1f --- /dev/null +++ b/ee/apps/landing/public/proof-logos/stanford.svg @@ -0,0 +1 @@ +StanfordStanford diff --git a/ee/apps/landing/public/proof-logos/tesla.svg b/ee/apps/landing/public/proof-logos/tesla.svg new file mode 100644 index 000000000..9f96c54f7 --- /dev/null +++ b/ee/apps/landing/public/proof-logos/tesla.svg @@ -0,0 +1 @@ +Tesla diff --git a/ee/apps/landing/public/proof-logos/toyota.svg b/ee/apps/landing/public/proof-logos/toyota.svg new file mode 100644 index 000000000..d28ec3d25 --- /dev/null +++ b/ee/apps/landing/public/proof-logos/toyota.svg @@ -0,0 +1 @@ +Toyota