Skip to content
This repository was archived by the owner on Jun 26, 2026. It is now read-only.

Rebuild homepage into a skills marketplace with DFY services#2

Open
ctrlswing wants to merge 1 commit into
mainfrom
feat/skills-marketplace
Open

Rebuild homepage into a skills marketplace with DFY services#2
ctrlswing wants to merge 1 commit into
mainfrom
feat/skills-marketplace

Conversation

@ctrlswing

Copy link
Copy Markdown
Contributor

Rebuilds channel47.dev from a single-page advertorial landing into a full skills marketplace with a done-for-you path — keeping and extending the existing dark / amber / mono editorial aesthetic.

What's new

Skill data layersrc/data/skills.ts: typed Skill interface (slug, title, descriptions, lab, price, tags, status, complementarySkills, includes), 5 available skills across 3 labs (Foundations → Research → Conversion) + 3 coming-soon placeholders. Helpers: getSkill, getAvailableSkills, getComingSoonSkills, getSkillsByLab, getComplementarySkills, formatPrice.

Pages

  • / — storefront: compact "Skills for vibe marketers" hero, featured grid, DFY section (the only Book-a-call CTA), social proof (3.2k+ / $6M+ / MIT), email capture (reuses SignupForm).
  • /skills — full catalog grouped by lab; coming-soon cards dimmed with badges.
  • /skills/[slug] — detail page (SSG via generateStaticParams + generateMetadata): buy box, what's-included, "works well with", DFY branch. All 8 prerendered.
  • /advertorial — the original landing moved here intact (inline header/footer removed since chrome is now global).

ComponentsSkillCard, SkillGrid, Navigation (sticky, cart count badge), CartDrawer (slide-in, Escape + scroll-lock), Footer, SkillBuyActions, reusable DFYSection.

Cartsrc/context/cart.tsx: React context (items + drawer open state), add/remove/clear, nav count badge.

Stripe checkoutPOST /api/checkout builds a Checkout Session from cart slugs (filters to purchasable). Gracefully handles missing STRIPE_SECRET_KEY (→ 503, friendly message) and empty/coming-soon carts (→ 400). stripe added to deps; .env.example documents the keys.

Layout & meta — global CartProvider + Navigation + Footer + CartDrawer; metadata + OG/Twitter tags updated for the new purpose. Extended @theme tokens (card surfaces, strong line).

Notes

  • Next.js 16: async params handled via the generated PageProps / RouteContext helpers; Turbopack default build.
  • Kit subscribe route and SignupForm left untouched as required.
  • Verified: npm run build (clean, 8 SSG skill pages), npm run lint (clean), and all flows screenshotted in-browser (home, cart drawer, detail, catalog, mobile).

Follow-ups (placeholders to swap)

  • Book-a-call link in src/lib/site.ts (cal.com/ctrlswing/dfy).
  • Prices are placeholders ($39–$79) via inline Stripe price_data; wire real Price IDs when ready.

🤖 Generated with Claude Code

Turn the single-page advertorial landing into a full storefront while
keeping the dark/amber/mono editorial aesthetic.

- Typed skill catalog (src/data/skills.ts): 5 available skills across 3
  labs + 3 coming-soon placeholders, with helpers + price formatting
- Pages: new storefront home, /skills catalog grouped by lab,
  /skills/[slug] detail (SSG via generateStaticParams + generateMetadata),
  and the original advertorial moved to /advertorial
- Components: SkillCard, SkillGrid, Navigation, CartDrawer, Footer,
  SkillBuyActions, reusable DFYSection
- Cart: React context (items + drawer state) with nav count badge
- Stripe: POST /api/checkout builds a Checkout Session from cart slugs;
  gracefully handles missing STRIPE_SECRET_KEY and non-purchasable items
- Global chrome + metadata in layout; OG/Twitter tags updated
- Extend @theme tokens (card surfaces, strong line); add stripe dep

Next.js 16: async params via PageProps/RouteContext helpers. Kit subscribe
route and SignupForm left untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant