Skip to content

Build a real onctl.sh landing page - #1096

Merged
cdalar merged 6 commits into
mainfrom
feat/landing-page
Sep 7, 2026
Merged

cdalar merged 6 commits into
mainfrom
feat/landing-page

Conversation

@cdalar

@cdalar cdalar commented Sep 7, 2026 •

Copy link
Copy Markdown
Owner

Summary

Replaces the untouched Docusaurus scaffold homepage with a real landing page, following the recommendations in #1095 (LANDING_PAGE_RESEARCH.md).

Went through two passes -- the second replaced most of the first's output:

  • Hero: asymmetric layout (headline/CTAs left, live terminal transcript right) -- install command, Get Started/GitHub CTAs, real GitHub-stars/Discussions/Issues trust bar
  • Identity: ember accent (#ff7a45 dark / #d9531e light) instead of Infima's default teal, cool near-black/grey-white grounds, JetBrains Mono for headlines and commands + IBM Plex Sans for body copy
  • ConfigPanel: a real (abbreviated, verified-live) excerpt of the onctl.yaml that onctl init generates -- makes the "one config, every backend" point concrete instead of illustrating it with a provider-icon grid
  • Lifecycle: one continuous terminal transcript (create -> ssh -> ls -> destroy) via a shared TerminalWindow component, replacing four separately-bordered command cards
  • Dark-by-default color mode (toggleable, respects OS preference)
  • Drops the unused HomepageFeatures scaffold + its undraw_* placeholder SVGs
  • Fixes the navbar logo's stale "onkube Logo" alt text
  • Fixes stale docs pages (getting-started, deployments, templates, index) to match the actual CLI

Independent of #1095 (doesn't depend on it merging first) -- this is the implementation, that PR is just the research notes.

Test plan

  • npm run build succeeds
  • npm run typecheck passes
  • Verified locally (dev server + Playwright screenshots) in both light and dark mode -- no console errors, no layout issues

🤖 Generated with Claude Code

https://claude.ai/code/session_01Lx5i19SzjoDPrn1eccMzCe

cdalar and others added 5 commits September 7, 2026 07:44
Following LANDING_PAGE_RESEARCH.md's comparison of comparable CLI-tool
homepages (bun.sh, rustup.rs, starship.rs, zellij.dev, brew.sh, etc.)
and its recommendation to build this inside the existing Docusaurus
site rather than a separate stack:

- Hero leads with the install command (`curl -fsSL
  https://onctl.sh/get.sh | bash`) in a copy-button code block, plus
  Get Started/GitHub CTAs and a real GitHub-stars/Discussions/Issues
  trust bar -- no fake logo walls or testimonials at this project's
  actual size.
- New ProviderGrid component replaces the generic "Easy to Use /
  Powered by React" scaffold copy with the actual differentiator: one
  CLI, six backends (AWS/Azure/GCP/Hetzner/Firecracker/Cloud
  Hypervisor), each card showing its real -p flag.
- New CommandExamples component shows real working commands as static
  styled code blocks instead of a recorded terminal demo -- none of
  the comparable sites embed a live terminal in the hero either, and
  it's not worth the production cost at this scale.
- Dark-by-default color mode (still toggleable, respects OS
  preference), matching the technical/indie-tool cluster the research
  identified onctl as closest to.
- Drops the unused Docusaurus scaffold (HomepageFeatures + its
  undraw_* placeholder SVGs) and fixes the navbar logo's stale
  "onkube Logo" alt text.

Verified with `npm run build`, `npm run typecheck`, and a local
Playwright screenshot pass in both light and dark mode.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUUwyWgX4uLP4grY6kxZWj
Built onctl from source (this branch's base, origin/main) and diffed
every docs page's claims against real --help output rather than
trusting what was already written:

- deployments.md described a defunct PaaS-style `onctl deploy`
  (--public/--cnames/onkube.app subdomains, `onctl reg add`) that no
  longer exists. Rewritten to match the real command: pulls a Docker
  image locally, uploads it over SSH, and runs it on a VM onctl
  already manages.
- index.md's supported-provider list and embedded `onctl --help`
  block were both stale -- missing gcp/fc/ch/static and 8+ commands
  (action, deploy, env, images, import, pause, resume, templates, vm)
  added since. Both regenerated from the real output.
- getting-started.md's ONCTL_CLOUD provider list had the same gap
  (missing gcp/fc/ch); also clarified onctl init's actual global-vs
  -project-local behavior (it always ensures a global ~/.onctl, and
  only asks about a project-local one interactively -- the previous
  wording implied project-local was the only outcome).
- templates.md's examples normalized from the `up` alias to `create`,
  matching every other doc page.
- Dropped markdown-page.md, the unmodified Docusaurus scaffold example
  page that was still live in the sidebar.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUUwyWgX4uLP4grY6kxZWj
Six identically-styled cards each showing little more than a `-p
<flag>` chip read as repetitive and flat. Replaced with:

- Cloud providers as a compact pill row (AWS/Azure/GCP/Hetzner) --
  quick to scan, not six competing cards.
- Firecracker as a single, larger feature card (icon, description,
  and its real create command side by side) -- this is onctl's actual
  differentiator, so it gets the visual weight instead of being one
  box among six. Cloud Hypervisor (-p ch) is left off the landing page
  for now at the user's request -- newer and less battle-tested than
  Firecracker; it's still documented in getting-started.md/
  deployments.md, just not spotlighted here yet.

Also swapped CommandExamples' second slot (a `-p hetzner -a
docker/docker.sh` command that overflowed its card on-screen, even
though overflow-x:auto meant it was technically scrollable) for
`onctl destroy`, so the section reads as a complete create -> ssh ->
ls -> destroy lifecycle instead of a second provider-switching
example that duplicated ProviderGrid's point.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUUwyWgX4uLP4grY6kxZWj
Everything shipped so far was, honestly, unmodified Docusaurus/Infima
defaults with content bolted on: the out-of-the-box teal accent, no
deliberate typeface choice, ALL-CAPS eyebrow labels above headings,
and repeated bordered/rounded cards -- the exact cluster of generic-
AI-page tells (near-black + single default accent, template chrome,
card-kit repetition). Ran this through a proper plan-critique-build
pass instead:

Color: ember (#ff7a45 dark / #d9531e light) as the one accent --
grounded in the product ("onctl" = turning compute *on*, and
Firecracker's own ignition/speed framing), not Infima's default teal
or a generic terracotta/acid-green swap. Cool near-black (#14161a)
and cool grey-white (#eef0f1) grounds instead of a warm charcoal/cream
pair.

Type: JetBrains Mono for headlines and all commands (the terminal is
this product's actual environment, used as an active design element
at real size/weight, not a neutral font swap) + IBM Plex Sans for
body copy, loaded via Google Fonts in docusaurus.config.ts.

Layout: replaced the centered hero + card-grid structure with an
asymmetric left-aligned hero (headline/CTAs left, a real terminal-
window transcript right) and two full-width sections built around
actual product content instead of decoration:
- ConfigPanel: a real (abbreviated, verified-live) excerpt of the
  onctl.yaml `onctl init` generates, replacing the provider-pill-row
  + Firecracker-card from the previous pass -- the "one config, every
  backend" point is demonstrated, not illustrated with icons.
- Lifecycle: one continuous terminal transcript (create -> ssh -> ls
  -> destroy) via a new shared TerminalWindow component, replacing
  four separately-bordered command cards.

Removed the ALL-CAPS "CLOUD PROVIDERS"/"LOCAL MICROVM" eyebrow labels
entirely, and the generic "Deploy with Ease / made easy" headline
(which didn't even name the product) for specific, plain copy: "Six
ways to boot a VM. One command."

Also fixed two real bugs found while building this: the homepage
Layout's title prop produced a duplicated "onctl | onctl" browser tab
title (Docusaurus's title formatter has no special case for title ===
siteConfig.title), and Infima's own theme-dependent `pre` background
was painting over TerminalWindow's always-dark chrome in light mode,
making its text nearly unreadable.

Verified with npm run build/typecheck and Playwright screenshots in
light mode, dark mode, and a 390px mobile viewport, checking for
horizontal overflow at each.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUUwyWgX4uLP4grY6kxZWj
@docusaurus/core and preset-classic had already been bumped to ^3.10.2
locally (uncommitted), but @docusaurus/tsconfig and @docusaurus/types
were left pinned at 3.7.0 -- a version-drift state Docusaurus doesn't
support. Bumped both to ^3.10.2 to match.

That surfaced a new v4 deprecation warning on build:
onBrokenMarkdownLinks moved under markdown.hooks. Migrated it.

Verified: npm run typecheck and npm run build both clean (no warnings),
homepage screenshot after the upgrade is pixel-identical to before.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Lx5i19SzjoDPrn1eccMzCe
@socket-security

socket-security Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

Docusaurus 3.10.2 requires Node >=20 (was >=18); the docs CI workflows
were still pinned to node-version: 18, so Test deployment failed on
PR #1096 with "Minimum Node.js version not met". Bumped both
docu-test-deploy.yml and docu-deploy.yml to Node 20, and updated
docs/package.json's engines field to match.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Lx5i19SzjoDPrn1eccMzCe
@cdalar
cdalar merged commit b363f0e into main Sep 7, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

⌂ 换网址