# Talk Pro Landing Page Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Build the Talk Pro marketing landing page as a fully static website using Astro + Tailwind CSS + TypeScript, pixel-faithful to the Figma design.
**Architecture:** One Astro component per Figma section (Header, Hero, CoreSystem, UseCases, DownloadCTA, Footer), composed in `src/pages/index.astro`. All Figma assets downloaded to `public/assets/` at setup time. Zero client-side JavaScript.
**Tech Stack:** Astro 4.x, Tailwind CSS 3.x, TypeScript (strict), Inter via Google Fonts
---
### Task 1: Scaffold Astro project
**Files:**
- Create: `package.json`, `astro.config.mjs`, `tsconfig.json`, `src/env.d.ts`
- [ ] **Step 1: Initialize Astro in the existing repo**
```bash
cd /Users/terry/finn/talk-pro
npm create astro@latest . --template minimal --no-git
```
When prompted:
- TypeScript: **Yes, strict**
- Install dependencies: **Yes**
- Initialize git: **No** (already a git repo)
- [ ] **Step 2: Add Tailwind integration**
```bash
npx astro add tailwind --yes
```
This creates `tailwind.config.mjs` and updates `astro.config.mjs`.
- [ ] **Step 3: Verify build works**
```bash
npm run build
```
Expected: `dist/` folder created, no errors.
- [ ] **Step 4: Commit scaffold**
```bash
git add -A
git commit -m "feat: scaffold Astro + Tailwind project"
```
---
### Task 2: Configure design tokens and global styles
**Files:**
- Modify: `tailwind.config.mjs`
- Create: `src/styles/global.css`
- [ ] **Step 1: Replace `tailwind.config.mjs` with Talk Pro tokens**
```js
/** @type {import('tailwindcss').Config} */
export default {
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,ts,tsx}'],
theme: {
extend: {
colors: {
brand: '#f28a4b',
'text-primary': '#2e2a28',
'text-secondary': '#7a726d',
surface: '#f8f3ee',
'surface-alt': '#f2eae3',
'surface-footer': '#efe6de',
'border-light': '#e3d9d1',
},
fontFamily: {
sans: ['Inter', 'sans-serif'],
},
},
},
plugins: [],
}
```
- [ ] **Step 2: Create `src/styles/global.css`**
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
- [ ] **Step 3: Verify build**
```bash
npm run build
```
Expected: No errors.
- [ ] **Step 4: Commit**
```bash
git add tailwind.config.mjs src/styles/global.css
git commit -m "feat: configure Tailwind design tokens"
```
---
### Task 3: Download Figma assets
**Files:**
- Create: `scripts/download-assets.sh`
- Create: `public/assets/` (13 image files)
- [ ] **Step 1: Create download script**
Create `scripts/download-assets.sh`:
```bash
#!/bin/bash
set -e
mkdir -p public/assets
curl -sL "https://www.figma.com/api/mcp/asset/81b107f5-6e2b-4877-9cd6-d2af7b9fc4e4" -o public/assets/logo-icon.png
curl -sL "https://www.figma.com/api/mcp/asset/642480ed-2bdc-40f0-8b34-4d868443be3a" -o public/assets/logo-wordmark.png
curl -sL "https://www.figma.com/api/mcp/asset/92f03ea0-0710-41ca-a84c-eff4af034455" -o public/assets/hero-bg.png
curl -sL "https://www.figma.com/api/mcp/asset/9e59170a-ac6c-48fd-a869-34bcd7beec0c" -o public/assets/hero-phone.png
curl -sL "https://www.figma.com/api/mcp/asset/86a3a493-f756-4e82-a055-2857ad1bb127" -o public/assets/icon-messaging.png
curl -sL "https://www.figma.com/api/mcp/asset/d8131626-0de4-4be3-98a0-d01c310c7e2d" -o public/assets/icon-groups.png
curl -sL "https://www.figma.com/api/mcp/asset/e9d23aa1-7e10-4382-b1bd-b9ac755e2a5f" -o public/assets/icon-channels.png
curl -sL "https://www.figma.com/api/mcp/asset/ac45f93c-45ed-464a-8a9c-c389ba20555f" -o public/assets/icon-voice.png
curl -sL "https://www.figma.com/api/mcp/asset/67edb5de-858a-4a14-86bf-ac815f6681d1" -o public/assets/icon-video.png
curl -sL "https://www.figma.com/api/mcp/asset/c54dcf64-c5ff-4e2e-9573-c80e3946d1fc" -o public/assets/icon-media.png
curl -sL "https://www.figma.com/api/mcp/asset/295181b7-7046-42dc-a5f2-234957c85c27" -o public/assets/badge-android-icon.png
curl -sL "https://www.figma.com/api/mcp/asset/c1b2603d-7e44-4235-ba42-5ca5983bd926" -o public/assets/badge-ios-icon.png
curl -sL "https://www.figma.com/api/mcp/asset/62960bde-f21e-494f-8e9d-f2f0b7a55547" -o public/assets/footer-divider.png
echo "Done. $(ls public/assets | wc -l) assets downloaded."
```
- [ ] **Step 2: Run the script**
```bash
chmod +x scripts/download-assets.sh && bash scripts/download-assets.sh
```
Expected output: `Done. 13 assets downloaded.`
- [ ] **Step 3: Verify**
```bash
ls public/assets/
```
Expected: `badge-android-icon.png badge-ios-icon.png footer-divider.png hero-bg.png hero-phone.png icon-channels.png icon-groups.png icon-media.png icon-messaging.png icon-voice.png icon-video.png logo-icon.png logo-wordmark.png`
- [ ] **Step 4: Commit**
```bash
git add public/assets/ scripts/download-assets.sh
git commit -m "feat: download Figma assets to public/assets"
```
---
### Task 4: Base layout
**Files:**
- Create: `src/layouts/Base.astro`
- Modify: `src/pages/index.astro`
- [ ] **Step 1: Create `src/layouts/Base.astro`**
```astro
---
import '../styles/global.css'
export interface Props {
title?: string
}
const { title = 'Talk Pro — One User. Multiple Worlds.' } = Astro.props
---
{title}
```
- [ ] **Step 2: Replace `src/pages/index.astro`**
```astro
---
import Base from '../layouts/Base.astro'
---
Talk Pro — scaffold works
```
- [ ] **Step 3: Start dev server and verify**
```bash
npm run dev
```
Open http://localhost:4321. Expected: "Talk Pro — scaffold works" in `#2e2a28` on cream `#f8f3ee` background, Inter font.
- [ ] **Step 4: Commit**
```bash
git add src/layouts/Base.astro src/pages/index.astro
git commit -m "feat: add Base layout with Inter font and Tailwind"
```
---
### Task 5: Header component
**Files:**
- Create: `src/components/Header.astro`
- Modify: `src/pages/index.astro`
- [ ] **Step 1: Create `src/components/Header.astro`**
```astro
---
---
```
- [ ] **Step 2: Update `src/pages/index.astro`**
```astro
---
import Base from '../layouts/Base.astro'
import Header from '../components/Header.astro'
---
```
- [ ] **Step 3: Verify in dev server**
Open http://localhost:4321. Expected: Sticky frosted-glass header, logo left, nav center, orange Download button right.
- [ ] **Step 4: Commit**
```bash
git add src/components/Header.astro src/pages/index.astro
git commit -m "feat: add Header component"
```
---
### Task 6: Hero section
**Files:**
- Create: `src/components/Hero.astro`
- Modify: `src/pages/index.astro`
- [ ] **Step 1: Create `src/components/Hero.astro`**
```astro
---
const floatCards = [
{
icon: '☷',
title: 'Work / Private / Protected',
desc: 'One account, multiple communication worlds.',
pos: 'left-[-40px] top-[75.5px]',
},
{
icon: '✦',
title: 'AI Summary Ready',
desc: 'Long conversations and group highlights organized automatically.',
pos: 'left-[180px] top-[270px]',
},
{
icon: '◌',
title: 'Protected Hidden Space',
desc: 'When privacy needs more, enter a protected space.',
pos: 'left-[20px] top-[540px]',
},
]
---
✦ Available on iOS and Android
One User.
Multiple Worlds.
Talk Pro is a modern messaging app designed for clear, simple, and reliable communication. From private chats to group conversations, channels, voice calls, and video calls, Talk Pro helps people stay connected in one familiar experience.
Download Talk Pro ↓
Explore Features →
{['Identity Layer', 'AI Native Messaging', 'Adaptive Privacy'].map((tag) => (
))}
{floatCards.map((card) => (
))}
```
- [ ] **Step 2: Update `src/pages/index.astro`**
```astro
---
import Base from '../layouts/Base.astro'
import Header from '../components/Header.astro'
import Hero from '../components/Hero.astro'
---
```
- [ ] **Step 3: Verify in dev server**
Open http://localhost:4321. Expected: Hero with "One User. Multiple Worlds." headline, two CTA buttons, phone mockup with three floating info cards.
- [ ] **Step 4: Commit**
```bash
git add src/components/Hero.astro src/pages/index.astro
git commit -m "feat: add Hero section"
```
---
### Task 7: Core System section
**Files:**
- Create: `src/components/CoreSystem.astro`
- Modify: `src/pages/index.astro`
- [ ] **Step 1: Create `src/components/CoreSystem.astro`**
```astro
---
const cards = [
{ img: '/assets/icon-messaging.png', title: 'Private Messaging', desc: 'Stay connected through fast and familiar one-on-one conversations.' },
{ img: '/assets/icon-groups.png', title: 'Group Chats', desc: 'Create spaces for friends, teams, communities, and shared discussions.' },
{ img: '/assets/icon-channels.png', title: 'Channels', desc: 'Follow updates, announcements, and content from the people or communities you care about.' },
{ img: '/assets/icon-voice.png', title: 'Voice Calls', desc: 'Talk in real time whenever messages are not enough.' },
{ img: '/assets/icon-video.png', title: 'Video Calls', desc: 'Connect face-to-face with a simple and reliable video call experience.' },
{ img: '/assets/icon-media.png', title: 'Media Sharing', desc: 'Share photos, videos, files, and updates in your conversations.' },
]
const rows = [cards.slice(0, 3), cards.slice(3)]
---
CORE SYSTEM
Built for how modern
communication actually works.
Different identities, different conversations, and different privacy levels should not be forced into one flat interface. Talk Pro lets them exist in order inside one platform.
```
- [ ] **Step 2: Update `src/pages/index.astro`**
```astro
---
import Base from '../layouts/Base.astro'
import Header from '../components/Header.astro'
import Hero from '../components/Hero.astro'
import CoreSystem from '../components/CoreSystem.astro'
---
```
- [ ] **Step 3: Verify in dev server**
Scroll down. Expected: "CORE SYSTEM" label, headline, 2 rows × 3 cards with icon images, titles, descriptions.
- [ ] **Step 4: Commit**
```bash
git add src/components/CoreSystem.astro src/pages/index.astro
git commit -m "feat: add Core System section"
```
---
### Task 8: Use Cases section
**Files:**
- Create: `src/components/UseCases.astro`
- Modify: `src/pages/index.astro`
- [ ] **Step 1: Create `src/components/UseCases.astro`**
```astro
---
const cases = [
{ title: 'Work Identity', desc: 'Keep work communication clear, organized, and easier to review.' },
{ title: 'Private Identity', desc: 'Keep personal conversations natural, focused, and separate from work noise.' },
{ title: 'Protected Space', desc: 'Some conversations are not only private. They require stronger boundaries and another layer of protection.' },
]
---
USE CASES
Designed for the worlds you already live in.
Work, private life, and protected conversations should not interfere with each other inside one identity.
```
- [ ] **Step 2: Update `src/pages/index.astro`**
```astro
---
import Base from '../layouts/Base.astro'
import Header from '../components/Header.astro'
import Hero from '../components/Hero.astro'
import CoreSystem from '../components/CoreSystem.astro'
import UseCases from '../components/UseCases.astro'
---
```
- [ ] **Step 3: Verify in dev server**
Scroll down. Expected: "USE CASES" label, headline, 3 cards (Work Identity, Private Identity, Protected Space).
- [ ] **Step 4: Commit**
```bash
git add src/components/UseCases.astro src/pages/index.astro
git commit -m "feat: add Use Cases section"
```
---
### Task 9: Download CTA section
**Files:**
- Create: `src/components/DownloadCTA.astro`
- Modify: `src/pages/index.astro`
- [ ] **Step 1: Create `src/components/DownloadCTA.astro`**
```astro
---
---
DOWNLOAD
Start with one conversation.
Build your own communication space.
Talk Pro supports iOS and Android. Official store links, QR codes, version information, and compatibility notes are reserved on the download page.
```
- [ ] **Step 2: Update `src/pages/index.astro`**
```astro
---
import Base from '../layouts/Base.astro'
import Header from '../components/Header.astro'
import Hero from '../components/Hero.astro'
import CoreSystem from '../components/CoreSystem.astro'
import UseCases from '../components/UseCases.astro'
import DownloadCTA from '../components/DownloadCTA.astro'
---
```
- [ ] **Step 3: Verify in dev server**
Scroll to bottom. Expected: Centered white panel with headline, description, orange Android badge and dark iOS badge.
- [ ] **Step 4: Commit**
```bash
git add src/components/DownloadCTA.astro src/pages/index.astro
git commit -m "feat: add Download CTA section"
```
---
### Task 10: Footer
**Files:**
- Create: `src/components/Footer.astro`
- Modify: `src/pages/index.astro`
- [ ] **Step 1: Create `src/components/Footer.astro`**
```astro
---
const columns: Record = {
Product: ['Features', 'Product', 'Download'],
Privacy: ['Privacy Policy', 'Protected Space', 'Security'],
Company: ['About', 'Support', 'Contact'],
}
---
```
- [ ] **Step 2: Update `src/pages/index.astro`**
```astro
---
import Base from '../layouts/Base.astro'
import Header from '../components/Header.astro'
import Hero from '../components/Hero.astro'
import CoreSystem from '../components/CoreSystem.astro'
import UseCases from '../components/UseCases.astro'
import DownloadCTA from '../components/DownloadCTA.astro'
import Footer from '../components/Footer.astro'
---
```
- [ ] **Step 3: Verify in dev server**
Scroll to the very bottom. Expected: Warm beige footer with Talk Pro brand, three link columns (Product, Privacy, Company), divider line, copyright and legal links.
- [ ] **Step 4: Commit**
```bash
git add src/components/Footer.astro src/pages/index.astro
git commit -m "feat: add Footer component"
```
---
### Task 11: Production build verification
**Files:** None new
- [ ] **Step 1: Stop the dev server (Ctrl+C), then run a production build**
```bash
npm run build
```
Expected: `dist/` folder created, zero errors, zero TypeScript errors.
- [ ] **Step 2: Preview the production build**
```bash
npm run preview
```
Open http://localhost:4321. Scroll through the full page and verify:
- All 6 sections render (Header, Hero, CoreSystem, UseCases, DownloadCTA, Footer)
- All images load (no broken image icons)
- Inter font displays correctly
- Orange brand color `#f28a4b` is visible on buttons and labels
- Cream background `#f8f3ee` throughout
- [ ] **Step 3: Final commit**
```bash
git add -A
git commit -m "feat: complete Talk Pro landing page"
```