feat(landing): beta "coming soon" CTAs + team credits & SEO
The app is in active development, not yet public — replace the "Launch app" CTAs with a "Private beta — coming soon" state (nav, hero, and final CTA). Add a "Built by" section crediting the team, each name linking to their LinkedIn, plus JSON-LD SoftwareApplication + Person author markup, an author meta tag, and a canonical link for name/entity SEO. Team: Karti Tripathi, Ramis Hasanli, Yahya Alhinai, Shakthi Bachala. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+39
-1
@@ -8,8 +8,10 @@
|
||||
<title>PodMan — the teammate that sees what git can’t</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="PodMan is an ambient AI teammate that watches your pod's screens in realtime and catches merge collisions before anyone pushes."
|
||||
content="PodMan is an ambient AI teammate that watches your pod's screens in realtime and catches merge collisions before anyone pushes. Top 3 at the AI Engineer World's Fair 2026 Hackathon — built by Karti Tripathi, Ramis Hasanli, Yahya Alhinai, and Shakthi Bachala."
|
||||
/>
|
||||
<meta name="author" content="Karti Tripathi, Ramis Hasanli, Yahya Alhinai, Shakthi Bachala" />
|
||||
<link rel="canonical" href="https://podman.live/" />
|
||||
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="PodMan" />
|
||||
@@ -31,6 +33,42 @@
|
||||
/>
|
||||
<meta name="twitter:image" content="https://www.podman.live/og.png" />
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "SoftwareApplication",
|
||||
"name": "PodMan",
|
||||
"url": "https://podman.live",
|
||||
"applicationCategory": "DeveloperApplication",
|
||||
"operatingSystem": "Web",
|
||||
"description": "An ambient AI teammate that watches your pod's screens in realtime and catches merge collisions, duplicated work, and missed handoffs before anyone pushes.",
|
||||
"award": "Top 3 — AI Engineer World's Fair 2026 Hackathon (2nd overall of 95+ teams, LiveKit track winner, DigitalOcean Best Use)",
|
||||
"author": [
|
||||
{
|
||||
"@type": "Person",
|
||||
"name": "Karti Tripathi",
|
||||
"url": "https://karti.ai",
|
||||
"sameAs": "https://www.linkedin.com/in/kartitripathi/"
|
||||
},
|
||||
{
|
||||
"@type": "Person",
|
||||
"name": "Ramis Hasanli",
|
||||
"sameAs": "https://www.linkedin.com/in/hasanliramis/"
|
||||
},
|
||||
{
|
||||
"@type": "Person",
|
||||
"name": "Yahya Alhinai",
|
||||
"sameAs": "https://www.linkedin.com/in/yhinai/"
|
||||
},
|
||||
{
|
||||
"@type": "Person",
|
||||
"name": "Shakthi Bachala",
|
||||
"sameAs": "https://www.linkedin.com/in/shakthi-bachala-09401510a/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Tear down any service worker we shipped earlier (vite-plugin-pwa).
|
||||
// PodMan runs no PWA in production: we deploy continuously and SW-driven
|
||||
|
||||
+58
-25
@@ -1,8 +1,6 @@
|
||||
import { useCallback } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import {
|
||||
TrophyIcon,
|
||||
ArrowRightIcon,
|
||||
ChevronDownIcon,
|
||||
EyeIcon,
|
||||
GitMergeIcon,
|
||||
@@ -18,8 +16,16 @@ import {
|
||||
/**
|
||||
* Public marketing landing page for podman.live.
|
||||
* Rendered at "/" without ClerkProvider — needs no secrets.
|
||||
* The live app lives at "/app".
|
||||
* The app (private beta) lives at "/app".
|
||||
*/
|
||||
|
||||
const TEAM = [
|
||||
{ name: 'Karti Tripathi', url: 'https://www.linkedin.com/in/kartitripathi/' },
|
||||
{ name: 'Ramis Hasanli', url: 'https://www.linkedin.com/in/hasanliramis/' },
|
||||
{ name: 'Yahya Alhinai', url: 'https://www.linkedin.com/in/yhinai/' },
|
||||
{ name: 'Shakthi Bachala', url: 'https://www.linkedin.com/in/shakthi-bachala-09401510a/' },
|
||||
];
|
||||
|
||||
export function Landing() {
|
||||
const scrollToStory = useCallback(() => {
|
||||
document.getElementById('story')?.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
@@ -39,12 +45,10 @@ export function Landing() {
|
||||
<img src="/podman-logo.svg" alt="PodMan" className="h-7 w-7" />
|
||||
<span className="text-[15px] font-semibold tracking-tight text-white">PodMan</span>
|
||||
</a>
|
||||
<Link
|
||||
to="/app"
|
||||
className="inline-flex items-center gap-1.5 rounded-full border border-white/15 bg-white/5 px-4 py-1.5 text-sm font-medium text-white/90 transition-colors hover:bg-white/10"
|
||||
>
|
||||
Launch app <ArrowRightIcon className="size-4" />
|
||||
</Link>
|
||||
<span className="inline-flex items-center gap-2 rounded-full border border-white/15 bg-white/5 px-4 py-1.5 text-sm font-medium text-white/70">
|
||||
<LiveDot />
|
||||
Beta soon
|
||||
</span>
|
||||
</header>
|
||||
|
||||
{/* hero */}
|
||||
@@ -93,12 +97,7 @@ export function Landing() {
|
||||
>
|
||||
Read the story <ChevronDownIcon className="size-4" />
|
||||
</button>
|
||||
<Link
|
||||
to="/app"
|
||||
className="inline-flex h-11 items-center justify-center gap-2 rounded-full border border-white/15 px-7 text-sm font-semibold text-white/90 transition-colors hover:bg-white/5"
|
||||
>
|
||||
Launch PodMan <ArrowRightIcon className="size-4" />
|
||||
</Link>
|
||||
<BetaPill />
|
||||
</div>
|
||||
|
||||
<button
|
||||
@@ -193,23 +192,37 @@ export function Landing() {
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
{/* final CTA */}
|
||||
{/* built by / team */}
|
||||
<Section id="team" eyebrow="Built by" title="The team behind PodMan.">
|
||||
<div className="flex flex-wrap gap-3">
|
||||
{TEAM.map((p) => (
|
||||
<a
|
||||
key={p.name}
|
||||
href={p.url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="rounded-full border border-white/10 bg-white/[0.03] px-4 py-2 text-[15px] font-medium text-white/80 transition-colors hover:border-cyan-300/40 hover:text-white"
|
||||
>
|
||||
{p.name}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
{/* final CTA — beta coming soon */}
|
||||
<section className="relative z-10 mx-auto max-w-3xl px-6 py-24 text-center">
|
||||
<div className="rounded-3xl border border-white/10 bg-gradient-to-b from-white/[0.06] to-transparent px-8 py-14">
|
||||
<MicIcon className="mx-auto size-8 text-cyan-300" />
|
||||
<h2 className="mt-5 text-3xl font-semibold tracking-tight text-white sm:text-4xl">
|
||||
Put PodMan in your pod.
|
||||
The private beta is coming soon.
|
||||
</h2>
|
||||
<p className="mx-auto mt-4 max-w-md text-[15px] leading-relaxed text-white/60">
|
||||
Open a room and let it watch the work. It's an early build we're actively
|
||||
shaping — jump in and try it.
|
||||
We're building PodMan out from the hackathon prototype into something a team runs
|
||||
every day. The private beta opens soon.
|
||||
</p>
|
||||
<Link
|
||||
to="/app"
|
||||
className="mt-8 inline-flex h-12 items-center justify-center gap-2 rounded-full bg-gradient-to-r from-indigo-500 to-cyan-400 px-8 text-sm font-semibold text-[#0b0f17] shadow-lg shadow-indigo-500/20 transition-transform hover:scale-[1.02]"
|
||||
>
|
||||
Launch PodMan <ArrowRightIcon className="size-4" />
|
||||
</Link>
|
||||
<div className="mt-8 flex justify-center">
|
||||
<BetaPill className="px-6 py-3 text-[15px]" />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -227,6 +240,26 @@ export function Landing() {
|
||||
);
|
||||
}
|
||||
|
||||
function LiveDot() {
|
||||
return (
|
||||
<span className="relative flex size-1.5">
|
||||
<span className="absolute inline-flex h-full w-full animate-ping rounded-full bg-cyan-400/70" />
|
||||
<span className="relative inline-flex size-1.5 rounded-full bg-cyan-400" />
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
function BetaPill({ className = '' }: { className?: string }) {
|
||||
return (
|
||||
<span
|
||||
className={`inline-flex items-center gap-2 rounded-full border border-white/15 bg-white/5 px-5 py-2.5 text-sm font-medium text-white/70 ${className}`}
|
||||
>
|
||||
<LiveDot />
|
||||
Private beta — coming soon
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
function Section({
|
||||
id,
|
||||
eyebrow,
|
||||
|
||||
Reference in New Issue
Block a user