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>
|
<title>PodMan — the teammate that sees what git can’t</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
@@ -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's an early build we're actively
|
We'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,
|
||||||
|
|||||||
Reference in New Issue
Block a user