a9cd7750f4
CI / detect-changes (push) Waiting to run
CI / build (push) Waiting to run
UI v2 CI / E2E (Mocked) (push) Blocked by required conditions
UI v2 Integration CI / E2E (Integration) (push) Waiting to run
CI / unit-test (push) Blocked by required conditions
CI / test-harness (push) Waiting to run
CI / generate-e2e-matrix (push) Waiting to run
CI / e2e (push) Blocked by required conditions
CI / build-ui (push) Waiting to run
Publish docs via GitHub Pages / Deploy docs (push) Waiting to run
Release Drafter / update_release_draft (push) Waiting to run
UI v2 CI / Lint, Format & Test (push) Waiting to run
1930 lines
73 KiB
HTML
1930 lines
73 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8"/>
|
||
<title>Conductor OSS | Open Source Workflow Orchestration</title>
|
||
<meta name="description" content="Open-source workflow orchestration and durable execution for long-running workflows, microservices, and AI agents. Self-hosted, JSON-native, and polyglot."/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||
<meta property="og:title" content="Conductor OSS | Open Source Workflow Orchestration"/>
|
||
<meta property="og:description" content="Open-source workflow orchestration and durable execution for long-running workflows, microservices, and AI agents."/>
|
||
<meta property="og:type" content="website"/>
|
||
<link rel="shortcut icon" href="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/6572bd8d27ee5db3eb91f55e_favicon-dashflow-webflow-template.svg" type="image/x-icon"/>
|
||
|
||
<!-- Fonts -->
|
||
<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=Inter:opsz,wght@14..32,300;14..32,400;14..32,500;14..32,600;14..32,700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet"/>
|
||
|
||
<!-- Theme: set before render to avoid flash -->
|
||
<script>
|
||
(function(){
|
||
var s = localStorage.getItem('theme');
|
||
var p = s || (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
|
||
document.documentElement.dataset.theme = p;
|
||
})();
|
||
</script>
|
||
|
||
<style>
|
||
/* ═══════════════════════════════════════════
|
||
RESET & TOKENS
|
||
═══════════════════════════════════════════ */
|
||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||
|
||
:root {
|
||
--bg: #09090b;
|
||
--bg-surface: #18181b;
|
||
--bg-card: #18181b;
|
||
--bg-card-h: #27272a;
|
||
--accent: #f97316;
|
||
--accent-dim: rgba(249,115,22,.10);
|
||
--accent-glow: rgba(249,115,22,.22);
|
||
--accent-hi: #fb923c;
|
||
--blue: #3b82f6;
|
||
--blue-dim: rgba(59,130,246,.10);
|
||
--t1: #fafafa;
|
||
--t2: #a1a1aa;
|
||
--t3: #71717a;
|
||
--border: rgba(255,255,255,.08);
|
||
--border-h: rgba(249,115,22,.35);
|
||
--r: 12px;
|
||
--r-lg: 16px;
|
||
--ease: cubic-bezier(.4,0,.2,1);
|
||
--dur: .22s;
|
||
}
|
||
|
||
/* ═══════════════════════════════════════════
|
||
LIGHT MODE TOKENS
|
||
═══════════════════════════════════════════ */
|
||
[data-theme="light"] {
|
||
--bg: #ffffff;
|
||
--bg-surface: #f4f4f5;
|
||
--bg-card: #ffffff;
|
||
--bg-card-h: #f4f4f5;
|
||
--accent: #f97316;
|
||
--accent-dim: rgba(249,115,22,.08);
|
||
--accent-glow: rgba(249,115,22,.16);
|
||
--accent-hi: #ea580c;
|
||
--blue: #2563eb;
|
||
--blue-dim: rgba(37,99,235,.08);
|
||
--t1: #09090b;
|
||
--t2: #52525b;
|
||
--t3: #71717a;
|
||
--border: #d4d4d8;
|
||
--border-h: rgba(249,115,22,.35);
|
||
}
|
||
|
||
/* Smooth theme transitions */
|
||
.transitioning *, .transitioning *::before, .transitioning *::after {
|
||
transition: background-color .32s ease, color .32s ease,
|
||
border-color .32s ease, box-shadow .32s ease !important;
|
||
}
|
||
|
||
/* ═══════════════════════════════════════════
|
||
LIGHT MODE COMPONENT OVERRIDES
|
||
═══════════════════════════════════════════ */
|
||
|
||
/* Logo needs to be dark on light nav */
|
||
[data-theme="light"] .nav-logo img,
|
||
[data-theme="light"] .footer-logo { filter: brightness(0); }
|
||
|
||
/* Nav & drawer */
|
||
[data-theme="light"] .nav {
|
||
background: rgba(255,255,255,.88);
|
||
border-bottom-color: rgba(0,0,0,.09);
|
||
}
|
||
[data-theme="light"] .nav-drawer {
|
||
background: rgba(255,255,255,.98);
|
||
border-bottom-color: rgba(0,0,0,.09);
|
||
}
|
||
[data-theme="light"] .burger span { background: var(--t2); }
|
||
|
||
/* Ghost button */
|
||
[data-theme="light"] .btn-ghost {
|
||
background: rgba(0,0,0,.04);
|
||
border-color: rgba(0,0,0,.14);
|
||
}
|
||
[data-theme="light"] .btn-ghost:hover {
|
||
background: rgba(0,0,0,.08);
|
||
border-color: rgba(0,0,0,.20);
|
||
}
|
||
|
||
/* Hero dot grid */
|
||
[data-theme="light"] .hero::before {
|
||
background-image: radial-gradient(circle, rgba(249,115,22,.11) 1px, transparent 1px);
|
||
}
|
||
/* Hero orbs */
|
||
[data-theme="light"] .orb-1 {
|
||
background: radial-gradient(circle, rgba(249,115,22,.07) 0%, transparent 70%);
|
||
}
|
||
[data-theme="light"] .orb-2 {
|
||
background: radial-gradient(circle, rgba(37,99,235,.05) 0%, transparent 70%);
|
||
}
|
||
[data-theme="light"] .orb-3 {
|
||
background: radial-gradient(circle, rgba(249,115,22,.04) 0%, transparent 70%);
|
||
}
|
||
|
||
/* Dark section → light gray in light mode */
|
||
[data-theme="light"] .sec-dark {
|
||
background: linear-gradient(135deg, #e4e4e7 0%, #f4f4f5 50%, #e4e4e7 100%);
|
||
}
|
||
|
||
/* Softer card shadows in light mode */
|
||
[data-theme="light"] .sdk-card:hover {
|
||
box-shadow: 0 0 20px var(--accent-dim), 0 4px 16px rgba(0,0,0,.08);
|
||
}
|
||
[data-theme="light"] .gs-card:hover {
|
||
box-shadow: 0 0 24px var(--accent-dim), 0 8px 24px rgba(0,0,0,.08);
|
||
}
|
||
[data-theme="light"] .feat-card:hover {
|
||
box-shadow: 0 0 32px var(--accent-dim);
|
||
}
|
||
[data-theme="light"] .res-card:hover {
|
||
box-shadow: 0 0 22px var(--accent-dim), 0 4px 16px rgba(0,0,0,.06);
|
||
}
|
||
[data-theme="light"] .comm-card:hover {
|
||
box-shadow: 0 0 24px var(--accent-dim), 0 8px 24px rgba(0,0,0,.08);
|
||
}
|
||
|
||
/* Modal */
|
||
[data-theme="light"] .modal-bg { background: rgba(13,27,42,.7); }
|
||
[data-theme="light"] .modal { background: #ffffff; }
|
||
[data-theme="light"] .modal-x { background: rgba(0,0,0,.05); border-color: rgba(0,0,0,.12); }
|
||
[data-theme="light"] .modal-x img { filter: brightness(0); opacity: .55; }
|
||
|
||
/* Theme toggle icon switching */
|
||
.icon-moon { display: none; }
|
||
.icon-sun { display: block; }
|
||
[data-theme="light"] .icon-sun { display: none; }
|
||
[data-theme="light"] .icon-moon { display: block; }
|
||
|
||
/* Toggle button */
|
||
.theme-toggle {
|
||
width: 34px; height: 34px;
|
||
border-radius: 8px;
|
||
background: rgba(255,255,255,.05);
|
||
border: 1px solid var(--border);
|
||
cursor: pointer;
|
||
display: flex; align-items: center; justify-content: center;
|
||
color: var(--t2);
|
||
transition: all var(--dur) var(--ease);
|
||
flex-shrink: 0;
|
||
}
|
||
.theme-toggle:hover {
|
||
background: var(--accent-dim);
|
||
border-color: var(--border-h);
|
||
color: var(--accent);
|
||
}
|
||
.theme-toggle svg { width: 16px; height: 16px; stroke: currentColor; fill: none; }
|
||
|
||
html { scroll-behavior: smooth; }
|
||
|
||
body {
|
||
font-family: 'Inter', sans-serif;
|
||
background: var(--bg);
|
||
color: var(--t1);
|
||
line-height: 1.6;
|
||
overflow-x: hidden;
|
||
}
|
||
|
||
img { display: block; max-width: 100%; }
|
||
a { text-decoration: none; color: inherit; }
|
||
|
||
h1, h2, h3, h4 {
|
||
font-family: 'Inter', sans-serif;
|
||
line-height: 1.1;
|
||
}
|
||
|
||
/* ═══════════════════════════════════════════
|
||
SCROLLBAR
|
||
═══════════════════════════════════════════ */
|
||
::-webkit-scrollbar { width: 7px; }
|
||
::-webkit-scrollbar-track { background: var(--bg); }
|
||
::-webkit-scrollbar-thumb { background: var(--border-h); border-radius: 4px; }
|
||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||
|
||
/* ═══════════════════════════════════════════
|
||
LAYOUT HELPERS
|
||
═══════════════════════════════════════════ */
|
||
.wrap { max-width: 1200px; margin: 0 auto; padding: 0 24px; }
|
||
.sec { padding: 96px 0; position: relative; }
|
||
.sec-alt{ background: var(--bg-surface); }
|
||
.sec-dark {
|
||
background: linear-gradient(135deg, #050506 0%, #18181b 55%, #050506 100%);
|
||
}
|
||
.divider {
|
||
height: 1px;
|
||
background: linear-gradient(90deg, transparent, var(--border-h), transparent);
|
||
}
|
||
|
||
/* ═══════════════════════════════════════════
|
||
SECTION HEADER
|
||
═══════════════════════════════════════════ */
|
||
.sec-header { text-align: center; margin-bottom: 56px; }
|
||
|
||
.sec-label {
|
||
font-family: 'IBM Plex Mono', monospace;
|
||
font-size: 11px;
|
||
font-weight: 500;
|
||
color: var(--accent);
|
||
text-transform: uppercase;
|
||
letter-spacing: .18em;
|
||
margin-bottom: 10px;
|
||
}
|
||
|
||
.sec-title {
|
||
font-size: clamp(28px, 3.5vw, 44px);
|
||
font-weight: 700;
|
||
letter-spacing: -.02em;
|
||
}
|
||
|
||
.sec-sub {
|
||
font-size: 16px;
|
||
color: var(--t2);
|
||
margin-top: 12px;
|
||
max-width: 500px;
|
||
margin-left: auto;
|
||
margin-right: auto;
|
||
line-height: 1.7;
|
||
}
|
||
|
||
/* ═══════════════════════════════════════════
|
||
SCROLL REVEAL
|
||
═══════════════════════════════════════════ */
|
||
.reveal {
|
||
opacity: 0;
|
||
transform: translateY(22px);
|
||
transition: opacity .55s var(--ease), transform .55s var(--ease);
|
||
}
|
||
.reveal.vis { opacity: 1; transform: translateY(0); }
|
||
|
||
/* ═══════════════════════════════════════════
|
||
NAV
|
||
═══════════════════════════════════════════ */
|
||
.nav {
|
||
position: fixed;
|
||
inset: 0 0 auto;
|
||
z-index: 200;
|
||
height: 64px;
|
||
background: rgba(9,9,11,.88);
|
||
backdrop-filter: blur(14px);
|
||
-webkit-backdrop-filter: blur(14px);
|
||
border-bottom: 1px solid var(--border);
|
||
transition: border-color var(--dur) var(--ease);
|
||
}
|
||
|
||
.nav-inner {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
height: 100%;
|
||
max-width: 1200px;
|
||
margin: 0 auto;
|
||
padding: 0 24px;
|
||
gap: 16px;
|
||
}
|
||
|
||
.nav-logo img { height: 30px; width: auto; }
|
||
|
||
.nav-links {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 2px;
|
||
}
|
||
|
||
.nav-link {
|
||
padding: 7px 14px;
|
||
border-radius: 8px;
|
||
font-size: 14px;
|
||
font-weight: 500;
|
||
color: var(--t2);
|
||
transition: color var(--dur) var(--ease), background var(--dur) var(--ease);
|
||
}
|
||
.nav-link:hover { color: var(--t1); background: rgba(255,255,255,.05); }
|
||
|
||
.nav-right {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 10px;
|
||
}
|
||
|
||
.nav-slack {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 6px;
|
||
padding: 7px 12px;
|
||
border-radius: 8px;
|
||
font-size: 13px;
|
||
font-weight: 500;
|
||
color: var(--t2);
|
||
border: 1px solid transparent;
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.nav-slack:hover {
|
||
color: var(--accent);
|
||
border-color: var(--border-h);
|
||
background: var(--accent-dim);
|
||
}
|
||
.nav-slack img { width: 17px; height: 17px; }
|
||
|
||
.github-wrap { display: flex; align-items: center; }
|
||
|
||
.btn-nav {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 7px;
|
||
padding: 8px 16px;
|
||
border: 1px solid var(--border-h);
|
||
border-radius: 8px;
|
||
background: var(--accent-dim);
|
||
color: var(--accent);
|
||
font-size: 13px;
|
||
font-weight: 600;
|
||
cursor: pointer;
|
||
transition: all var(--dur) var(--ease);
|
||
font-family: inherit;
|
||
}
|
||
.btn-nav:hover { background: rgba(249,115,22,.18); box-shadow: 0 0 18px var(--accent-glow); }
|
||
.btn-nav img {
|
||
width: 16px;
|
||
height: 16px;
|
||
filter: brightness(0) saturate(100%) invert(56%) sepia(89%) saturate(2324%) hue-rotate(352deg) brightness(98%) contrast(96%);
|
||
opacity: .95;
|
||
}
|
||
|
||
/* burger */
|
||
.burger {
|
||
display: none;
|
||
flex-direction: column;
|
||
gap: 5px;
|
||
padding: 8px;
|
||
cursor: pointer;
|
||
background: none;
|
||
border: none;
|
||
}
|
||
.burger span {
|
||
display: block;
|
||
width: 22px;
|
||
height: 2px;
|
||
background: var(--t2);
|
||
border-radius: 2px;
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
|
||
/* mobile drawer */
|
||
.nav-drawer {
|
||
display: none;
|
||
position: fixed;
|
||
top: 64px;
|
||
left: 0; right: 0;
|
||
background: rgba(9,9,11,.98);
|
||
border-bottom: 1px solid var(--border);
|
||
padding: 16px 24px 24px;
|
||
flex-direction: column;
|
||
gap: 4px;
|
||
z-index: 199;
|
||
}
|
||
.nav-drawer.open { display: flex; }
|
||
.nav-drawer .nav-link { width: 100%; font-size: 15px; padding: 10px 14px; }
|
||
|
||
/* ═══════════════════════════════════════════
|
||
MODAL
|
||
═══════════════════════════════════════════ */
|
||
.modal-bg {
|
||
position: fixed;
|
||
inset: 0;
|
||
background: rgba(9,9,11,.92);
|
||
backdrop-filter: blur(10px);
|
||
-webkit-backdrop-filter: blur(10px);
|
||
z-index: 500;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
opacity: 0;
|
||
pointer-events: none;
|
||
transition: opacity .2s var(--ease);
|
||
}
|
||
.modal-bg.open { opacity: 1; pointer-events: all; }
|
||
|
||
.modal {
|
||
background: var(--bg-surface);
|
||
border: 1px solid var(--border-h);
|
||
border-radius: var(--r-lg);
|
||
padding: 40px;
|
||
width: 90%;
|
||
max-width: 520px;
|
||
position: relative;
|
||
transform: translateY(16px) scale(.98);
|
||
transition: transform .25s var(--ease);
|
||
}
|
||
.modal-bg.open .modal { transform: translateY(0) scale(1); }
|
||
|
||
.modal-x {
|
||
position: absolute;
|
||
top: 14px; right: 14px;
|
||
width: 32px; height: 32px;
|
||
display: flex; align-items: center; justify-content: center;
|
||
background: rgba(255,255,255,.04);
|
||
border: 1px solid var(--border);
|
||
border-radius: 8px;
|
||
cursor: pointer;
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.modal-x:hover { border-color: var(--border-h); background: rgba(255,255,255,.09); }
|
||
.modal-x img { width: 14px; height: 14px; filter: invert(1); opacity: .7; }
|
||
|
||
.modal-title {
|
||
font-size: 28px;
|
||
font-weight: 700;
|
||
margin-bottom: 24px;
|
||
}
|
||
.modal-copy {
|
||
font-size: 15px;
|
||
color: var(--t2);
|
||
line-height: 1.75;
|
||
margin-bottom: 22px;
|
||
}
|
||
.modal-links {
|
||
display: grid;
|
||
gap: 12px;
|
||
}
|
||
.modal-link {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
gap: 12px;
|
||
padding: 14px 16px;
|
||
border: 1px solid var(--border);
|
||
border-radius: 12px;
|
||
background: var(--bg-card);
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.modal-link:hover {
|
||
border-color: var(--border-h);
|
||
background: var(--bg-card-h);
|
||
box-shadow: 0 0 18px var(--accent-dim);
|
||
}
|
||
.modal-link strong {
|
||
display: block;
|
||
font-size: 14px;
|
||
font-weight: 600;
|
||
margin-bottom: 2px;
|
||
}
|
||
.modal-link span {
|
||
display: block;
|
||
font-size: 12.5px;
|
||
color: var(--t2);
|
||
line-height: 1.55;
|
||
}
|
||
.modal-link .modal-arr {
|
||
color: var(--accent);
|
||
font-size: 14px;
|
||
font-weight: 700;
|
||
flex-shrink: 0;
|
||
}
|
||
.modal-note {
|
||
margin-top: 18px;
|
||
font-size: 12.5px;
|
||
color: var(--t3);
|
||
line-height: 1.65;
|
||
}
|
||
|
||
/* ═══════════════════════════════════════════
|
||
HERO
|
||
═══════════════════════════════════════════ */
|
||
.hero {
|
||
min-height: auto;
|
||
display: flex;
|
||
align-items: center;
|
||
position: relative;
|
||
overflow: hidden;
|
||
padding-top: 64px;
|
||
}
|
||
|
||
/* dot grid */
|
||
.hero::before {
|
||
content: '';
|
||
position: absolute;
|
||
inset: 0;
|
||
background-image: radial-gradient(circle, rgba(249,115,22,.13) 1px, transparent 1px);
|
||
background-size: 38px 38px;
|
||
mask-image: radial-gradient(ellipse 80% 70% at 50% 50%, black 20%, transparent 80%);
|
||
-webkit-mask-image: radial-gradient(ellipse 80% 70% at 50% 50%, black 20%, transparent 80%);
|
||
pointer-events: none;
|
||
}
|
||
|
||
/* gradient orbs */
|
||
.orb {
|
||
position: absolute;
|
||
border-radius: 50%;
|
||
filter: blur(90px);
|
||
pointer-events: none;
|
||
}
|
||
.orb-1 {
|
||
width: 560px; height: 560px;
|
||
background: radial-gradient(circle, rgba(249,115,22,.09) 0%, transparent 70%);
|
||
top: -120px; left: -80px;
|
||
animation: float1 18s ease-in-out infinite;
|
||
}
|
||
.orb-2 {
|
||
width: 440px; height: 440px;
|
||
background: radial-gradient(circle, rgba(59,130,246,.07) 0%, transparent 70%);
|
||
bottom: -60px; right: 5%;
|
||
animation: float2 22s ease-in-out infinite;
|
||
}
|
||
.orb-3 {
|
||
width: 320px; height: 320px;
|
||
background: radial-gradient(circle, rgba(249,115,22,.05) 0%, transparent 70%);
|
||
top: 35%; left: 38%;
|
||
animation: float3 15s ease-in-out infinite;
|
||
}
|
||
|
||
@keyframes float1 {
|
||
0%,100%{ transform: translate(0,0); }
|
||
33% { transform: translate(40px,28px); }
|
||
66% { transform: translate(-18px,46px); }
|
||
}
|
||
@keyframes float2 {
|
||
0%,100%{ transform: translate(0,0); }
|
||
50% { transform: translate(-28px,-38px); }
|
||
}
|
||
@keyframes float3 {
|
||
0%,100%{ transform: translate(0,0); }
|
||
25% { transform: translate(18px,-18px); }
|
||
75% { transform: translate(-18px,18px); }
|
||
}
|
||
|
||
/* canvas */
|
||
#hero-canvas {
|
||
position: absolute;
|
||
inset: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
opacity: .55;
|
||
pointer-events: none;
|
||
}
|
||
|
||
.hero-content {
|
||
position: relative;
|
||
z-index: 1;
|
||
width: 100%;
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
text-align: center;
|
||
padding: 80px 24px 56px;
|
||
max-width: 1200px;
|
||
margin: 0 auto;
|
||
}
|
||
|
||
.hero-badge {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
padding: 6px 16px;
|
||
background: var(--accent-dim);
|
||
border: 1px solid var(--border-h);
|
||
border-radius: 100px;
|
||
font-family: 'IBM Plex Mono', monospace;
|
||
font-size: 11.5px;
|
||
font-weight: 500;
|
||
color: var(--accent);
|
||
margin-bottom: 28px;
|
||
animation: fadeup .65s ease both;
|
||
}
|
||
.hero-badge::before {
|
||
content: '';
|
||
width: 6px; height: 6px;
|
||
background: var(--accent);
|
||
border-radius: 50%;
|
||
animation: blink 2.2s ease infinite;
|
||
}
|
||
|
||
@keyframes blink {
|
||
0%,100% { opacity: 1; transform: scale(1); }
|
||
50% { opacity: .45; transform: scale(.75); }
|
||
}
|
||
|
||
.hero-h1 {
|
||
font-size: clamp(36px, 5.2vw, 76px);
|
||
font-weight: 800;
|
||
letter-spacing: -.03em;
|
||
max-width: 820px;
|
||
margin-bottom: 22px;
|
||
animation: fadeup .65s .1s ease both;
|
||
}
|
||
.hero-h1 .hi { color: var(--accent); }
|
||
|
||
.hero-p {
|
||
font-size: 17px;
|
||
font-weight: 400;
|
||
color: var(--t2);
|
||
max-width: 520px;
|
||
line-height: 1.75;
|
||
margin-bottom: 40px;
|
||
animation: fadeup .65s .2s ease both;
|
||
}
|
||
|
||
.hero-ctas {
|
||
display: flex;
|
||
gap: 12px;
|
||
flex-wrap: wrap;
|
||
justify-content: center;
|
||
animation: fadeup .65s .3s ease both;
|
||
}
|
||
|
||
.btn-primary {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
padding: 14px 28px;
|
||
background: var(--accent);
|
||
color: #03101c;
|
||
border: 1px solid var(--accent);
|
||
border-radius: 10px;
|
||
font-family: 'Inter', sans-serif;
|
||
font-weight: 700;
|
||
font-size: 14px;
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.btn-primary:hover {
|
||
background: var(--teal-bright);
|
||
border-color: var(--teal-bright);
|
||
box-shadow: 0 0 28px var(--accent-glow);
|
||
transform: translateY(-2px);
|
||
}
|
||
.btn-primary img { width: 17px; height: 17px; filter: brightness(0); }
|
||
.btn-primary-logo {
|
||
width: 18px;
|
||
height: 18px;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.btn-ghost {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
padding: 14px 28px;
|
||
background: rgba(255,255,255,.04);
|
||
border: 1px solid rgba(255,255,255,.11);
|
||
color: var(--t1);
|
||
border-radius: 10px;
|
||
font-family: 'Inter', sans-serif;
|
||
font-weight: 600;
|
||
font-size: 14px;
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.btn-ghost:hover {
|
||
background: rgba(255,255,255,.09);
|
||
border-color: rgba(255,255,255,.2);
|
||
transform: translateY(-2px);
|
||
}
|
||
.btn-ghost svg { flex-shrink: 0; }
|
||
|
||
/* trust strip */
|
||
.hero-trust {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 28px;
|
||
margin-top: 68px;
|
||
padding-top: 36px;
|
||
border-top: 1px solid var(--border);
|
||
animation: fadeup .65s .4s ease both;
|
||
flex-wrap: wrap;
|
||
justify-content: center;
|
||
}
|
||
.trust-label {
|
||
font-size: 11px;
|
||
font-weight: 600;
|
||
color: var(--t3);
|
||
text-transform: uppercase;
|
||
letter-spacing: .14em;
|
||
}
|
||
.trust-names {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 28px;
|
||
flex-wrap: wrap;
|
||
justify-content: center;
|
||
}
|
||
.trust-name {
|
||
font-family: 'Inter', sans-serif;
|
||
font-size: 13px;
|
||
font-weight: 600;
|
||
color: var(--t3);
|
||
letter-spacing: .04em;
|
||
transition: color var(--dur) var(--ease);
|
||
}
|
||
.trust-name:hover { color: var(--t2); }
|
||
|
||
@keyframes fadeup {
|
||
from { opacity: 0; transform: translateY(22px); }
|
||
to { opacity: 1; transform: translateY(0); }
|
||
}
|
||
|
||
/* ═══════════════════════════════════════════
|
||
SDK GRID
|
||
═══════════════════════════════════════════ */
|
||
.sdk-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
gap: 14px;
|
||
}
|
||
|
||
.sdk-card {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 14px;
|
||
padding: 18px 20px;
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border);
|
||
border-radius: var(--r);
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.sdk-card:hover {
|
||
border-color: var(--border-h);
|
||
background: var(--bg-card-h);
|
||
box-shadow: 0 0 24px var(--accent-dim), 0 4px 20px rgba(0,0,0,.3);
|
||
transform: translateY(-2px);
|
||
}
|
||
|
||
.sdk-icon {
|
||
width: 38px; height: 38px;
|
||
flex-shrink: 0;
|
||
display: flex; align-items: center; justify-content: center;
|
||
}
|
||
.sdk-icon img { width: 34px; height: 34px; object-fit: contain; }
|
||
|
||
.sdk-name {
|
||
font-family: 'Inter', sans-serif;
|
||
font-size: 15px;
|
||
font-weight: 600;
|
||
}
|
||
.sdk-sub {
|
||
font-size: 12px;
|
||
color: var(--accent);
|
||
opacity: .75;
|
||
font-weight: 500;
|
||
margin-top: 2px;
|
||
transition: opacity var(--dur);
|
||
}
|
||
.sdk-card:hover .sdk-sub { opacity: 1; }
|
||
|
||
.sdk-arr {
|
||
margin-left: auto;
|
||
width: 26px; height: 26px;
|
||
border-radius: 7px;
|
||
background: var(--accent-dim);
|
||
color: var(--accent);
|
||
display: flex; align-items: center; justify-content: center;
|
||
font-size: 13px;
|
||
transition: all var(--dur) var(--ease);
|
||
flex-shrink: 0;
|
||
}
|
||
.sdk-card:hover .sdk-arr {
|
||
background: var(--accent-glow);
|
||
transform: translateX(3px);
|
||
}
|
||
|
||
/* ═══════════════════════════════════════════
|
||
GETTING STARTED
|
||
═══════════════════════════════════════════ */
|
||
.gs-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
gap: 18px;
|
||
}
|
||
|
||
.gs-card {
|
||
display: flex;
|
||
flex-direction: column;
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border);
|
||
border-radius: var(--r-lg);
|
||
overflow: hidden;
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.gs-card:hover {
|
||
border-color: var(--border-h);
|
||
box-shadow: 0 0 32px var(--accent-dim), 0 8px 28px rgba(0,0,0,.4);
|
||
transform: translateY(-4px);
|
||
}
|
||
|
||
.gs-img {
|
||
width: 100%;
|
||
aspect-ratio: 16/9;
|
||
object-fit: cover;
|
||
display: block;
|
||
}
|
||
|
||
.gs-body {
|
||
padding: 18px 20px 20px;
|
||
flex: 1;
|
||
display: flex;
|
||
align-items: flex-end;
|
||
}
|
||
|
||
.gs-title {
|
||
font-family: 'Inter', sans-serif;
|
||
font-size: 14px;
|
||
font-weight: 600;
|
||
line-height: 1.4;
|
||
}
|
||
|
||
.gs-vid { position: relative; }
|
||
.gs-play {
|
||
position: absolute;
|
||
inset: 0;
|
||
display: flex; align-items: center; justify-content: center;
|
||
background: rgba(9,9,11,.38);
|
||
transition: background var(--dur);
|
||
}
|
||
.gs-vid:hover .gs-play { background: rgba(9,9,11,.18); }
|
||
.gs-play img {
|
||
width: 46px; height: 46px;
|
||
filter: drop-shadow(0 0 16px var(--accent-glow));
|
||
transition: transform var(--dur);
|
||
}
|
||
.gs-vid:hover .gs-play img { transform: scale(1.1); }
|
||
|
||
/* ═══════════════════════════════════════════
|
||
FEATURES
|
||
═══════════════════════════════════════════ */
|
||
.feat-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, 1fr);
|
||
gap: 20px;
|
||
}
|
||
|
||
.feat-card {
|
||
display: flex;
|
||
overflow: hidden;
|
||
background: rgba(255,255,255,.018);
|
||
border: 1px solid var(--border);
|
||
border-radius: var(--r-lg);
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.feat-card:hover {
|
||
border-color: var(--border-h);
|
||
background: rgba(249,115,22,.025);
|
||
box-shadow: 0 0 40px rgba(249,115,22,.08);
|
||
}
|
||
|
||
.feat-thumb {
|
||
width: 175px;
|
||
flex-shrink: 0;
|
||
overflow: hidden;
|
||
}
|
||
.feat-thumb img {
|
||
width: 100%; height: 100%;
|
||
object-fit: cover;
|
||
transition: transform .5s ease;
|
||
}
|
||
.feat-card:hover .feat-thumb img { transform: scale(1.06); }
|
||
|
||
.feat-body {
|
||
padding: 24px 24px 24px 20px;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
.feat-num {
|
||
font-family: 'IBM Plex Mono', monospace;
|
||
font-size: 10.5px;
|
||
font-weight: 500;
|
||
color: var(--accent);
|
||
text-transform: uppercase;
|
||
letter-spacing: .14em;
|
||
margin-bottom: 6px;
|
||
}
|
||
|
||
.feat-title {
|
||
font-size: 21px;
|
||
font-weight: 700;
|
||
margin-bottom: 9px;
|
||
}
|
||
|
||
.feat-desc {
|
||
font-size: 13.5px;
|
||
color: var(--t2);
|
||
line-height: 1.7;
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
.feat-link {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 7px;
|
||
font-size: 13px;
|
||
font-weight: 600;
|
||
color: var(--accent);
|
||
transition: gap var(--dur);
|
||
}
|
||
.feat-link:hover { gap: 11px; }
|
||
.feat-link .circ {
|
||
width: 20px; height: 20px;
|
||
border: 1.5px solid currentColor;
|
||
border-radius: 50%;
|
||
display: flex; align-items: center; justify-content: center;
|
||
font-size: 10px;
|
||
}
|
||
|
||
/* ═══════════════════════════════════════════
|
||
RESOURCES
|
||
═══════════════════════════════════════════ */
|
||
.res-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
gap: 18px;
|
||
}
|
||
|
||
.res-card {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 18px;
|
||
padding: 26px;
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border);
|
||
border-radius: var(--r-lg);
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.res-card:hover {
|
||
border-color: var(--border-h);
|
||
background: var(--bg-card-h);
|
||
box-shadow: 0 0 28px var(--accent-dim);
|
||
transform: translateY(-3px);
|
||
}
|
||
|
||
.res-icon {
|
||
width: 42px; height: 42px;
|
||
padding: 9px;
|
||
background: var(--accent-dim);
|
||
border: 1px solid var(--border-h);
|
||
border-radius: 10px;
|
||
}
|
||
.res-icon img { width: 100%; height: 100%; object-fit: contain; }
|
||
|
||
.res-title {
|
||
font-family: 'Inter', sans-serif;
|
||
font-size: 17px;
|
||
font-weight: 600;
|
||
margin-bottom: 6px;
|
||
}
|
||
.res-desc { font-size: 13.5px; color: var(--t2); line-height: 1.65; }
|
||
|
||
.res-link {
|
||
font-size: 13px;
|
||
font-weight: 600;
|
||
color: var(--accent);
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 6px;
|
||
margin-top: auto;
|
||
transition: gap var(--dur);
|
||
}
|
||
.res-card:hover .res-link { gap: 10px; }
|
||
|
||
/* ═══════════════════════════════════════════
|
||
COMMUNITY
|
||
═══════════════════════════════════════════ */
|
||
.comm-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
gap: 22px;
|
||
}
|
||
|
||
.comm-card {
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border);
|
||
border-radius: var(--r-lg);
|
||
overflow: hidden;
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.comm-card:hover {
|
||
border-color: var(--border-h);
|
||
box-shadow: 0 0 32px var(--accent-dim), 0 8px 28px rgba(0,0,0,.4);
|
||
transform: translateY(-4px);
|
||
}
|
||
|
||
.comm-img-wrap { overflow: hidden; }
|
||
.comm-img {
|
||
width: 100%;
|
||
aspect-ratio: 16/9;
|
||
object-fit: cover;
|
||
display: block;
|
||
transition: transform .5s ease;
|
||
}
|
||
.comm-card:hover .comm-img { transform: scale(1.04); }
|
||
|
||
.comm-body { padding: 22px; }
|
||
|
||
.comm-title {
|
||
font-family: 'Inter', sans-serif;
|
||
font-size: 17px;
|
||
font-weight: 600;
|
||
margin-bottom: 7px;
|
||
}
|
||
.comm-desc {
|
||
font-size: 13.5px;
|
||
color: var(--t2);
|
||
line-height: 1.65;
|
||
margin-bottom: 18px;
|
||
}
|
||
|
||
.comm-cta {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 7px;
|
||
padding: 9px 16px;
|
||
border-radius: 8px;
|
||
font-size: 13px;
|
||
font-weight: 600;
|
||
background: var(--accent-dim);
|
||
border: 1px solid var(--border-h);
|
||
color: var(--accent);
|
||
transition: all var(--dur) var(--ease);
|
||
}
|
||
.comm-cta:hover { background: rgba(249,115,22,.18); box-shadow: 0 0 18px var(--accent-glow); }
|
||
.comm-cta img { width: 17px; height: 17px; }
|
||
|
||
.comm-cta-blue {
|
||
background: var(--blue-dim);
|
||
border-color: rgba(59,130,246,.28);
|
||
color: var(--blue);
|
||
}
|
||
.comm-cta-blue:hover { background: rgba(59,130,246,.18); box-shadow: 0 0 18px rgba(59,130,246,.25); }
|
||
|
||
/* ═══════════════════════════════════════════
|
||
FOOTER
|
||
═══════════════════════════════════════════ */
|
||
.footer {
|
||
background: var(--bg-surface);
|
||
border-top: 1px solid var(--border);
|
||
padding: 56px 0 0;
|
||
}
|
||
|
||
.footer-main {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
gap: 40px;
|
||
padding-bottom: 44px;
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
.footer-brand { min-width: 240px; }
|
||
.footer-logo { height: 26px; margin-bottom: 14px; }
|
||
.footer-tagline { font-size: 13.5px; color: var(--t2); margin-bottom: 8px; }
|
||
.footer-copy {
|
||
font-family: 'IBM Plex Mono', monospace;
|
||
font-size: 11.5px;
|
||
color: var(--t3);
|
||
}
|
||
|
||
.footer-cols { display: flex; gap: 56px; flex-wrap: wrap; }
|
||
.footer-col-head {
|
||
font-family: 'Inter', sans-serif;
|
||
font-size: 12px;
|
||
font-weight: 600;
|
||
color: var(--t1);
|
||
text-transform: uppercase;
|
||
letter-spacing: .09em;
|
||
margin-bottom: 14px;
|
||
}
|
||
.footer-col a {
|
||
display: block;
|
||
font-size: 13.5px;
|
||
color: var(--t2);
|
||
margin-bottom: 9px;
|
||
transition: color var(--dur);
|
||
}
|
||
.footer-col a:hover { color: var(--accent); }
|
||
|
||
.footer-end {
|
||
border-top: 1px solid var(--border);
|
||
padding: 18px 0;
|
||
text-align: center;
|
||
font-size: 12.5px;
|
||
color: var(--t3);
|
||
}
|
||
.footer-end a { color: var(--accent); transition: opacity var(--dur); }
|
||
.footer-end a:hover { opacity: .75; }
|
||
|
||
/* ═══════════════════════════════════════════
|
||
RESPONSIVE
|
||
═══════════════════════════════════════════ */
|
||
@media (max-width: 1024px) {
|
||
.gs-grid { grid-template-columns: repeat(2, 1fr); }
|
||
.res-grid { grid-template-columns: repeat(2, 1fr); }
|
||
}
|
||
|
||
@media (max-width: 900px) {
|
||
.comm-grid { grid-template-columns: 1fr; }
|
||
.feat-grid { grid-template-columns: 1fr; }
|
||
}
|
||
|
||
@media (max-width: 768px) {
|
||
.nav-links { display: none; }
|
||
.nav-slack { display: none; }
|
||
.github-wrap{ display: none; }
|
||
.burger { display: flex; }
|
||
.sdk-grid { grid-template-columns: repeat(2, 1fr); }
|
||
.footer-main{ flex-direction: column; }
|
||
.feat-thumb { width: 130px; }
|
||
}
|
||
|
||
@media (max-width: 560px) {
|
||
.sdk-grid { grid-template-columns: 1fr; }
|
||
.gs-grid { grid-template-columns: 1fr; }
|
||
.res-grid { grid-template-columns: 1fr; }
|
||
.feat-card { flex-direction: column; }
|
||
.feat-thumb { width: 100%; height: 170px; }
|
||
.feat-body { padding: 22px; }
|
||
.footer-cols { gap: 32px; }
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<!-- ═══════════════════════ MODAL ═══════════════════════ -->
|
||
<div class="modal-bg" id="modal-bg">
|
||
<div class="modal">
|
||
<button class="modal-x" id="modal-x">
|
||
<img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/67b70dee88df7d842abeaa76_cross_x_Icon_Mid.svg" alt="Close"/>
|
||
</button>
|
||
<h2 class="modal-title">Get Involved</h2>
|
||
<p class="modal-copy">
|
||
Conductor is maintained in the open. Use the links below to contribute code, ask questions,
|
||
report issues, or review project policies.
|
||
</p>
|
||
<div class="modal-links">
|
||
<a href="https://github.com/conductor-oss/conductor/blob/main/CONTRIBUTING.md" target="_blank" class="modal-link">
|
||
<div>
|
||
<strong>Contributing Guide</strong>
|
||
<span>Development workflow, pull requests, and contribution guidelines.</span>
|
||
</div>
|
||
<span class="modal-arr">→</span>
|
||
</a>
|
||
<a href="https://github.com/conductor-oss/conductor/discussions" target="_blank" class="modal-link">
|
||
<div>
|
||
<strong>GitHub Discussions</strong>
|
||
<span>Ask questions, propose ideas, and share patterns with the community.</span>
|
||
</div>
|
||
<span class="modal-arr">→</span>
|
||
</a>
|
||
<a href="https://github.com/conductor-oss/conductor/security/policy" target="_blank" class="modal-link">
|
||
<div>
|
||
<strong>Security Policy</strong>
|
||
<span>Review the vulnerability reporting policy and security contact path.</span>
|
||
</div>
|
||
<span class="modal-arr">→</span>
|
||
</a>
|
||
<a href="https://join.slack.com/t/orkes-conductor/shared_invite/zt-3dpcskdyd-W895bJDm8psAV7viYG3jFA" target="_blank" class="modal-link">
|
||
<div>
|
||
<strong>Slack Community</strong>
|
||
<span>Join the public community chat for support and project discussion.</span>
|
||
</div>
|
||
<span class="modal-arr">→</span>
|
||
</a>
|
||
</div>
|
||
<p class="modal-note">Project resources stay public and versioned in the repository and docs site.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ═══════════════════════ NAV ═══════════════════════ -->
|
||
<nav class="nav" id="nav">
|
||
<div class="nav-inner">
|
||
<a href="https://conductor-oss.org/" class="nav-logo">
|
||
<img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/657349f6b74e4f7dab1b979b_Conductor-Logo_RW.png" alt="Conductor"/>
|
||
</a>
|
||
|
||
<div class="nav-links">
|
||
<a href="https://docs.conductor-oss.org/index.html" target="_blank" class="nav-link">Docs</a>
|
||
<a href="https://docs.conductor-oss.org/quickstart/index.html" target="_blank" class="nav-link">Quickstart</a>
|
||
<a href="https://github.com/conductor-oss/conductor" target="_blank" class="nav-link">GitHub</a>
|
||
</div>
|
||
|
||
<div class="nav-right">
|
||
<a href="https://join.slack.com/t/orkes-conductor/shared_invite/zt-3dpcskdyd-W895bJDm8psAV7viYG3jFA"
|
||
target="_blank" class="nav-slack">
|
||
<img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/65734bf299254b8afd025072_Slack%20Icon.svg" alt="Slack"/>
|
||
Community
|
||
</a>
|
||
|
||
<div class="github-wrap">
|
||
<a class="github-button"
|
||
href="https://github.com/conductor-oss/conductor"
|
||
data-color-scheme="no-preference: dark; light: dark; dark: dark;"
|
||
data-icon="octicon-star"
|
||
data-size="large"
|
||
data-show-count="true"
|
||
aria-label="Star conductor-oss/conductor on GitHub">Star</a>
|
||
</div>
|
||
|
||
<button class="theme-toggle" id="theme-toggle" aria-label="Toggle theme">
|
||
<!-- Sun: shown in dark mode, click to go light -->
|
||
<svg class="icon-sun" viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||
<circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/>
|
||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/>
|
||
<line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/>
|
||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
|
||
</svg>
|
||
<!-- Moon: shown in light mode, click to go dark -->
|
||
<svg class="icon-moon" viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
|
||
</svg>
|
||
</button>
|
||
|
||
<button class="btn-nav" id="open-modal">
|
||
<img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f7693f1a21217bf682afb_Get%20Involved.svg" alt=""/>
|
||
Contribute
|
||
</button>
|
||
|
||
<button class="burger" id="burger" aria-label="Menu">
|
||
<span></span><span></span><span></span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<!-- Mobile drawer -->
|
||
<div class="nav-drawer" id="nav-drawer">
|
||
<a href="https://docs.conductor-oss.org/index.html" target="_blank" class="nav-link">Docs</a>
|
||
<a href="https://docs.conductor-oss.org/quickstart/index.html" target="_blank" class="nav-link">Quickstart</a>
|
||
<a href="https://github.com/conductor-oss/conductor" target="_blank" class="nav-link">GitHub</a>
|
||
<a href="https://join.slack.com/t/orkes-conductor/shared_invite/zt-3dpcskdyd-W895bJDm8psAV7viYG3jFA"
|
||
target="_blank" class="nav-link">Community</a>
|
||
</div>
|
||
|
||
<!-- ═══════════════════════ HERO ═══════════════════════ -->
|
||
<section class="hero">
|
||
<div class="orb orb-1"></div>
|
||
<div class="orb orb-2"></div>
|
||
<div class="orb orb-3"></div>
|
||
<canvas id="hero-canvas"></canvas>
|
||
|
||
<div class="hero-content">
|
||
<div class="hero-badge">Apache 2.0 Licensed · Originally created at Netflix</div>
|
||
|
||
<h1 class="hero-h1">
|
||
Code breaks. Infrastructure fails.<br>
|
||
<span class="hi">Your workflows don't.</span>
|
||
</h1>
|
||
|
||
<p class="hero-p">
|
||
Ship workflow changes without redeploying workers. Write your code in any language — the engine guarantees durability, not your coding discipline.
|
||
</p>
|
||
|
||
<div class="hero-ctas">
|
||
<a href="https://docs.conductor-oss.org/quickstart/index.html" target="_blank" class="btn-primary">
|
||
<svg class="btn-primary-logo" viewBox="0 0 419.77176 434.76002" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||
<path fill="currentColor" d="m 384.31177,242.99 -59.55,103.19 a 13.52,13.52 0 0 1 -11.67,6.73 h -19.95 l 63.46,-109.92 h -35.47 l -63.45,109.88 h -85.46 a 13.49,13.49 0 0 1 -11.62,-6.69 l -70.490004,-122 a 13.54,13.54 0 0 1 0,-13.48 l 70.450004,-122 a 13.51,13.51 0 0 1 11.67,-6.73 h 67.67 l -13.3,-23.16 a 54.43,54.43 0 0 0 -5.55,-7.6 h -48.83 a 44.3,44.3 0 0 0 -38.26,22.09 l -70.440004,122 a 44.29,44.29 0 0 0 0,44.18 l 70.430004,122 a 44.31,44.31 0 0 0 38.27,22.1 h 140.87 a 44.3,44.3 0 0 0 38.26,-22.09 l 68.42,-118.5 z"/>
|
||
<path fill="currentColor" d="m 218.88177,398.93 a 55.89,55.89 0 0 1 -23.16,5.12 h -33.54 a 56.31,56.31 0 0 1 -48.58,-28.07 L 38.211766,245.47 a 56.3,56.3 0 0 1 0,-56.14 L 113.60177,58.81 a 56.29,56.29 0 0 1 48.62,-28.07 h 33.54 a 56.28,56.28 0 0 1 48.62,28.07 l 76.79,133 h 35.43 l -63.46,-109.89 h 19.95 a 13.52,13.52 0 0 1 11.67,6.73 l 59.55,103.16 h 35.46 l -68.41,-118.5 a 44.31,44.31 0 0 0 -38.27,-22.13 h -37.68 l -4.47,-7.76 A 87.11,87.11 0 0 0 195.72177,0 h -33.54 A 87.1,87 0 0 0 86.971766,43.42 l -75.37,130.55 a 87.07,87.07 0 0 0 0,86.85 l 75.35,130.52 a 87.1,87.1 0 0 0 75.210004,43.42 h 33.54 a 87,87 0 0 0 70.12,-35.83 z"/>
|
||
</svg>
|
||
Get Started
|
||
</a>
|
||
<a href="https://github.com/conductor-oss/conductor" target="_blank" class="btn-ghost">
|
||
<svg viewBox="0 0 16 16" width="18" height="18" fill="currentColor" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||
<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 class="hero-trust">
|
||
<span class="trust-label">Built for change</span>
|
||
<div class="trust-names">
|
||
<span class="trust-name">Independent workflow upgrades</span>
|
||
<span class="trust-name">Runtime-defined workflows</span>
|
||
<span class="trust-name">Dynamic forks and tasks</span>
|
||
<span class="trust-name">Native LLM + MCP</span>
|
||
<span class="trust-name">Human-in-the-loop</span>
|
||
<span class="trust-name">Any-language workers</span>
|
||
<span class="trust-name">Replayable history</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<div class="divider"></div>
|
||
|
||
<!-- ═══════════════════════ SDKs ═══════════════════════ -->
|
||
<section class="sec sec-alt">
|
||
<div class="wrap">
|
||
<div class="sec-header reveal">
|
||
<div class="sec-label">Polyglot Execution</div>
|
||
<h2 class="sec-title">Keep workers in the stacks you already run</h2>
|
||
<p class="sec-sub">Conductor orchestrates across languages and services instead of forcing workflow logic into a single application runtime</p>
|
||
</div>
|
||
|
||
<div class="sdk-grid">
|
||
<a href="https://github.com/conductor-oss/python-sdk" target="_blank" class="sdk-card reveal">
|
||
<div class="sdk-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678a2209d4ba4824214673ba_Python-Logo.svg" alt="Python"/></div>
|
||
<div><div class="sdk-name">Python</div><div class="sdk-sub">conductor-oss/python-sdk</div></div>
|
||
<div class="sdk-arr">→</div>
|
||
</a>
|
||
<a href="https://github.com/conductor-oss/java-sdk" target="_blank" class="sdk-card reveal">
|
||
<div class="sdk-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678a25110bcb32a4d1f2a22c_Java-Logo.svg" alt="Java"/></div>
|
||
<div><div class="sdk-name">Java</div><div class="sdk-sub">conductor-oss/java-sdk</div></div>
|
||
<div class="sdk-arr">→</div>
|
||
</a>
|
||
<a href="https://github.com/conductor-oss/javascript-sdk" target="_blank" class="sdk-card reveal">
|
||
<div class="sdk-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678a2511a772639865269151_Javascript%20Logo.svg" alt="TypeScript"/></div>
|
||
<div><div class="sdk-name">TypeScript</div><div class="sdk-sub">conductor-oss/javascript-sdk</div></div>
|
||
<div class="sdk-arr">→</div>
|
||
</a>
|
||
<a href="https://github.com/conductor-oss/csharp-sdk" target="_blank" class="sdk-card reveal">
|
||
<div class="sdk-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678a26151fe2f8e3fa2d22bd_CSharp%20Logo.svg" alt=".NET"/></div>
|
||
<div><div class="sdk-name">.NET</div><div class="sdk-sub">conductor-oss/csharp-sdk</div></div>
|
||
<div class="sdk-arr">→</div>
|
||
</a>
|
||
<a href="https://github.com/conductor-oss/go-sdk" target="_blank" class="sdk-card reveal">
|
||
<div class="sdk-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678a25111b9e7323a0d7f881_Go%20Logo.svg" alt="Go"/></div>
|
||
<div><div class="sdk-name">Go</div><div class="sdk-sub">conductor-oss/go-sdk</div></div>
|
||
<div class="sdk-arr">→</div>
|
||
</a>
|
||
<a href="https://github.com/conductor-oss/ruby-sdk" target="_blank" class="sdk-card reveal">
|
||
<div class="sdk-icon">
|
||
<svg viewBox="0 0 40 40" width="34" height="34" xmlns="http://www.w3.org/2000/svg">
|
||
<defs><linearGradient id="rg1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#FF6B6B"/><stop offset="100%" stop-color="#CC342D"/></linearGradient></defs>
|
||
<polygon points="20,4 34,12 34,28 20,36 6,28 6,12" fill="url(#rg1)"/>
|
||
<polygon points="20,9 29,14 29,26 20,31 11,26 11,14" fill="#CC342D" opacity="0.4"/>
|
||
<circle cx="20" cy="20" r="5" fill="white" opacity="0.9"/>
|
||
</svg>
|
||
</div>
|
||
<div><div class="sdk-name">Ruby</div><div class="sdk-sub">conductor-oss/ruby-sdk</div></div>
|
||
<div class="sdk-arr">→</div>
|
||
</a>
|
||
<a href="https://github.com/conductor-oss/rust-sdk" target="_blank" class="sdk-card reveal">
|
||
<div class="sdk-icon">
|
||
<svg viewBox="0 0 40 40" width="34" height="34" xmlns="http://www.w3.org/2000/svg">
|
||
<circle cx="20" cy="20" r="16" fill="#CE422B"/>
|
||
<text x="20" y="26" font-size="18" font-weight="bold" text-anchor="middle" fill="white" font-family="sans-serif">R</text>
|
||
<circle cx="20" cy="20" r="16" fill="none" stroke="white" stroke-width="1.5" opacity="0.3"/>
|
||
</svg>
|
||
</div>
|
||
<div><div class="sdk-name">Rust</div><div class="sdk-sub">conductor-oss/rust-sdk</div></div>
|
||
<div class="sdk-arr">→</div>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<div class="divider"></div>
|
||
|
||
<!-- ═══════════════════════ GETTING STARTED ═══════════════════════ -->
|
||
<section class="sec">
|
||
<div class="wrap">
|
||
<div class="sec-header reveal">
|
||
<div class="sec-label">Quick Start</div>
|
||
<h2 class="sec-title">Getting Started</h2>
|
||
<p class="sec-sub">Start with the core OSS paths: quickstart, self-hosting, recipes, and releases</p>
|
||
</div>
|
||
|
||
<div class="res-grid">
|
||
<a href="https://docs.conductor-oss.org/quickstart/index.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366de246fa22be1364f1_Docs.svg" alt="Quickstart"/></div>
|
||
<div>
|
||
<div class="res-title">Quickstart Guide</div>
|
||
<p class="res-desc">Run Conductor locally, register a workflow, and execute it end to end.</p>
|
||
</div>
|
||
<div class="res-link">Start here →</div>
|
||
</a>
|
||
|
||
<a href="https://docs.conductor-oss.org/devguide/running/deploy.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366dd6adbc0fd8fd73ac_Guides.svg" alt="Deployment"/></div>
|
||
<div>
|
||
<div class="res-title">Self-Hosting</div>
|
||
<p class="res-desc">Deploy Conductor OSS with Docker, shared persistence, and production-ready topology.</p>
|
||
</div>
|
||
<div class="res-link">Deploy OSS →</div>
|
||
</a>
|
||
|
||
<a href="https://docs.conductor-oss.org/devguide/cookbook/index.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366d6b7f4bad39d28f23_Blogs.svg" alt="Cookbook"/></div>
|
||
<div>
|
||
<div class="res-title">Cookbook</div>
|
||
<p class="res-desc">Reference patterns for microservices, timers, event-driven workflows, and AI orchestration.</p>
|
||
</div>
|
||
<div class="res-link">Browse recipes →</div>
|
||
</a>
|
||
|
||
<a href="https://github.com/conductor-oss/conductor/releases" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366dc3ebba51aa4c8c65_Customers.svg" alt="Releases"/></div>
|
||
<div>
|
||
<div class="res-title">Releases</div>
|
||
<p class="res-desc">Download tagged releases, review changelogs, and track the project release cadence.</p>
|
||
</div>
|
||
<div class="res-link">View releases →</div>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<div class="divider"></div>
|
||
|
||
<!-- ═══════════════════════ CONDUCTOR MODEL ═══════════════════════ -->
|
||
<section class="sec sec-alt">
|
||
<div class="wrap">
|
||
<div class="sec-header reveal">
|
||
<div class="sec-label">Four Pillars</div>
|
||
<h2 class="sec-title">Why Conductor is stronger when systems change in production</h2>
|
||
<p class="sec-sub">The real advantage is not just durability. It is durable orchestration that can evolve independently, adapt at runtime, span any language boundary, and absorb AI-native workflows without forcing a new stack.</p>
|
||
</div>
|
||
|
||
<div class="res-grid">
|
||
<a href="https://docs.conductor-oss.org/architecture/json-native.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366de246fa22be1364f1_Docs.svg" alt="JSON-native"/></div>
|
||
<div>
|
||
<div class="res-title">Workflow changes should not require worker redeploys</div>
|
||
<p class="res-desc">Version, inspect, and change workflow behavior independently of worker implementations. Running executions keep their snapshot while new executions pick up the new path.</p>
|
||
</div>
|
||
<div class="res-link">See runtime model →</div>
|
||
</a>
|
||
|
||
<a href="https://docs.conductor-oss.org/devguide/ai/dynamic-workflows.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366dd6adbc0fd8fd73ac_Guides.svg" alt="Dynamic workflows"/></div>
|
||
<div>
|
||
<div class="res-title">Dynamic plans should run natively at runtime</div>
|
||
<p class="res-desc">Generate workflows on demand, branch with dynamic tasks and forks, and choose sub-workflows per execution without adding a code generation or redeploy step.</p>
|
||
</div>
|
||
<div class="res-link">See dynamic workflows →</div>
|
||
</a>
|
||
|
||
<a href="https://docs.conductor-oss.org/devguide/ai/llm-orchestration.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366d6b7f4bad39d28f23_Blogs.svg" alt="AI orchestration"/></div>
|
||
<div>
|
||
<div class="res-title">AI orchestration should be infrastructure, not example code</div>
|
||
<p class="res-desc">LLM tasks, MCP tool discovery and calls, vector workflows, and human approval are first-class engine capabilities on the same durable runtime as service orchestration.</p>
|
||
</div>
|
||
<div class="res-link">See AI orchestration →</div>
|
||
</a>
|
||
|
||
<a href="https://docs.conductor-oss.org/documentation/clientsdks/index.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366dc3ebba51aa4c8c65_Customers.svg" alt="Polyglot workers"/></div>
|
||
<div>
|
||
<div class="res-title">Polyglot systems need one durable control plane</div>
|
||
<p class="res-desc">Keep workers in Java, Python, Go, TypeScript, C#, Ruby, Rust, or any service that can call HTTP. Orchestration should not force a single application runtime.</p>
|
||
</div>
|
||
<div class="res-link">See SDKs and workers →</div>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<div class="divider"></div>
|
||
|
||
<!-- ═══════════════════════ FEATURES ═══════════════════════ -->
|
||
<section class="sec sec-dark">
|
||
<div class="wrap">
|
||
<div class="sec-header reveal">
|
||
<div class="sec-label">Production Proof</div>
|
||
<h2 class="sec-title">Why the model holds under real failure</h2>
|
||
<p class="sec-sub">The mechanics behind independent workflow evolution, runtime orchestration, and long-running execution in production</p>
|
||
</div>
|
||
|
||
<div class="feat-grid">
|
||
<div class="feat-card reveal">
|
||
<div class="feat-thumb">
|
||
<a href="https://docs.conductor-oss.org/architecture/durable-execution.html" target="_blank">
|
||
<img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/6793c66f1dec8a45facefc2d_Reliability.jpg" alt="High Reliability"/>
|
||
</a>
|
||
</div>
|
||
<div class="feat-body">
|
||
<div>
|
||
<div class="feat-num">01 — Durability</div>
|
||
<div class="feat-title">State Persists at Every Step</div>
|
||
<div class="feat-desc">Workflow state, task state, inputs, outputs, retries, and queues are persisted before execution advances, so workers and servers can fail without losing progress.</div>
|
||
</div>
|
||
<a href="https://docs.conductor-oss.org/architecture/durable-execution.html" target="_blank" class="feat-link">
|
||
Failure semantics <span class="circ">→</span>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="feat-card reveal">
|
||
<div class="feat-thumb">
|
||
<a href="https://docs.conductor-oss.org/architecture/durable-execution.html#replay-and-recovery" target="_blank">
|
||
<img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678a2c102b760b3868dfdc83_Reliability.png" alt="Infinite Scale"/>
|
||
</a>
|
||
</div>
|
||
<div class="feat-body">
|
||
<div>
|
||
<div class="feat-num">02 — Recovery</div>
|
||
<div class="feat-title">Recovery Is an Operator Primitive</div>
|
||
<div class="feat-desc">Pause, resume, retry, rerun, and restart are normal controls backed by preserved execution history, not custom recovery logic you have to invent later.</div>
|
||
</div>
|
||
<a href="https://docs.conductor-oss.org/architecture/durable-execution.html#replay-and-recovery" target="_blank" class="feat-link">
|
||
Learn recovery model <span class="circ">→</span>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="feat-card reveal">
|
||
<div class="feat-thumb">
|
||
<a href="https://docs.conductor-oss.org/architecture/json-native.html" target="_blank">
|
||
<img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678a2c1060f04714890cc123_High-Availability.jpg" alt="High Availability"/>
|
||
</a>
|
||
</div>
|
||
<div class="feat-body">
|
||
<div>
|
||
<div class="feat-num">03 — Determinism</div>
|
||
<div class="feat-title">No Replay-Safe Workflow Coding Trap</div>
|
||
<div class="feat-desc">Workflow definitions are pure orchestration. Side effects live in workers and system tasks, so determinism comes from the model itself instead of replay-safe application code discipline.</div>
|
||
</div>
|
||
<a href="https://docs.conductor-oss.org/architecture/json-native.html" target="_blank" class="feat-link">
|
||
Why JSON-native <span class="circ">→</span>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="feat-card reveal">
|
||
<div class="feat-thumb">
|
||
<a href="https://docs.conductor-oss.org/architecture/json-native.html#diffable-versioning" target="_blank">
|
||
<img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678a437064cabed6825fb79f_Durable-Execution-cover.png" alt="Durable Execution"/>
|
||
</a>
|
||
</div>
|
||
<div class="feat-body">
|
||
<div>
|
||
<div class="feat-num">04 — Versioning</div>
|
||
<div class="feat-title">Running Workflows Keep Their Snapshot</div>
|
||
<div class="feat-desc">Each execution carries the workflow definition snapshot taken at start time, so new workflow behavior can ship without destabilizing executions that are already in flight.</div>
|
||
</div>
|
||
<a href="https://docs.conductor-oss.org/architecture/json-native.html#diffable-versioning" target="_blank" class="feat-link">
|
||
Learn versioning model <span class="circ">→</span>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<div class="divider"></div>
|
||
|
||
<!-- ═══════════════════════ RESOURCES ═══════════════════════ -->
|
||
<section class="sec sec-alt">
|
||
<div class="wrap">
|
||
<div class="sec-header reveal">
|
||
<div class="sec-label">Learn</div>
|
||
<h2 class="sec-title">Project Resources</h2>
|
||
<p class="sec-sub">Core documentation, architecture, recipes, and direct answers to the common durability and comparison questions</p>
|
||
</div>
|
||
|
||
<div class="res-grid">
|
||
<a href="https://docs.conductor-oss.org/index.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366de246fa22be1364f1_Docs.svg" alt="Docs"/></div>
|
||
<div>
|
||
<div class="res-title">Documentation</div>
|
||
<p class="res-desc">Architecture, APIs, workflow primitives, operations, and deployment guidance.</p>
|
||
</div>
|
||
<div class="res-link">Read Docs →</div>
|
||
</a>
|
||
|
||
<a href="https://docs.conductor-oss.org/architecture/durable-execution.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366dd6adbc0fd8fd73ac_Guides.svg" alt="Guides"/></div>
|
||
<div>
|
||
<div class="res-title">Durable Execution</div>
|
||
<p class="res-desc">Read the project contract for persistence, retries, replay, and recovery behavior.</p>
|
||
</div>
|
||
<div class="res-link">Read architecture →</div>
|
||
</a>
|
||
|
||
<a href="https://docs.conductor-oss.org/devguide/cookbook/index.html" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366d6b7f4bad39d28f23_Blogs.svg" alt="Blog"/></div>
|
||
<div>
|
||
<div class="res-title">Cookbook</div>
|
||
<p class="res-desc">Use reference recipes for microservices, event-driven patterns, timers, and AI workflows.</p>
|
||
</div>
|
||
<div class="res-link">Browse cookbook →</div>
|
||
</a>
|
||
|
||
<a href="https://docs.conductor-oss.org/devguide/faq.html#how-is-conductor-different-from-temporal" target="_blank" class="res-card reveal">
|
||
<div class="res-icon"><img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f366dc3ebba51aa4c8c65_Customers.svg" alt="FAQ"/></div>
|
||
<div>
|
||
<div class="res-title">Why Conductor</div>
|
||
<p class="res-desc">Read the reasoning behind independent workflow upgrades, runtime-defined orchestration, native AI primitives, and polyglot workers.</p>
|
||
</div>
|
||
<div class="res-link">Read answers →</div>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<div class="divider"></div>
|
||
|
||
<!-- ═══════════════════════ COMMUNITY ═══════════════════════ -->
|
||
<section class="sec">
|
||
<div class="wrap">
|
||
<div class="sec-header reveal">
|
||
<div class="sec-label">Community</div>
|
||
<h2 class="sec-title">Join the Community</h2>
|
||
<p class="sec-sub">Discuss ideas, contribute in public, and track project activity across the open-source community</p>
|
||
</div>
|
||
|
||
<div class="comm-grid">
|
||
<div class="comm-card reveal">
|
||
<div class="comm-img-wrap">
|
||
<img class="comm-img"
|
||
src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f24641057233c8ec4ef5b_Community-portals.jpg"
|
||
alt="Community"/>
|
||
</div>
|
||
<div class="comm-body">
|
||
<div class="comm-title">Community</div>
|
||
<p class="comm-desc">Join the public Slack community and GitHub Discussions to ask questions and share patterns.</p>
|
||
<a href="https://join.slack.com/t/orkes-conductor/shared_invite/zt-3dpcskdyd-W895bJDm8psAV7viYG3jFA"
|
||
target="_blank" class="comm-cta">
|
||
Join Slack
|
||
<img src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/65734bf299254b8afd025072_Slack%20Icon.svg" alt="Slack"/>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="comm-card reveal">
|
||
<a href="https://github.com/conductor-oss/conductor" target="_blank" class="comm-img-wrap">
|
||
<img class="comm-img"
|
||
src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f2464a5be829c3ba4d3d2_Community-Github.jpg"
|
||
alt="GitHub"/>
|
||
</a>
|
||
<div class="comm-body">
|
||
<div class="comm-title">GitHub</div>
|
||
<p class="comm-desc">Follow the repository, browse issues, review releases, and track active development.</p>
|
||
<div style="display:flex;align-items:center;gap:12px;margin-top:8px;">
|
||
<a href="https://github.com/conductor-oss/conductor" target="_blank" class="comm-cta" style="text-decoration:none;">
|
||
View on GitHub →
|
||
</a>
|
||
<a class="github-button"
|
||
href="https://github.com/conductor-oss/conductor"
|
||
data-color-scheme="no-preference: dark; light: dark; dark: dark;"
|
||
data-size="large"
|
||
data-show-count="true"
|
||
aria-label="Star conductor-oss/conductor on GitHub">Star</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="comm-card reveal">
|
||
<div class="comm-img-wrap">
|
||
<img class="comm-img"
|
||
src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/678f2464e8a0298699edb71b_Community-events.jpg"
|
||
alt="Contributing"/>
|
||
</div>
|
||
<div class="comm-body">
|
||
<div class="comm-title">Contributing</div>
|
||
<p class="comm-desc">Open pull requests, report issues, and review the project security and contribution policies.</p>
|
||
<a href="https://github.com/conductor-oss/conductor/blob/main/CONTRIBUTING.md" target="_blank" class="comm-cta comm-cta-blue">
|
||
Read contributing guide →
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ═══════════════════════ FOOTER ═══════════════════════ -->
|
||
<footer class="footer">
|
||
<div class="wrap">
|
||
<div class="footer-main">
|
||
<div class="footer-brand">
|
||
<img class="footer-logo"
|
||
src="https://cdn.prod.website-files.com/6572bd8c27ee5db3eb91f4b3/657349f6b74e4f7dab1b979b_Conductor-Logo_RW.png"
|
||
alt="Conductor"/>
|
||
<p class="footer-tagline">Open Source Workflow and Agent Orchestration Platform</p>
|
||
<p class="footer-copy">Copyright 2026 © Conductor OSS Contributors</p>
|
||
</div>
|
||
|
||
<div class="footer-cols">
|
||
<div class="footer-col">
|
||
<div class="footer-col-head">Resources</div>
|
||
<a href="https://docs.conductor-oss.org/index.html" target="_blank">Docs</a>
|
||
<a href="https://docs.conductor-oss.org/quickstart/index.html" target="_blank">Quickstart</a>
|
||
<a href="https://github.com/conductor-oss/conductor/releases" target="_blank">Releases</a>
|
||
<a href="https://github.com/conductor-oss/conductor/security/policy" target="_blank">Security</a>
|
||
</div>
|
||
<div class="footer-col">
|
||
<div class="footer-col-head">Community</div>
|
||
<a href="https://github.com/conductor-oss/conductor" target="_blank">GitHub</a>
|
||
<a href="https://github.com/conductor-oss/conductor/discussions" target="_blank">Discussions</a>
|
||
<a href="https://join.slack.com/t/orkes-conductor/shared_invite/zt-3dpcskdyd-W895bJDm8psAV7viYG3jFA" target="_blank">Slack</a>
|
||
<a href="https://github.com/conductor-oss/conductor/blob/main/CONTRIBUTING.md" target="_blank">Contributing</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="footer-end">
|
||
<div class="wrap">
|
||
Originally created at Netflix. Maintained in the open by the Conductor OSS community.
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
<!-- GitHub Buttons -->
|
||
<script async defer src="https://buttons.github.io/buttons.js"></script>
|
||
|
||
<script>
|
||
document.querySelectorAll('a[target="_blank"]').forEach(function (link) {
|
||
link.rel = 'noopener noreferrer';
|
||
});
|
||
|
||
/* ─── MODAL ─── */
|
||
const modalBg = document.getElementById('modal-bg');
|
||
const openBtn = document.getElementById('open-modal');
|
||
const closeBtn = document.getElementById('modal-x');
|
||
|
||
function openModal() { modalBg.classList.add('open'); document.body.style.overflow = 'hidden'; }
|
||
function closeModal() { modalBg.classList.remove('open'); document.body.style.overflow = ''; }
|
||
|
||
openBtn.addEventListener('click', openModal);
|
||
closeBtn.addEventListener('click', closeModal);
|
||
modalBg.addEventListener('click', e => { if (e.target === modalBg) closeModal(); });
|
||
document.addEventListener('keydown', e => { if (e.key === 'Escape') closeModal(); });
|
||
|
||
/* ─── MOBILE NAV ─── */
|
||
const burger = document.getElementById('burger');
|
||
const drawer = document.getElementById('nav-drawer');
|
||
burger.addEventListener('click', () => drawer.classList.toggle('open'));
|
||
|
||
/* ─── SCROLL REVEAL ─── */
|
||
const ro = new IntersectionObserver(entries => {
|
||
entries.forEach(e => {
|
||
if (e.isIntersecting) {
|
||
setTimeout(() => e.target.classList.add('vis'), +e.target.dataset.d || 0);
|
||
ro.unobserve(e.target);
|
||
}
|
||
});
|
||
}, { threshold: 0.08, rootMargin: '0px 0px -32px 0px' });
|
||
|
||
/* Stagger items inside grids */
|
||
document.querySelectorAll('.sdk-grid, .gs-grid, .feat-grid, .res-grid, .comm-grid').forEach(g => {
|
||
g.querySelectorAll('.reveal').forEach((el, i) => { el.dataset.d = i * 75; });
|
||
});
|
||
|
||
document.querySelectorAll('.reveal').forEach(el => ro.observe(el));
|
||
|
||
/* ─── NAV SCROLL TINT ─── */
|
||
const nav = document.getElementById('nav');
|
||
window.addEventListener('scroll', () => {
|
||
const alpha = scrollY > 10 ? '.16' : '.10';
|
||
const isLight = document.documentElement.dataset.theme === 'light';
|
||
nav.style.borderBottomColor = isLight
|
||
? `rgba(0,0,0,${scrollY > 10 ? '.14' : '.09'})`
|
||
: `rgba(255,255,255,${scrollY > 10 ? '.12' : '.08'})`;
|
||
}, { passive: true });
|
||
|
||
/* ─── THEME TOGGLE ─── */
|
||
const themeBtn = document.getElementById('theme-toggle');
|
||
themeBtn.addEventListener('click', () => {
|
||
const html = document.documentElement;
|
||
const next = html.dataset.theme === 'light' ? 'dark' : 'light';
|
||
html.classList.add('transitioning');
|
||
html.dataset.theme = next;
|
||
localStorage.setItem('theme', next);
|
||
// Update canvas opacity
|
||
const heroCanvas = document.getElementById('hero-canvas');
|
||
heroCanvas.style.opacity = next === 'light' ? '0.7' : '0.55';
|
||
setTimeout(() => html.classList.remove('transitioning'), 400);
|
||
});
|
||
|
||
// Set initial canvas opacity based on stored theme
|
||
(function(){
|
||
const heroCanvas = document.getElementById('hero-canvas');
|
||
if (document.documentElement.dataset.theme === 'light') heroCanvas.style.opacity = '0.7';
|
||
})();
|
||
|
||
/* ─── HERO CANVAS – WORKFLOW ANIMATION ─── */
|
||
(function () {
|
||
const canvas = document.getElementById('hero-canvas');
|
||
const ctx = canvas.getContext('2d');
|
||
|
||
function tc() {
|
||
/* Orange accent — matches docs.conductor-oss.org Zinc+Orange theme */
|
||
return document.documentElement.dataset.theme === 'light'
|
||
? [234, 88, 12] /* #ea580c — deeper orange on light bg */
|
||
: [249, 115, 22]; /* #f97316 — brand orange on dark bg */
|
||
}
|
||
let W, H, raf;
|
||
|
||
function resize() {
|
||
W = canvas.width = canvas.offsetWidth;
|
||
H = canvas.height = canvas.offsetHeight;
|
||
}
|
||
window.addEventListener('resize', resize);
|
||
resize();
|
||
|
||
/* Node definitions (relative coords) */
|
||
const ND = [
|
||
{ rx:.07, ry:.44, lbl:'START', kind:'end' },
|
||
{ rx:.23, ry:.24, lbl:'HTTP', kind:'task' },
|
||
{ rx:.23, ry:.64, lbl:'FORK', kind:'fork' },
|
||
{ rx:.42, ry:.13, lbl:'Worker A', kind:'task' },
|
||
{ rx:.42, ry:.44, lbl:'Worker B', kind:'task' },
|
||
{ rx:.42, ry:.72, lbl:'Worker C', kind:'task' },
|
||
{ rx:.63, ry:.40, lbl:'JOIN', kind:'fork' },
|
||
{ rx:.80, ry:.25, lbl:'Notify', kind:'task' },
|
||
{ rx:.80, ry:.57, lbl:'Store', kind:'task' },
|
||
{ rx:.94, ry:.40, lbl:'END', kind:'end' },
|
||
];
|
||
|
||
const EDGES = [
|
||
[0,1],[0,2],
|
||
[1,4],[2,3],[2,5],
|
||
[3,6],[4,6],[5,6],
|
||
[6,7],[6,8],
|
||
[7,9],[8,9],
|
||
];
|
||
|
||
/* One particle per edge */
|
||
const particles = EDGES.map(() => ({
|
||
t: Math.random(),
|
||
spd: .0028 + Math.random() * .002,
|
||
live: Math.random() > .35,
|
||
}));
|
||
|
||
let frame = 0;
|
||
|
||
function bezier(ax, ay, bx, by, t) {
|
||
const cpx = (ax + bx) / 2;
|
||
const x = (1-t)**3*ax + 3*(1-t)**2*t*cpx + 3*(1-t)*t**2*cpx + t**3*bx;
|
||
const y = (1-t)**3*ay + 3*(1-t)**2*t*ay + 3*(1-t)*t**2*by + t**3*by;
|
||
return { x, y };
|
||
}
|
||
|
||
function draw() {
|
||
ctx.clearRect(0, 0, W, H);
|
||
|
||
const nodes = ND.map(n => ({ ...n, x: n.rx * W, y: n.ry * H }));
|
||
|
||
const [tr, tg, tb] = tc();
|
||
const rgb = `${tr},${tg},${tb}`;
|
||
|
||
/* Edges */
|
||
EDGES.forEach(([a, b]) => {
|
||
const na = nodes[a], nb = nodes[b];
|
||
const cpx = (na.x + nb.x) / 2;
|
||
ctx.beginPath();
|
||
ctx.moveTo(na.x, na.y);
|
||
ctx.bezierCurveTo(cpx, na.y, cpx, nb.y, nb.x, nb.y);
|
||
ctx.strokeStyle = `rgba(${rgb},.13)`;
|
||
ctx.lineWidth = 1.4;
|
||
ctx.stroke();
|
||
});
|
||
|
||
/* Particles */
|
||
particles.forEach((p, i) => {
|
||
if (!p.live) { if (Math.random() < .004) { p.live = true; p.t = 0; } return; }
|
||
const [a, b] = EDGES[i];
|
||
const na = nodes[a], nb = nodes[b];
|
||
const pos = bezier(na.x, na.y, nb.x, nb.y, p.t);
|
||
|
||
/* glow */
|
||
const g = ctx.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, 9);
|
||
g.addColorStop(0, `rgba(${rgb},.55)`);
|
||
g.addColorStop(1, `rgba(${rgb},0)`);
|
||
ctx.beginPath(); ctx.arc(pos.x, pos.y, 9, 0, Math.PI*2);
|
||
ctx.fillStyle = g; ctx.fill();
|
||
|
||
/* dot */
|
||
ctx.beginPath(); ctx.arc(pos.x, pos.y, 2.2, 0, Math.PI*2);
|
||
ctx.fillStyle = `rgba(${rgb},.9)`; ctx.fill();
|
||
|
||
p.t += p.spd;
|
||
if (p.t > 1) { p.t = 0; p.live = Math.random() > .15; }
|
||
});
|
||
|
||
/* Nodes */
|
||
nodes.forEach((n, i) => {
|
||
const pulse = Math.sin(frame * .038 + i * 1.05) * .5 + .5;
|
||
const r = n.kind === 'end' ? 7 : 5;
|
||
|
||
/* outer glow */
|
||
const gr = ctx.createRadialGradient(n.x, n.y, 0, n.x, n.y, 26 + pulse * 8);
|
||
gr.addColorStop(0, `rgba(${rgb},${.10 + pulse * .08})`);
|
||
gr.addColorStop(1, `rgba(${rgb},0)`);
|
||
ctx.beginPath(); ctx.arc(n.x, n.y, 26 + pulse * 8, 0, Math.PI*2);
|
||
ctx.fillStyle = gr; ctx.fill();
|
||
|
||
/* circle */
|
||
ctx.beginPath(); ctx.arc(n.x, n.y, r, 0, Math.PI*2);
|
||
ctx.fillStyle = `rgba(${rgb},${n.kind === 'end' ? .78 + pulse*.22 : .40 + pulse*.22})`;
|
||
ctx.strokeStyle = `rgba(${rgb},${.58 + pulse*.38})`;
|
||
ctx.lineWidth = 1.4;
|
||
ctx.fill(); ctx.stroke();
|
||
|
||
/* label */
|
||
ctx.font = '400 9.5px IBM Plex Mono, monospace';
|
||
ctx.fillStyle = `rgba(${rgb},${.40 + pulse*.15})`;
|
||
ctx.textAlign = 'center';
|
||
ctx.fillText(n.lbl, n.x, n.y - r - 5);
|
||
});
|
||
|
||
frame++;
|
||
raf = requestAnimationFrame(draw);
|
||
}
|
||
|
||
draw();
|
||
window.addEventListener('beforeunload', () => cancelAnimationFrame(raf));
|
||
})();
|
||
</script>
|
||
|
||
</body>
|
||
</html>
|