diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index 7c76ad4b..3693af08 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -106,10 +106,6 @@ jobs: os_type: linux target: aarch64-unknown-linux-gnu args: "--target aarch64-unknown-linux-gnu --bundles deb,rpm" - - platform: windows-2022 - os_type: windows - target: x86_64-pc-windows-msvc - args: "--target x86_64-pc-windows-msvc --bundles msi" steps: - name: Log runner selection @@ -202,9 +198,6 @@ jobs: aarch64-unknown-linux-gnu) opencode_asset="opencode-linux-arm64.tar.gz" ;; - x86_64-pc-windows-msvc) - opencode_asset="opencode-windows-x64-baseline.zip" - ;; *) echo "Unsupported target: ${{ matrix.target }}" exit 1 @@ -243,9 +236,6 @@ jobs: fi target_name="opencode-${{ matrix.target }}" - if [ "${{ matrix.os_type }}" = "windows" ]; then - target_name="${target_name}.exe" - fi mkdir -p apps/desktop/src-tauri/sidecars cp "$bin_path" "apps/desktop/src-tauri/sidecars/${target_name}" diff --git a/.github/workflows/release-macos-aarch64.yml b/.github/workflows/release-macos-aarch64.yml index 5dd8644a..33c3fa98 100644 --- a/.github/workflows/release-macos-aarch64.yml +++ b/.github/workflows/release-macos-aarch64.yml @@ -275,10 +275,6 @@ jobs: os_type: linux target: aarch64-unknown-linux-gnu args: "--target aarch64-unknown-linux-gnu --bundles deb,rpm" - - platform: windows-2022 - os_type: windows - target: x86_64-pc-windows-msvc - args: "--target x86_64-pc-windows-msvc --bundles msi" steps: - name: Log runner selection @@ -290,11 +286,6 @@ jobs: RUNNER_LABEL: ${{ vars.OPENWORK_LINUX_X64_RUNNER_LABEL }} EFFECTIVE_RUNS_ON: ${{ matrix.target == 'x86_64-unknown-linux-gnu' && vars.OPENWORK_LINUX_X64_RUNNER_LABEL != '' && vars.OPENWORK_LINUX_X64_RUNNER_LABEL || matrix.platform }} - - name: Enable git long paths (Windows) - if: matrix.os_type == 'windows' - shell: pwsh - run: git config --global core.longpaths true - - name: Checkout uses: actions/checkout@v4 with: @@ -404,9 +395,6 @@ jobs: aarch64-unknown-linux-gnu) opencode_asset="opencode-linux-arm64.tar.gz" ;; - x86_64-pc-windows-msvc) - opencode_asset="opencode-windows-x64-baseline.zip" - ;; *) echo "Unsupported target: ${{ matrix.target }}" >&2 exit 1 @@ -445,9 +433,6 @@ jobs: fi target_name="opencode-${{ matrix.target }}" - if [ "${{ matrix.os_type }}" = "windows" ]; then - target_name="${target_name}.exe" - fi mkdir -p apps/desktop/src-tauri/sidecars cp "$bin_path" "apps/desktop/src-tauri/sidecars/${target_name}" diff --git a/ee/apps/den-api/src/billing/polar.ts b/ee/apps/den-api/src/billing/polar.ts index 3ee1f2be..d202a6f3 100644 --- a/ee/apps/den-api/src/billing/polar.ts +++ b/ee/apps/den-api/src/billing/polar.ts @@ -74,9 +74,6 @@ type PolarProduct = { prices?: PolarProductPrice[] } -const CHECKOUT_TRIAL_INTERVAL = "day" -const CHECKOUT_TRIAL_INTERVAL_COUNT = 14 - export type CloudWorkerAccess = | { allowed: true @@ -194,9 +191,6 @@ function assertPaywallConfig() { if (!env.polar.productId) { throw new Error("POLAR_PRODUCT_ID is required when POLAR_FEATURE_GATE_ENABLED=true") } - if (!env.polar.benefitId) { - throw new Error("POLAR_BENEFIT_ID is required when POLAR_FEATURE_GATE_ENABLED=true") - } if (!env.polar.successUrl) { throw new Error("POLAR_SUCCESS_URL is required when POLAR_FEATURE_GATE_ENABLED=true") } @@ -290,9 +284,6 @@ async function createCheckoutSession(input: CloudAccessInput): Promise { products: [env.polar.productId], success_url: env.polar.successUrl, return_url: env.polar.returnUrl, - allow_trial: true, - trial_interval: CHECKOUT_TRIAL_INTERVAL, - trial_interval_count: CHECKOUT_TRIAL_INTERVAL_COUNT, external_customer_id: input.userId, customer_email: input.email, customer_name: input.name, diff --git a/ee/apps/den-web/app/(den)/_components/checkout-screen.tsx b/ee/apps/den-web/app/(den)/_components/checkout-screen.tsx index 65b1e934..2fc483be 100644 --- a/ee/apps/den-web/app/(den)/_components/checkout-screen.tsx +++ b/ee/apps/den-web/app/(den)/_components/checkout-screen.tsx @@ -10,10 +10,9 @@ import { useDenFlow } from "../_providers/den-flow-provider"; // Enable with: NEXT_PUBLIC_DEN_MOCK_BILLING=1 const MOCK_BILLING = process.env.NEXT_PUBLIC_DEN_MOCK_BILLING === "1"; const MOCK_CHECKOUT_URL = (process.env.NEXT_PUBLIC_DEN_MOCK_CHECKOUT_URL ?? "").trim() || null; -const TRIAL_DAYS = 14; function formatSubscriptionStatus(value: string | null | undefined) { - if (!value) return "Trial ready"; + if (!value) return "Purchase required"; return value .split(/[_\s]+/) .filter(Boolean) @@ -60,9 +59,9 @@ export function CheckoutScreen({ customerSessionToken }: { customerSessionToken: featureGateEnabled: true, hasActivePlan: false, checkoutRequired: true, - checkoutUrl: MOCK_CHECKOUT_URL, - portalUrl: null, - price: { amount: 5000, currency: "usd", recurringInterval: "month", recurringIntervalCount: 1 }, + checkoutUrl: MOCK_CHECKOUT_URL, + portalUrl: null, + price: { amount: 5000, currency: "usd", recurringInterval: "month", recurringIntervalCount: 1 }, subscription: null, invoices: [], productId: null, @@ -175,16 +174,16 @@ export function CheckoutScreen({ customerSessionToken }: { customerSessionToken:

OpenWork Cloud

-

Provision shared setups for your team.

+

Purchase worker access before launch.

- Share your setup across your org, launch background agents in alpha, and prepare for team-wide provider provisioning. + Workers are disabled by default. Add one hosted OpenWork worker for $50/month, then launch it from your dashboard.

{checkoutHref ? ( - Start free trial + Purchase worker — $50/month ) : ( )} @@ -202,9 +201,9 @@ export function CheckoutScreen({ customerSessionToken }: { customerSessionToken:
- {TRIAL_DAYS}-day free trial + $50/month per worker - {planAmountLabel} after trial + {planAmountLabel} billed monthly {user?.email ?? "Signed in"}
@@ -280,7 +279,7 @@ export function CheckoutScreen({ customerSessionToken }: { customerSessionToken:

Billing status

{subscriptionStatus}

- {billingSummary.hasActivePlan ? "Your Cloud plan is active." : `${TRIAL_DAYS}-day free trial before billing starts.`} + {billingSummary.hasActivePlan ? "Your worker billing is active." : "Purchase a worker to enable hosted launches."}

@@ -304,7 +303,7 @@ export function CheckoutScreen({ customerSessionToken }: { customerSessionToken:
{checkoutHref && !billingSummary.hasActivePlan ? ( - Start free trial + Purchase worker ) : null} {billingSummary.portalUrl ? ( @@ -329,7 +328,7 @@ export function CheckoutScreen({ customerSessionToken }: { customerSessionToken: ) : null} Invoices {billingSummary.invoices.length > 0 ? `(${billingSummary.invoices.length})` : ""} - Cancel anytime + Monthly billing
diff --git a/ee/apps/den-web/app/(den)/_components/dashboard-screen.tsx b/ee/apps/den-web/app/(den)/_components/dashboard-screen.tsx index bd2670e2..1ecf7e9e 100644 --- a/ee/apps/den-web/app/(den)/_components/dashboard-screen.tsx +++ b/ee/apps/den-web/app/(den)/_components/dashboard-screen.tsx @@ -557,8 +557,8 @@ export function DashboardScreen({ showSidebar = true }: { showSidebar?: boolean

{billingSummary?.featureGateEnabled ? billingSummary.hasActivePlan - ? "Your account has an active OpenWork Cloud plan." - : "Your account needs billing before the next launch." + ? "Your account has active worker billing." + : "Workers stay disabled until you purchase one for $50/month." : "Billing gates are disabled in this environment."}

No workers yet

-

Create your first worker to unlock connection details and runtime controls.

+

Purchase your first worker to unlock connection details and runtime controls.

+ + Purchase worker billing +
)} @@ -653,14 +659,14 @@ export function DashboardScreen({ showSidebar = true }: { showSidebar?: boolean {workersBusy ?

Loading workers...

: null} {workersError ?

{workersError}

: null} - {workers.length === 0 && !workersBusy ?

No workers yet. Create one to get started.

: null} + {workers.length === 0 && !workersBusy ?

No workers yet. Purchase one to get started.

: null}
Signed in as {user.email}
{billingSummary?.featureGateEnabled && !billingSummary.hasActivePlan - ? "Billing required before the next launch." + ? "Purchase required before the next launch." : `${ownedWorkerCount} worker${ownedWorkerCount === 1 ? "" : "s"} in your account.`}
diff --git a/ee/apps/den-web/app/(den)/_providers/den-flow-provider.tsx b/ee/apps/den-web/app/(den)/_providers/den-flow-provider.tsx index 6f444030..9ca62a29 100644 --- a/ee/apps/den-web/app/(den)/_providers/den-flow-provider.tsx +++ b/ee/apps/den-web/app/(den)/_providers/den-flow-provider.tsx @@ -1299,7 +1299,7 @@ export function DenFlowProvider({ children }: { children: ReactNode }) { setLaunchBusy(true); setLaunchError(null); setCheckoutUrl(null); - setLaunchStatus(options.source === "signup_auto" ? "Creating your first worker..." : "Checking subscription and launch eligibility..."); + setLaunchStatus(options.source === "signup_auto" ? "Creating your first worker..." : "Checking worker billing and launch eligibility..."); appendEvent("info", "Launch requested", resolvedLaunchName); try { diff --git a/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_components/billing-dashboard-screen.tsx b/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_components/billing-dashboard-screen.tsx index 8f773862..6df307d1 100644 --- a/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_components/billing-dashboard-screen.tsx +++ b/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_components/billing-dashboard-screen.tsx @@ -144,7 +144,7 @@ export function BillingDashboardScreen() { rel="noreferrer" className="rounded-full bg-gray-900 px-5 py-2.5 text-[14px] font-medium text-white transition-colors hover:bg-gray-800" > - Start free trial + Purchase worker ) : null} diff --git a/ee/apps/landing/README.md b/ee/apps/landing/README.md index 323a3cc0..f57dc807 100644 --- a/ee/apps/landing/README.md +++ b/ee/apps/landing/README.md @@ -11,6 +11,7 @@ - `NEXT_PUBLIC_CAL_URL` - enterprise booking link - `NEXT_PUBLIC_DEN_CHECKOUT_URL` - Polar checkout URL for the Den preorder CTA +- `NEXT_PUBLIC_WINDOWS_CHECKOUT_URL` - Polar checkout URL for the Windows support plan CTA - `LOOPS_API_KEY` - Loops API key for feedback/contact submissions - `LOOPS_TRANSACTIONAL_ID_APP_FEEDBACK` - Loops transactional template ID for app feedback emails - `LOOPS_INTERNAL_FEEDBACK_EMAIL` - optional override for the internal feedback recipient (defaults to `team@openworklabs.com`) diff --git a/ee/apps/landing/app/download/page.tsx b/ee/apps/landing/app/download/page.tsx index c1ec01f1..dad9d3db 100644 --- a/ee/apps/landing/app/download/page.tsx +++ b/ee/apps/landing/app/download/page.tsx @@ -5,13 +5,16 @@ import { getGithubData } from "../../lib/github"; export const metadata = { title: "OpenWork - Download", description: - "Download OpenWork desktop for macOS, Windows, and Linux. Includes AUR install instructions and direct package downloads.", + "Download OpenWork desktop for macOS and Linux, or purchase Windows support for binary access and updates.", }; export default async function Download() { const github = await getGithubData(); const releaseLabel = github.releaseTag || "latest"; const releaseUrl = github.releaseUrl; + const windowsCheckoutUrl = + process.env.NEXT_PUBLIC_WINDOWS_CHECKOUT_URL || "/pricing#windows-support"; + const windowsCheckoutExternal = /^https?:\/\//.test(windowsCheckoutUrl); return (
@@ -60,7 +63,7 @@ export default async function Download() { className="feature-card border-violet-100 bg-violet-50/50 transition hover:border-violet-200" >

Windows

-

x64 MSI installer

+

$99/year support plan with manual build delivery

Windows

- OpenWork for Windows is available as an x64 MSI installer. + Windows access is sold as an annual support plan. It includes one seat, + Windows binary access, and one year of updates.

-
- Download Windows x64 (.msi) - + +
+

+ Windows support — $99/year +

+

+ Purchase through Polar, then we will send your Windows build link manually in phase one. +

+
+ + Purchase Windows support + + + See pricing details + +
+

diff --git a/ee/apps/landing/app/enterprise/page.tsx b/ee/apps/landing/app/enterprise/page.tsx index dedc911f..47163f41 100644 --- a/ee/apps/landing/app/enterprise/page.tsx +++ b/ee/apps/landing/app/enterprise/page.tsx @@ -3,7 +3,7 @@ import { getGithubData } from "../../lib/github"; export const metadata = { title: "OpenWork — Enterprise", - description: "Secure hosting for safe, permissioned AI employees." + description: "Enterprise OpenWork licensing with deployment support, rollout help, and included Windows support." }; export default async function Enterprise() { diff --git a/ee/apps/landing/app/page.tsx b/ee/apps/landing/app/page.tsx index f4e95ac0..00061240 100644 --- a/ee/apps/landing/app/page.tsx +++ b/ee/apps/landing/app/page.tsx @@ -5,6 +5,8 @@ import { headers } from "next/headers"; export default async function Home() { const github = await getGithubData(); const cal = process.env.NEXT_PUBLIC_CAL_URL || "/enterprise#book"; + const windowsCheckoutUrl = + process.env.NEXT_PUBLIC_WINDOWS_CHECKOUT_URL || "/download#windows-support"; const userAgent = headers().get("user-agent")?.toLowerCase() || ""; const isMobileVisitor = /android|iphone|ipad|ipod|mobile/.test(userAgent); @@ -13,6 +15,7 @@ export default async function Home() { stars={github.stars} downloadHref={github.downloads.macos} callHref={cal} + windowsCheckoutUrl={windowsCheckoutUrl} isMobileVisitor={isMobileVisitor} /> ); diff --git a/ee/apps/landing/app/pricing/page.tsx b/ee/apps/landing/app/pricing/page.tsx new file mode 100644 index 00000000..cb5deb07 --- /dev/null +++ b/ee/apps/landing/app/pricing/page.tsx @@ -0,0 +1,53 @@ +import { LandingBackground } from "../../components/landing-background"; +import { PricingGrid } from "../../components/pricing-grid"; +import { SiteFooter } from "../../components/site-footer"; +import { SiteNav } from "../../components/site-nav"; +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." +}; + +export default async function PricingPage() { + const github = await getGithubData(); + const callUrl = process.env.NEXT_PUBLIC_CAL_URL || "/enterprise#book"; + const windowsCheckoutUrl = + process.env.NEXT_PUBLIC_WINDOWS_CHECKOUT_URL || "/download#windows-support"; + + return ( +
+ + +
+
+ +
+ +
+
+
+ OpenWork pricing +
+

+ Pricing that keeps desktop free and makes paid access explicit. +

+

+ 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. +

+
+ + + + +
+
+
+ ); +} diff --git a/ee/apps/landing/components/landing-enterprise.tsx b/ee/apps/landing/components/landing-enterprise.tsx index b98201d8..516cbd1b 100644 --- a/ee/apps/landing/components/landing-enterprise.tsx +++ b/ee/apps/landing/components/landing-enterprise.tsx @@ -71,7 +71,8 @@ export function LandingEnterprise(props: Props) { Run agentic workflows through your existing gateway, with approved tools, clear permissions, and a rollout path your non-technical teams can actually use, whether you self-host in - your own infrastructure or deploy with OpenWork. + your own infrastructure or deploy with OpenWork. Enterprise + licensing includes Windows support.

@@ -185,7 +186,8 @@ export function LandingEnterprise(props: Props) {

Deploy inside your own environment or work with us on a managed rollout, with your gateway, MCP servers, skills, and - internal data sources connected. + internal data sources connected. Windows support is included in + enterprise licensing.

diff --git a/ee/apps/landing/components/landing-home.tsx b/ee/apps/landing/components/landing-home.tsx index 2f99b43b..f44b90a3 100644 --- a/ee/apps/landing/components/landing-home.tsx +++ b/ee/apps/landing/components/landing-home.tsx @@ -11,6 +11,7 @@ import { landingDemoFlows, landingDemoFlowTimes } from "./landing-demo-flows"; +import { PricingGrid } from "./pricing-grid"; import { LandingSharePackageCard } from "./landing-share-package-card"; import { SiteFooter } from "./site-footer"; import { SiteNav } from "./site-nav"; @@ -20,6 +21,7 @@ type Props = { stars: string; downloadHref: string; callHref: string; + windowsCheckoutUrl: string; isMobileVisitor: boolean; }; @@ -70,8 +72,6 @@ export function LandingHome(props: Props) { [activeDemoId] ); - const downloadLinkProps = externalLinkProps(props.downloadHref); - const callLinkProps = externalLinkProps(props.callHref); const primaryCtaHref = props.isMobileVisitor ? "https://app.openworklabs.com" : "/download"; @@ -108,6 +108,14 @@ export function LandingHome(props: Props) { own keys, and share your setups seamlessly with your team.

+
+ Solo free forever + + Windows support $99/year + + Workers $50/month +
+
- Contact sales + See pricing
@@ -247,8 +254,8 @@ export function LandingHome(props: Props) {

Local AI worker

- Start free on desktop with no signup, then automate email, Slack, - and the work you do every day. + Start free on desktop forever with macOS and Linux downloads, + then automate email, Slack, and the work you do every day.

Learn more @@ -262,8 +269,8 @@ export function LandingHome(props: Props) {

Hosted sandboxed workers

- Share your setup with your team and run your local setup in the - cloud. + Workers are disabled by default. Purchase one for $50/month when + you need hosted runtime.

Learn more @@ -277,8 +284,8 @@ export function LandingHome(props: Props) {

Safe workflow sharing

- Deploy on your infrastructure. Full audit trails, admin controls, - and data that never leaves your network. + Deploy on your infrastructure. Enterprise licensing includes + Windows support plus rollout guidance.

Learn more @@ -286,6 +293,14 @@ export function LandingHome(props: Props) {
+
+ +
+
diff --git a/ee/apps/landing/components/pricing-grid.tsx b/ee/apps/landing/components/pricing-grid.tsx new file mode 100644 index 00000000..81e7e093 --- /dev/null +++ b/ee/apps/landing/components/pricing-grid.tsx @@ -0,0 +1,222 @@ +import { ArrowUpRight, Cloud, Download, Monitor, Shield } from "lucide-react"; + +type PricingGridProps = { + windowsCheckoutUrl: string; + callUrl: string; + showHeader?: boolean; +}; + +type PricingCard = { + id: string; + eyebrow: string; + title: string; + price: string; + priceSub: string; + description: string; + ctaLabel: string; + href: string; + external?: boolean; + features: string[]; + footer: string; + icon: typeof Download; + accent: string; +}; + +function PricingAction(props: { href: string; label: string; external?: boolean }) { + return ( + + {props.label} + + + ); +} + +function PricingCardView(card: PricingCard) { + const Icon = card.icon; + + return ( +
+
+ +
+
+
+
+
+ {card.eyebrow} +
+

+ {card.title} +

+
+
+ +
+
+ +
+ + {card.price} + + + {card.priceSub} + +
+ +

+ {card.description} +

+ +
+ +
+
+ +
+
+ Included +
+ +
+ {card.features.map((feature) => ( +
+ {feature} +
+ ))} +
+ +
+ {card.footer} +
+
+
+
+ ); +} + +export function PricingGrid(props: PricingGridProps) { + const cards: PricingCard[] = [ + { + id: "solo", + eyebrow: "Solo", + title: "Free forever", + price: "$0", + priceSub: "open source", + description: + "Start on desktop for free with macOS and Linux downloads, local models, and bring-your-own-provider workflows.", + ctaLabel: "Download free", + href: "/download", + features: [ + "Open source desktop app", + "macOS and Linux downloads", + "Bring your own keys and local models" + ], + footer: "Best for individual builders and local-first workflows.", + icon: Download, + accent: "linear-gradient(135deg, #4b5563 0%, #111827 100%)" + }, + { + id: "windows-support", + eyebrow: "Windows", + title: "Windows support", + price: "$99", + priceSub: "per year · 1 seat", + description: + "Annual Windows access includes the binary plus one year of updates. In phase one we send the build link manually after purchase.", + ctaLabel: "Purchase Windows support", + href: props.windowsCheckoutUrl, + external: /^https?:\/\//.test(props.windowsCheckoutUrl), + features: [ + "1 Windows seat", + "Binary access", + "1 year of updates" + ], + footer: "Manual fulfillment first, hosted delivery later.", + icon: Monitor, + accent: "linear-gradient(135deg, #7c3aed 0%, #1f2937 100%)" + }, + { + id: "cloud-workers", + eyebrow: "Cloud workers", + title: "One worker at a time", + price: "$50", + priceSub: "per month · per worker", + description: + "Workers stay disabled by default. Buy worker access when you want a hosted OpenWork worker for your account.", + ctaLabel: "Purchase worker", + href: "https://app.openworklabs.com/checkout", + external: true, + features: [ + "Hosted OpenWork worker", + "Monthly billing", + "Purchase required before launch" + ], + footer: "Designed for cloud usage without forcing hosted billing on solo desktop users.", + icon: Cloud, + accent: "linear-gradient(135deg, #2563eb 0%, #0f172a 100%)" + }, + { + id: "enterprise-license", + eyebrow: "Enterprise", + title: "Talk to us", + price: "Custom", + priceSub: "licensing", + description: + "Enterprise licensing includes Windows support, rollout help, and managed or self-hosted deployment paths for larger teams.", + ctaLabel: "Talk to us", + href: props.callUrl, + external: /^https?:\/\//.test(props.callUrl), + features: [ + "Includes Windows support", + "Deployment and rollout guidance", + "Custom commercial terms" + ], + footer: "Use this when you need org-wide rollout, controls, or custom terms.", + icon: Shield, + accent: "linear-gradient(135deg, #fb923c 0%, #111827 100%)" + } + ]; + + return ( +
+ {props.showHeader !== false ? ( +
+
+
+ Pricing +
+

+ Gray by default. Clear when you hover. +

+
+

+ Solo stays free forever. Windows is annual. Cloud workers are monthly. Enterprise starts with a conversation. +

+
+ ) : null} + +
+ {cards.map((card) => ( + + ))} +
+ +

+ Prices exclude taxes. Windows delivery is manual in phase one. +

+
+ ); +} diff --git a/ee/apps/landing/components/site-footer.tsx b/ee/apps/landing/components/site-footer.tsx index 8616cd54..c8af0b38 100644 --- a/ee/apps/landing/components/site-footer.tsx +++ b/ee/apps/landing/components/site-footer.tsx @@ -21,6 +21,9 @@ export function SiteFooter() { Docs + + Pricing + Desktop diff --git a/ee/apps/landing/components/site-nav.tsx b/ee/apps/landing/components/site-nav.tsx index 7fd772a9..d0d85c2f 100644 --- a/ee/apps/landing/components/site-nav.tsx +++ b/ee/apps/landing/components/site-nav.tsx @@ -11,7 +11,7 @@ type Props = { downloadHref?: string; mobilePrimaryHref?: string; mobilePrimaryLabel?: string; - active?: "home" | "download" | "enterprise" | "den" | "docs"; + active?: "home" | "pricing" | "download" | "enterprise" | "den" | "docs"; }; export function SiteNav(props: Props) { @@ -33,6 +33,7 @@ export function SiteNav(props: Props) { const mobilePrimaryExternal = /^https?:\/\//.test(mobilePrimaryHref); const navItems = [ { href: "/docs", label: "Docs", key: "docs" }, + { href: "/pricing", label: "Pricing", key: "pricing" }, { href: "/download", label: "Desktop", key: "download" }, { href: "https://app.openworklabs.com", label: "Cloud", key: "den" }, { href: "/enterprise", label: "Enterprise", key: "enterprise" } diff --git a/ee/apps/landing/lib/github.ts b/ee/apps/landing/lib/github.ts index b91a8650..78da6521 100644 --- a/ee/apps/landing/lib/github.ts +++ b/ee/apps/landing/lib/github.ts @@ -105,13 +105,10 @@ export const getGithubData = async () => { const assets = Array.isArray(pick?.assets) ? pick.assets : []; const releaseUrl = pick?.html_url || FALLBACK_RELEASE; const dmg = selectAsset(assets, [".dmg"]); - const exe = selectAsset(assets, [".exe", ".msi"], ["win", "windows"]); const appImage = selectAsset(assets, [".appimage"], ["linux"]); const macosApple = selectAsset(assets, [".dmg"], ["darwin-aarch64"]); const macosIntel = selectAsset(assets, [".dmg"], ["darwin-x64"]); - const windowsX64 = - selectAsset(assets, [".msi", ".exe"], ["windows-x64"]) || exe; const linuxDebX64 = selectAsset(assets, [".deb"], ["linux-amd64", "linux-x64"]); const linuxDebArm64 = selectAsset(assets, [".deb"], ["linux-arm64", "linux-aarch64"]); @@ -124,7 +121,6 @@ export const getGithubData = async () => { releaseTag: pick?.tag_name || "", downloads: { macos: dmg?.browser_download_url || FALLBACK_RELEASE, - windows: exe?.browser_download_url || FALLBACK_RELEASE, linux: appImage?.browser_download_url || linuxDebX64?.browser_download_url || @@ -136,9 +132,6 @@ export const getGithubData = async () => { appleSilicon: macosApple?.browser_download_url || dmg?.browser_download_url || releaseUrl, intel: macosIntel?.browser_download_url || dmg?.browser_download_url || releaseUrl }, - windows: { - x64: windowsX64?.browser_download_url || releaseUrl - }, linux: { aur: "https://aur.archlinux.org/packages/openwork", debX64: linuxDebX64?.browser_download_url || releaseUrl,