Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/<short-desc>, fix/<short-desc>, chore/<short-desc>.
Expand All @@ -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.
93 changes: 72 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,99 @@
# 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**
- Humanreadable explanations of context across Linear, GitHub, Slack.
- Human-readable explanations of context across Linear, GitHub, Slack
- **Suggested actions**
- Structured, userapproved actions (update Linear, comment on GitHub, notify via Slack).
- Structured, user-approved actions (update Linear, comment on GitHub, notify via Slack)
- **Conversational threads**
- Chatstyle 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

---

## The bigger picture

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.

---

Expand Down Expand Up @@ -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`.

Expand Down
2 changes: 1 addition & 1 deletion libs/shared/client/ui/src/components/footer-section.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ export function FooterSection() {
</div>

<div className="pt-8 border-t border-border">
<p className="text-xs text-muted-foreground/60">© 2025 Launchline</p>
<p className="text-xs text-muted-foreground/60">© 2026 Launchline</p>
</div>
</div>
</footer>
Expand Down
17 changes: 9 additions & 8 deletions libs/shared/client/ui/src/components/hero-section.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,25 @@ export function HeroSection() {

<div className="relative z-10 mx-auto max-w-3xl px-6 text-center">
<div className="inline-flex items-center rounded-full border border-border bg-secondary/30 px-3 py-1 text-xs text-muted-foreground mb-12">
Soon in early access
Early access
</div>

<h1 className="text-4xl md:text-6xl font-medium tracking-tight text-foreground leading-[1.1] mb-6">
The execution inbox
Transparency without
<br />
<span className="text-accent">for product managers</span>
<span className="text-accent">micromanagement</span>
</h1>

<p className="text-lg text-muted-foreground max-w-xl mx-auto mb-8 leading-relaxed">
Launchline watches Linear, Slack, and GitHub — surfaces the things you{' '}
<em className="text-accent not-italic">must</em> act on — so you can
unblock teams and deliver with confidence.
Launchline helps teams see what's{' '}
<em className="text-accent not-italic">actually</em> happening - not
what fits in spreadsheets. Surface hidden impact, respect context,
embrace different working styles.
</p>

<p className="text-sm text-muted-foreground/80 mb-12">
Engineers got coding copilots.{' '}
<span className="text-foreground/80">Product teams never did.</span>
Impact without fake KPIs.{' '}
<span className="text-foreground/80">Finally.</span>
</p>

<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
Expand Down
68 changes: 43 additions & 25 deletions libs/shared/client/ui/src/components/how-it-works-section.tsx
Original file line number Diff line number Diff line change
@@ -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 (
<section id="how-it-works" className="py-24 bg-background">
<div className="mx-auto max-w-4xl px-6">
<div className="text-center mb-16">
<p className="text-xs font-medium text-muted-foreground/80 mb-6 uppercase tracking-widest">How it works</p>
<h2 className="text-2xl md:text-3xl font-medium tracking-tight text-foreground">Three steps to clarity</h2>
<p className="text-xs font-medium text-muted-foreground/80 mb-6 uppercase tracking-widest">
How it works
</p>
<h2 className="text-2xl md:text-3xl font-medium tracking-tight text-foreground">
Three steps to transparency
</h2>
</div>

<div className="grid md:grid-cols-3 gap-6">
{steps.map((step, index) => (
<div key={index} className="p-6 rounded-xl bg-card/50 border border-border hover:bg-card transition-colors">
<div className={`w-10 h-10 rounded-lg ${step.bg} flex items-center justify-center mb-4`}>
<div
key={index}
className="p-6 rounded-xl bg-card/50 border border-border hover:bg-card transition-colors"
>
<div
className={`w-10 h-10 rounded-lg ${step.bg} flex items-center justify-center mb-4`}
>
<step.icon className={`h-5 w-5 ${step.accent}`} />
</div>
<div className="flex items-baseline gap-2 mb-2">
<span className={`text-sm font-medium ${step.accent}`}>{step.step}</span>
<h3 className="text-base font-medium text-foreground">{step.title}</h3>
<span className={`text-sm font-medium ${step.accent}`}>
{step.step}
</span>
<h3 className="text-base font-medium text-foreground">
{step.title}
</h3>
</div>
<p className="text-sm text-muted-foreground leading-relaxed">{step.description}</p>
<p className="text-sm text-muted-foreground leading-relaxed">
{step.description}
</p>
</div>
))}
</div>
</div>
</section>
)
);
}
47 changes: 27 additions & 20 deletions libs/shared/client/ui/src/components/integrations-section.tsx
Original file line number Diff line number Diff line change
@@ -1,41 +1,44 @@
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 (
<section id="integrations" className="py-24 bg-background">
<div className="mx-auto max-w-4xl px-6">
<div className="flex flex-col md:flex-row md:items-end md:justify-between gap-4 mb-12">
<div>
<p className="text-xs font-medium text-muted-foreground/80 mb-3 uppercase tracking-widest">Integrations</p>
<p className="text-xs font-medium text-muted-foreground/80 mb-3 uppercase tracking-widest">
Integrations
</p>
<h2 className="text-2xl md:text-3xl font-medium tracking-tight text-foreground">
Works with the tools you already use
</h2>
</div>
<p className="text-sm text-muted-foreground md:text-right max-w-xs">
Connect once. Launchline watches, learns, and surfaces what matters.
We collect signals across your tools and turn them into insights
about real impact.
</p>
</div>

Expand All @@ -47,9 +50,13 @@ export function IntegrationsSection() {
>
<div className="flex items-center gap-3 mb-3">
<div className={`h-3 w-3 rounded-full ${integration.color}`} />
<span className="text-base font-medium text-foreground">{integration.name}</span>
<span className="text-base font-medium text-foreground">
{integration.name}
</span>
</div>
<p className="text-xs text-muted-foreground mb-4 leading-relaxed">{integration.description}</p>
<p className="text-xs text-muted-foreground mb-4 leading-relaxed">
{integration.description}
</p>
<div className="flex flex-wrap gap-1.5">
{integration.features.map((feature) => (
<span
Expand Down Expand Up @@ -85,5 +92,5 @@ export function IntegrationsSection() {
</div>
</div>
</section>
)
);
}
8 changes: 5 additions & 3 deletions libs/shared/client/ui/src/components/open-source-section.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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.',
},
];

Expand Down
Loading
Loading