Files
apress/src/pages/Landing.tsx
T
Omar SobhandClaude Opus 4.8 063116507b feat(workshop): local-demo landing + consolidated Phase 1 + live Telegram setup
Reframes the app for the local single-team demo and reworks onboarding.

Landing (local-demo chrome):
- Drop Lecture / staff sign-in / programme / stat tiles / bottom CTA.
- Hero → "an APESS agent on the edge"; CTA → "Start the workshop".
- Presenter keeps redclaw.dev + [email protected] contact.

Phase strip:
- Colour by position off the active phase (earlier=done, current=active,
  later=pending) so a stale/persisted flag can't light up a future phase
  green (fixes "phase 2 green while on phase 1").

Phase 1 (Team registration) — consolidated onboarding:
- After the board connects, reveal Say hi (moved from Phase 2), Extra
  channels (Telegram wizard), and a Voice enable/disable toggle.
- Phase 2 "Meet your node" thins to Open-your-node + Pick-your-domain;
  removed the Lock-it-down card. New session `channels {telegram, voice}`
  (persist v3, non-destructive migration).

Live Telegram apply (browser → APESS API → board ZeroClaw gateway):
- Wizard Finish pushes the bot token to the running node and restarts it:
  PUT /api/config/prop channels.telegram.main.bot_token (gateway
  auto-creates the alias + enc2-encrypts the secret) then POST
  /admin/reload (in-place subsystem reload → the Telegram channel starts).
- api: bridge configureTelegram + POST /nodes/:teamId/telegram; client
  configureTelegram(); wizard shows applying/error and only saves on
  success. Remote /admin/reload needs the board's gateway.allow_remote_admin
  (+ pairing); on a fully-open board the reload step 403s.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-22 00:24:05 -07:00

99 lines
4.6 KiB
TypeScript

import { Link } from 'react-router-dom'
import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
import { Card, CardContent } from '@/components/ui/card'
export function Landing() {
return (
<main className="min-h-screen flex flex-col bg-background">
<header className="px-8 py-5 border-b border-border flex items-center justify-between sticky top-0 bg-background/90 backdrop-blur z-50">
<div className="font-mono text-xs tracking-widest uppercase">
APESS <span className="text-primary font-bold">2026</span>
<span className="text-muted-foreground"> · Workshop</span>
</div>
<div className="flex items-center gap-3">
<Button asChild size="sm">
<Link to="/workshop">Start the workshop →</Link>
</Button>
</div>
</header>
<section className="relative overflow-hidden border-b border-border px-8 py-20">
<div className="max-w-3xl mx-auto text-center space-y-6 relative z-10">
<Badge variant="secondary" className="font-mono text-[10px] tracking-widest uppercase">
FabLab Torino · July 27, 2026
</Badge>
<h1 className="text-5xl md:text-6xl font-bold tracking-tight leading-[1.05]">
Design a domain node
<br />
<span className="text-primary">an APESS agent on the edge</span>
</h1>
<p className="text-base md:text-lg text-muted-foreground leading-relaxed max-w-2xl mx-auto">
Your Uno Q already senses. Today it gets an agent — one you talk to, one that drives your devices, and
one that keeps working when things break. Design its skills, policies, harness and loops around the
failure states you find, and leave with a five-layer Agent Design Document.
</p>
<div className="flex flex-wrap gap-3 justify-center pt-4">
<Button asChild size="lg">
<Link to="/workshop">Start the workshop →</Link>
</Button>
</div>
</div>
</section>
<section className="px-8 py-16 border-b border-border bg-secondary/30">
<div className="max-w-4xl mx-auto">
<p className="font-mono text-[10px] tracking-widest uppercase text-primary mb-2">Presenter</p>
<Card className="mt-4">
<CardContent className="grid grid-cols-[80px_1fr] gap-6 p-6 items-start">
<div className="w-20 h-20 rounded-full bg-gradient-to-br from-primary to-teal flex items-center justify-center text-2xl font-bold text-primary-foreground">
OS
</div>
<div className="space-y-3">
<div>
<div className="text-xl font-bold tracking-tight">Omar Sobh</div>
<div className="font-mono text-[10px] uppercase tracking-widest text-primary">
Founder · RedClaw Systems
</div>
</div>
<p className="text-sm text-muted-foreground leading-relaxed">
Builds AI agents that live at the edge — from on-device LLM runtimes to multi-agent fleets.
Maintains ZeroClaw, EdgeHDF5, and RustyHDF5. Previously: hardware + ML at scale.
</p>
<div className="space-y-1 font-mono text-xs">
<a
href="https://redclaw.dev"
target="_blank"
rel="noreferrer"
className="text-primary hover:underline"
>
redclaw.dev
</a>
<div className="text-muted-foreground">
Email:{' '}
<a href="mailto:[email protected]" className="text-primary hover:underline">
osobh@redclaw.dev
</a>
</div>
</div>
<div className="flex gap-1.5 flex-wrap">
{['Rust', 'Edge AI', 'Agentic systems', 'HDF5'].map((c) => (
<Badge key={c} variant="outline" className="font-mono text-[9px] uppercase tracking-wider">
{c}
</Badge>
))}
</div>
</div>
</CardContent>
</Card>
</div>
</section>
<footer className="px-8 py-6 border-t border-border font-mono text-[10px] text-muted-foreground flex justify-between items-center">
<span>RedClaw Systems LLC · Los Gatos, CA</span>
<span>apess.redclaw.dev</span>
</footer>
</main>
)
}