From 2475691ec49263c3ae1d8d32c5bc8f8091b68c05 Mon Sep 17 00:00:00 2001 From: dkarasiewicz Date: Tue, 27 Jan 2026 19:01:30 +0100 Subject: [PATCH] LAU-38: align landing page with Launchline mission --- CONTRIBUTING.md | 4 +- README.md | 93 ++++++++++++++----- .../ui/src/components/footer-section.tsx | 2 +- .../client/ui/src/components/hero-section.tsx | 17 ++-- .../src/components/how-it-works-section.tsx | 68 +++++++++----- .../src/components/integrations-section.tsx | 47 ++++++---- .../ui/src/components/open-source-section.tsx | 8 +- .../ui/src/components/pricing-section.tsx | 4 +- .../ui/src/components/problem-section.tsx | 49 ++++++---- .../ui/src/components/solution-section.tsx | 92 +++++++++++------- .../tool-ui/data-table/data-table.tsx | 2 +- .../ui/src/components/value-props-section.tsx | 41 ++++++-- .../ui/src/components/vision-section.tsx | 78 ++++++++++------ 13 files changed, 331 insertions(+), 174 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1438243..3ec0d57 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -35,7 +35,7 @@ By contributing, you agree that: - Reviewers should respond within 48 hours if possible; indicate blockers early. - Authors: address feedback promptly and squash/fixup commits as requested. - Prefer clarity over cleverness. Include unit/integration tests for behavior changes. -- The community can shape the roadmap — thoughtful contributions are welcome. +- The community can shape the roadmap - thoughtful contributions are welcome. ## Branching & commit messages - Branch names: feature/, fix/, chore/. @@ -62,4 +62,4 @@ By contributing, you agree that: - PR template: .github/PULL_REQUEST_TEMPLATE.md - License: LICENSE (BSL 1.1 for core, MIT for SDKs) -Thank you for contributing — clear, small, and tested changes are the fastest path to merge. Built in the open, for the community. +Thank you for contributing - clear, small, and tested changes are the fastest path to merge. Built in the open, for the community. diff --git a/README.md b/README.md index a2bdba1..4fdfc33 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,81 @@ # Launchline -Launchline is the **execution inbox for product managers (PMs)** — an AI‑augmented platform that watches work across your tools (Linear, Slack, GitHub), surfaces what matters now, and helps PMs take confident action. +**Transparency without micromanagement. Impact without fake KPIs.** -Unlike dashboards or planning tools that only track work, Launchline focuses on **understanding** and **acting** on work by turning raw signals into summaries, insights, and suggested actions with a human‑in‑the‑loop workflow. +Launchline helps teams see what's *actually* happening - not what fits in spreadsheets. -> Status: Early stage. APIs, schemas, and configuration may change. +--- + +## Why Launchline? + +Most teams waste resources not because people aren't working, but because **context is invisible**: + +- A developer who "closes fewer tickets" might be preventing production fires +- Someone who writes less code might be unlocking others through great design +- A PM who doesn't "ship features" might be keeping the team aligned + +### The problem with traditional tracking + +**Micromanagement metrics** (hours, commits, messages) → fake productivity +**Surface-level dashboards** (tickets closed) → miss the real story +**One-size-fits-all KPIs** → punish different working styles + +Some people thrive on daily increments. Others need deep focus and moments of inspiration. Traditional tools force everyone into the same mold - and punish those who don't fit. + +### What Launchline does differently + +Launchline is an **AI-augmented execution platform** that: + +- **Surfaces hidden impact** - code reviews, mentoring, firefighting, unblocking others +- **Respects context** - understands *why* work is slow, not just *that* it is +- **Embraces different styles** - recognizes value that doesn't show up in Jira +- **Increases transparency** - gives managers clarity without surveillance +- **Keeps it fair** - respects people who do their job, highlights those who go beyond + +We collect signals across your tools (Linear, GitHub, Slack), turn them into insights, and help you understand: + +- Where resources are actually going +- What blockers exist *before* they derail your roadmap +- How each team member's strengths can be better utilized +- Which small actions have the biggest impact on your product + +--- + +## The vision + +### Today: Execution inbox + +An AI-powered PM inbox that surfaces blockers, priority drift, and decisions across tools. + +### Next: Intelligent resource allocation + +- **Predict blockers** before they happen (ML models + platform signals) +- **Recommend work distribution** based on team strengths and historical patterns +- **Show broader context** - what founders miss while focused on immediate priorities + +### Eventually: Impact transparency for everyone + +- **For developers**: See how your work shapes the product, even when it's not "shipping features" +- **For teams**: Highlight underdeveloped areas, frequent pain points, customer impact zones +- **For organizations**: Understand how small actions compound into outcomes + +We believe teams should organize around people's strengths - not force people into arbitrary processes. --- ## Features - **PM Inbox** - - One place for blockers, priority drift, and project update opportunities. + - One place for blockers, priority drift, and project update opportunities - **Generative summaries** - - Human‑readable explanations of context across Linear, GitHub, Slack. + - Human-readable explanations of context across Linear, GitHub, Slack - **Suggested actions** - - Structured, user‑approved actions (update Linear, comment on GitHub, notify via Slack). + - Structured, user-approved actions (update Linear, comment on GitHub, notify via Slack) - **Conversational threads** - - Chat‑style interface for each Inbox item, powered by AI agents. + - Chat-style interface for each Inbox item, powered by AI agents - **Tool integrations** - - Current: Linear, GitHub, Slack. - - Planned: Notion, Jira, Figma, feedback tools. + - Current: Linear, GitHub, Slack + - Planned: Notion, Jira, Figma, feedback tools --- @@ -28,21 +83,17 @@ Unlike dashboards or planning tools that only track work, Launchline focuses on Product work is becoming too complex for humans alone. -Modern products are built across dozens of tools, teams, and decisions. PMs are expected to keep everything aligned — but the system itself doesn\'t learn. Launchline is building the missing layer: a product copilot that understands context, history, and tradeoffs — not just tickets. - -### Today: Execution inbox - -Captures blockers, risks, and decisions across tools. - -### Next: Product memory +Modern products are built across dozens of tools, teams, and decisions. PMs are expected to keep everything aligned - but the system itself doesn't learn. -Understands how your team, product, and users behave over time. +Launchline is building the missing layer: a **product copilot** that understands context, history, and tradeoffs - not just tickets. -### Eventually: Product copilot +### Execution → Memory → Copilot -Helps steer priorities and tradeoffs — grounded in reality. +**Execution inbox**: Captures blockers, risks, and decisions across tools +**Product memory**: Understands how your team, product, and users behave over time +**Product copilot**: Helps steer priorities and tradeoffs - grounded in reality -We start where the pain is highest: execution. Inbox → decisions → unblock → ship. +We start where the pain is highest: **execution**. Inbox → decisions → unblock → ship. --- @@ -212,7 +263,7 @@ pnpm nx start customer-ui -p 2201 ## Contributing -Issues and pull requests are welcome. The community can shape the roadmap — thoughtful contributions are encouraged. +Issues and pull requests are welcome. The community can shape the roadmap - thoughtful contributions are encouraged. For contribution and collaboration guidelines (licensing, code review, PR expectations, triage), see `./CONTRIBUTING.md`. diff --git a/libs/shared/client/ui/src/components/footer-section.tsx b/libs/shared/client/ui/src/components/footer-section.tsx index d595013..7b7e321 100644 --- a/libs/shared/client/ui/src/components/footer-section.tsx +++ b/libs/shared/client/ui/src/components/footer-section.tsx @@ -94,7 +94,7 @@ export function FooterSection() {
-

© 2025 Launchline

+

© 2026 Launchline

diff --git a/libs/shared/client/ui/src/components/hero-section.tsx b/libs/shared/client/ui/src/components/hero-section.tsx index 1a7b80e..1fd7bf2 100644 --- a/libs/shared/client/ui/src/components/hero-section.tsx +++ b/libs/shared/client/ui/src/components/hero-section.tsx @@ -13,24 +13,25 @@ export function HeroSection() {
- Soon in early access + Early access

- The execution inbox + Transparency without
- for product managers + micromanagement

- Launchline watches Linear, Slack, and GitHub — surfaces the things you{' '} - must act on — so you can - unblock teams and deliver with confidence. + Launchline helps teams see what's{' '} + actually happening - not + what fits in spreadsheets. Surface hidden impact, respect context, + embrace different working styles.

- Engineers got coding copilots.{' '} - Product teams never did. + Impact without fake KPIs.{' '} + Finally.

diff --git a/libs/shared/client/ui/src/components/how-it-works-section.tsx b/libs/shared/client/ui/src/components/how-it-works-section.tsx index 824f3ad..b8a1a75 100644 --- a/libs/shared/client/ui/src/components/how-it-works-section.tsx +++ b/libs/shared/client/ui/src/components/how-it-works-section.tsx @@ -1,56 +1,74 @@ -import { Eye, Inbox, Zap } from "lucide-react" +import { Eye, Inbox, Zap } from 'lucide-react'; const steps = [ { - step: "01", + step: '01', icon: Eye, - title: "Observe", - description: "Connects to Linear, Slack, and GitHub. Watches your work in real time.", - accent: "text-status-info", - bg: "bg-status-info/15", + title: 'Observe', + description: + 'Connects to Linear, Slack, and GitHub. Watches your work in real time.', + accent: 'text-status-info', + bg: 'bg-status-info/15', }, { - step: "02", + step: '02', icon: Inbox, - title: "Surface", - description: "Blockers and decisions appear in your inbox with context and actions.", - accent: "text-accent", - bg: "bg-accent/15", + title: 'Surface', + description: + 'Blockers and decisions appear in your inbox with context and actions.', + accent: 'text-accent', + bg: 'bg-accent/15', }, { - step: "03", + step: '03', icon: Zap, - title: "Act", - description: "One click to update tickets, ping teammates, or reprioritize work.", - accent: "text-status-success", - bg: "bg-status-success/15", + title: 'Act', + description: + 'One click to update tickets, ping teammates, or reprioritize work.', + accent: 'text-status-success', + bg: 'bg-status-success/15', }, -] +]; export function HowItWorksSection() { return (
-

How it works

-

Three steps to clarity

+

+ How it works +

+

+ Three steps to transparency +

{steps.map((step, index) => ( -
-
+
+
- {step.step} -

{step.title}

+ + {step.step} + +

+ {step.title} +

-

{step.description}

+

+ {step.description} +

))}
- ) + ); } diff --git a/libs/shared/client/ui/src/components/integrations-section.tsx b/libs/shared/client/ui/src/components/integrations-section.tsx index 385df0e..d0e22fb 100644 --- a/libs/shared/client/ui/src/components/integrations-section.tsx +++ b/libs/shared/client/ui/src/components/integrations-section.tsx @@ -1,27 +1,27 @@ -import { ArrowRight, Zap } from "lucide-react" +import { ArrowRight, Zap } from 'lucide-react'; const integrations = [ { - name: "Linear", - description: "Bidirectional sync of tickets, blockers, and status changes", - color: "bg-status-info", - features: ["Ticket sync", "Blocker detection", "Status updates"], + name: 'Linear', + description: 'Bidirectional sync of tickets, blockers, and status changes', + color: 'bg-status-info', + features: ['Ticket sync', 'Blocker detection', 'Status updates'], }, { - name: "Slack", - description: "Context from standups, threads, and @mentions", - color: "bg-accent", - features: ["Standup parsing", "Thread context", "Notifications"], + name: 'Slack', + description: 'Context from standups, threads, and @mentions', + color: 'bg-accent', + features: ['Standup parsing', 'Thread context', 'Notifications'], }, { - name: "GitHub", - description: "PR status, reviews, and deployment metadata", - color: "bg-foreground/60", - features: ["PR tracking", "Review status", "Deploy events"], + name: 'GitHub', + description: 'PR status, reviews, and deployment metadata', + color: 'bg-foreground/60', + features: ['PR tracking', 'Review status', 'Deploy events'], }, -] +]; -const upcoming = ["Notion", "Jira", "Figma", "Customer feedback tools"] +const upcoming = ['Notion', 'Jira', 'Figma', 'Customer feedback tools']; export function IntegrationsSection() { return ( @@ -29,13 +29,16 @@ export function IntegrationsSection() {
-

Integrations

+

+ Integrations +

Works with the tools you already use

- Connect once. Launchline watches, learns, and surfaces what matters. + We collect signals across your tools and turn them into insights + about real impact.

@@ -47,9 +50,13 @@ export function IntegrationsSection() { >
- {integration.name} + + {integration.name} +
-

{integration.description}

+

+ {integration.description} +

{integration.features.map((feature) => (
- ) + ); } diff --git a/libs/shared/client/ui/src/components/open-source-section.tsx b/libs/shared/client/ui/src/components/open-source-section.tsx index e113e10..cde2a1f 100644 --- a/libs/shared/client/ui/src/components/open-source-section.tsx +++ b/libs/shared/client/ui/src/components/open-source-section.tsx @@ -5,18 +5,20 @@ const openSourceBenefits = [ { icon: Code2, title: 'Transparent by design', - description: 'Audit the code. Understand the logic. No black boxes.', + description: + 'Audit the code. Understand the logic. No black boxes or hidden metrics.', }, { icon: Users, title: 'Community-driven', - description: 'Contribute features, report issues, and shape the roadmap.', + description: + 'Contribute features, report issues, and help shape how teams work.', }, { icon: Shield, title: 'Self-host if you want', description: - 'Run Launchline on your own infrastructure. You own your data.', + 'Run Launchline on your own infrastructure. Your data, your rules.', }, ]; diff --git a/libs/shared/client/ui/src/components/pricing-section.tsx b/libs/shared/client/ui/src/components/pricing-section.tsx index 4ea067c..8e8b319 100644 --- a/libs/shared/client/ui/src/components/pricing-section.tsx +++ b/libs/shared/client/ui/src/components/pricing-section.tsx @@ -22,8 +22,8 @@ export function PricingSection() { Join the founding users

- We're onboarding a small group of PMs to shape Launchline together. - Limited spots available. + We're onboarding a small group of teams who want transparency + without micromanagement. Limited spots available.

diff --git a/libs/shared/client/ui/src/components/problem-section.tsx b/libs/shared/client/ui/src/components/problem-section.tsx index 940b7ae..7bc9fa2 100644 --- a/libs/shared/client/ui/src/components/problem-section.tsx +++ b/libs/shared/client/ui/src/components/problem-section.tsx @@ -1,27 +1,27 @@ -import { AlertCircle, TrendingDown, Layers, Clock } from "lucide-react" +import { BarChart3, TrendingDown, Layers, UserX } from 'lucide-react'; const problems = [ { - icon: AlertCircle, - title: "Blockers go unnoticed", - text: "Dependencies stall silently until delivery slips.", + icon: BarChart3, + title: 'Micromanagement metrics', + text: 'Hours, commits, messages tracked - fake productivity rewarded.', }, { icon: TrendingDown, - title: "Priorities drift", - text: "What's being built diverges from what was planned.", + title: 'Surface-level dashboards', + text: 'Tickets closed shown, but the real story is missed.', }, { icon: Layers, - title: "Context is fragmented", - text: "Linear, Slack, GitHub — never connected.", + title: 'Context is invisible', + text: 'Who prevents fires? Who unlocks others? Nobody knows.', }, { - icon: Clock, - title: "Updates consume time", - text: "Hours spent on status that could resolve problems.", + icon: UserX, + title: 'One-size-fits-all KPIs', + text: 'Different working styles get punished, not embraced.', }, -] +]; export function ProblemSection() { return ( @@ -29,29 +29,40 @@ export function ProblemSection() {
-

The problem

+

+ The problem +

- Product management is not about tools + Teams waste resources not because people aren't working
- — it's about what you miss + + - but because context is invisible +

{problems.map((problem, index) => ( -
+
-

{problem.title}

-

{problem.text}

+

+ {problem.title} +

+

+ {problem.text} +

))}
- ) + ); } diff --git a/libs/shared/client/ui/src/components/solution-section.tsx b/libs/shared/client/ui/src/components/solution-section.tsx index e55b19c..98ae16e 100644 --- a/libs/shared/client/ui/src/components/solution-section.tsx +++ b/libs/shared/client/ui/src/components/solution-section.tsx @@ -1,49 +1,62 @@ -import { Inbox, AlertTriangle, TrendingDown, FileText, GitBranch, Hand } from "lucide-react" +import { + Inbox, + AlertTriangle, + TrendingDown, + FileText, + GitBranch, + Hand, +} from 'lucide-react'; const features = [ { icon: Inbox, - title: "PM Inbox", - description: "Your action queue for blockers, decisions, and drift. One place for everything that needs attention.", - accent: "text-accent", - bg: "bg-accent/15", + title: 'PM Inbox', + description: + 'Your action queue for blockers, decisions, and drift. One place for everything that needs attention.', + accent: 'text-accent', + bg: 'bg-accent/15', }, { icon: AlertTriangle, - title: "Blocker Detection", - description: "Automatically surfaces stalled work, dependency conflicts, and blocked teammates.", - accent: "text-status-error", - bg: "bg-status-error/15", + title: 'Blocker Detection', + description: + 'Automatically surfaces stalled work, dependency conflicts, and blocked teammates.', + accent: 'text-status-error', + bg: 'bg-status-error/15', }, { icon: TrendingDown, - title: "Priority Drift Alerts", - description: "Know when execution diverges from plan. Catch scope changes before they compound.", - accent: "text-status-warning", - bg: "bg-status-warning/15", + title: 'Priority Drift Alerts', + description: + 'Know when execution diverges from plan. Catch scope changes before they compound.', + accent: 'text-status-warning', + bg: 'bg-status-warning/15', }, { icon: FileText, - title: "Auto Project Updates", - description: "Draft stakeholder updates from real work. No more status meeting prep.", - accent: "text-status-info", - bg: "bg-status-info/15", + title: 'Auto Project Updates', + description: + 'Draft stakeholder updates from real work. No more status meeting prep.', + accent: 'text-status-info', + bg: 'bg-status-info/15', }, { icon: GitBranch, - title: "Linear & GitHub Sync", - description: "Bidirectional sync keeps everything aligned. Work in the tools you already use.", - accent: "text-muted-foreground", - bg: "bg-secondary", + title: 'Linear & GitHub Sync', + description: + 'Bidirectional sync keeps everything aligned. Work in the tools you already use.', + accent: 'text-muted-foreground', + bg: 'bg-secondary', }, { icon: Hand, - title: "Human-in-the-Loop", - description: "You approve; Launchline executes. Stay in control while moving faster.", - accent: "text-status-success", - bg: "bg-status-success/15", + title: 'Human-in-the-Loop', + description: + 'You approve; Launchline executes. Stay in control while moving faster.', + accent: 'text-status-success', + bg: 'bg-status-success/15', }, -] +]; export function SolutionSection() { return ( @@ -51,28 +64,39 @@ export function SolutionSection() {
-

Features

+

+ Features +

- A single place for what matters + AI-augmented execution platform

- Everything you need to stay ahead of execution — nothing you don't. + Transparency without micromanagement. Impact without fake KPIs.

{features.map((feature, index) => ( -
-
+
+
-

{feature.title}

-

{feature.description}

+

+ {feature.title} +

+

+ {feature.description} +

))}
- ) + ); } diff --git a/libs/shared/client/ui/src/components/tool-ui/data-table/data-table.tsx b/libs/shared/client/ui/src/components/tool-ui/data-table/data-table.tsx index c7c3090..ee99965 100644 --- a/libs/shared/client/ui/src/components/tool-ui/data-table/data-table.tsx +++ b/libs/shared/client/ui/src/components/tool-ui/data-table/data-table.tsx @@ -301,7 +301,7 @@ function CellValue>({ locale: string; }) { if (value === null || value === undefined) { - return ; + return -; } const format = column.format; diff --git a/libs/shared/client/ui/src/components/value-props-section.tsx b/libs/shared/client/ui/src/components/value-props-section.tsx index 1de3aa6..3b3a88d 100644 --- a/libs/shared/client/ui/src/components/value-props-section.tsx +++ b/libs/shared/client/ui/src/components/value-props-section.tsx @@ -1,24 +1,45 @@ -import { Search, RefreshCw, Eye, Layers } from "lucide-react" +import { Code2, Users, Building2, Target } from 'lucide-react'; const reasons = [ - { icon: Search, text: "Find issues before they become delays", accent: "text-accent" }, - { icon: RefreshCw, text: "Coordinate execution without chasing updates", accent: "text-status-info" }, - { icon: Eye, text: "Get visibility without dashboards that distract", accent: "text-status-success" }, - { icon: Layers, text: "Stay in control without constant tool switching", accent: "text-accent" }, -] + { + icon: Code2, + text: 'For developers: See how your work shapes the product - even without shipping features', + accent: 'text-accent', + }, + { + icon: Users, + text: 'For teams: Highlight underdeveloped areas and frequent pain points', + accent: 'text-status-info', + }, + { + icon: Building2, + text: 'For organizations: Understand how small actions compound into outcomes', + accent: 'text-status-success', + }, + { + icon: Target, + text: 'For managers: Get clarity without surveillance', + accent: 'text-accent', + }, +]; export function ValuePropsSection() { return (
-

Why it matters

+

+ Why it matters +

- Designed for the way PMs actually work + Organize around people's strengths - not arbitrary processes

{reasons.map((reason, index) => ( -
+

{reason.text}

@@ -26,5 +47,5 @@ export function ValuePropsSection() {
- ) + ); } diff --git a/libs/shared/client/ui/src/components/vision-section.tsx b/libs/shared/client/ui/src/components/vision-section.tsx index afa0505..c39782e 100644 --- a/libs/shared/client/ui/src/components/vision-section.tsx +++ b/libs/shared/client/ui/src/components/vision-section.tsx @@ -1,28 +1,29 @@ -import { Inbox, Brain, Sparkles, ChevronRight } from "lucide-react" +import { Inbox, Brain, Sparkles, ChevronRight } from 'lucide-react'; const stages = [ { - label: "Today", - title: "Execution inbox", - description: "Captures blockers, risks, and decisions across tools.", + label: 'Today', + title: 'Execution inbox', + description: 'Captures blockers, risks, and decisions across tools.', icon: Inbox, active: true, }, { - label: "Next", - title: "Product memory", - description: "Understands how your team, product, and users behave over time.", + label: 'Next', + title: 'Product memory', + description: + 'Understands how your team, product, and users behave over time.', icon: Brain, active: false, }, { - label: "Eventually", - title: "Product copilot", - description: "Helps steer priorities and tradeoffs — grounded in reality.", + label: 'Eventually', + title: 'Product copilot', + description: 'Helps steer priorities and tradeoffs - grounded in reality.', icon: Sparkles, active: false, }, -] +]; export function VisionSection() { return ( @@ -39,11 +40,14 @@ export function VisionSection() { for humans alone

- Products today are built across dozens of tools, teams, and decisions. PMs are expected to keep everything - aligned — but the system itself doesn't learn. Launchline is building the missing layer: a product copilot - that understands context,{" "} - history, and{" "} - tradeoffs — not just tickets. + Products today are built across dozens of tools, teams, and + decisions. PMs are expected to keep everything aligned - but the + system itself doesn't learn. Launchline is building the missing + layer: a product copilot that understands{' '} + context,{' '} + history, and{' '} + tradeoffs - not just + tickets.

@@ -54,42 +58,58 @@ export function VisionSection() {
{stage.label} {stage.active && ( - Current + + Current + )}
-

+

{stage.title}

{stage.description}

@@ -108,11 +128,13 @@ export function VisionSection() { {/* Anchor back to today */}

- We start where the pain is highest:{" "} - execution. Inbox → decisions → unblock → ship. + We start where the pain is highest:{' '} + + execution. See context → understand impact → ship with confidence. +

- ) + ); }