fix(landing,den): clean up pricing copy, remove Windows from grid, add billing pricing to den, darker borders

This commit is contained in:
Benjamin Shafii
2026-04-01 15:25:32 -07:00
parent 4caf178048
commit 89d5aa152f
5 changed files with 37 additions and 42 deletions

View File

@@ -60,7 +60,7 @@ export function BillingDashboardScreen() {
? formatSubscriptionStatus(subscription.status)
: billingSummary?.hasActivePlan
? "Active"
: "Trial ready";
: "Purchase required";
const nextBillingDate = subscription?.currentPeriodEnd
? formatIsoDate(subscription.currentPeriodEnd)
: "Not available";
@@ -92,7 +92,7 @@ export function BillingDashboardScreen() {
<p className="text-[15px] text-gray-700">
{billingSummary?.hasActivePlan
? `This workspace's plan is currently ${statusLabel.toLowerCase()} and renews on ${nextBillingDate}.`
: "Start your OpenWork Cloud billing flow when your team is ready to share templates and cloud workflows."}
: "Workers are $50/month each. Purchase a worker to enable hosted launches for your team."}
</p>
</div>
@@ -184,6 +184,27 @@ export function BillingDashboardScreen() {
</div>
</div>
<div className="mb-6 rounded-[20px] border border-gray-100 bg-white p-8 shadow-[0_2px_12px_-4px_rgba(0,0,0,0.06)]">
<h2 className="mb-4 text-[15px] font-medium text-gray-900">Pricing</h2>
<div className="grid grid-cols-1 gap-4 md:grid-cols-3">
<div className="rounded-[16px] border border-gray-100 bg-gray-50 p-4">
<p className="mb-1 text-[12px] font-semibold uppercase tracking-wide text-gray-500">Solo</p>
<p className="text-[20px] font-semibold text-gray-900">$0</p>
<p className="mt-1 text-[13px] text-gray-500">Free forever · open source</p>
</div>
<div className="rounded-[16px] border border-gray-100 bg-gray-50 p-4">
<p className="mb-1 text-[12px] font-semibold uppercase tracking-wide text-gray-500">Cloud worker</p>
<p className="text-[20px] font-semibold text-gray-900">$50<span className="text-[13px] font-medium text-gray-500">/month</span></p>
<p className="mt-1 text-[13px] text-gray-500">Per worker · 5 seats included</p>
</div>
<div className="rounded-[16px] border border-gray-100 bg-gray-50 p-4">
<p className="mb-1 text-[12px] font-semibold uppercase tracking-wide text-gray-500">Enterprise</p>
<p className="text-[20px] font-semibold text-gray-900">Custom</p>
<p className="mt-1 text-[13px] text-gray-500">Windows included · talk to us</p>
</div>
</div>
</div>
<div className="flex items-center justify-between rounded-[20px] border border-gray-100 bg-white p-6 shadow-[0_2px_12px_-4px_rgba(0,0,0,0.06)]">
<div>
<h2 className="mb-1 text-[15px] font-medium text-gray-900">Invoices</h2>

View File

@@ -123,7 +123,7 @@ export default async function Download() {
Windows support $99/year
</h3>
<p className="mb-5 text-[14px] leading-7 text-gray-600">
Purchase through Polar, then we will send your Windows build link manually in phase one.
Purchase through Polar and we will send your Windows build link after checkout.
</p>
<div className="flex flex-wrap gap-3">
<a

View File

@@ -7,7 +7,7 @@ import { getGithubData } from "../../lib/github";
export const metadata = {
title: "OpenWork — Pricing",
description:
"Free solo desktop usage, annual Windows support, monthly cloud workers, and enterprise licensing."
"Free desktop app, cloud workers from $50/month, and enterprise licensing."
};
export default async function PricingPage() {
@@ -32,15 +32,9 @@ export default async function PricingPage() {
<main className="mx-auto flex w-full max-w-6xl flex-col gap-16 px-6 pb-24 md:gap-20 md:px-8 md:pb-28">
<section className="max-w-4xl pt-6 md:pt-10">
<div className="mb-4 inline-flex rounded-full border border-white/70 bg-white/80 px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.24em] text-slate-500 shadow-sm">
OpenWork pricing
</div>
<h1 className="mb-6 text-4xl font-medium leading-[1.05] tracking-tight md:text-5xl lg:text-6xl">
Pricing that keeps desktop free and makes paid access explicit.
Pricing
</h1>
<p className="max-w-3xl text-lg leading-relaxed text-slate-600 md:text-xl">
Start solo for free. Purchase Windows support when you need it. Add hosted workers when you want cloud runtime. Talk to us for enterprise licensing.
</p>
</section>
<PricingGrid windowsCheckoutUrl={windowsCheckoutUrl} callUrl={callUrl} />

View File

@@ -111,9 +111,9 @@ export function LandingHome(props: Props) {
<div className="mb-6 flex flex-wrap items-center gap-x-3 gap-y-2 text-[13px] font-medium text-gray-500 md:text-[14px]">
<span>Solo free forever</span>
<span aria-hidden="true"></span>
<span>Windows support $99/year</span>
<span aria-hidden="true"></span>
<span>Workers $50/month</span>
<span aria-hidden="true"></span>
<span>Enterprise talk to us</span>
</div>
<div className="mt-6 flex flex-col items-start gap-4 sm:flex-row sm:items-center">

View File

@@ -1,6 +1,6 @@
"use client";
import { ArrowUpRight, Cloud, Download, Monitor, Shield, CornerRightDown } from "lucide-react";
import { ArrowUpRight, Cloud, Download, Shield, CornerRightDown } from "lucide-react";
import { ResponsiveGrain } from "./responsive-grain";
type PricingGridProps = {
@@ -19,7 +19,6 @@ type PricingCard = {
external?: boolean;
features: Array<{ text: string; icon: typeof Download }>;
footer: string;
/** GrainGradient colors revealed on hover */
gradientColors: string[];
gradientBack: string;
gradientShape: "corners" | "wave" | "dots" | "truchet" | "ripple" | "blob" | "sphere";
@@ -42,7 +41,6 @@ function PricingCardView({ card }: { card: PricingCard }) {
shape={card.gradientShape}
speed={0.4}
/>
{/* Overlay for text contrast */}
<div className="absolute inset-0 bg-black/10 mix-blend-overlay" />
</div>
@@ -85,9 +83,9 @@ function PricingCardView({ card }: { card: PricingCard }) {
return (
<div
key={idx}
className="flex items-start gap-3 py-3 border-b border-dotted border-gray-200/80 last:border-0 text-[13px] text-gray-700 font-medium"
className="flex items-start gap-3 py-3 border-b border-dotted border-gray-400/40 last:border-0 text-[13px] text-gray-700 font-medium"
>
<Icon className="w-[18px] h-[18px] text-gray-600 shrink-0 mt-0.5" strokeWidth={1.5} />
<Icon className="w-[18px] h-[18px] text-gray-500 shrink-0 mt-0.5" strokeWidth={1.5} />
<span className="leading-snug">{feature.text}</span>
</div>
);
@@ -118,24 +116,6 @@ export function PricingGrid(props: PricingGridProps) {
{ text: "Bring your own keys", icon: Download },
],
footer: "Free forever",
gradientColors: ["#6B7280", "#374151", "#1F2937", "#111827"],
gradientBack: "#0F172A",
gradientShape: "sphere",
},
{
id: "windows-support",
title: "Windows",
price: "$99",
priceSub: "per year · 1 seat",
ctaLabel: "Purchase Windows",
href: props.windowsCheckoutUrl,
external: /^https?:\/\//.test(props.windowsCheckoutUrl),
features: [
{ text: "1 Windows seat", icon: Monitor },
{ text: "Binary access", icon: Monitor },
{ text: "1 year of updates", icon: Monitor },
],
footer: "Manual delivery in phase one",
gradientColors: ["#7C3AED", "#A855F7", "#6D28D9", "#4338CA"],
gradientBack: "#1E1B4B",
gradientShape: "wave",
@@ -149,11 +129,11 @@ export function PricingGrid(props: PricingGridProps) {
href: "https://app.openworklabs.com/checkout",
external: true,
features: [
{ text: "5 seats included", icon: Cloud },
{ text: "Hosted OpenWork worker", icon: Cloud },
{ text: "Monthly billing", icon: Cloud },
{ text: "$50 per additional worker", icon: Cloud },
],
footer: "5 seats included · workers disabled by default",
footer: "Workers disabled by default",
gradientColors: ["#2563EB", "#0284C7", "#0EA5E9", "#0F172A"],
gradientBack: "#0C1220",
gradientShape: "ripple",
@@ -162,7 +142,7 @@ export function PricingGrid(props: PricingGridProps) {
id: "enterprise-license",
title: "Enterprise",
price: "Custom pricing",
priceSub: "licensing",
priceSub: "",
isCustomPricing: true,
ctaLabel: "Talk to us",
href: props.callUrl,
@@ -189,16 +169,16 @@ export function PricingGrid(props: PricingGridProps) {
</div>
) : null}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 relative border-l border-t border-dotted border-gray-200/80">
<div className="grid grid-cols-1 md:grid-cols-3 relative border-l border-t border-dotted border-gray-400/50">
{cards.map((card) => (
<div key={card.id} className="p-6 border-r border-b border-dotted border-gray-200/80 flex flex-col h-full">
<div key={card.id} className="p-6 border-r border-b border-dotted border-gray-400/50 flex flex-col h-full">
<PricingCardView card={card} />
</div>
))}
</div>
<p className="text-center text-[12px] font-medium text-gray-500">
Prices exclude taxes. Windows delivery is manual in phase one.
Prices exclude taxes.
</p>
</section>
);