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:
Karti Tripathi
2026-07-06 03:31:37 +00:00
parent 26c851e2bb
commit 82e5378658
2 changed files with 97 additions and 26 deletions
+39 -1
View File
@@ -8,8 +8,10 @@
<title>PodMan — the teammate that sees what git cant</title> <title>PodMan — the teammate that sees what git cant</title>
<meta <meta
name="description" 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:type" content="website" />
<meta property="og:site_name" content="PodMan" /> <meta property="og:site_name" content="PodMan" />
@@ -31,6 +33,42 @@
/> />
<meta name="twitter:image" content="https://www.podman.live/og.png" /> <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> <script>
// Tear down any service worker we shipped earlier (vite-plugin-pwa). // Tear down any service worker we shipped earlier (vite-plugin-pwa).
// PodMan runs no PWA in production: we deploy continuously and SW-driven // PodMan runs no PWA in production: we deploy continuously and SW-driven
+58 -25
View File
@@ -1,8 +1,6 @@
import { useCallback } from 'react'; import { useCallback } from 'react';
import { Link } from 'react-router-dom';
import { import {
TrophyIcon, TrophyIcon,
ArrowRightIcon,
ChevronDownIcon, ChevronDownIcon,
EyeIcon, EyeIcon,
GitMergeIcon, GitMergeIcon,
@@ -18,8 +16,16 @@ import {
/** /**
* Public marketing landing page for podman.live. * Public marketing landing page for podman.live.
* Rendered at "/" without ClerkProvider — needs no secrets. * 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() { export function Landing() {
const scrollToStory = useCallback(() => { const scrollToStory = useCallback(() => {
document.getElementById('story')?.scrollIntoView({ behavior: 'smooth', block: 'start' }); 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" /> <img src="/podman-logo.svg" alt="PodMan" className="h-7 w-7" />
<span className="text-[15px] font-semibold tracking-tight text-white">PodMan</span> <span className="text-[15px] font-semibold tracking-tight text-white">PodMan</span>
</a> </a>
<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">
to="/app" <LiveDot />
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" Beta soon
> </span>
Launch app <ArrowRightIcon className="size-4" />
</Link>
</header> </header>
{/* hero */} {/* hero */}
@@ -93,12 +97,7 @@ export function Landing() {
> >
Read the story <ChevronDownIcon className="size-4" /> Read the story <ChevronDownIcon className="size-4" />
</button> </button>
<Link <BetaPill />
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>
</div> </div>
<button <button
@@ -193,23 +192,37 @@ export function Landing() {
</div> </div>
</Section> </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"> <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"> <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" /> <MicIcon className="mx-auto size-8 text-cyan-300" />
<h2 className="mt-5 text-3xl font-semibold tracking-tight text-white sm:text-4xl"> <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> </h2>
<p className="mx-auto mt-4 max-w-md text-[15px] leading-relaxed text-white/60"> <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&apos;s an early build we&apos;re actively We&apos;re building PodMan out from the hackathon prototype into something a team runs
shaping jump in and try it. every day. The private beta opens soon.
</p> </p>
<Link <div className="mt-8 flex justify-center">
to="/app" <BetaPill className="px-6 py-3 text-[15px]" />
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]" </div>
>
Launch PodMan <ArrowRightIcon className="size-4" />
</Link>
</div> </div>
</section> </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({ function Section({
id, id,
eyebrow, eyebrow,