2026-03-17 23:11:40 +01:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
2026-03-18 16:21:42 +01:00
< title > Disinto — From Vision to Market Fit< / title >
2026-03-22 07:22:31 +00:00
< 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." >
2026-03-18 16:21:42 +01:00
< 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" >
2026-03-19 20:56:44 +00:00
< link rel = "canonical" href = "https://disinto.ai/" >
2026-03-18 16:21:42 +01:00
< meta property = "og:title" content = "Disinto — From Vision to Market Fit" >
2026-03-22 07:22:31 +00:00
< 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." >
2026-03-18 16:21:42 +01:00
< meta property = "og:image" content = "https://disinto.ai/og-image.jpg" >
2026-03-19 21:04:39 +00:00
< meta property = "og:url" content = "https://disinto.ai/" >
2026-03-18 16:21:42 +01:00
< 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" >
2026-03-22 07:22:31 +00:00
< meta name = "twitter:description" content = "Open-source autonomous code factory for solo founders." >
2026-03-18 16:21:42 +01:00
< meta name = "twitter:image" content = "https://disinto.ai/og-image.jpg" >
2026-03-17 23:11:40 +01:00
< 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;
2026-03-18 16:21:42 +01:00
margin-bottom: 2rem;
2026-03-17 23:11:40 +01:00
}
.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);
2026-03-18 16:21:42 +01:00
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);
2026-03-17 23:11:40 +01:00
}
/* 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;
}
2026-03-18 16:21:42 +01:00
/* Sections */
2026-03-17 23:11:40 +01:00
.section {
margin-bottom: 3rem;
}
2026-03-23 08:40:16 +00:00
.section h2,
.example h2 {
2026-03-17 23:11:40 +01:00
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);
}
2026-03-18 16:21:42 +01:00
/* Value blocks */
.values {
2026-03-17 23:11:40 +01:00
display: grid;
2026-03-19 00:10:39 +00:00
grid-template-columns: 1fr;
2026-03-17 23:11:40 +01:00
gap: 1px;
background: var(--border);
margin-bottom: 3rem;
}
2026-03-18 16:21:42 +01:00
.value {
2026-03-17 23:11:40 +01:00
background: var(--surface);
padding: 1.5rem;
}
2026-03-18 16:21:42 +01:00
.value .headline {
font-size: 0.85rem;
2026-03-17 23:11:40 +01:00
color: var(--accent);
2026-03-18 16:21:42 +01:00
margin-bottom: 0.5rem;
2026-03-17 23:11:40 +01:00
}
2026-03-18 16:21:42 +01:00
.value .detail {
font-size: 0.8rem;
2026-03-17 23:11:40 +01:00
color: var(--dim);
2026-03-18 16:21:42 +01:00
line-height: 1.7;
}
.value .detail strong {
color: var(--fg);
2026-03-17 23:11:40 +01:00
}
/* Pipeline */
.pipeline {
font-size: 0.8rem;
color: var(--dim);
padding: 1.5rem;
background: var(--surface);
border: 1px solid var(--border);
2026-03-22 07:22:31 +00:00
margin-bottom: 1rem;
2026-03-17 23:11:40 +01:00
overflow-x: auto;
2026-03-18 16:21:42 +01:00
text-align: center;
2026-03-17 23:11:40 +01:00
}
.pipeline .step {
color: var(--accent-dim);
}
.pipeline .arrow {
color: var(--border);
margin: 0 0.5rem;
}
2026-03-22 07:22:31 +00:00
/* 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; }
}
2026-03-18 16:21:42 +01:00
/* 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;
}
2026-03-22 07:22:31 +00:00
/* 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; }
}
2026-03-19 20:56:44 +00:00
/* 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 {
2026-03-18 16:21:42 +01:00
display: grid;
2026-03-19 20:56:44 +00:00
grid-template-columns: 1fr 1fr 1fr;
2026-03-18 16:21:42 +01:00
gap: 1px;
background: var(--border);
margin-bottom: 3rem;
}
2026-03-19 20:56:44 +00:00
.benefit {
2026-03-18 16:21:42 +01:00
background: var(--surface);
padding: 1.2rem;
}
2026-03-19 20:56:44 +00:00
.benefit .name {
2026-03-18 16:21:42 +01:00
font-size: 0.75rem;
color: var(--accent-dim);
2026-03-19 20:56:44 +00:00
margin-bottom: 0.5rem;
2026-03-18 16:21:42 +01:00
text-transform: uppercase;
letter-spacing: 0.1em;
}
2026-03-19 20:56:44 +00:00
.benefit .desc {
2026-03-18 16:21:42 +01:00
font-size: 0.75rem;
color: var(--dim);
2026-03-19 20:56:44 +00:00
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);
2026-03-18 16:21:42 +01:00
}
2026-03-17 23:11:40 +01:00
/* 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;
}
2026-03-18 16:21:42 +01:00
.footer .under-hood {
margin-top: 1.5rem;
font-size: 0.7rem;
color: var(--border);
}
2026-03-17 23:11:40 +01:00
/* Mobile */
@media (max-width: 600px) {
.hero h1 { font-size: 2rem; }
.origin { flex-direction: column; align-items: center; }
.origin img { max-width: 100%; }
2026-03-19 20:56:44 +00:00
.benefits { grid-template-columns: 1fr; }
2026-03-18 16:21:42 +01:00
.proof-grid { grid-template-columns: 1fr; }
2026-03-17 23:11:40 +01:00
.container { padding: 2rem 1rem; }
}
< / style >
< / head >
< body >
< div class = "container" >
< div class = "hero" >
< h1 > Disinto< / h1 >
2026-03-18 16:21:42 +01:00
< div class = "tagline" > from vision to market fit< / div >
< / div >
< div class = "pitch" >
< p >
2026-03-22 07:22:31 +00:00
< 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.
2026-03-18 16:21:42 +01:00
< / p >
2026-03-17 23:11:40 +01:00
< / 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 >
2026-03-18 16:21:42 +01:00
< 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 >
2026-03-17 23:11:40 +01:00
< / div >
2026-03-18 16:21:42 +01:00
< 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 >
2026-03-17 23:11:40 +01:00
< / div >
2026-03-18 16:21:42 +01:00
< 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 >
2026-03-17 23:11:40 +01:00
< / div >
< / div >
< div class = "section" >
2026-03-22 07:22:31 +00:00
< h2 > The full lifecycle< / h2 >
2026-03-17 23:11:40 +01:00
< 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 >
2026-03-22 07:22:31 +00:00
< span class = "step" > plan< / span >
< span class = "arrow" > →< / span >
< span class = "step" > groom< / span >
2026-03-17 23:11:40 +01:00
< span class = "arrow" > →< / span >
2026-03-22 07:22:31 +00:00
< 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 >
2026-03-17 23:11:40 +01:00
< / div >
< / div >
2026-03-22 07:22:31 +00:00
< 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 >
2026-03-19 20:56:44 +00:00
< div class = "example" >
2026-03-19 21:04:39 +00:00
< h2 > The factory fixed itself< / h2 >
2026-03-19 22:55:32 +00:00
< 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 >
2026-03-19 20:56:44 +00:00
< 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 >
2026-03-18 16:21:42 +01:00
< 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 >
2026-03-19 20:56:44 +00:00
< div class = "label" > repos managed< / div >
2026-03-18 16:21:42 +01:00
< / div >
< / div >
< div class = "context" >
2026-03-19 20:56:44 +00:00
Disinto building itself — and a DeFi protocol — on a single 8GB VPS. As of March 2026.
2026-03-18 16:21:42 +01:00
< / div >
2026-03-17 23:11:40 +01:00
< / div >
< div class = "section" >
2026-03-18 16:21:42 +01:00
< h2 > One VPS, one repo, one battery< / h2 >
2026-03-17 23:11:40 +01:00
< p >
2026-03-18 16:21:42 +01:00
< strong > Bash scripts and Claude.< / strong > No Kubernetes, no microservices,
no SaaS dependencies. Runs on an 8GB VPS.
fix: Replace Codeberg dependency with local Forgejo instance (#611)
- Add setup_forge() to bin/disinto: provisions Forgejo via Docker,
creates admin + bot users (dev-bot, review-bot), generates API
tokens, creates repo, and pushes code — all automated
- Rename env vars: CODEBERG_TOKEN→FORGE_TOKEN, REVIEW_BOT_TOKEN→
FORGE_REVIEW_TOKEN, CODEBERG_REPO→FORGE_REPO, CODEBERG_API→
FORGE_API, CODEBERG_WEB→FORGE_WEB, CODEBERG_BOT_USERNAMES→
FORGE_BOT_USERNAMES (with backwards-compat fallbacks)
- Rename API helpers: codeberg_api()→forge_api(), codeberg_api_all()
→forge_api_all() (with compat aliases)
- Add forge_url field to project TOML; load-project.sh derives
FORGE_API/FORGE_WEB from forge_url + repo
- Update parse_repo_slug() to accept any host URL, not just codeberg
- Forgejo data stored under ~/.disinto/forgejo/ (not in factory repo)
- Update all 58 files: agent scripts, formulas, docs, site HTML
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 16:57:12 +00:00
Point it at a < strong > forge repo< / strong > with a
2026-03-18 16:21:42 +01:00
< strong > Woodpecker CI< / strong > pipeline and it starts building.
2026-03-17 23:11:40 +01:00
< / p >
< p >
2026-03-18 16:21:42 +01:00
< 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.
2026-03-17 23:11:40 +01:00
< / p >
< / div >
2026-03-19 20:56:44 +00:00
< 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 >
2026-03-18 16:21:42 +01:00
< / div >
2026-03-19 20:56:44 +00:00
< 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 >
2026-03-18 16:21:42 +01:00
< / div >
2026-03-19 20:56:44 +00:00
< div class = "benefit" >
2026-03-18 16:21:42 +01:00
< div class = "name" > Self-improving< / div >
2026-03-19 20:56:44 +00:00
< 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" >
2026-03-21 14:43:19 +00:00
< a href = "/docs/quickstart" > Quickstart< / a >
< a href = "/docs/architecture" > Architecture< / a >
fix: Replace Codeberg dependency with local Forgejo instance (#611)
- Add setup_forge() to bin/disinto: provisions Forgejo via Docker,
creates admin + bot users (dev-bot, review-bot), generates API
tokens, creates repo, and pushes code — all automated
- Rename env vars: CODEBERG_TOKEN→FORGE_TOKEN, REVIEW_BOT_TOKEN→
FORGE_REVIEW_TOKEN, CODEBERG_REPO→FORGE_REPO, CODEBERG_API→
FORGE_API, CODEBERG_WEB→FORGE_WEB, CODEBERG_BOT_USERNAMES→
FORGE_BOT_USERNAMES (with backwards-compat fallbacks)
- Rename API helpers: codeberg_api()→forge_api(), codeberg_api_all()
→forge_api_all() (with compat aliases)
- Add forge_url field to project TOML; load-project.sh derives
FORGE_API/FORGE_WEB from forge_url + repo
- Update parse_repo_slug() to accept any host URL, not just codeberg
- Forgejo data stored under ~/.disinto/forgejo/ (not in factory repo)
- Update all 58 files: agent scripts, formulas, docs, site HTML
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 16:57:12 +00:00
< a href = "http://localhost:3000/johba/disinto" > Browse the source< / a >
< a href = "http://localhost:3000/johba/disinto/issues" > See active issues< / a >
2026-03-21 14:08:22 +00:00
< a href = "/dashboard" > Live dashboard< / a >
2026-03-18 16:21:42 +01:00
< / div >
< / div >
2026-03-17 23:11:40 +01:00
< div class = "footer" >
2026-03-18 16:21:42 +01:00
< div > Built from scrap, powered by a single battery.< / div >
2026-03-17 23:11:40 +01:00
< div class = "links" >
2026-03-21 14:43:19 +00:00
< a href = "/docs/quickstart" > quickstart< / a >
< a href = "/docs/architecture" > architecture< / a >
fix: Replace Codeberg dependency with local Forgejo instance (#611)
- Add setup_forge() to bin/disinto: provisions Forgejo via Docker,
creates admin + bot users (dev-bot, review-bot), generates API
tokens, creates repo, and pushes code — all automated
- Rename env vars: CODEBERG_TOKEN→FORGE_TOKEN, REVIEW_BOT_TOKEN→
FORGE_REVIEW_TOKEN, CODEBERG_REPO→FORGE_REPO, CODEBERG_API→
FORGE_API, CODEBERG_WEB→FORGE_WEB, CODEBERG_BOT_USERNAMES→
FORGE_BOT_USERNAMES (with backwards-compat fallbacks)
- Rename API helpers: codeberg_api()→forge_api(), codeberg_api_all()
→forge_api_all() (with compat aliases)
- Add forge_url field to project TOML; load-project.sh derives
FORGE_API/FORGE_WEB from forge_url + repo
- Update parse_repo_slug() to accept any host URL, not just codeberg
- Forgejo data stored under ~/.disinto/forgejo/ (not in factory repo)
- Update all 58 files: agent scripts, formulas, docs, site HTML
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 16:57:12 +00:00
< a href = "http://localhost:3000/johba/disinto" > source< / a >
2026-03-21 14:08:22 +00:00
< a href = "/dashboard" > dashboard< / a >
2026-03-17 23:11:40 +01:00
< / div >
2026-03-18 16:21:42 +01:00
< div class = "under-hood" >
2026-03-22 07:22:31 +00:00
Under the hood: dev, review, planner, gardener, supervisor, predictor, action, vault — eight agents orchestrated by cron and bash.
2026-03-18 16:21:42 +01:00
< / div >
2026-03-17 23:11:40 +01:00
< / div >
< / div >
< / body >
< / html >