Rename the CTA link from 'Watch it work' to 'See active issues' so visitors know the link leads to the issue tracker, not a demo or live view. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
715 lines
19 KiB
HTML
715 lines
19 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Disinto — From Vision to Market Fit</title>
|
|
<meta name="description" content="Open-source autonomous code factory for solo founders. Write the vision, define quality gates — agents build, review, ship, operate, plan, and groom.">
|
|
<link rel="icon" href="favicon.ico" sizes="32x32">
|
|
<link rel="icon" href="favicon-192.png" sizes="192x192" type="image/png">
|
|
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
|
<link rel="canonical" href="https://disinto.ai/">
|
|
<meta property="og:title" content="Disinto — From Vision to Market Fit">
|
|
<meta property="og:description" content="Open-source autonomous code factory for solo founders. Write the vision, define quality gates — agents build, review, ship, operate, plan, and groom.">
|
|
<meta property="og:image" content="https://disinto.ai/og-image.jpg">
|
|
<meta property="og:url" content="https://disinto.ai/">
|
|
<meta property="og:type" content="website">
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="twitter:title" content="Disinto — From Vision to Market Fit">
|
|
<meta name="twitter:description" content="Open-source autonomous code factory for solo founders.">
|
|
<meta name="twitter:image" content="https://disinto.ai/og-image.jpg">
|
|
<style>
|
|
:root {
|
|
--bg: #0a0a0a;
|
|
--fg: #e0e0e0;
|
|
--dim: #707070;
|
|
--accent: #c8a46e;
|
|
--accent-dim: #8a7044;
|
|
--surface: #141414;
|
|
--border: #222;
|
|
}
|
|
|
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
|
|
body {
|
|
font-family: 'SF Mono', 'Cascadia Code', 'Fira Code', 'JetBrains Mono', monospace;
|
|
background: var(--bg);
|
|
color: var(--fg);
|
|
line-height: 1.7;
|
|
min-height: 100vh;
|
|
}
|
|
|
|
.container {
|
|
max-width: 720px;
|
|
margin: 0 auto;
|
|
padding: 4rem 2rem;
|
|
}
|
|
|
|
/* Hero */
|
|
.hero {
|
|
text-align: center;
|
|
margin-bottom: 2rem;
|
|
}
|
|
|
|
.hero h1 {
|
|
font-size: 3rem;
|
|
font-weight: 300;
|
|
letter-spacing: 0.3em;
|
|
text-transform: uppercase;
|
|
color: var(--accent);
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.hero .tagline {
|
|
color: var(--dim);
|
|
font-size: 1.4rem;
|
|
letter-spacing: 0.15em;
|
|
}
|
|
|
|
/* Pitch */
|
|
.pitch {
|
|
text-align: center;
|
|
margin-bottom: 4rem;
|
|
padding: 0 1rem;
|
|
}
|
|
|
|
.pitch p {
|
|
color: var(--fg);
|
|
font-size: 0.95rem;
|
|
line-height: 1.9;
|
|
}
|
|
|
|
.pitch p strong {
|
|
color: var(--accent);
|
|
}
|
|
|
|
/* Origin story */
|
|
.origin {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 1.5rem;
|
|
align-items: center;
|
|
margin-bottom: 4rem;
|
|
padding: 2rem;
|
|
border: 1px solid var(--border);
|
|
background: var(--surface);
|
|
}
|
|
|
|
.origin img {
|
|
width: 100%;
|
|
max-width: 600px;
|
|
opacity: 0.9;
|
|
border: 1px solid var(--border);
|
|
}
|
|
|
|
.origin blockquote {
|
|
color: var(--dim);
|
|
font-size: 0.85rem;
|
|
font-style: italic;
|
|
line-height: 1.8;
|
|
}
|
|
|
|
.origin blockquote strong {
|
|
color: var(--accent);
|
|
font-style: normal;
|
|
}
|
|
|
|
.origin .cite {
|
|
display: block;
|
|
margin-top: 1rem;
|
|
color: var(--accent-dim);
|
|
font-size: 0.75rem;
|
|
font-style: normal;
|
|
}
|
|
|
|
/* Sections */
|
|
.section {
|
|
margin-bottom: 3rem;
|
|
}
|
|
|
|
.section h2,
|
|
.example h2 {
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
letter-spacing: 0.2em;
|
|
text-transform: uppercase;
|
|
color: var(--accent-dim);
|
|
margin-bottom: 1.5rem;
|
|
padding-bottom: 0.5rem;
|
|
border-bottom: 1px solid var(--border);
|
|
}
|
|
|
|
.section p {
|
|
color: var(--dim);
|
|
font-size: 0.85rem;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.section p strong {
|
|
color: var(--fg);
|
|
}
|
|
|
|
/* Value blocks */
|
|
.values {
|
|
display: grid;
|
|
grid-template-columns: 1fr;
|
|
gap: 1px;
|
|
background: var(--border);
|
|
margin-bottom: 3rem;
|
|
}
|
|
|
|
.value {
|
|
background: var(--surface);
|
|
padding: 1.5rem;
|
|
}
|
|
|
|
.value .headline {
|
|
font-size: 0.85rem;
|
|
color: var(--accent);
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.value .detail {
|
|
font-size: 0.8rem;
|
|
color: var(--dim);
|
|
line-height: 1.7;
|
|
}
|
|
|
|
.value .detail strong {
|
|
color: var(--fg);
|
|
}
|
|
|
|
/* Pipeline */
|
|
.pipeline {
|
|
font-size: 0.8rem;
|
|
color: var(--dim);
|
|
padding: 1.5rem;
|
|
background: var(--surface);
|
|
border: 1px solid var(--border);
|
|
margin-bottom: 1rem;
|
|
overflow-x: auto;
|
|
text-align: center;
|
|
}
|
|
|
|
.pipeline .step {
|
|
color: var(--accent-dim);
|
|
}
|
|
|
|
.pipeline .arrow {
|
|
color: var(--border);
|
|
margin: 0 0.5rem;
|
|
}
|
|
|
|
/* Lifecycle detail */
|
|
.lifecycle {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 1px;
|
|
background: var(--border);
|
|
margin-bottom: 3rem;
|
|
}
|
|
|
|
.lifecycle-stage {
|
|
background: var(--surface);
|
|
padding: 1.2rem;
|
|
}
|
|
|
|
.lifecycle-stage .stage-name {
|
|
font-size: 0.75rem;
|
|
color: var(--accent);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.1em;
|
|
margin-bottom: 0.4rem;
|
|
}
|
|
|
|
.lifecycle-stage .stage-desc {
|
|
font-size: 0.75rem;
|
|
color: var(--dim);
|
|
line-height: 1.7;
|
|
}
|
|
|
|
.lifecycle-stage .stage-desc strong {
|
|
color: var(--fg);
|
|
}
|
|
|
|
@media (max-width: 600px) {
|
|
.lifecycle { grid-template-columns: 1fr; }
|
|
}
|
|
|
|
/* Proof */
|
|
.proof {
|
|
padding: 1.5rem;
|
|
background: var(--surface);
|
|
border: 1px solid var(--border);
|
|
margin-bottom: 3rem;
|
|
font-size: 0.8rem;
|
|
color: var(--dim);
|
|
}
|
|
|
|
.proof .number {
|
|
color: var(--accent);
|
|
font-size: 1.4rem;
|
|
font-weight: 300;
|
|
}
|
|
|
|
.proof .label {
|
|
color: var(--dim);
|
|
font-size: 0.75rem;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.proof-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(3, 1fr);
|
|
gap: 1rem;
|
|
text-align: center;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.proof .context {
|
|
font-size: 0.75rem;
|
|
color: var(--dim);
|
|
text-align: center;
|
|
font-style: italic;
|
|
}
|
|
|
|
/* Differentiator */
|
|
.differ {
|
|
margin-bottom: 3rem;
|
|
padding: 2rem;
|
|
border: 1px solid var(--accent-dim);
|
|
background: var(--surface);
|
|
}
|
|
|
|
.differ h2 {
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
letter-spacing: 0.2em;
|
|
text-transform: uppercase;
|
|
color: var(--accent);
|
|
margin-bottom: 1.5rem;
|
|
padding-bottom: 0.5rem;
|
|
border-bottom: 1px solid var(--accent-dim);
|
|
}
|
|
|
|
.differ p {
|
|
color: var(--dim);
|
|
font-size: 0.85rem;
|
|
line-height: 1.8;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.differ p:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.differ p strong {
|
|
color: var(--fg);
|
|
}
|
|
|
|
.differ .accent {
|
|
color: var(--accent);
|
|
}
|
|
|
|
.differ-cols {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 1px;
|
|
background: var(--border);
|
|
margin-bottom: 1.5rem;
|
|
}
|
|
|
|
.differ-col {
|
|
background: var(--surface);
|
|
padding: 1.2rem;
|
|
}
|
|
|
|
.differ-col .col-head {
|
|
font-size: 0.75rem;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.1em;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.differ-col .col-head.dim { color: var(--dim); }
|
|
.differ-col .col-head.gold { color: var(--accent); }
|
|
|
|
.differ-col ul {
|
|
list-style: none;
|
|
font-size: 0.75rem;
|
|
color: var(--dim);
|
|
line-height: 2;
|
|
}
|
|
|
|
.differ-col ul strong {
|
|
color: var(--fg);
|
|
}
|
|
|
|
@media (max-width: 600px) {
|
|
.differ-cols { grid-template-columns: 1fr; }
|
|
}
|
|
|
|
/* Concrete example */
|
|
.example {
|
|
margin-bottom: 3rem;
|
|
padding: 2rem;
|
|
border: 1px solid var(--border);
|
|
background: var(--surface);
|
|
}
|
|
|
|
.example img {
|
|
width: 100%;
|
|
border: 1px solid var(--border);
|
|
margin-bottom: 1.5rem;
|
|
opacity: 0.9;
|
|
}
|
|
|
|
.example p {
|
|
color: var(--dim);
|
|
font-size: 0.85rem;
|
|
line-height: 1.8;
|
|
}
|
|
|
|
.example p strong {
|
|
color: var(--fg);
|
|
}
|
|
|
|
/* Benefits */
|
|
.benefits {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr 1fr;
|
|
gap: 1px;
|
|
background: var(--border);
|
|
margin-bottom: 3rem;
|
|
}
|
|
|
|
.benefit {
|
|
background: var(--surface);
|
|
padding: 1.2rem;
|
|
}
|
|
|
|
.benefit .name {
|
|
font-size: 0.75rem;
|
|
color: var(--accent-dim);
|
|
margin-bottom: 0.5rem;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.1em;
|
|
}
|
|
|
|
.benefit .desc {
|
|
font-size: 0.75rem;
|
|
color: var(--dim);
|
|
line-height: 1.7;
|
|
}
|
|
|
|
.benefit .desc strong {
|
|
color: var(--fg);
|
|
}
|
|
|
|
/* CTA */
|
|
.cta {
|
|
text-align: center;
|
|
margin-bottom: 3rem;
|
|
padding: 2rem;
|
|
border: 1px solid var(--accent-dim);
|
|
background: var(--surface);
|
|
}
|
|
|
|
.cta p {
|
|
color: var(--dim);
|
|
font-size: 0.85rem;
|
|
margin-bottom: 1.5rem;
|
|
}
|
|
|
|
.cta .cta-links {
|
|
display: flex;
|
|
justify-content: center;
|
|
gap: 2rem;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.cta .cta-links a {
|
|
color: var(--accent);
|
|
text-decoration: none;
|
|
font-size: 0.85rem;
|
|
padding: 0.5rem 1rem;
|
|
border: 1px solid var(--accent-dim);
|
|
transition: border-color 0.2s;
|
|
}
|
|
|
|
.cta .cta-links a:hover {
|
|
border-color: var(--accent);
|
|
}
|
|
|
|
/* Footer */
|
|
.footer {
|
|
text-align: center;
|
|
padding-top: 3rem;
|
|
border-top: 1px solid var(--border);
|
|
font-size: 0.75rem;
|
|
color: var(--dim);
|
|
}
|
|
|
|
.footer a {
|
|
color: var(--accent-dim);
|
|
text-decoration: none;
|
|
}
|
|
|
|
.footer a:hover {
|
|
color: var(--accent);
|
|
}
|
|
|
|
.footer .links {
|
|
margin-top: 0.75rem;
|
|
}
|
|
|
|
.footer .links a {
|
|
margin: 0 1rem;
|
|
}
|
|
|
|
.footer .under-hood {
|
|
margin-top: 1.5rem;
|
|
font-size: 0.7rem;
|
|
color: var(--border);
|
|
}
|
|
|
|
/* Mobile */
|
|
@media (max-width: 600px) {
|
|
.hero h1 { font-size: 2rem; }
|
|
.origin { flex-direction: column; align-items: center; }
|
|
.origin img { max-width: 100%; }
|
|
.benefits { grid-template-columns: 1fr; }
|
|
.proof-grid { grid-template-columns: 1fr; }
|
|
.container { padding: 2rem 1rem; }
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
|
|
<div class="hero">
|
|
<h1>Disinto</h1>
|
|
<div class="tagline">from vision to market fit</div>
|
|
</div>
|
|
|
|
<div class="pitch">
|
|
<p>
|
|
<strong>An autonomous code factory for solo founders.</strong><br>
|
|
Write a vision file. Define quality gates in the vault.<br>
|
|
Agents derive the backlog, build, review, ship, operate, plan, and groom.<br>
|
|
You make decisions. They do the work.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="origin">
|
|
<picture>
|
|
<source srcset="al76.webp" type="image/webp">
|
|
<img src="al76.jpg" alt="Robot AL-76 building a Disinto from scrap">
|
|
</picture>
|
|
<blockquote>
|
|
A mining robot, lost and confused, builds a <strong>Disinto</strong> from
|
|
scrap — a device so powerful it vaporizes three-quarters of a mountain
|
|
on a single battery. Nobody can figure out how it works.
|
|
When ordered to explain, it calmly dismantles the machine into
|
|
rubble and flinders.
|
|
<span class="cite">— Isaac Asimov, "Robot AL-76 Goes Astray" (1942)</span>
|
|
</blockquote>
|
|
</div>
|
|
|
|
<div class="values">
|
|
<div class="value">
|
|
<div class="headline">Write the vision, not the code</div>
|
|
<div class="detail">
|
|
Describe what you want built. Agents figure out what's missing,
|
|
break it into tasks, and start working. You wake up to
|
|
<strong>progress, not process</strong>.
|
|
</div>
|
|
</div>
|
|
<div class="value">
|
|
<div class="headline">Nothing ships without your gates</div>
|
|
<div class="detail">
|
|
You define the boundaries — what gets auto-approved and what
|
|
needs your eyes. Agents work within them.
|
|
<strong>You steer. They row.</strong>
|
|
</div>
|
|
</div>
|
|
<div class="value">
|
|
<div class="headline">Decisions, not busywork</div>
|
|
<div class="detail">
|
|
The work organizes itself. Duplicates get closed, priorities
|
|
get surfaced, gaps get found. Your job is
|
|
<strong>direction</strong> — not tickets, not triage, not grooming.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section">
|
|
<h2>The full lifecycle</h2>
|
|
<div class="pipeline">
|
|
<span class="step">build</span>
|
|
<span class="arrow">→</span>
|
|
<span class="step">review</span>
|
|
<span class="arrow">→</span>
|
|
<span class="step">ship</span>
|
|
<span class="arrow">→</span>
|
|
<span class="step">operate</span>
|
|
<span class="arrow">→</span>
|
|
<span class="step">plan</span>
|
|
<span class="arrow">→</span>
|
|
<span class="step">groom</span>
|
|
<span class="arrow">→</span>
|
|
<span class="step">build</span>
|
|
</div>
|
|
<div class="lifecycle">
|
|
<div class="lifecycle-stage">
|
|
<div class="stage-name">Build</div>
|
|
<div class="stage-desc"><strong>Dev-agent</strong> picks up backlog issues, implements in isolated worktrees, opens PRs.</div>
|
|
</div>
|
|
<div class="lifecycle-stage">
|
|
<div class="stage-name">Review</div>
|
|
<div class="stage-desc"><strong>Review-agent</strong> checks PRs against project conventions, approves or requests changes.</div>
|
|
</div>
|
|
<div class="lifecycle-stage">
|
|
<div class="stage-name">Ship</div>
|
|
<div class="stage-desc">CI runs, PRs merge, deployments happen. The <strong>vault</strong> controls what needs your sign-off.</div>
|
|
</div>
|
|
<div class="lifecycle-stage">
|
|
<div class="stage-name">Operate</div>
|
|
<div class="stage-desc"><strong>Supervisor</strong> monitors health, fixes what it can, escalates what it can't.</div>
|
|
</div>
|
|
<div class="lifecycle-stage">
|
|
<div class="stage-name">Plan</div>
|
|
<div class="stage-desc"><strong>Planner</strong> compares project state against your vision, creates issues for gaps.</div>
|
|
</div>
|
|
<div class="lifecycle-stage">
|
|
<div class="stage-name">Groom</div>
|
|
<div class="stage-desc"><strong>Gardener</strong> maintains the backlog — closes duplicates, promotes tech debt, keeps things moving.</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="differ">
|
|
<h2>Not CI/CD — a quality-gated code factory</h2>
|
|
<div class="differ-cols">
|
|
<div class="differ-col">
|
|
<div class="col-head dim">Generic CI/CD</div>
|
|
<ul>
|
|
<li>Runs your tests after you push</li>
|
|
<li>You write the code</li>
|
|
<li>You manage the backlog</li>
|
|
<li>You decide what to build next</li>
|
|
</ul>
|
|
</div>
|
|
<div class="differ-col">
|
|
<div class="col-head gold">Disinto</div>
|
|
<ul>
|
|
<li>Writes the code, opens the PR, reviews it</li>
|
|
<li><strong>Vision</strong> defines what gets built</li>
|
|
<li><strong>Vault</strong> gates what can ship</li>
|
|
<li>Agents plan, groom, build, and operate</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<p>
|
|
Two files set the boundaries: <strong class="accent">VISION.md</strong> tells agents
|
|
what you're building and why. The <strong class="accent">vault</strong> defines what
|
|
needs your approval — deployments, infrastructure changes, anything dangerous.
|
|
Everything else flows autonomously.
|
|
</p>
|
|
<p>
|
|
This is the quality gate model. Your vision sets direction. The vault enforces
|
|
safety. Between them, agents have enough freedom to work and enough
|
|
constraint to be trusted. <strong>That's what makes it a factory, not a pipeline.</strong>
|
|
</p>
|
|
</div>
|
|
|
|
<div class="example">
|
|
<h2>The factory fixed itself</h2>
|
|
<picture>
|
|
<source srcset="factory-fixes-itself.webp" type="image/webp">
|
|
<img src="factory-fixes-itself.jpg" alt="Screenshot: factory files a bug, fixes it, reviews it, and merges — 14 minutes">
|
|
</picture>
|
|
<p>
|
|
We filed a bug about the review lifecycle. <strong>14 minutes later</strong>,
|
|
the dev-agent picked it up, built a fix, the review-agent approved it, and it
|
|
merged into main. The factory fixed a bug in its own code while we watched.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="proof">
|
|
<div class="proof-grid">
|
|
<div>
|
|
<div class="number">219</div>
|
|
<div class="label">commits in 6 days</div>
|
|
</div>
|
|
<div>
|
|
<div class="number">50</div>
|
|
<div class="label">issues closed</div>
|
|
</div>
|
|
<div>
|
|
<div class="number">2</div>
|
|
<div class="label">repos managed</div>
|
|
</div>
|
|
</div>
|
|
<div class="context">
|
|
Disinto building itself — and a DeFi protocol — on a single 8GB VPS. As of March 2026.
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section">
|
|
<h2>One VPS, one repo, one battery</h2>
|
|
<p>
|
|
<strong>Bash scripts and Claude.</strong> No Kubernetes, no microservices,
|
|
no SaaS dependencies. Runs on an 8GB VPS.
|
|
Point it at a <strong>Codeberg repo</strong> with a
|
|
<strong>Woodpecker CI</strong> pipeline and it starts building.
|
|
</p>
|
|
<p>
|
|
<strong>Built for web apps and crypto projects.</strong>
|
|
SaaS dashboards, DeFi protocols, token launches — if it has
|
|
a repo and tests, Disinto can work it.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="benefits">
|
|
<div class="benefit">
|
|
<div class="name">Runs on a single VPS</div>
|
|
<div class="desc">No cloud bills that scale with usage. <strong>One 8GB machine</strong> runs the whole factory. Your costs stay flat.</div>
|
|
</div>
|
|
<div class="benefit">
|
|
<div class="name">No vendor lock-in</div>
|
|
<div class="desc">Open source, bash scripts, standard git. <strong>You own every piece.</strong> Move it, fork it, read every line.</div>
|
|
</div>
|
|
<div class="benefit">
|
|
<div class="name">Self-improving</div>
|
|
<div class="desc">Every bug it fixes teaches it a pattern. Every review sharpens the next one. <strong>The factory gets better as it runs.</strong></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="cta">
|
|
<p>The code is public. The factory is running. See for yourself.</p>
|
|
<div class="cta-links">
|
|
<a href="/docs/quickstart">Quickstart</a>
|
|
<a href="/docs/architecture">Architecture</a>
|
|
<a href="https://codeberg.org/johba/disinto">Browse the source</a>
|
|
<a href="https://codeberg.org/johba/disinto/issues">See active issues</a>
|
|
<a href="/dashboard">Live dashboard</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="footer">
|
|
<div>Built from scrap, powered by a single battery.</div>
|
|
<div class="links">
|
|
<a href="/docs/quickstart">quickstart</a>
|
|
<a href="/docs/architecture">architecture</a>
|
|
<a href="https://codeberg.org/johba/disinto">source</a>
|
|
<a href="/dashboard">dashboard</a>
|
|
</div>
|
|
<div class="under-hood">
|
|
Under the hood: dev, review, planner, gardener, supervisor, predictor, action, vault — eight agents orchestrated by cron and bash.
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|