Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion docs/app/(home)/openclaw-os/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ export default function OpenClawOSPage() {
mobilePreviewImageWidth={804}
mobilePreviewImageHeight={880}
mobilePreviewImageCropTopPercent={20}
showGitHubBanner={false}
githubRepoUrl="https://github.com/thesysdev/openclaw-os"
githubButtonLabel="Star on GitHub"
widePreview
showTagline
taglineCompact
Expand Down
30 changes: 18 additions & 12 deletions docs/app/(home)/sections/FeaturesSection/FeaturesSection.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
"use client";

import {
Browsers,
Eye,
MagicWand,
PushPin,
SlidersHorizontal,
SquaresFour,
BellIcon,
BrowserIcon,
EyeIcon,
MagicWandIcon,
PushPinIcon,
SlidersHorizontalIcon,
SquaresFourIcon,
} from "@phosphor-icons/react";
import svgPaths from "@/imports/svg-urruvoh2be";
import { PillLink } from "../../components/Button/Button";
Expand Down Expand Up @@ -80,32 +81,37 @@ export const OPENCLAW_FEATURES: FeatureListItem[] = [
{
title: "Generative UI",
description: "Build apps, dashboards, and artifacts on demand",
icon: <MagicWand size={PHOSPHOR_ICON_SIZE} weight="fill" />,
icon: <MagicWandIcon size={PHOSPHOR_ICON_SIZE} weight="fill" />,
},
{
title: "Persistent apps",
description: "Apps stay in place and refresh with live data automatically",
icon: <PushPin size={PHOSPHOR_ICON_SIZE} weight="fill" />,
icon: <PushPinIcon size={PHOSPHOR_ICON_SIZE} weight="fill" />,
},
{
title: "Structured workspace",
description: "Agents, sessions, artifacts, and apps in one organized space",
icon: <SquaresFour size={PHOSPHOR_ICON_SIZE} weight="fill" />,
icon: <SquaresFourIcon size={PHOSPHOR_ICON_SIZE} weight="fill" />,
},
{
title: "Full visibility",
description: "Inspect tool calls, context, and agent actions in real time",
icon: <Eye size={PHOSPHOR_ICON_SIZE} weight="fill" />,
icon: <EyeIcon size={PHOSPHOR_ICON_SIZE} weight="fill" />,
},
{
title: "Direct control",
description: "Permissions, schedules, and execution from one interface",
icon: <SlidersHorizontal size={PHOSPHOR_ICON_SIZE} weight="fill" />,
icon: <SlidersHorizontalIcon size={PHOSPHOR_ICON_SIZE} weight="fill" />,
},
{
title: "Live notifications",
description: "Cron jobs notifications",
icon: <BellIcon size={PHOSPHOR_ICON_SIZE} weight="fill" />,
},
{
title: "Elegant interface",
description: "Built for clarity with responsive layouts and themes",
icon: <Browsers size={PHOSPHOR_ICON_SIZE} weight="fill" />,
icon: <BrowserIcon size={PHOSPHOR_ICON_SIZE} weight="fill" />,
},
];

Expand Down
68 changes: 63 additions & 5 deletions docs/app/(home)/sections/HeroSection/HeroSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,30 @@ function MobilePlaygroundButton({ className = "" }: { className?: string }) {
);
}

function DesktopGithubButton({
href,
label = "Star on GitHub",
className = "",
}: {
href: string;
label?: string;
className?: string;
}) {
return (
<PillLink
href={href}
external
className={`${styles.desktopPlaygroundButton} ${className}`.trim()}
arrow={<TrailingArrow />}
>
<span aria-hidden="true" className={styles.heroBannerIcon}>
<GitHubIcon />
</span>
<span>{label}</span>
</PillLink>
);
}

function AnnouncementBanner({ className = "" }: { className?: string }) {
return (
<>
Expand Down Expand Up @@ -150,10 +174,18 @@ function AnnouncementBanner({ className = "" }: { className?: string }) {
);
}

function GitHubBanner({ className = "" }: { className?: string }) {
function GitHubBanner({
href = "https://github.com/thesysdev/openui",
label = "Star us on Github",
className = "",
}: {
href?: string;
label?: string;
className?: string;
}) {
return (
<a
href="https://github.com/thesysdev/openui"
href={href}
target="_blank"
rel="noopener noreferrer"
className={`${styles.heroBanner} ${styles.mobileGithubButton} ${className}`.trim()}
Expand All @@ -162,7 +194,7 @@ function GitHubBanner({ className = "" }: { className?: string }) {
<span aria-hidden="true" className={styles.heroBannerIcon}>
<GitHubIcon />
</span>
<span>Star us on Github</span>
<span>{label}</span>
</span>
<TrailingArrow />
</a>
Expand All @@ -180,14 +212,22 @@ function DesktopHero({
compact,
showBanner,
showPlaygroundButton,
githubRepoUrl,
githubButtonLabel,
}: {
title: ReactNode;
subtitle: ReactNode;
command: string;
compact: boolean;
showBanner: boolean;
showPlaygroundButton: boolean;
githubRepoUrl?: string;
githubButtonLabel?: string;
}) {
// The shadow-room class compensates for the absent secondary CTA — only
// applied when both the playground button AND the GitHub button are off.
const hasSecondaryCta = showPlaygroundButton || !!githubRepoUrl;

return (
<div className={styles.desktopHero}>
<div className={styles.desktopHeroInner}>
Expand All @@ -203,11 +243,14 @@ function DesktopHero({

<div
className={`${styles.desktopCtaStack} ${
!showPlaygroundButton ? styles.desktopCtaStackShadowRoom : ""
!hasSecondaryCta ? styles.desktopCtaStackShadowRoom : ""
}`.trim()}
>
<NpmButton command={command} />
{showPlaygroundButton && <DesktopPlaygroundButton />}
{githubRepoUrl && (
<DesktopGithubButton href={githubRepoUrl} label={githubButtonLabel} />
)}
</div>
</div>
</div>
Expand All @@ -227,6 +270,7 @@ function MobileHero({
showBanner,
showPlaygroundButton,
showGitHubBanner,
githubRepoUrl,
mobileImageOverride,
mobileImageAlt,
mobileImageWidth,
Expand All @@ -241,6 +285,7 @@ function MobileHero({
showBanner: boolean;
showPlaygroundButton: boolean;
showGitHubBanner: boolean;
githubRepoUrl?: string;
mobileImageOverride?: string;
mobileImageAlt?: string;
mobileImageWidth?: number;
Expand Down Expand Up @@ -282,7 +327,9 @@ function MobileHero({
<div className={styles.mobileCtaStack}>
<NpmButton className={styles.mobileCtaButtonWidth} command={command} />
{showPlaygroundButton && <MobilePlaygroundButton className={styles.mobileCtaButtonWidth} />}
{showGitHubBanner && <GitHubBanner className={styles.mobileCtaButtonWidth} />}
{showGitHubBanner && (
<GitHubBanner href={githubRepoUrl} className={styles.mobileCtaButtonWidth} />
)}
</div>

{/* Mobile hero image */}
Expand Down Expand Up @@ -391,6 +438,8 @@ export function HeroSection({
tagline,
taglineCompact = false,
showGitHubBanner = true,
githubRepoUrl,
githubButtonLabel,
mobilePreviewImage,
mobilePreviewImageAlt,
mobilePreviewImageWidth,
Expand All @@ -412,6 +461,12 @@ export function HeroSection({
tagline?: ReactNode;
taglineCompact?: boolean;
showGitHubBanner?: boolean;
/** When set, adds a desktop GitHub PillLink CTA pointing here AND uses
* this URL for the mobile GitHub banner (instead of the default openui
* repo). Useful for sub-product pages like /openclaw-os. */
githubRepoUrl?: string;
/** Optional override for the desktop GitHub button label (default: "Star on GitHub"). */
githubButtonLabel?: string;
mobilePreviewImage?: string;
mobilePreviewImageAlt?: string;
mobilePreviewImageWidth?: number;
Expand All @@ -429,6 +484,8 @@ export function HeroSection({
compact={compact}
showBanner={showBanner}
showPlaygroundButton={showPlaygroundButton}
githubRepoUrl={githubRepoUrl}
githubButtonLabel={githubButtonLabel}
/>
<MobileHero
theme={theme}
Expand All @@ -439,6 +496,7 @@ export function HeroSection({
showBanner={showBanner}
showPlaygroundButton={showPlaygroundButton}
showGitHubBanner={showGitHubBanner}
githubRepoUrl={githubRepoUrl}
mobileImageOverride={mobilePreviewImage}
mobileImageAlt={mobilePreviewImageAlt}
mobileImageWidth={mobilePreviewImageWidth}
Expand Down
52 changes: 48 additions & 4 deletions docs/public/openclaw-os/install.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ $Repo = 'thesysdev/openclaw-os'
$SrcDir = Join-Path $env:USERPROFILE '.openclaw\openui\openclaw-os'
$PluginDir = Join-Path $SrcDir 'packages\claw-plugin'
$PluginId = 'openclaw-os-plugin'
$PluginPathSlug = 'openclawos'
$OpenclawConfig = Join-Path $env:USERPROFILE '.openclaw\openclaw.json'
$LegacyDir = Join-Path $env:USERPROFILE ".openclaw\extensions\$PluginId"

Expand All @@ -50,7 +51,7 @@ function Require-Cmd($name, $hint) {
function Banner {
Write-Host ""
Write-Host "OpenClaw OS" -ForegroundColor Magenta -NoNewline
Write-Host " — Generative UI for OpenClaw" -ForegroundColor DarkGray
Write-Host " — The default workspace for OpenClaw" -ForegroundColor DarkGray
Write-Host ""
}

Expand Down Expand Up @@ -215,7 +216,8 @@ function Uninstall-Plugin {
if ($LASTEXITCODE -ne 0) { Write-Warn2 'Could not disable plugin (may not be installed). Continuing.' } else { Write-Ok 'Plugin disabled' }

Write-Step "Uninstalling $PluginId"
& openclaw plugins uninstall $PluginId
# --force skips the interactive y/N prompt (no TTY in `iwr | iex`).
& openclaw plugins uninstall $PluginId --force
if ($LASTEXITCODE -ne 0) { Write-Warn2 'Could not uninstall plugin (may not be registered). Continuing.' } else { Write-Ok 'Plugin uninstalled' }
}

Expand All @@ -233,6 +235,49 @@ function Remove-LegacyGlobalInstall {
}
}

function Print-DashboardUrl {
Write-Step 'Opening OpenClaw OS'

# The plugin (via `api.registerCli`) constructs the auth-bearing URL from the
# gateway-validated config — survives `--dev`/`--profile`, no JSON parsing.
$url = $null
& openclaw os --help 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) {
# The openclaw CLI emits plugin-registration logs to stdout when loading a
# plugin to discover its commands; grep just the URL line.
$output = (& openclaw os url 2>$null | Out-String)
if ($output) {
$match = [regex]::Match($output, 'https?://[^\s]+')
if ($match.Success) { $url = $match.Value }
}
}

if (-not $url) {
Write-Warn2 '`openclaw os url` not available — older plugin or missing token.'
Write-Log "Open http://127.0.0.1:18789/plugins/$PluginPathSlug and paste the token from $OpenclawConfig."
return
}

Write-Host ""
Write-Host " Dashboard URL: " -NoNewline
Write-Host $url -ForegroundColor Cyan
Write-Host ""

try {
Set-Clipboard -Value $url -ErrorAction Stop
Write-Log 'Copied to clipboard.'
} catch {
# Set-Clipboard missing on PS 5.0; ignore — URL was printed above.
}

try {
Start-Process $url -ErrorAction Stop
Write-Ok 'Opened in your browser. Keep that tab to use OpenClaw OS.'
} catch {
Write-Log 'Open the URL above to use OpenClaw OS.'
}
}

function Do-Install {
Banner
Check-Prereqs
Expand All @@ -245,8 +290,7 @@ function Do-Install {
Verify
Write-Host ""
Write-Host "✓ OpenClaw OS installed." -ForegroundColor Cyan
Write-Host " Open the Claw UI from your OpenClaw client to start generating apps." -ForegroundColor DarkGray
Write-Host ""
Print-DashboardUrl
}

function Do-Uninstall {
Expand Down
Loading
Loading