<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>git-parsec — Full-lifecycle worktree management</title>
<meta name="description" content="From ticket to PR in one command. git-parsec manages the full lifecycle of git worktrees tied to issue tickets with Jira and GitHub Issues integration.">
<meta name="keywords" content="git, worktree, CLI, Rust, Jira, GitHub Issues, GitLab, parallel development, AI agents, developer tools, git-parsec, parsec">
<meta name="author" content="erishforG">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://erishforg.github.io/git-parsec/">
<meta property="og:title" content="git-parsec — From ticket to PR in one command">
<meta property="og:description" content="Full-lifecycle git worktree manager with Jira & GitHub Issues integration. Create isolated workspaces, detect conflicts, ship with one command.">
<meta property="og:site_name" content="git-parsec">
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="git-parsec — From ticket to PR in one command">
<meta name="twitter:description" content="Full-lifecycle git worktree manager with Jira & GitHub Issues integration. Create isolated workspaces, detect conflicts, ship with one command.">
<!-- Canonical -->
<link rel="canonical" href="https://erishforg.github.io/git-parsec/">
<meta name="theme-color" content="#0a0e1a">
<!-- Schema.org Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "git-parsec",
"alternateName": "parsec",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "macOS, Linux, Windows",
"description": "Git worktree lifecycle manager for parallel AI agent workflows. Create isolated workspaces from ticket IDs (Jira, GitHub Issues, GitLab), work in parallel without lock conflicts, ship with one command (push + PR + cleanup). Supports CI monitoring, stacked PRs, conflict detection, and operation history with undo.",
"url": "https://erishforg.github.io/git-parsec/",
"downloadUrl": "https://crates.io/crates/git-parsec",
"softwareVersion": "0.2.4",
"author": {
"@type": "Person",
"name": "erishforG",
"url": "https://github.com/erishforG"
},
"codeRepository": "https://github.com/erishforG/git-parsec",
"programmingLanguage": "Rust",
"license": "https://opensource.org/licenses/MIT",
"keywords": ["git", "worktree", "CLI", "Jira", "GitHub Issues", "GitLab", "parallel development", "AI agents", "developer tools", "pull request", "CI/CD", "stacked PRs", "git worktree manager"],
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is git-parsec?",
"acceptedAnswer": {
"@type": "Answer",
"text": "git-parsec (parsec) is a command-line tool that manages the full lifecycle of git worktrees tied to issue tickets. It creates isolated workspaces from ticket IDs, enables parallel development without lock conflicts, and ships features with one command (push + PR/MR + cleanup). It integrates with Jira, GitHub Issues, and GitLab."
}
},
{
"@type": "Question",
"name": "How does parsec differ from git worktree?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Plain git worktree only creates and removes worktrees. parsec adds full lifecycle management: ticket tracker integration (Jira, GitHub Issues, GitLab), one-step shipping (push + PR + cleanup), cross-worktree conflict detection, operation history with undo, CI status monitoring, stacked PR support, and machine-readable JSON output for AI agents."
}
},
{
"@type": "Question",
"name": "Can multiple AI agents use parsec on the same repository?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Each parsec workspace is a separate git worktree with its own index, so multiple AI agents (or developers) can run git add, commit, and push simultaneously without index.lock conflicts. parsec also detects when multiple workspaces modify the same files."
}
},
{
"@type": "Question",
"name": "How do I install parsec?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Install via cargo: cargo install git-parsec. Or build from source: git clone https://github.com/erishforG/git-parsec.git && cd git-parsec && cargo build --release. The binary is at ./target/release/parsec."
}
}
]
}
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Outfit:wght@400;500;600;700;800;900&family=Source+Sans+3:wght@400;500;600&display=swap" rel="stylesheet">
<style>
/* ================================================
RESET & BASE
================================================ */
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--bg-deep: #060a14;
--bg-base: #0a0e1a;
--bg-raised: #0f1424;
--bg-card: #111828;
--bg-card-hover: #151d30;
--accent-cyan: #4FC3F7;
--accent-blue: #2196F3;
--accent-teal: #26C6DA;
--accent-electric: #40E0D0;
--accent-purple: #7C4DFF;
--accent-glow: rgba(79, 195, 247, 0.15);
--accent-glow-strong: rgba(79, 195, 247, 0.3);
--text-primary: #e8edf5;
--text-secondary: #8892a4;
--text-muted: #5a6577;
--text-code: #b4c7e7;
--border-subtle: rgba(79, 195, 247, 0.08);
--border-accent: rgba(79, 195, 247, 0.2);
--radius-sm: 6px;
--radius-md: 12px;
--radius-lg: 20px;
--radius-xl: 28px;
--font-display: 'Outfit', sans-serif;
--font-body: 'Source Sans 3', sans-serif;
--font-mono: 'JetBrains Mono', monospace;
}
html {
scroll-behavior: smooth;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
font-family: var(--font-body);
background: var(--bg-deep);
color: var(--text-primary);
line-height: 1.6;
overflow-x: hidden;
}
/* ================================================
STARFIELD BACKGROUND
================================================ */
body::before {
content: '';
position: fixed;
top: 0; left: 0;
width: 100%; height: 100%;
background:
radial-gradient(1.5px 1.5px at 20% 30%, rgba(79, 195, 247, 0.4) 50%, transparent 50%),
radial-gradient(1px 1px at 40% 70%, rgba(255, 255, 255, 0.3) 50%, transparent 50%),
radial-gradient(1.2px 1.2px at 60% 20%, rgba(38, 198, 218, 0.35) 50%, transparent 50%),
radial-gradient(1px 1px at 80% 50%, rgba(255, 255, 255, 0.25) 50%, transparent 50%),
radial-gradient(1.3px 1.3px at 10% 80%, rgba(79, 195, 247, 0.3) 50%, transparent 50%),
radial-gradient(0.8px 0.8px at 70% 85%, rgba(255, 255, 255, 0.2) 50%, transparent 50%),
radial-gradient(1px 1px at 90% 15%, rgba(64, 224, 208, 0.3) 50%, transparent 50%),
radial-gradient(1.1px 1.1px at 35% 45%, rgba(255, 255, 255, 0.15) 50%, transparent 50%),
radial-gradient(0.9px 0.9px at 55% 65%, rgba(79, 195, 247, 0.2) 50%, transparent 50%),
radial-gradient(1px 1px at 85% 35%, rgba(255, 255, 255, 0.2) 50%, transparent 50%),
radial-gradient(1.4px 1.4px at 15% 55%, rgba(38, 198, 218, 0.25) 50%, transparent 50%),
radial-gradient(0.7px 0.7px at 45% 90%, rgba(255, 255, 255, 0.15) 50%, transparent 50%),
radial-gradient(1px 1px at 75% 10%, rgba(79, 195, 247, 0.25) 50%, transparent 50%),
radial-gradient(0.9px 0.9px at 25% 75%, rgba(255, 255, 255, 0.18) 50%, transparent 50%),
radial-gradient(1.2px 1.2px at 95% 60%, rgba(64, 224, 208, 0.2) 50%, transparent 50%),
radial-gradient(0.8px 0.8px at 5% 40%, rgba(255, 255, 255, 0.12) 50%, transparent 50%),
radial-gradient(1px 1px at 50% 5%, rgba(79, 195, 247, 0.3) 50%, transparent 50%),
radial-gradient(1.1px 1.1px at 65% 50%, rgba(255, 255, 255, 0.1) 50%, transparent 50%);
pointer-events: none;
z-index: 0;
animation: starDrift 120s linear infinite;
}
@keyframes starDrift {
0% { transform: translateY(0); }
100% { transform: translateY(-30px); }
}
/* ================================================
LAYOUT
================================================ */
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
position: relative;
z-index: 1;
}
section {
position: relative;
z-index: 1;
}
/* ================================================
NAV
================================================ */
nav {
position: fixed;
top: 0; left: 0; right: 0;
z-index: 100;
padding: 16px 0;
background: rgba(6, 10, 20, 0.8);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-bottom: 1px solid var(--border-subtle);
transition: background 0.3s;
}
.nav-inner {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
display: flex;
align-items: center;
justify-content: space-between;
}
.nav-brand {
display: flex;
align-items: center;
gap: 10px;
text-decoration: none;
color: var(--text-primary);
}
.nav-brand-icon {
width: 32px;
height: 32px;
border-radius: 8px;
background: linear-gradient(135deg, var(--accent-cyan), var(--accent-teal));
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
font-weight: 700;
color: var(--bg-deep);
font-family: var(--font-mono);
}
.nav-brand span {
font-family: var(--font-display);
font-weight: 700;
font-size: 18px;
letter-spacing: -0.02em;
}
.nav-links {
display: flex;
gap: 32px;
list-style: none;
}
.nav-links a {
color: var(--text-secondary);
text-decoration: none;
font-size: 14px;
font-weight: 500;
transition: color 0.2s;
}
.nav-links a:hover {
color: var(--accent-cyan);
}
.nav-cta {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 20px;
background: transparent;
border: 1px solid var(--border-accent);
border-radius: var(--radius-sm);
color: var(--accent-cyan);
text-decoration: none;
font-family: var(--font-mono);
font-size: 13px;
font-weight: 500;
transition: all 0.25s;
}
.nav-cta:hover {
background: var(--accent-glow);
border-color: var(--accent-cyan);
box-shadow: 0 0 20px rgba(79, 195, 247, 0.15);
}
.nav-cta svg {
width: 16px;
height: 16px;
}
/* ================================================
HERO
================================================ */
.hero {
min-height: 100vh;
display: flex;
align-items: center;
padding: 140px 0 100px;
position: relative;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
top: -20%;
right: -10%;
width: 800px;
height: 800px;
background: radial-gradient(circle, rgba(79, 195, 247, 0.06) 0%, transparent 70%);
pointer-events: none;
}
.hero::after {
content: '';
position: absolute;
bottom: -10%;
left: -15%;
width: 600px;
height: 600px;
background: radial-gradient(circle, rgba(38, 198, 218, 0.04) 0%, transparent 70%);
pointer-events: none;
}
.hero-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 80px;
align-items: center;
}
.hero-badge {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 16px;
background: var(--accent-glow);
border: 1px solid var(--border-accent);
border-radius: 100px;
font-family: var(--font-mono);
font-size: 12px;
font-weight: 500;
color: var(--accent-cyan);
margin-bottom: 28px;
animation: fadeSlideIn 0.8s ease-out both;
}
.hero-badge::before {
content: '';
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--accent-cyan);
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(79, 195, 247, 0.4); }
50% { opacity: 0.7; box-shadow: 0 0 0 6px rgba(79, 195, 247, 0); }
}
.hero h1 {
font-family: var(--font-display);
font-size: clamp(40px, 5vw, 64px);
font-weight: 900;
line-height: 1.08;
letter-spacing: -0.035em;
margin-bottom: 24px;
animation: fadeSlideIn 0.8s 0.1s ease-out both;
}
.hero h1 .gradient-text {
background: linear-gradient(135deg, var(--accent-cyan) 0%, var(--accent-teal) 40%, var(--accent-electric) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-subtitle {
font-size: 18px;
color: var(--text-secondary);
line-height: 1.7;
margin-bottom: 40px;
max-width: 520px;
animation: fadeSlideIn 0.8s 0.2s ease-out both;
}
.hero-actions {
display: flex;
align-items: center;
gap: 16px;
flex-wrap: wrap;
animation: fadeSlideIn 0.8s 0.3s ease-out both;
}
.btn-primary {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 14px 28px;
background: linear-gradient(135deg, var(--accent-cyan), var(--accent-blue));
color: var(--bg-deep);
font-family: var(--font-display);
font-weight: 700;
font-size: 15px;
border: none;
border-radius: var(--radius-md);
text-decoration: none;
cursor: pointer;
transition: all 0.3s;
box-shadow: 0 4px 24px rgba(79, 195, 247, 0.25);
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 32px rgba(79, 195, 247, 0.35);
}
.btn-secondary {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 14px 28px;
background: var(--bg-card);
color: var(--text-primary);
font-family: var(--font-display);
font-weight: 600;
font-size: 15px;
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
text-decoration: none;
cursor: pointer;
transition: all 0.3s;
}
.btn-secondary:hover {
background: var(--bg-card-hover);
border-color: var(--border-accent);
}
/* Hero Terminal */
.hero-terminal {
background: var(--bg-base);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg);
overflow: hidden;
box-shadow:
0 4px 6px rgba(0, 0, 0, 0.3),
0 24px 48px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(79, 195, 247, 0.05),
inset 0 1px 0 rgba(255, 255, 255, 0.03);
animation: fadeSlideUp 1s 0.4s ease-out both;
position: relative;
}
.hero-terminal::after {
content: '';
position: absolute;
inset: -1px;
border-radius: var(--radius-lg);
background: linear-gradient(135deg, rgba(79, 195, 247, 0.1), transparent 50%, rgba(38, 198, 218, 0.05));
pointer-events: none;
z-index: 0;
}
.terminal-bar {
display: flex;
align-items: center;
gap: 8px;
padding: 14px 18px;
background: var(--bg-raised);
border-bottom: 1px solid var(--border-subtle);
position: relative;
z-index: 1;
}
.terminal-dot {
width: 12px;
height: 12px;
border-radius: 50%;
}
.terminal-dot:nth-child(1) { background: #ff5f57; }
.terminal-dot:nth-child(2) { background: #febc2e; }
.terminal-dot:nth-child(3) { background: #28c840; }
.terminal-title {
flex: 1;
text-align: center;
font-family: var(--font-mono);
font-size: 12px;
color: var(--text-muted);
margin-right: 36px;
}
.terminal-body {
padding: 24px;
font-family: var(--font-mono);
font-size: 13px;
line-height: 1.8;
position: relative;
z-index: 1;
overflow-x: auto;
}
.terminal-body .comment { color: var(--text-muted); }
.terminal-body .prompt { color: var(--accent-cyan); }
.terminal-body .command { color: var(--text-primary); }
.terminal-body .flag { color: var(--accent-purple); }
.terminal-body .success { color: #28c840; }
.terminal-body .info { color: var(--text-secondary); }
.terminal-body .link { color: var(--accent-teal); }
.terminal-body .arg { color: #ffb74d; }
.terminal-line {
display: block;
white-space: pre;
}
.terminal-line.typing::after {
content: '';
display: inline-block;
width: 8px;
height: 16px;
background: var(--accent-cyan);
margin-left: 2px;
animation: blink 1s step-end infinite;
vertical-align: text-bottom;
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
/* ================================================
ANIMATIONS
================================================ */
@keyframes fadeSlideIn {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeSlideUp {
from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); }
}
.reveal {
opacity: 0;
transform: translateY(24px);
transition: opacity 0.7s ease-out, transform 0.7s ease-out;
}
.reveal.visible {
opacity: 1;
transform: translateY(0);
}
.reveal-delay-1 { transition-delay: 0.1s; }
.reveal-delay-2 { transition-delay: 0.2s; }
.reveal-delay-3 { transition-delay: 0.3s; }
.reveal-delay-4 { transition-delay: 0.4s; }
.reveal-delay-5 { transition-delay: 0.5s; }
.reveal-delay-6 { transition-delay: 0.6s; }
/* ================================================
SECTION HEADERS
================================================ */
.section-label {
display: inline-flex;
align-items: center;
gap: 8px;
font-family: var(--font-mono);
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--accent-cyan);
margin-bottom: 16px;
}
.section-label::before {
content: '';
width: 20px;
height: 1px;
background: var(--accent-cyan);
}
.section-title {
font-family: var(--font-display);
font-size: clamp(32px, 4vw, 48px);
font-weight: 800;
line-height: 1.15;
letter-spacing: -0.03em;
margin-bottom: 16px;
}
.section-desc {
font-size: 17px;
color: var(--text-secondary);
line-height: 1.7;
max-width: 600px;
}
/* ================================================
PROBLEM SECTION
================================================ */
.problem-section {
padding: 120px 0;
position: relative;
}
.problem-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, var(--border-accent), transparent);
}
.problem-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 80px;
margin-top: 64px;
align-items: start;
}
.problem-list {
list-style: none;
display: flex;
flex-direction: column;
gap: 20px;
}
.problem-item {
display: flex;
gap: 16px;
padding: 20px;
background: rgba(255, 87, 87, 0.04);
border: 1px solid rgba(255, 87, 87, 0.1);
border-radius: var(--radius-md);
transition: border-color 0.3s;
}
.problem-item:hover {
border-color: rgba(255, 87, 87, 0.2);
}
.problem-icon {
flex-shrink: 0;
width: 36px;
height: 36px;
border-radius: 10px;
background: rgba(255, 87, 87, 0.1);
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
}
.problem-item h4 {
font-family: var(--font-display);
font-size: 15px;
font-weight: 700;
margin-bottom: 4px;
color: var(--text-primary);
}
.problem-item p {
font-size: 14px;
color: var(--text-secondary);
line-height: 1.6;
}
.solution-list {
list-style: none;
display: flex;
flex-direction: column;
gap: 20px;
}
.solution-item {
display: flex;
gap: 16px;
padding: 20px;
background: var(--accent-glow);
border: 1px solid var(--border-accent);
border-radius: var(--radius-md);
transition: border-color 0.3s, box-shadow 0.3s;
}
.solution-item:hover {
border-color: rgba(79, 195, 247, 0.3);
box-shadow: 0 0 24px rgba(79, 195, 247, 0.08);
}
.solution-icon {
flex-shrink: 0;
width: 36px;
height: 36px;
border-radius: 10px;
background: rgba(79, 195, 247, 0.15);
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
}
.solution-item h4 {
font-family: var(--font-display);
font-size: 15px;
font-weight: 700;
margin-bottom: 4px;
color: var(--text-primary);
}
.solution-item p {
font-size: 14px;
color: var(--text-secondary);
line-height: 1.6;
}
.problem-col-header {
font-family: var(--font-display);
font-weight: 700;
font-size: 14px;
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 24px;
display: flex;
align-items: center;
gap: 10px;
}
.problem-col-header.bad { color: #ff5f57; }
.problem-col-header.good { color: var(--accent-cyan); }
.problem-col-header::after {
content: '';
flex: 1;
height: 1px;
background: currentColor;
opacity: 0.2;
}
/* ================================================
FEATURES SECTION
================================================ */
.features-section {
padding: 120px 0;
position: relative;
}
.features-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, var(--border-accent), transparent);
}
.features-header {
text-align: center;
margin-bottom: 72px;
}
.features-header .section-desc {
margin: 0 auto;
}
.features-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
.feature-card {
padding: 32px;
background: var(--bg-card);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg);
transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
position: relative;
overflow: hidden;
}
.feature-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, var(--accent-cyan), var(--accent-teal));
opacity: 0;
transition: opacity 0.4s;
}
.feature-card:hover {
background: var(--bg-card-hover);
border-color: var(--border-accent);
transform: translateY(-4px);
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.3), 0 0 0 1px var(--border-accent);
}
.feature-card:hover::before {
opacity: 1;
}
.feature-card.featured {
grid-column: span 2;
background: linear-gradient(135deg, var(--bg-card) 0%, rgba(79, 195, 247, 0.05) 100%);
border-color: var(--border-accent);
}
.feature-icon {
width: 48px;
height: 48px;
border-radius: 14px;
background: var(--accent-glow);
border: 1px solid var(--border-accent);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
}
.feature-icon svg {
width: 24px;
height: 24px;
stroke: var(--accent-cyan);
fill: none;
stroke-width: 1.8;
stroke-linecap: round;
stroke-linejoin: round;
}
.feature-card h3 {
font-family: var(--font-display);
font-size: 18px;
font-weight: 700;
margin-bottom: 10px;
letter-spacing: -0.01em;
}
.feature-card p {
font-size: 14px;
color: var(--text-secondary);
line-height: 1.7;
}
.feature-code {
margin-top: 16px;
padding: 12px 16px;
background: var(--bg-deep);
border-radius: var(--radius-sm);
font-family: var(--font-mono);
font-size: 12px;
color: var(--text-code);
overflow-x: auto;
}
/* ================================================
COMPARISON TABLE
================================================ */
.comparison-section {
padding: 120px 0;
position: relative;
}
.comparison-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, var(--border-accent), transparent);
}
.comparison-header {
text-align: center;
margin-bottom: 64px;
}
.comparison-header .section-desc {
margin: 0 auto;
}
.comparison-table-wrapper {
overflow-x: auto;
border-radius: var(--radius-lg);
border: 1px solid var(--border-subtle);
}
.comparison-table {
width: 100%;
border-collapse: collapse;
font-size: 14px;
}
.comparison-table thead th {
padding: 20px 24px;
text-align: left;
font-family: var(--font-display);
font-weight: 700;
font-size: 14px;
background: var(--bg-raised);
border-bottom: 1px solid var(--border-subtle);
white-space: nowrap;
}
.comparison-table thead th:first-child {
color: var(--text-secondary);
}
.comparison-table thead th.highlight {
color: var(--accent-cyan);
position: relative;
}
.comparison-table thead th.highlight::after {
content: 'RECOMMENDED';
position: absolute;
top: 6px;
right: 16px;
font-family: var(--font-mono);
font-size: 9px;
font-weight: 700;
letter-spacing: 0.08em;
padding: 2px 8px;
background: rgba(79, 195, 247, 0.15);
border: 1px solid var(--border-accent);
border-radius: 100px;
color: var(--accent-cyan);
}
.comparison-table tbody td {
padding: 16px 24px;
border-bottom: 1px solid var(--border-subtle);
color: var(--text-secondary);
}
.comparison-table tbody tr:last-child td {
border-bottom: none;
}
.comparison-table tbody td:first-child {
font-weight: 500;
color: var(--text-primary);
white-space: nowrap;
}
.comparison-table tbody td.highlight {
background: rgba(79, 195, 247, 0.03);
}
.comparison-table .check {
color: #28c840;
font-weight: 600;
}
.comparison-table .cross {
color: var(--text-muted);
}
.comparison-table .partial {
color: #febc2e;
}
/* ================================================
QUICKSTART SECTION
================================================ */
.quickstart-section {
padding: 120px 0;
position: relative;
}
.quickstart-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, var(--border-accent), transparent);
}
.quickstart-header {
text-align: center;
margin-bottom: 64px;
}
.quickstart-header .section-desc {
margin: 0 auto;
}
.quickstart-steps {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
margin-bottom: 64px;
}
.step-card {
padding: 32px;
background: var(--bg-card);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg);
position: relative;
transition: border-color 0.3s;
}
.step-card:hover {
border-color: var(--border-accent);
}
.step-number {
font-family: var(--font-display);
font-size: 48px;
font-weight: 900;
background: linear-gradient(180deg, rgba(79, 195, 247, 0.3), rgba(79, 195, 247, 0.05));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
line-height: 1;
margin-bottom: 16px;
}
.step-card h3 {
font-family: var(--font-display);
font-weight: 700;
font-size: 17px;
margin-bottom: 8px;
}
.step-card p {
font-size: 14px;
color: var(--text-secondary);
line-height: 1.6;
margin-bottom: 16px;
}
.step-code {
padding: 12px 16px;
background: var(--bg-deep);
border-radius: var(--radius-sm);
font-family: var(--font-mono);
font-size: 13px;
color: var(--accent-cyan);
overflow-x: auto;
}
/* ================================================
INSTALL SECTION
================================================ */
.install-section {
padding: 120px 0;
position: relative;
}
.install-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, var(--border-accent), transparent);
}
.install-wrapper {
max-width: 720px;
margin: 0 auto;
text-align: center;
}
.install-wrapper .section-desc {
margin: 0 auto 48px;
}
.install-options {
display: flex;
flex-direction: column;
gap: 16px;
}
.install-option {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 28px;
background: var(--bg-card);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
transition: all 0.3s;
}
.install-option:hover {
border-color: var(--border-accent);
background: var(--bg-card-hover);
}
.install-option-label {
font-family: var(--font-display);
font-weight: 600;
font-size: 14px;
color: var(--text-secondary);
white-space: nowrap;
min-width: 120px;
text-align: left;
}
.install-option-cmd {
font-family: var(--font-mono);
font-size: 14px;
color: var(--accent-cyan);
flex: 1;
text-align: left;
padding-left: 24px;
}
.install-option-badge {
font-family: var(--font-mono);
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
padding: 4px 10px;
border-radius: 100px;
white-space: nowrap;
}
.install-option-badge.available {
background: rgba(40, 200, 64, 0.1);
color: #28c840;
border: 1px solid rgba(40, 200, 64, 0.2);
}
.install-option-badge.soon {
background: rgba(254, 188, 46, 0.1);
color: #febc2e;
border: 1px solid rgba(254, 188, 46, 0.2);
}
/* ================================================
CTA SECTION
================================================ */
.cta-section {
padding: 120px 0 160px;
text-align: center;
position: relative;
}
.cta-section::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 600px;
height: 400px;
background: radial-gradient(ellipse, rgba(79, 195, 247, 0.06), transparent 70%);
pointer-events: none;
}
.cta-title {
font-family: var(--font-display);
font-size: clamp(36px, 4.5vw, 56px);
font-weight: 900;
letter-spacing: -0.03em;
line-height: 1.1;
margin-bottom: 20px;
}
.cta-desc {
font-size: 18px;
color: var(--text-secondary);
max-width: 500px;
margin: 0 auto 40px;
line-height: 1.7;
}
.cta-actions {
display: flex;
align-items: center;
justify-content: center;
gap: 16px;
flex-wrap: wrap;
}
.cta-install-cmd {
display: inline-flex;
align-items: center;
gap: 12px;
padding: 14px 24px;
background: var(--bg-card);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
font-family: var(--font-mono);
font-size: 14px;
color: var(--text-code);
cursor: pointer;
transition: all 0.3s;
text-decoration: none;
}
.cta-install-cmd:hover {
border-color: var(--border-accent);
background: var(--bg-card-hover);
}
.cta-install-cmd .dollar {
color: var(--text-muted);
}
/* ================================================
FOOTER
================================================ */
footer {
position: relative;
z-index: 1;
padding: 40px 0;
border-top: 1px solid var(--border-subtle);
}
.footer-inner {
display: flex;
align-items: center;
justify-content: space-between;
}
.footer-left {
display: flex;
align-items: center;
gap: 24px;
}
.footer-brand {
font-family: var(--font-display);
font-weight: 700;
font-size: 15px;
color: var(--text-secondary);
}
.footer-links {
display: flex;
gap: 24px;
list-style: none;
}
.footer-links a {
color: var(--text-muted);
text-decoration: none;
font-size: 13px;
transition: color 0.2s;
}
.footer-links a:hover {
color: var(--accent-cyan);
}
.footer-right {
font-size: 13px;
color: var(--text-muted);
}
/* ================================================
RESPONSIVE
================================================ */
@media (max-width: 1024px) {
.hero-grid {
grid-template-columns: 1fr;
gap: 48px;
}
.features-grid {
grid-template-columns: repeat(2, 1fr);
}
.feature-card.featured {
grid-column: span 2;
}
}
@media (max-width: 768px) {
.nav-links { display: none; }
.hero {
padding: 120px 0 80px;
min-height: auto;
}
.problem-grid {
grid-template-columns: 1fr;
gap: 48px;
}
.features-grid {
grid-template-columns: 1fr;
}
.feature-card.featured {
grid-column: span 1;
}
.quickstart-steps {
grid-template-columns: 1fr;
}
.comparison-table-wrapper {
margin: 0 -24px;
border-radius: 0;
border-left: none;
border-right: none;
}
.install-option {
flex-direction: column;
gap: 12px;
align-items: flex-start;
}
.install-option-cmd {
padding-left: 0;
}
.footer-inner {
flex-direction: column;
gap: 16px;
text-align: center;
}
.footer-left {
flex-direction: column;
gap: 12px;
}
}
@media (max-width: 480px) {
.container { padding: 0 16px; }
.terminal-body {
font-size: 11px;
padding: 16px;
}
.hero-actions {
flex-direction: column;
width: 100%;
}
.btn-primary, .btn-secondary {
width: 100%;
justify-content: center;
}
.cta-actions {
flex-direction: column;
}
}
/* ================================================
SCROLLBAR
================================================ */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: var(--bg-deep); }
::-webkit-scrollbar-thumb { background: var(--bg-card); border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: var(--bg-card-hover); }
/* ================================================
SELECTION
================================================ */
::selection {
background: rgba(79, 195, 247, 0.25);
color: var(--text-primary);
}
/* Demo Section */
.demo-section {
padding: 80px 0;
}
.demo-header {
text-align: center;
margin-bottom: 48px;
}
.demo-container {
max-width: 900px;
margin: 0 auto;
border-radius: 12px;
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
}
.demo-gif {
width: 100%;
display: block;
}
</style>
</head>
<body>
<!-- ============ NAV ============ -->
<nav>
<div class="nav-inner">
<a href="#" class="nav-brand">
<div class="nav-brand-icon">P</div>
<span>git-parsec</span>
</a>
<ul class="nav-links">
<li><a href="#features">Features</a></li>
<li><a href="#comparison">Compare</a></li>
<li><a href="#quickstart">Quick Start</a></li>
<li><a href="#install">Install</a></li>
</ul>
<a href="https://github.com/erishforG/git-parsec" class="nav-cta" target="_blank" rel="noopener">
<svg viewBox="0 0 16 16" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
GitHub
</a>
</div>
</nav>
<!-- ============ HERO ============ -->
<section class="hero" id="hero">
<div class="container">
<div class="hero-grid">
<div>
<div class="hero-badge">Built with Rust</div>
<h1>
From ticket to PR<br>
<span class="gradient-text">in one command.</span>
</h1>
<p class="hero-subtitle">
git-parsec manages the full lifecycle of git worktrees tied to your issue tracker. Start a ticket, code in parallel, ship a PR, and clean up -- all without leaving your terminal.
</p>
<div class="hero-actions">
<a href="#install" class="btn-primary">
Get Started
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</a>
<a href="https://github.com/erishforG/git-parsec" class="btn-secondary" target="_blank" rel="noopener">
<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
View on GitHub
</a>
</div>
</div>
<div class="hero-terminal">
<div class="terminal-bar">
<div class="terminal-dot"></div>
<div class="terminal-dot"></div>
<div class="terminal-dot"></div>
<div class="terminal-title">parsec -- zsh</div>
</div>
<div class="terminal-body">
<span class="terminal-line"><span class="comment"># Start working on a Jira ticket</span></span>
<span class="terminal-line"><span class="prompt">$</span> <span class="command">parsec start</span> <span class="arg">CL-2283</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">Created worktree for </span><span class="arg">CL-2283</span></span>
<span class="terminal-line"><span class="info"> Title: Collect HeuristicCompletionException handling</span></span>
<span class="terminal-line"><span class="info"> Branch: </span><span class="link">feature/CL-2283</span></span>
<span class="terminal-line"><span class="info"> Path: ../myproject.CL-2283</span></span>
<span class="terminal-line"> </span>
<span class="terminal-line"><span class="comment"># Work in parallel on another ticket</span></span>
<span class="terminal-line"><span class="prompt">$</span> <span class="command">parsec start</span> <span class="arg">CL-2290</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">Created worktree for </span><span class="arg">CL-2290</span></span>
<span class="terminal-line"> </span>
<span class="terminal-line"><span class="comment"># Ship it -- push, create PR, cleanup</span></span>
<span class="terminal-line"><span class="prompt">$</span> <span class="command">parsec ship</span> <span class="arg">CL-2283</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">Pushed </span><span class="link">feature/CL-2283</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">PR created: </span><span class="link">github.com/org/repo/pull/42</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">Worktree cleaned up</span></span>
<span class="terminal-line typing"> </span>
</div>
</div>
</div>
</div>
</section>
<!-- ============ PROBLEM / SOLUTION ============ -->
<section class="problem-section" id="problem">
<div class="container">
<div class="reveal">
<div class="section-label">The Problem</div>
<div class="section-title">Git wasn't built for<br>parallel workflows.</div>
<p class="section-desc">
Multiple developers or AI agents on the same repo fight over index.lock.
Worktrees solve isolation, but lack lifecycle management.
</p>
</div>
<div class="problem-grid">
<div class="reveal reveal-delay-1">
<div class="problem-col-header bad">
Without parsec
</div>
<ul class="problem-list">
<li class="problem-item">
<div class="problem-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#ff5f57" stroke-width="2" stroke-linecap="round"><path d="M18 6L6 18M6 6l12 12"/></svg>
</div>
<div>
<h4>Lock contention</h4>
<p>Parallel git operations collide on <code>.git/index.lock</code>, blocking agents and developers.</p>
</div>
</li>
<li class="problem-item">
<div class="problem-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#ff5f57" stroke-width="2" stroke-linecap="round"><path d="M18 6L6 18M6 6l12 12"/></svg>
</div>
<div>
<h4>Manual worktree management</h4>
<p>Create branch, add worktree, remember paths, clean up manually. Error-prone and tedious.</p>
</div>
</li>
<li class="problem-item">
<div class="problem-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#ff5f57" stroke-width="2" stroke-linecap="round"><path d="M18 6L6 18M6 6l12 12"/></svg>
</div>
<div>
<h4>No ticket connection</h4>
<p>Branches and worktrees have no link to your issue tracker. Context gets lost.</p>
</div>
</li>
<li class="problem-item">
<div class="problem-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#ff5f57" stroke-width="2" stroke-linecap="round"><path d="M18 6L6 18M6 6l12 12"/></svg>
</div>
<div>
<h4>Invisible conflicts</h4>
<p>Parallel work silently edits the same files. You only find out at merge time.</p>
</div>
</li>
</ul>
</div>
<div class="reveal reveal-delay-2">
<div class="problem-col-header good">
With parsec
</div>
<ul class="solution-list">
<li class="solution-item">
<div class="solution-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--accent-cyan)" stroke-width="2" stroke-linecap="round"><path d="M20 6L9 17l-5-5"/></svg>
</div>
<div>
<h4>Zero-conflict parallelism</h4>
<p>Each ticket gets its own isolated worktree. No lock contention, ever.</p>
</div>
</li>
<li class="solution-item">
<div class="solution-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--accent-cyan)" stroke-width="2" stroke-linecap="round"><path d="M20 6L9 17l-5-5"/></svg>
</div>
<div>
<h4>One-command lifecycle</h4>
<p><code>parsec start</code> creates everything. <code>parsec ship</code> pushes, PRs, and cleans up.</p>
</div>
</li>
<li class="solution-item">
<div class="solution-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--accent-cyan)" stroke-width="2" stroke-linecap="round"><path d="M20 6L9 17l-5-5"/></svg>
</div>
<div>
<h4>Ticket tracker integration</h4>
<p>Jira and GitHub Issues built in. Branches auto-named, PR titles auto-filled.</p>
</div>
</li>
<li class="solution-item">
<div class="solution-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--accent-cyan)" stroke-width="2" stroke-linecap="round"><path d="M20 6L9 17l-5-5"/></svg>
</div>
<div>
<h4>Early conflict detection</h4>
<p><code>parsec conflicts</code> warns when worktrees touch the same files -- before you merge.</p>
</div>
</li>
<li class="solution-item">
<div class="solution-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--accent-cyan)" stroke-width="2" stroke-linecap="round"><path d="M20 6L9 17l-5-5"/></svg>
</div>
<div>
<h4>Full operation history</h4>
<p><code>parsec log</code> shows everything parsec has done. <code>parsec undo</code> rolls back the last step if something goes wrong.</p>
</div>
</li>
</ul>
</div>
</div>
</div>
</section>
<!-- ============ DEMO ============ -->
<section class="demo-section" id="demo">
<div class="container">
<div class="demo-header reveal">
<div class="section-label">See it in action</div>
<div class="section-title">From ticket to PR in 60 seconds.</div>
</div>
<div class="demo-container reveal reveal-delay-1">
<img src="demo.gif" alt="git-parsec demo showing start, list, switch, log, undo, and clean commands" class="demo-gif" loading="lazy">
</div>
</div>
</section>
<!-- ============ FEATURES ============ -->
<section class="features-section" id="features">
<div class="container">
<div class="features-header reveal">
<div class="section-label">Features</div>
<div class="section-title">Everything you need.<br>Nothing you don't.</div>
<p class="section-desc">
A focused toolset for the complete worktree lifecycle -- from creating isolated workspaces to shipping production-ready PRs.
</p>
</div>
<div class="features-grid">
<!-- Feature 1: Ticket Integration (Featured) -->
<div class="feature-card featured reveal reveal-delay-1">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2"/><rect x="9" y="3" width="6" height="4" rx="1"/><path d="M9 14l2 2 4-4"/></svg>
</div>
<h3>Ticket Tracker Integration</h3>
<p>
Connect to Jira or GitHub Issues. When you <code>parsec start PROJ-123</code>, the ticket title is
fetched automatically, branches are named consistently, and PR/MR descriptions reference the original issue.
Manual <code>--title</code> fallback for offline or unsupported trackers.
</p>
<div class="feature-code">$ parsec start PROJ-123 <span style="color: var(--text-muted)"># auto-fetches title from Jira</span></div>
</div>
<!-- Feature 2: Sibling Layout -->
<div class="feature-card reveal reveal-delay-2">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg>
</div>
<h3>Sibling Worktree Layout</h3>
<p>
Worktrees placed adjacent to your repo as <code>../repo.ticket/</code>. Clean, predictable, and compatible with your IDE.
</p>
</div>
<!-- Feature 3: One-step Ship -->
<div class="feature-card reveal reveal-delay-3">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</div>
<h3>One-step Shipping</h3>
<p>
<code>parsec ship</code> pushes your branch, creates a GitHub PR or GitLab MR with the ticket context, and cleans up the worktree. One command, done.
</p>
</div>
<!-- Feature 4: Conflict Detection -->
<div class="feature-card reveal reveal-delay-1">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
</div>
<h3>Cross-worktree Conflict Detection</h3>
<p>
Detect when multiple worktrees modify the same files before you merge. Catch conflicts early, not at review time.
</p>
</div>
<!-- Feature 5: Shell Integration & Completions -->
<div class="feature-card reveal reveal-delay-2">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/></svg>
</div>
<h3>Shell Integration & Completions</h3>
<p>
Auto-cd with <code>parsec switch</code>, tab-completions for zsh/bash/fish/powershell, and a man page — all built in.
</p>
</div>
<!-- Feature 6: Sync -->
<div class="feature-card reveal reveal-delay-3">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
</div>
<h3>Branch Sync</h3>
<p>
Keep worktrees fresh with <code>parsec sync</code> — rebase or merge the latest base branch into one or all worktrees at once.
</p>
</div>
<!-- Feature 7: JSON Output (Featured) -->
<div class="feature-card featured reveal reveal-delay-1">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M16 18l2-2v-4l2-2-2-2V4l-2-2"/><path d="M8 6L6 8v4l-2 2 2 2v4l2 2"/></svg>
</div>
<h3>JSON Output for AI Agents</h3>
<p>
Every command supports <code>--json</code> for machine-readable output. Build automation pipelines,
integrate with AI coding agents, or script complex workflows. parsec is built to be both
human-friendly and agent-friendly.
</p>
<div class="feature-code">$ parsec list --json | jq '.[] | select(.commits > 0)'</div>
</div>
<!-- Feature 8: Adopt -->
<div class="feature-card reveal reveal-delay-2">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M12 5v14M5 12l7-7 7 7"/></svg>
</div>
<h3>Adopt Existing Branches</h3>
<p>
Already have a branch in flight? <code>parsec adopt</code> imports it into parsec management so you get full lifecycle tracking without starting over.
</p>
<div class="feature-code">$ parsec adopt PROJ-99 --branch fix/payment-timeout</div>
</div>
<!-- Feature: Attach to Existing Branch -->
<div class="feature-card reveal reveal-delay-3">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"/></svg>
</div>
<h3>Attach to Existing Branch</h3>
<p>
Need to work on a branch that already exists? <code>parsec start --branch</code> creates a managed worktree from any local or remote branch. Fetches remote-only branches automatically.
</p>
<div class="feature-code">$ parsec start CL-2208 --branch feature/CL-2208</div>
</div>
<!-- Feature 9: Operation History -->
<div class="feature-card reveal reveal-delay-3">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
</div>
<h3>Operation History</h3>
<p>
Every parsec action is logged. Use <code>parsec log</code> to review your full operation history, filter by ticket, or inspect the last N operations at a glance.
</p>
<div class="feature-code">$ parsec log --last 5 <span style="color: var(--text-muted)"># or: parsec log PROJ-1234</span></div>
</div>
<!-- Feature 10: Undo -->
<div class="feature-card reveal reveal-delay-1">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><polyline points="9 14 4 9 9 4"/><path d="M20 20v-7a4 4 0 00-4-4H4"/></svg>
</div>
<h3>Undo Last Operation</h3>
<p>
Made a mistake? <code>parsec undo</code> reverts the most recent operation. Use <code>--dry-run</code> to preview exactly what will be rolled back before committing.
</p>
<div class="feature-code">$ parsec undo --dry-run</div>
</div>
<!-- Feature 11: Open in Browser -->
<div class="feature-card reveal reveal-delay-2">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
</div>
<h3>Open in Browser</h3>
<p>
<code>parsec open</code> launches the PR or ticket page in your browser. Works with GitHub, GitLab, and Jira.
</p>
<div class="feature-code">$ parsec open PROJ-1234</div>
</div>
<!-- Feature 12: PR Status -->
<div class="feature-card reveal reveal-delay-3">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M22 11.08V12a10 10 0 11-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
</div>
<h3>PR Status Dashboard</h3>
<p>
<code>parsec pr-status</code> shows CI checks, review approvals, and merge state for all shipped PRs in one color-coded table.
</p>
<div class="feature-code">$ parsec pr-status PROJ-1234</div>
</div>
<!-- Feature: Stacked PRs -->
<div class="feature-card featured reveal reveal-delay-1">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"/><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/></svg>
</div>
<h3>Stacked PRs</h3>
<p>
Create dependent PR chains with <code>--on</code>. <code>parsec stack</code> shows the dependency graph and <code>--sync</code> rebases the entire chain.
</p>
<div class="feature-code">$ parsec start PROJ-2 --on PROJ-1</div>
</div>
<!-- Feature 13: CI Dashboard -->
<div class="feature-card reveal reveal-delay-1">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
</div>
<h3>CI Pipeline Dashboard</h3>
<p>
<code>parsec ci</code> shows individual check runs, durations, and overall status. Use <code>--watch</code> to poll until completion.
</p>
<div class="feature-code">$ parsec ci --watch</div>
</div>
<!-- Feature 14: Merge from Terminal -->
<div class="feature-card reveal reveal-delay-2">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M15 18l-6-6 6-6"/><path d="M9 18l6-6-6-6" transform="translate(6,0)"/></svg>
</div>
<h3>Merge from Terminal</h3>
<p>
<code>parsec merge</code> merges PRs directly from your terminal. Waits for CI to pass, supports squash and rebase, and cleans up automatically.
</p>
<div class="feature-code">$ parsec merge PROJ-1234</div>
</div>
<!-- Feature 15: Worktree Diff -->
<div class="feature-card reveal reveal-delay-3">
<div class="feature-icon">
<svg viewBox="0 0 24 24"><path d="M12 20V10"/><path d="M18 20V4"/><path d="M6 20v-4"/></svg>
</div>
<h3>Worktree Diff</h3>
<p>
<code>parsec diff</code> shows changes in any worktree compared to its base branch. Supports <code>--stat</code> and <code>--name-only</code> views.
</p>
<div class="feature-code">$ parsec diff --stat</div>
</div>
</div>
</div>
</section>
<!-- ============ COMPARISON ============ -->
<section class="comparison-section" id="comparison">
<div class="container">
<div class="comparison-header reveal">
<div class="section-label">Comparison</div>
<div class="section-title">How parsec stacks up.</div>
<p class="section-desc">
parsec fills the gap between bare git worktree commands and tools that don't connect to your issue tracker.
</p>
</div>
<div class="comparison-table-wrapper reveal reveal-delay-1">
<table class="comparison-table">
<thead>
<tr>
<th>Feature</th>
<th class="highlight">parsec</th>
<th>worktrunk</th>
<th>git worktree</th>
<th>git-town</th>
<th>GitButler</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ticket tracker integration</td>
<td class="highlight"><span class="check">Jira + GitHub Issues</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
</tr>
<tr>
<td>Physical isolation (worktrees)</td>
<td class="highlight"><span class="check">Yes</span></td>
<td><span class="check">Yes</span></td>
<td><span class="check">Yes</span></td>
<td><span class="cross">--</span></td>
<td><span class="partial">Virtual branches</span></td>
</tr>
<tr>
<td>Cross-worktree conflict detection</td>
<td class="highlight"><span class="check">Yes</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
</tr>
<tr>
<td>One-step ship (push + PR/MR + clean)</td>
<td class="highlight"><span class="check">GitHub + GitLab</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="check">Yes</span></td>
<td><span class="cross">--</span></td>
</tr>
<tr>
<td>Operation history & undo</td>
<td class="highlight"><span class="check">Yes</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="check">Yes (undo)</span></td>
<td><span class="check">Yes</span></td>
</tr>
<tr>
<td>JSON output for AI agents</td>
<td class="highlight"><span class="check">Yes</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="check">Yes</span></td>
</tr>
<tr>
<td>CI monitoring</td>
<td class="highlight"><span class="check">Yes (--watch)</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
</tr>
<tr>
<td>Stacked PRs</td>
<td class="highlight"><span class="check">Yes</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="check">Yes</span></td>
<td><span class="check">Yes</span></td>
</tr>
<tr>
<td>Post-create hooks</td>
<td class="highlight"><span class="check">Yes</span></td>
<td><span class="check">Yes</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
</tr>
<tr>
<td>Auto-cleanup merged worktrees</td>
<td class="highlight"><span class="check">Yes</span></td>
<td><span class="cross">--</span></td>
<td><span class="partial">Manual</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
</tr>
<tr>
<td>Forge support</td>
<td class="highlight"><span class="check">GitHub + GitLab</span></td>
<td><span class="partial">GitHub</span></td>
<td><span class="cross">--</span></td>
<td><span class="check">GH, GL, Gitea, BB</span></td>
<td><span class="check">GitHub + GitLab</span></td>
</tr>
<tr>
<td>Zero config start</td>
<td class="highlight"><span class="check">Yes</span></td>
<td><span class="check">Yes</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
<td><span class="cross">--</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- ============ QUICK START ============ -->
<section class="quickstart-section" id="quickstart">
<div class="container">
<div class="quickstart-header reveal">
<div class="section-label">Quick Start</div>
<div class="section-title">Up and running in 60 seconds.</div>
<p class="section-desc">
Three commands from install to your first PR.
</p>
</div>
<div class="quickstart-steps">
<div class="step-card reveal reveal-delay-1">
<div class="step-number">01</div>
<h3>Install</h3>
<p>Install via cargo. A single binary, no runtime dependencies.</p>
<div class="step-code">cargo install git-parsec</div>
</div>
<div class="step-card reveal reveal-delay-2">
<div class="step-number">02</div>
<h3>Configure</h3>
<p>Run interactive setup, enable shell integration and tab-completions.</p>
<div class="step-code">parsec config init<br>eval "$(parsec config completions zsh)"</div>
</div>
<div class="step-card reveal reveal-delay-3">
<div class="step-number">03</div>
<h3>Start building</h3>
<p>Create a worktree from any ticket. Code, commit, and ship when ready.</p>
<div class="step-code">parsec start PROJ-42</div>
</div>
</div>
<!-- Full demo terminal -->
<div class="hero-terminal reveal reveal-delay-2" style="max-width: 800px; margin: 0 auto;">
<div class="terminal-bar">
<div class="terminal-dot"></div>
<div class="terminal-dot"></div>
<div class="terminal-dot"></div>
<div class="terminal-title">full workflow demo</div>
</div>
<div class="terminal-body">
<span class="terminal-line"><span class="comment"># Create isolated workspace from Jira ticket</span></span>
<span class="terminal-line"><span class="prompt">$</span> <span class="command">parsec start</span> <span class="arg">CL-2283</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">Created worktree for CL-2283</span></span>
<span class="terminal-line"><span class="info"> Branch: feature/CL-2283</span></span>
<span class="terminal-line"><span class="info"> Path: ../myproject.CL-2283</span></span>
<span class="terminal-line"> </span>
<span class="terminal-line"><span class="comment"># Switch into the worktree</span></span>
<span class="terminal-line"><span class="prompt">$</span> <span class="command">parsec switch</span> <span class="arg">CL-2283</span></span>
<span class="terminal-line"><span class="info"> cd ../myproject.CL-2283</span></span>
<span class="terminal-line"> </span>
<span class="terminal-line"><span class="comment"># ... do your work, commit as usual ...</span></span>
<span class="terminal-line"> </span>
<span class="terminal-line"><span class="comment"># Check for conflicts with other worktrees</span></span>
<span class="terminal-line"><span class="prompt">$</span> <span class="command">parsec conflicts</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">No file conflicts across 3 active worktrees</span></span>
<span class="terminal-line"> </span>
<span class="terminal-line"><span class="comment"># Ship it -- push, create PR, cleanup</span></span>
<span class="terminal-line"><span class="prompt">$</span> <span class="command">parsec ship</span> <span class="arg">CL-2283</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">Pushed feature/CL-2283 (4 commits)</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">PR #42 created: </span><span class="link">github.com/org/repo/pull/42</span></span>
<span class="terminal-line"><span class="success">✓</span> <span class="info">Worktree cleaned up</span></span>
</div>
</div>
</div>
</section>
<!-- ============ INSTALL ============ -->
<section class="install-section" id="install">
<div class="container">
<div class="install-wrapper">
<div class="reveal">
<div class="section-label">Installation</div>
<div class="section-title">Install parsec.</div>
<p class="section-desc">
A single Rust binary. No runtime dependencies, no node_modules, no Python virtualenvs.
</p>
</div>
<div class="install-options reveal reveal-delay-1">
<div class="install-option">
<span class="install-option-label">Cargo</span>
<span class="install-option-cmd">cargo install git-parsec</span>
<span class="install-option-badge available">Available</span>
</div>
<div class="install-option">
<span class="install-option-label">Homebrew</span>
<span class="install-option-cmd">brew install git-parsec</span>
<span class="install-option-badge soon">Coming soon</span>
</div>
<div class="install-option">
<span class="install-option-label">From source</span>
<span class="install-option-cmd">git clone && cargo build --release</span>
<span class="install-option-badge available">Available</span>
</div>
</div>
</div>
</div>
</section>
<!-- ============ CTA ============ -->
<section class="cta-section">
<div class="container">
<div class="reveal">
<div class="cta-title">
Stop managing worktrees.<br>
<span class="gradient-text" style="background: linear-gradient(135deg, var(--accent-cyan) 0%, var(--accent-teal) 40%, var(--accent-electric) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;">Start shipping tickets.</span>
</div>
<p class="cta-desc">
Join developers who use parsec to work on multiple tickets in parallel without the overhead.
</p>
<div class="cta-actions">
<a href="https://github.com/erishforG/git-parsec" class="btn-primary" target="_blank" rel="noopener">
<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
Star on GitHub
</a>
<div class="cta-install-cmd">
<span class="dollar">$</span> cargo install git-parsec
</div>
</div>
</div>
</div>
</section>
<!-- ============ FOOTER ============ -->
<footer>
<div class="container">
<div class="footer-inner">
<div class="footer-left">
<span class="footer-brand">git-parsec</span>
<ul class="footer-links">
<li><a href="https://github.com/erishforG/git-parsec" target="_blank" rel="noopener">GitHub</a></li>
<li><a href="https://github.com/erishforG/git-parsec/issues" target="_blank" rel="noopener">Issues</a></li>
<li><a href="https://github.com/erishforG/git-parsec/blob/main/LICENSE" target="_blank" rel="noopener">MIT License</a></li>
</ul>
</div>
<div class="footer-right">
Built with Rust. Designed for velocity.
</div>
</div>
</div>
</footer>
<!-- ============ SCROLL REVEAL (minimal JS, no libraries) ============ -->
<script>
document.addEventListener('DOMContentLoaded', () => {
const reveals = document.querySelectorAll('.reveal');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, {
threshold: 0.1,
rootMargin: '0px 0px -40px 0px'
});
reveals.forEach(el => observer.observe(el));
});
</script>
</body>
</html>