Repository files navigation

Foundry

Foundry

Spec-driven development with AI. Write the spec, let AI build it.

FeaturesHow It WorksGetting StartedDevelopmentBuildingArchitectureContributingLicense


Warning

This project is a playground for the author to test out building ideas for open-source project using agentic development. It is not intended to be fully secure and operational. Feel free to fork if you want to make the idea viable.


Foundry is an Electron-based IDE where you collaborate with an LLM to write markdown specification files that define a software project. Each commit of your spec triggers an AI coding agent to produce a complete, working implementation as a standalone artifact.

You iterate on the spec, inspect the generated code, run tests, and get feedback from expert review agents — all within the same app. No API keys required — Foundry uses locally installed Claude Code or Codex CLI tools.

Foundry Welcome Screen

Features

Design Tab

Write and refine your project spec using a Notion-like WYSIWYG editor (BlockNote). A chat panel lets you discuss changes with an AI assistant that can directly edit your spec files. Highlight text to add inline comments that get batched and sent to the assistant.

Design Tab

Inspect Tab

Browse the generated implementation code with a full Monaco editor — file tree, tabs, minimap, and syntax highlighting for every language. Watch builds in real-time with streaming agent output.

Inspect Tab

Test Tab

Run tests against the implementation, view results with a visual pass/fail summary, and launch the built artifact to preview it. Test output renders with ANSI color codes.

Test Tab

Review Tab

Get feedback from configurable expert agents — QA Analyst, Security Analyst, UX/UI Designer, Performance Engineer, or your own custom roles. Each expert reviews the full spec + implementation and provides actionable feedback with streaming responses.

Review Tab

Settings

Configure providers (Claude Code / Codex), models, build commands, test commands, and screenshot capture. Per-expert provider/model overrides supported. Settings work as global defaults and per-project overrides.

Settings

How It Works

Write Spec (.md files) → Commit → AI Agent Implements → Inspect / Test / Review
↑ ↓
└──────────── Iterate based on feedback ───────────────────────┘
  1. Design your project spec as a collection of markdown files (overview, architecture, features, tests)
  2. Commit your spec — this triggers the AI agent (Claude Code or Codex) to implement the entire project from scratch in a git worktree
  3. Inspect the generated code in a full-featured code editor
  4. Test the implementation by running your test suite and launching the built artifact
  5. Review the code with expert agents who provide detailed feedback
  6. Iterate — refine your spec based on feedback and commit again

Each commit produces a standalone artifact. The spec is the source of truth.

Prerequisites

  • Node.js >= 18
  • Bun >= 1.0 — Install Bun
  • Git — for version control of spec and implementation repos
  • At least one AI coding agent installed and authenticated:
    • Claude Codenpm install -g @anthropic-ai/claude-code
    • Codex — follow OpenAI's install instructions

Getting Started

# Clone the repository
git clone https://github.com/user/foundry.git
cd foundry
# Install dependencies
bun install
# Start in development mode
bun run dev

This builds all packages, starts the Vite dev server, and launches the Electron app.

Development

Project Structure

foundry/
apps/
desktop/ # Electron shell (main process, preload)
server/ # Node.js backend (event sourcing, git, providers, WS)
web/ # React frontend (Vite, shadcn/ui, Tailwind, Monaco, BlockNote)
packages/
contracts/ # Shared TypeScript types (WS protocol, IDs)
shared/ # Shared utilities (logging, port finder)

Tech Stack

LayerTechnology
DesktopElectron
FrontendReact 19, TypeScript, Vite, Tailwind CSS, shadcn/ui
Spec EditorBlockNote (Notion-like WYSIWYG)
Code EditorMonaco Editor
StateJotai (frontend), Event Sourcing + CQRS (server)
BackendNode.js, WebSocket (JSON-RPC), SQLite
Agent HarnessClaude Code CLI, Codex CLI (spawned as subprocesses)
BuildTurborepo, Bun

Scripts

CommandDescription
bun run devStart dev mode (Vite + Electron)
bun run buildBuild all packages
bun run typecheckType-check all packages
bun run packageBuild and package as standalone macOS app
bun run cleanClean all build artifacts

Key Design Decisions

  • No API keys required — All LLM interaction goes through locally installed CLI tools (Claude Code, Codex). The user authenticates once with the CLI, and Foundry uses it.
  • Event sourcing — All state changes (project creation, spec edits, artifact builds, reviews) are stored as immutable events in SQLite. The read model is rebuilt from events on startup.
  • Separate repos — The spec (markdown files) and implementation (generated code) live in separate git repos. Each artifact gets its own git worktree.
  • Single-shot artifacts — Each spec commit produces a fresh, complete implementation. Simpler than incremental diffing; the spec is always the source of truth.
  • Provider adapters — Claude Code and Codex are abstracted behind a common interface. Prompts are piped via stdin to avoid argument length limits.

Building

Development Build

bun run dev

Package for macOS

bun run package

This produces signed .dmg files for both ARM64 (Apple Silicon) and x64 (Intel) in the release/ directory.

Code Signing & Notarization

To distribute the app, create a .env.local file with your Apple credentials:

CSC_NAME="Developer ID Application: Your Name (TEAMID)"
APPLE_ID="your@email.com"
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
APPLE_TEAM_ID="XXXXXXXXXX"

Without these, the app is built unsigned (users right-click > Open to bypass Gatekeeper).

See Apple's developer documentation for details on obtaining certificates.

Architecture

┌─────────────────────────────────────────────────────┐
│ ELECTRON MAIN PROCESS │
│ BrowserWindow, server spawn, shell PATH resolution │
└──────────┬──────────────────────┬────────────────────┘
│ fork() │ preload bridge
v v
┌──────────────────┐ JSON-RPC ┌─────────────────────┐
│ SERVER (Node.js) │◄──── WS ──►│ REACT FRONTEND │
│ │ │ │
│ Event Store │ │ Design │ Inspect │
│ (SQLite) │ │ Test │ Review │
│ │ │ Settings │
│ Provider Service │ └─────────────────────┘
│ (Claude / Codex) │
│ │──► SPEC REPO (user's .md files)
│ Git Layer │──► IMPL REPO (agent-generated code)
│ Screenshot Svc │──► Puppeteer (configurable)
└──────────────────┘

Data Flow

  1. Frontend sends commands via WebSocket JSON-RPC
  2. Server validates commands through the Decider (CQRS pattern)
  3. Events are appended to the SQLite Event Store
  4. The Projector folds events into the in-memory read model
  5. Changes are broadcast to all connected clients via WebSocket push
  6. Side effects (agent runs, screenshots, tests) are triggered by event listeners

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Tips

  • The frontend hot-reloads via Vite HMR
  • After running bun run package, run bun install to restore native modules for dev
  • SQLite database is stored at ~/.foundry/foundry.db
  • Project data (spec repos, impl worktrees) lives at ~/.foundry/projects/

License

MIT


Built with Claude & Electron

About

Spec-driven development with AI. Write the spec, let AI build it.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Foundry

Foundry

Spec-driven development with AI. Write the spec, let AI build it.

FeaturesHow It WorksGetting StartedDevelopmentBuildingArchitectureContributingLicense


Warning

This project is a playground for the author to test out building ideas for open-source project using agentic development. It is not intended to be fully secure and operational. Feel free to fork if you want to make the idea viable.


Foundry is an Electron-based IDE where you collaborate with an LLM to write markdown specification files that define a software project. Each commit of your spec triggers an AI coding agent to produce a complete, working implementation as a standalone artifact.

You iterate on the spec, inspect the generated code, run tests, and get feedback from expert review agents — all within the same app. No API keys required — Foundry uses locally installed Claude Code or Codex CLI tools.

Foundry Welcome Screen

Features

Design Tab

Write and refine your project spec using a Notion-like WYSIWYG editor (BlockNote). A chat panel lets you discuss changes with an AI assistant that can directly edit your spec files. Highlight text to add inline comments that get batched and sent to the assistant.

Design Tab

Inspect Tab

Browse the generated implementation code with a full Monaco editor — file tree, tabs, minimap, and syntax highlighting for every language. Watch builds in real-time with streaming agent output.

Inspect Tab

Test Tab

Run tests against the implementation, view results with a visual pass/fail summary, and launch the built artifact to preview it. Test output renders with ANSI color codes.

Test Tab

Review Tab

Get feedback from configurable expert agents — QA Analyst, Security Analyst, UX/UI Designer, Performance Engineer, or your own custom roles. Each expert reviews the full spec + implementation and provides actionable feedback with streaming responses.

Review Tab

Settings

Configure providers (Claude Code / Codex), models, build commands, test commands, and screenshot capture. Per-expert provider/model overrides supported. Settings work as global defaults and per-project overrides.

Settings

How It Works

Write Spec (.md files) → Commit → AI Agent Implements → Inspect / Test / Review
↑ ↓
└──────────── Iterate based on feedback ───────────────────────┘
  1. Design your project spec as a collection of markdown files (overview, architecture, features, tests)
  2. Commit your spec — this triggers the AI agent (Claude Code or Codex) to implement the entire project from scratch in a git worktree
  3. Inspect the generated code in a full-featured code editor
  4. Test the implementation by running your test suite and launching the built artifact
  5. Review the code with expert agents who provide detailed feedback
  6. Iterate — refine your spec based on feedback and commit again

Each commit produces a standalone artifact. The spec is the source of truth.

Prerequisites

  • Node.js >= 18
  • Bun >= 1.0 — Install Bun
  • Git — for version control of spec and implementation repos
  • At least one AI coding agent installed and authenticated:
    • Claude Codenpm install -g @anthropic-ai/claude-code
    • Codex — follow OpenAI's install instructions

Getting Started

# Clone the repository
git clone https://github.com/user/foundry.git
cd foundry
# Install dependencies
bun install
# Start in development mode
bun run dev

This builds all packages, starts the Vite dev server, and launches the Electron app.

Development

Project Structure

foundry/
apps/
desktop/ # Electron shell (main process, preload)
server/ # Node.js backend (event sourcing, git, providers, WS)
web/ # React frontend (Vite, shadcn/ui, Tailwind, Monaco, BlockNote)
packages/
contracts/ # Shared TypeScript types (WS protocol, IDs)
shared/ # Shared utilities (logging, port finder)

Tech Stack

LayerTechnology
DesktopElectron
FrontendReact 19, TypeScript, Vite, Tailwind CSS, shadcn/ui
Spec EditorBlockNote (Notion-like WYSIWYG)
Code EditorMonaco Editor
StateJotai (frontend), Event Sourcing + CQRS (server)
BackendNode.js, WebSocket (JSON-RPC), SQLite
Agent HarnessClaude Code CLI, Codex CLI (spawned as subprocesses)
BuildTurborepo, Bun

Scripts

CommandDescription
bun run devStart dev mode (Vite + Electron)
bun run buildBuild all packages
bun run typecheckType-check all packages
bun run packageBuild and package as standalone macOS app
bun run cleanClean all build artifacts

Key Design Decisions

  • No API keys required — All LLM interaction goes through locally installed CLI tools (Claude Code, Codex). The user authenticates once with the CLI, and Foundry uses it.
  • Event sourcing — All state changes (project creation, spec edits, artifact builds, reviews) are stored as immutable events in SQLite. The read model is rebuilt from events on startup.
  • Separate repos — The spec (markdown files) and implementation (generated code) live in separate git repos. Each artifact gets its own git worktree.
  • Single-shot artifacts — Each spec commit produces a fresh, complete implementation. Simpler than incremental diffing; the spec is always the source of truth.
  • Provider adapters — Claude Code and Codex are abstracted behind a common interface. Prompts are piped via stdin to avoid argument length limits.

Building

Development Build

bun run dev

Package for macOS

bun run package

This produces signed .dmg files for both ARM64 (Apple Silicon) and x64 (Intel) in the release/ directory.

Code Signing & Notarization

To distribute the app, create a .env.local file with your Apple credentials:

CSC_NAME="Developer ID Application: Your Name (TEAMID)"
APPLE_ID="your@email.com"
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
APPLE_TEAM_ID="XXXXXXXXXX"

Without these, the app is built unsigned (users right-click > Open to bypass Gatekeeper).

See Apple's developer documentation for details on obtaining certificates.

Architecture

┌─────────────────────────────────────────────────────┐
│ ELECTRON MAIN PROCESS │
│ BrowserWindow, server spawn, shell PATH resolution │
└──────────┬──────────────────────┬────────────────────┘
│ fork() │ preload bridge
v v
┌──────────────────┐ JSON-RPC ┌─────────────────────┐
│ SERVER (Node.js) │◄──── WS ──►│ REACT FRONTEND │
│ │ │ │
│ Event Store │ │ Design │ Inspect │
│ (SQLite) │ │ Test │ Review │
│ │ │ Settings │
│ Provider Service │ └─────────────────────┘
│ (Claude / Codex) │
│ │──► SPEC REPO (user's .md files)
│ Git Layer │──► IMPL REPO (agent-generated code)
│ Screenshot Svc │──► Puppeteer (configurable)
└──────────────────┘

Data Flow

  1. Frontend sends commands via WebSocket JSON-RPC
  2. Server validates commands through the Decider (CQRS pattern)
  3. Events are appended to the SQLite Event Store
  4. The Projector folds events into the in-memory read model
  5. Changes are broadcast to all connected clients via WebSocket push
  6. Side effects (agent runs, screenshots, tests) are triggered by event listeners

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Tips

  • The frontend hot-reloads via Vite HMR
  • After running bun run package, run bun install to restore native modules for dev
  • SQLite database is stored at ~/.foundry/foundry.db
  • Project data (spec repos, impl worktrees) lives at ~/.foundry/projects/

License

MIT


Built with Claude & Electron

About

Spec-driven development with AI. Write the spec, let AI build it.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Foundry

Foundry

Spec-driven development with AI. Write the spec, let AI build it.

FeaturesHow It WorksGetting StartedDevelopmentBuildingArchitectureContributingLicense


Warning

This project is a playground for the author to test out building ideas for open-source project using agentic development. It is not intended to be fully secure and operational. Feel free to fork if you want to make the idea viable.


Foundry is an Electron-based IDE where you collaborate with an LLM to write markdown specification files that define a software project. Each commit of your spec triggers an AI coding agent to produce a complete, working implementation as a standalone artifact.

You iterate on the spec, inspect the generated code, run tests, and get feedback from expert review agents — all within the same app. No API keys required — Foundry uses locally installed Claude Code or Codex CLI tools.

Foundry Welcome Screen

Features

Design Tab

Write and refine your project spec using a Notion-like WYSIWYG editor (BlockNote). A chat panel lets you discuss changes with an AI assistant that can directly edit your spec files. Highlight text to add inline comments that get batched and sent to the assistant.

Design Tab

Inspect Tab

Browse the generated implementation code with a full Monaco editor — file tree, tabs, minimap, and syntax highlighting for every language. Watch builds in real-time with streaming agent output.

Inspect Tab

Test Tab

Run tests against the implementation, view results with a visual pass/fail summary, and launch the built artifact to preview it. Test output renders with ANSI color codes.

Test Tab

Review Tab

Get feedback from configurable expert agents — QA Analyst, Security Analyst, UX/UI Designer, Performance Engineer, or your own custom roles. Each expert reviews the full spec + implementation and provides actionable feedback with streaming responses.

Review Tab

Settings

Configure providers (Claude Code / Codex), models, build commands, test commands, and screenshot capture. Per-expert provider/model overrides supported. Settings work as global defaults and per-project overrides.

Settings

How It Works

Write Spec (.md files) → Commit → AI Agent Implements → Inspect / Test / Review
↑ ↓
└──────────── Iterate based on feedback ───────────────────────┘
  1. Design your project spec as a collection of markdown files (overview, architecture, features, tests)
  2. Commit your spec — this triggers the AI agent (Claude Code or Codex) to implement the entire project from scratch in a git worktree
  3. Inspect the generated code in a full-featured code editor
  4. Test the implementation by running your test suite and launching the built artifact
  5. Review the code with expert agents who provide detailed feedback
  6. Iterate — refine your spec based on feedback and commit again

Each commit produces a standalone artifact. The spec is the source of truth.

Prerequisites

  • Node.js >= 18
  • Bun >= 1.0 — Install Bun
  • Git — for version control of spec and implementation repos
  • At least one AI coding agent installed and authenticated:
    • Claude Codenpm install -g @anthropic-ai/claude-code
    • Codex — follow OpenAI's install instructions

Getting Started

# Clone the repository
git clone https://github.com/user/foundry.git
cd foundry
# Install dependencies
bun install
# Start in development mode
bun run dev

This builds all packages, starts the Vite dev server, and launches the Electron app.

Development

Project Structure

foundry/
apps/
desktop/ # Electron shell (main process, preload)
server/ # Node.js backend (event sourcing, git, providers, WS)
web/ # React frontend (Vite, shadcn/ui, Tailwind, Monaco, BlockNote)
packages/
contracts/ # Shared TypeScript types (WS protocol, IDs)
shared/ # Shared utilities (logging, port finder)

Tech Stack

LayerTechnology
DesktopElectron
FrontendReact 19, TypeScript, Vite, Tailwind CSS, shadcn/ui
Spec EditorBlockNote (Notion-like WYSIWYG)
Code EditorMonaco Editor
StateJotai (frontend), Event Sourcing + CQRS (server)
BackendNode.js, WebSocket (JSON-RPC), SQLite
Agent HarnessClaude Code CLI, Codex CLI (spawned as subprocesses)
BuildTurborepo, Bun

Scripts

CommandDescription
bun run devStart dev mode (Vite + Electron)
bun run buildBuild all packages
bun run typecheckType-check all packages
bun run packageBuild and package as standalone macOS app
bun run cleanClean all build artifacts

Key Design Decisions

  • No API keys required — All LLM interaction goes through locally installed CLI tools (Claude Code, Codex). The user authenticates once with the CLI, and Foundry uses it.
  • Event sourcing — All state changes (project creation, spec edits, artifact builds, reviews) are stored as immutable events in SQLite. The read model is rebuilt from events on startup.
  • Separate repos — The spec (markdown files) and implementation (generated code) live in separate git repos. Each artifact gets its own git worktree.
  • Single-shot artifacts — Each spec commit produces a fresh, complete implementation. Simpler than incremental diffing; the spec is always the source of truth.
  • Provider adapters — Claude Code and Codex are abstracted behind a common interface. Prompts are piped via stdin to avoid argument length limits.

Building

Development Build

bun run dev

Package for macOS

bun run package

This produces signed .dmg files for both ARM64 (Apple Silicon) and x64 (Intel) in the release/ directory.

Code Signing & Notarization

To distribute the app, create a .env.local file with your Apple credentials:

CSC_NAME="Developer ID Application: Your Name (TEAMID)"
APPLE_ID="your@email.com"
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
APPLE_TEAM_ID="XXXXXXXXXX"

Without these, the app is built unsigned (users right-click > Open to bypass Gatekeeper).

See Apple's developer documentation for details on obtaining certificates.

Architecture

┌─────────────────────────────────────────────────────┐
│ ELECTRON MAIN PROCESS │
│ BrowserWindow, server spawn, shell PATH resolution │
└──────────┬──────────────────────┬────────────────────┘
│ fork() │ preload bridge
v v
┌──────────────────┐ JSON-RPC ┌─────────────────────┐
│ SERVER (Node.js) │◄──── WS ──►│ REACT FRONTEND │
│ │ │ │
│ Event Store │ │ Design │ Inspect │
│ (SQLite) │ │ Test │ Review │
│ │ │ Settings │
│ Provider Service │ └─────────────────────┘
│ (Claude / Codex) │
│ │──► SPEC REPO (user's .md files)
│ Git Layer │──► IMPL REPO (agent-generated code)
│ Screenshot Svc │──► Puppeteer (configurable)
└──────────────────┘

Data Flow

  1. Frontend sends commands via WebSocket JSON-RPC
  2. Server validates commands through the Decider (CQRS pattern)
  3. Events are appended to the SQLite Event Store
  4. The Projector folds events into the in-memory read model
  5. Changes are broadcast to all connected clients via WebSocket push
  6. Side effects (agent runs, screenshots, tests) are triggered by event listeners

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Tips

  • The frontend hot-reloads via Vite HMR
  • After running bun run package, run bun install to restore native modules for dev
  • SQLite database is stored at ~/.foundry/foundry.db
  • Project data (spec repos, impl worktrees) lives at ~/.foundry/projects/

License

MIT


Built with Claude & Electron

About

Spec-driven development with AI. Write the spec, let AI build it.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Foundry

Foundry

Spec-driven development with AI. Write the spec, let AI build it.

FeaturesHow It WorksGetting StartedDevelopmentBuildingArchitectureContributingLicense


Warning

This project is a playground for the author to test out building ideas for open-source project using agentic development. It is not intended to be fully secure and operational. Feel free to fork if you want to make the idea viable.


Foundry is an Electron-based IDE where you collaborate with an LLM to write markdown specification files that define a software project. Each commit of your spec triggers an AI coding agent to produce a complete, working implementation as a standalone artifact.

You iterate on the spec, inspect the generated code, run tests, and get feedback from expert review agents — all within the same app. No API keys required — Foundry uses locally installed Claude Code or Codex CLI tools.

Foundry Welcome Screen

Features

Design Tab

Write and refine your project spec using a Notion-like WYSIWYG editor (BlockNote). A chat panel lets you discuss changes with an AI assistant that can directly edit your spec files. Highlight text to add inline comments that get batched and sent to the assistant.

Design Tab

Inspect Tab

Browse the generated implementation code with a full Monaco editor — file tree, tabs, minimap, and syntax highlighting for every language. Watch builds in real-time with streaming agent output.

Inspect Tab

Test Tab

Run tests against the implementation, view results with a visual pass/fail summary, and launch the built artifact to preview it. Test output renders with ANSI color codes.

Test Tab

Review Tab

Get feedback from configurable expert agents — QA Analyst, Security Analyst, UX/UI Designer, Performance Engineer, or your own custom roles. Each expert reviews the full spec + implementation and provides actionable feedback with streaming responses.

Review Tab

Settings

Configure providers (Claude Code / Codex), models, build commands, test commands, and screenshot capture. Per-expert provider/model overrides supported. Settings work as global defaults and per-project overrides.

Settings

How It Works

Write Spec (.md files) → Commit → AI Agent Implements → Inspect / Test / Review
↑ ↓
└──────────── Iterate based on feedback ───────────────────────┘
  1. Design your project spec as a collection of markdown files (overview, architecture, features, tests)
  2. Commit your spec — this triggers the AI agent (Claude Code or Codex) to implement the entire project from scratch in a git worktree
  3. Inspect the generated code in a full-featured code editor
  4. Test the implementation by running your test suite and launching the built artifact
  5. Review the code with expert agents who provide detailed feedback
  6. Iterate — refine your spec based on feedback and commit again

Each commit produces a standalone artifact. The spec is the source of truth.

Prerequisites

  • Node.js >= 18
  • Bun >= 1.0 — Install Bun
  • Git — for version control of spec and implementation repos
  • At least one AI coding agent installed and authenticated:
    • Claude Codenpm install -g @anthropic-ai/claude-code
    • Codex — follow OpenAI's install instructions

Getting Started

# Clone the repository
git clone https://github.com/user/foundry.git
cd foundry
# Install dependencies
bun install
# Start in development mode
bun run dev

This builds all packages, starts the Vite dev server, and launches the Electron app.

Development

Project Structure

foundry/
apps/
desktop/ # Electron shell (main process, preload)
server/ # Node.js backend (event sourcing, git, providers, WS)
web/ # React frontend (Vite, shadcn/ui, Tailwind, Monaco, BlockNote)
packages/
contracts/ # Shared TypeScript types (WS protocol, IDs)
shared/ # Shared utilities (logging, port finder)

Tech Stack

LayerTechnology
DesktopElectron
FrontendReact 19, TypeScript, Vite, Tailwind CSS, shadcn/ui
Spec EditorBlockNote (Notion-like WYSIWYG)
Code EditorMonaco Editor
StateJotai (frontend), Event Sourcing + CQRS (server)
BackendNode.js, WebSocket (JSON-RPC), SQLite
Agent HarnessClaude Code CLI, Codex CLI (spawned as subprocesses)
BuildTurborepo, Bun

Scripts

CommandDescription
bun run devStart dev mode (Vite + Electron)
bun run buildBuild all packages
bun run typecheckType-check all packages
bun run packageBuild and package as standalone macOS app
bun run cleanClean all build artifacts

Key Design Decisions

  • No API keys required — All LLM interaction goes through locally installed CLI tools (Claude Code, Codex). The user authenticates once with the CLI, and Foundry uses it.
  • Event sourcing — All state changes (project creation, spec edits, artifact builds, reviews) are stored as immutable events in SQLite. The read model is rebuilt from events on startup.
  • Separate repos — The spec (markdown files) and implementation (generated code) live in separate git repos. Each artifact gets its own git worktree.
  • Single-shot artifacts — Each spec commit produces a fresh, complete implementation. Simpler than incremental diffing; the spec is always the source of truth.
  • Provider adapters — Claude Code and Codex are abstracted behind a common interface. Prompts are piped via stdin to avoid argument length limits.

Building

Development Build

bun run dev

Package for macOS

bun run package

This produces signed .dmg files for both ARM64 (Apple Silicon) and x64 (Intel) in the release/ directory.

Code Signing & Notarization

To distribute the app, create a .env.local file with your Apple credentials:

CSC_NAME="Developer ID Application: Your Name (TEAMID)"
APPLE_ID="your@email.com"
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
APPLE_TEAM_ID="XXXXXXXXXX"

Without these, the app is built unsigned (users right-click > Open to bypass Gatekeeper).

See Apple's developer documentation for details on obtaining certificates.

Architecture

┌─────────────────────────────────────────────────────┐
│ ELECTRON MAIN PROCESS │
│ BrowserWindow, server spawn, shell PATH resolution │
└──────────┬──────────────────────┬────────────────────┘
│ fork() │ preload bridge
v v
┌──────────────────┐ JSON-RPC ┌─────────────────────┐
│ SERVER (Node.js) │◄──── WS ──►│ REACT FRONTEND │
│ │ │ │
│ Event Store │ │ Design │ Inspect │
│ (SQLite) │ │ Test │ Review │
│ │ │ Settings │
│ Provider Service │ └─────────────────────┘
│ (Claude / Codex) │
│ │──► SPEC REPO (user's .md files)
│ Git Layer │──► IMPL REPO (agent-generated code)
│ Screenshot Svc │──► Puppeteer (configurable)
└──────────────────┘

Data Flow

  1. Frontend sends commands via WebSocket JSON-RPC
  2. Server validates commands through the Decider (CQRS pattern)
  3. Events are appended to the SQLite Event Store
  4. The Projector folds events into the in-memory read model
  5. Changes are broadcast to all connected clients via WebSocket push
  6. Side effects (agent runs, screenshots, tests) are triggered by event listeners

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Tips

  • The frontend hot-reloads via Vite HMR
  • After running bun run package, run bun install to restore native modules for dev
  • SQLite database is stored at ~/.foundry/foundry.db
  • Project data (spec repos, impl worktrees) lives at ~/.foundry/projects/

License

MIT


Built with Claude & Electron

About

Spec-driven development with AI. Write the spec, let AI build it.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Foundry

Foundry

Spec-driven development with AI. Write the spec, let AI build it.

FeaturesHow It WorksGetting StartedDevelopmentBuildingArchitectureContributingLicense


Warning

This project is a playground for the author to test out building ideas for open-source project using agentic development. It is not intended to be fully secure and operational. Feel free to fork if you want to make the idea viable.


Foundry is an Electron-based IDE where you collaborate with an LLM to write markdown specification files that define a software project. Each commit of your spec triggers an AI coding agent to produce a complete, working implementation as a standalone artifact.

You iterate on the spec, inspect the generated code, run tests, and get feedback from expert review agents — all within the same app. No API keys required — Foundry uses locally installed Claude Code or Codex CLI tools.

Foundry Welcome Screen

Features

Design Tab

Write and refine your project spec using a Notion-like WYSIWYG editor (BlockNote). A chat panel lets you discuss changes with an AI assistant that can directly edit your spec files. Highlight text to add inline comments that get batched and sent to the assistant.

Design Tab

Inspect Tab

Browse the generated implementation code with a full Monaco editor — file tree, tabs, minimap, and syntax highlighting for every language. Watch builds in real-time with streaming agent output.

Inspect Tab

Test Tab

Run tests against the implementation, view results with a visual pass/fail summary, and launch the built artifact to preview it. Test output renders with ANSI color codes.

Test Tab

Review Tab

Get feedback from configurable expert agents — QA Analyst, Security Analyst, UX/UI Designer, Performance Engineer, or your own custom roles. Each expert reviews the full spec + implementation and provides actionable feedback with streaming responses.

Review Tab

Settings

Configure providers (Claude Code / Codex), models, build commands, test commands, and screenshot capture. Per-expert provider/model overrides supported. Settings work as global defaults and per-project overrides.

Settings

How It Works

Write Spec (.md files) → Commit → AI Agent Implements → Inspect / Test / Review
↑ ↓
└──────────── Iterate based on feedback ───────────────────────┘
  1. Design your project spec as a collection of markdown files (overview, architecture, features, tests)
  2. Commit your spec — this triggers the AI agent (Claude Code or Codex) to implement the entire project from scratch in a git worktree
  3. Inspect the generated code in a full-featured code editor
  4. Test the implementation by running your test suite and launching the built artifact
  5. Review the code with expert agents who provide detailed feedback
  6. Iterate — refine your spec based on feedback and commit again

Each commit produces a standalone artifact. The spec is the source of truth.

Prerequisites

  • Node.js >= 18
  • Bun >= 1.0 — Install Bun
  • Git — for version control of spec and implementation repos
  • At least one AI coding agent installed and authenticated:
    • Claude Codenpm install -g @anthropic-ai/claude-code
    • Codex — follow OpenAI's install instructions

Getting Started

# Clone the repository
git clone https://github.com/user/foundry.git
cd foundry
# Install dependencies
bun install
# Start in development mode
bun run dev

This builds all packages, starts the Vite dev server, and launches the Electron app.

Development

Project Structure

foundry/
apps/
desktop/ # Electron shell (main process, preload)
server/ # Node.js backend (event sourcing, git, providers, WS)
web/ # React frontend (Vite, shadcn/ui, Tailwind, Monaco, BlockNote)
packages/
contracts/ # Shared TypeScript types (WS protocol, IDs)
shared/ # Shared utilities (logging, port finder)

Tech Stack

LayerTechnology
DesktopElectron
FrontendReact 19, TypeScript, Vite, Tailwind CSS, shadcn/ui
Spec EditorBlockNote (Notion-like WYSIWYG)
Code EditorMonaco Editor
StateJotai (frontend), Event Sourcing + CQRS (server)
BackendNode.js, WebSocket (JSON-RPC), SQLite
Agent HarnessClaude Code CLI, Codex CLI (spawned as subprocesses)
BuildTurborepo, Bun

Scripts

CommandDescription
bun run devStart dev mode (Vite + Electron)
bun run buildBuild all packages
bun run typecheckType-check all packages
bun run packageBuild and package as standalone macOS app
bun run cleanClean all build artifacts

Key Design Decisions

  • No API keys required — All LLM interaction goes through locally installed CLI tools (Claude Code, Codex). The user authenticates once with the CLI, and Foundry uses it.
  • Event sourcing — All state changes (project creation, spec edits, artifact builds, reviews) are stored as immutable events in SQLite. The read model is rebuilt from events on startup.
  • Separate repos — The spec (markdown files) and implementation (generated code) live in separate git repos. Each artifact gets its own git worktree.
  • Single-shot artifacts — Each spec commit produces a fresh, complete implementation. Simpler than incremental diffing; the spec is always the source of truth.
  • Provider adapters — Claude Code and Codex are abstracted behind a common interface. Prompts are piped via stdin to avoid argument length limits.

Building

Development Build

bun run dev

Package for macOS

bun run package

This produces signed .dmg files for both ARM64 (Apple Silicon) and x64 (Intel) in the release/ directory.

Code Signing & Notarization

To distribute the app, create a .env.local file with your Apple credentials:

CSC_NAME="Developer ID Application: Your Name (TEAMID)"
APPLE_ID="your@email.com"
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
APPLE_TEAM_ID="XXXXXXXXXX"

Without these, the app is built unsigned (users right-click > Open to bypass Gatekeeper).

See Apple's developer documentation for details on obtaining certificates.

Architecture

┌─────────────────────────────────────────────────────┐
│ ELECTRON MAIN PROCESS │
│ BrowserWindow, server spawn, shell PATH resolution │
└──────────┬──────────────────────┬────────────────────┘
│ fork() │ preload bridge
v v
┌──────────────────┐ JSON-RPC ┌─────────────────────┐
│ SERVER (Node.js) │◄──── WS ──►│ REACT FRONTEND │
│ │ │ │
│ Event Store │ │ Design │ Inspect │
│ (SQLite) │ │ Test │ Review │
│ │ │ Settings │
│ Provider Service │ └─────────────────────┘
│ (Claude / Codex) │
│ │──► SPEC REPO (user's .md files)
│ Git Layer │──► IMPL REPO (agent-generated code)
│ Screenshot Svc │──► Puppeteer (configurable)
└──────────────────┘

Data Flow

  1. Frontend sends commands via WebSocket JSON-RPC
  2. Server validates commands through the Decider (CQRS pattern)
  3. Events are appended to the SQLite Event Store
  4. The Projector folds events into the in-memory read model
  5. Changes are broadcast to all connected clients via WebSocket push
  6. Side effects (agent runs, screenshots, tests) are triggered by event listeners

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Tips

  • The frontend hot-reloads via Vite HMR
  • After running bun run package, run bun install to restore native modules for dev
  • SQLite database is stored at ~/.foundry/foundry.db
  • Project data (spec repos, impl worktrees) lives at ~/.foundry/projects/

License

MIT


Built with Claude & Electron

About

Spec-driven development with AI. Write the spec, let AI build it.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Foundry

Foundry

Spec-driven development with AI. Write the spec, let AI build it.

FeaturesHow It WorksGetting StartedDevelopmentBuildingArchitectureContributingLicense


Warning

This project is a playground for the author to test out building ideas for open-source project using agentic development. It is not intended to be fully secure and operational. Feel free to fork if you want to make the idea viable.


Foundry is an Electron-based IDE where you collaborate with an LLM to write markdown specification files that define a software project. Each commit of your spec triggers an AI coding agent to produce a complete, working implementation as a standalone artifact.

You iterate on the spec, inspect the generated code, run tests, and get feedback from expert review agents — all within the same app. No API keys required — Foundry uses locally installed Claude Code or Codex CLI tools.

Foundry Welcome Screen

Features

Design Tab

Write and refine your project spec using a Notion-like WYSIWYG editor (BlockNote). A chat panel lets you discuss changes with an AI assistant that can directly edit your spec files. Highlight text to add inline comments that get batched and sent to the assistant.

Design Tab

Inspect Tab

Browse the generated implementation code with a full Monaco editor — file tree, tabs, minimap, and syntax highlighting for every language. Watch builds in real-time with streaming agent output.

Inspect Tab

Test Tab

Run tests against the implementation, view results with a visual pass/fail summary, and launch the built artifact to preview it. Test output renders with ANSI color codes.

Test Tab

Review Tab

Get feedback from configurable expert agents — QA Analyst, Security Analyst, UX/UI Designer, Performance Engineer, or your own custom roles. Each expert reviews the full spec + implementation and provides actionable feedback with streaming responses.

Review Tab

Settings

Configure providers (Claude Code / Codex), models, build commands, test commands, and screenshot capture. Per-expert provider/model overrides supported. Settings work as global defaults and per-project overrides.

Settings

How It Works

Write Spec (.md files) → Commit → AI Agent Implements → Inspect / Test / Review
↑ ↓
└──────────── Iterate based on feedback ───────────────────────┘
  1. Design your project spec as a collection of markdown files (overview, architecture, features, tests)
  2. Commit your spec — this triggers the AI agent (Claude Code or Codex) to implement the entire project from scratch in a git worktree
  3. Inspect the generated code in a full-featured code editor
  4. Test the implementation by running your test suite and launching the built artifact
  5. Review the code with expert agents who provide detailed feedback
  6. Iterate — refine your spec based on feedback and commit again

Each commit produces a standalone artifact. The spec is the source of truth.

Prerequisites

  • Node.js >= 18
  • Bun >= 1.0 — Install Bun
  • Git — for version control of spec and implementation repos
  • At least one AI coding agent installed and authenticated:
    • Claude Codenpm install -g @anthropic-ai/claude-code
    • Codex — follow OpenAI's install instructions

Getting Started

# Clone the repository
git clone https://github.com/user/foundry.git
cd foundry
# Install dependencies
bun install
# Start in development mode
bun run dev

This builds all packages, starts the Vite dev server, and launches the Electron app.

Development

Project Structure

foundry/
apps/
desktop/ # Electron shell (main process, preload)
server/ # Node.js backend (event sourcing, git, providers, WS)
web/ # React frontend (Vite, shadcn/ui, Tailwind, Monaco, BlockNote)
packages/
contracts/ # Shared TypeScript types (WS protocol, IDs)
shared/ # Shared utilities (logging, port finder)

Tech Stack

LayerTechnology
DesktopElectron
FrontendReact 19, TypeScript, Vite, Tailwind CSS, shadcn/ui
Spec EditorBlockNote (Notion-like WYSIWYG)
Code EditorMonaco Editor
StateJotai (frontend), Event Sourcing + CQRS (server)
BackendNode.js, WebSocket (JSON-RPC), SQLite
Agent HarnessClaude Code CLI, Codex CLI (spawned as subprocesses)
BuildTurborepo, Bun

Scripts

CommandDescription
bun run devStart dev mode (Vite + Electron)
bun run buildBuild all packages
bun run typecheckType-check all packages
bun run packageBuild and package as standalone macOS app
bun run cleanClean all build artifacts

Key Design Decisions

  • No API keys required — All LLM interaction goes through locally installed CLI tools (Claude Code, Codex). The user authenticates once with the CLI, and Foundry uses it.
  • Event sourcing — All state changes (project creation, spec edits, artifact builds, reviews) are stored as immutable events in SQLite. The read model is rebuilt from events on startup.
  • Separate repos — The spec (markdown files) and implementation (generated code) live in separate git repos. Each artifact gets its own git worktree.
  • Single-shot artifacts — Each spec commit produces a fresh, complete implementation. Simpler than incremental diffing; the spec is always the source of truth.
  • Provider adapters — Claude Code and Codex are abstracted behind a common interface. Prompts are piped via stdin to avoid argument length limits.

Building

Development Build

bun run dev

Package for macOS

bun run package

This produces signed .dmg files for both ARM64 (Apple Silicon) and x64 (Intel) in the release/ directory.

Code Signing & Notarization

To distribute the app, create a .env.local file with your Apple credentials:

CSC_NAME="Developer ID Application: Your Name (TEAMID)"
APPLE_ID="your@email.com"
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
APPLE_TEAM_ID="XXXXXXXXXX"

Without these, the app is built unsigned (users right-click > Open to bypass Gatekeeper).

See Apple's developer documentation for details on obtaining certificates.

Architecture

┌─────────────────────────────────────────────────────┐
│ ELECTRON MAIN PROCESS │
│ BrowserWindow, server spawn, shell PATH resolution │
└──────────┬──────────────────────┬────────────────────┘
│ fork() │ preload bridge
v v
┌──────────────────┐ JSON-RPC ┌─────────────────────┐
│ SERVER (Node.js) │◄──── WS ──►│ REACT FRONTEND │
│ │ │ │
│ Event Store │ │ Design │ Inspect │
│ (SQLite) │ │ Test │ Review │
│ │ │ Settings │
│ Provider Service │ └─────────────────────┘
│ (Claude / Codex) │
│ │──► SPEC REPO (user's .md files)
│ Git Layer │──► IMPL REPO (agent-generated code)
│ Screenshot Svc │──► Puppeteer (configurable)
└──────────────────┘

Data Flow

  1. Frontend sends commands via WebSocket JSON-RPC
  2. Server validates commands through the Decider (CQRS pattern)
  3. Events are appended to the SQLite Event Store
  4. The Projector folds events into the in-memory read model
  5. Changes are broadcast to all connected clients via WebSocket push
  6. Side effects (agent runs, screenshots, tests) are triggered by event listeners

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Tips

  • The frontend hot-reloads via Vite HMR
  • After running bun run package, run bun install to restore native modules for dev
  • SQLite database is stored at ~/.foundry/foundry.db
  • Project data (spec repos, impl worktrees) lives at ~/.foundry/projects/

License

MIT


Built with Claude & Electron

About

Spec-driven development with AI. Write the spec, let AI build it.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Foundry

Foundry

Spec-driven development with AI. Write the spec, let AI build it.

FeaturesHow It WorksGetting StartedDevelopmentBuildingArchitectureContributingLicense


Warning

This project is a playground for the author to test out building ideas for open-source project using agentic development. It is not intended to be fully secure and operational. Feel free to fork if you want to make the idea viable.


Foundry is an Electron-based IDE where you collaborate with an LLM to write markdown specification files that define a software project. Each commit of your spec triggers an AI coding agent to produce a complete, working implementation as a standalone artifact.

You iterate on the spec, inspect the generated code, run tests, and get feedback from expert review agents — all within the same app. No API keys required — Foundry uses locally installed Claude Code or Codex CLI tools.

Foundry Welcome Screen

Features

Design Tab

Write and refine your project spec using a Notion-like WYSIWYG editor (BlockNote). A chat panel lets you discuss changes with an AI assistant that can directly edit your spec files. Highlight text to add inline comments that get batched and sent to the assistant.

Design Tab

Inspect Tab

Browse the generated implementation code with a full Monaco editor — file tree, tabs, minimap, and syntax highlighting for every language. Watch builds in real-time with streaming agent output.

Inspect Tab

Test Tab

Run tests against the implementation, view results with a visual pass/fail summary, and launch the built artifact to preview it. Test output renders with ANSI color codes.

Test Tab

Review Tab

Get feedback from configurable expert agents — QA Analyst, Security Analyst, UX/UI Designer, Performance Engineer, or your own custom roles. Each expert reviews the full spec + implementation and provides actionable feedback with streaming responses.

Review Tab

Settings

Configure providers (Claude Code / Codex), models, build commands, test commands, and screenshot capture. Per-expert provider/model overrides supported. Settings work as global defaults and per-project overrides.

Settings

How It Works

Write Spec (.md files) → Commit → AI Agent Implements → Inspect / Test / Review
↑ ↓
└──────────── Iterate based on feedback ───────────────────────┘
  1. Design your project spec as a collection of markdown files (overview, architecture, features, tests)
  2. Commit your spec — this triggers the AI agent (Claude Code or Codex) to implement the entire project from scratch in a git worktree
  3. Inspect the generated code in a full-featured code editor
  4. Test the implementation by running your test suite and launching the built artifact
  5. Review the code with expert agents who provide detailed feedback
  6. Iterate — refine your spec based on feedback and commit again

Each commit produces a standalone artifact. The spec is the source of truth.

Prerequisites

  • Node.js >= 18
  • Bun >= 1.0 — Install Bun
  • Git — for version control of spec and implementation repos
  • At least one AI coding agent installed and authenticated:
    • Claude Codenpm install -g @anthropic-ai/claude-code
    • Codex — follow OpenAI's install instructions

Getting Started

# Clone the repository
git clone https://github.com/user/foundry.git
cd foundry
# Install dependencies
bun install
# Start in development mode
bun run dev

This builds all packages, starts the Vite dev server, and launches the Electron app.

Development

Project Structure

foundry/
apps/
desktop/ # Electron shell (main process, preload)
server/ # Node.js backend (event sourcing, git, providers, WS)
web/ # React frontend (Vite, shadcn/ui, Tailwind, Monaco, BlockNote)
packages/
contracts/ # Shared TypeScript types (WS protocol, IDs)
shared/ # Shared utilities (logging, port finder)

Tech Stack

LayerTechnology
DesktopElectron
FrontendReact 19, TypeScript, Vite, Tailwind CSS, shadcn/ui
Spec EditorBlockNote (Notion-like WYSIWYG)
Code EditorMonaco Editor
StateJotai (frontend), Event Sourcing + CQRS (server)
BackendNode.js, WebSocket (JSON-RPC), SQLite
Agent HarnessClaude Code CLI, Codex CLI (spawned as subprocesses)
BuildTurborepo, Bun

Scripts

CommandDescription
bun run devStart dev mode (Vite + Electron)
bun run buildBuild all packages
bun run typecheckType-check all packages
bun run packageBuild and package as standalone macOS app
bun run cleanClean all build artifacts

Key Design Decisions

  • No API keys required — All LLM interaction goes through locally installed CLI tools (Claude Code, Codex). The user authenticates once with the CLI, and Foundry uses it.
  • Event sourcing — All state changes (project creation, spec edits, artifact builds, reviews) are stored as immutable events in SQLite. The read model is rebuilt from events on startup.
  • Separate repos — The spec (markdown files) and implementation (generated code) live in separate git repos. Each artifact gets its own git worktree.
  • Single-shot artifacts — Each spec commit produces a fresh, complete implementation. Simpler than incremental diffing; the spec is always the source of truth.
  • Provider adapters — Claude Code and Codex are abstracted behind a common interface. Prompts are piped via stdin to avoid argument length limits.

Building

Development Build

bun run dev

Package for macOS

bun run package

This produces signed .dmg files for both ARM64 (Apple Silicon) and x64 (Intel) in the release/ directory.

Code Signing & Notarization

To distribute the app, create a .env.local file with your Apple credentials:

CSC_NAME="Developer ID Application: Your Name (TEAMID)"
APPLE_ID="your@email.com"
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
APPLE_TEAM_ID="XXXXXXXXXX"

Without these, the app is built unsigned (users right-click > Open to bypass Gatekeeper).

See Apple's developer documentation for details on obtaining certificates.

Architecture

┌─────────────────────────────────────────────────────┐
│ ELECTRON MAIN PROCESS │
│ BrowserWindow, server spawn, shell PATH resolution │
└──────────┬──────────────────────┬────────────────────┘
│ fork() │ preload bridge
v v
┌──────────────────┐ JSON-RPC ┌─────────────────────┐
│ SERVER (Node.js) │◄──── WS ──►│ REACT FRONTEND │
│ │ │ │
│ Event Store │ │ Design │ Inspect │
│ (SQLite) │ │ Test │ Review │
│ │ │ Settings │
│ Provider Service │ └─────────────────────┘
│ (Claude / Codex) │
│ │──► SPEC REPO (user's .md files)
│ Git Layer │──► IMPL REPO (agent-generated code)
│ Screenshot Svc │──► Puppeteer (configurable)
└──────────────────┘

Data Flow

  1. Frontend sends commands via WebSocket JSON-RPC
  2. Server validates commands through the Decider (CQRS pattern)
  3. Events are appended to the SQLite Event Store
  4. The Projector folds events into the in-memory read model
  5. Changes are broadcast to all connected clients via WebSocket push
  6. Side effects (agent runs, screenshots, tests) are triggered by event listeners

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Tips

  • The frontend hot-reloads via Vite HMR
  • After running bun run package, run bun install to restore native modules for dev
  • SQLite database is stored at ~/.foundry/foundry.db
  • Project data (spec repos, impl worktrees) lives at ~/.foundry/projects/

License

MIT


Built with Claude & Electron

About

Spec-driven development with AI. Write the spec, let AI build it.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Foundry

Foundry

Spec-driven development with AI. Write the spec, let AI build it.

FeaturesHow It WorksGetting StartedDevelopmentBuildingArchitectureContributingLicense


Warning

This project is a playground for the author to test out building ideas for open-source project using agentic development. It is not intended to be fully secure and operational. Feel free to fork if you want to make the idea viable.


Foundry is an Electron-based IDE where you collaborate with an LLM to write markdown specification files that define a software project. Each commit of your spec triggers an AI coding agent to produce a complete, working implementation as a standalone artifact.

You iterate on the spec, inspect the generated code, run tests, and get feedback from expert review agents — all within the same app. No API keys required — Foundry uses locally installed Claude Code or Codex CLI tools.

Foundry Welcome Screen

Features

Design Tab

Write and refine your project spec using a Notion-like WYSIWYG editor (BlockNote). A chat panel lets you discuss changes with an AI assistant that can directly edit your spec files. Highlight text to add inline comments that get batched and sent to the assistant.

Design Tab

Inspect Tab

Browse the generated implementation code with a full Monaco editor — file tree, tabs, minimap, and syntax highlighting for every language. Watch builds in real-time with streaming agent output.

Inspect Tab

Test Tab

Run tests against the implementation, view results with a visual pass/fail summary, and launch the built artifact to preview it. Test output renders with ANSI color codes.

Test Tab

Review Tab

Get feedback from configurable expert agents — QA Analyst, Security Analyst, UX/UI Designer, Performance Engineer, or your own custom roles. Each expert reviews the full spec + implementation and provides actionable feedback with streaming responses.

Review Tab

Settings

Configure providers (Claude Code / Codex), models, build commands, test commands, and screenshot capture. Per-expert provider/model overrides supported. Settings work as global defaults and per-project overrides.

Settings

How It Works

Write Spec (.md files) → Commit → AI Agent Implements → Inspect / Test / Review
↑ ↓
└──────────── Iterate based on feedback ───────────────────────┘
  1. Design your project spec as a collection of markdown files (overview, architecture, features, tests)
  2. Commit your spec — this triggers the AI agent (Claude Code or Codex) to implement the entire project from scratch in a git worktree
  3. Inspect the generated code in a full-featured code editor
  4. Test the implementation by running your test suite and launching the built artifact
  5. Review the code with expert agents who provide detailed feedback
  6. Iterate — refine your spec based on feedback and commit again

Each commit produces a standalone artifact. The spec is the source of truth.

Prerequisites

  • Node.js >= 18
  • Bun >= 1.0 — Install Bun
  • Git — for version control of spec and implementation repos
  • At least one AI coding agent installed and authenticated:
    • Claude Codenpm install -g @anthropic-ai/claude-code
    • Codex — follow OpenAI's install instructions

Getting Started

# Clone the repository
git clone https://github.com/user/foundry.git
cd foundry
# Install dependencies
bun install
# Start in development mode
bun run dev

This builds all packages, starts the Vite dev server, and launches the Electron app.

Development

Project Structure

foundry/
apps/
desktop/ # Electron shell (main process, preload)
server/ # Node.js backend (event sourcing, git, providers, WS)
web/ # React frontend (Vite, shadcn/ui, Tailwind, Monaco, BlockNote)
packages/
contracts/ # Shared TypeScript types (WS protocol, IDs)
shared/ # Shared utilities (logging, port finder)

Tech Stack

LayerTechnology
DesktopElectron
FrontendReact 19, TypeScript, Vite, Tailwind CSS, shadcn/ui
Spec EditorBlockNote (Notion-like WYSIWYG)
Code EditorMonaco Editor
StateJotai (frontend), Event Sourcing + CQRS (server)
BackendNode.js, WebSocket (JSON-RPC), SQLite
Agent HarnessClaude Code CLI, Codex CLI (spawned as subprocesses)
BuildTurborepo, Bun

Scripts

CommandDescription
bun run devStart dev mode (Vite + Electron)
bun run buildBuild all packages
bun run typecheckType-check all packages
bun run packageBuild and package as standalone macOS app
bun run cleanClean all build artifacts

Key Design Decisions

  • No API keys required — All LLM interaction goes through locally installed CLI tools (Claude Code, Codex). The user authenticates once with the CLI, and Foundry uses it.
  • Event sourcing — All state changes (project creation, spec edits, artifact builds, reviews) are stored as immutable events in SQLite. The read model is rebuilt from events on startup.
  • Separate repos — The spec (markdown files) and implementation (generated code) live in separate git repos. Each artifact gets its own git worktree.
  • Single-shot artifacts — Each spec commit produces a fresh, complete implementation. Simpler than incremental diffing; the spec is always the source of truth.
  • Provider adapters — Claude Code and Codex are abstracted behind a common interface. Prompts are piped via stdin to avoid argument length limits.

Building

Development Build

bun run dev

Package for macOS

bun run package

This produces signed .dmg files for both ARM64 (Apple Silicon) and x64 (Intel) in the release/ directory.

Code Signing & Notarization

To distribute the app, create a .env.local file with your Apple credentials:

CSC_NAME="Developer ID Application: Your Name (TEAMID)"
APPLE_ID="your@email.com"
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
APPLE_TEAM_ID="XXXXXXXXXX"

Without these, the app is built unsigned (users right-click > Open to bypass Gatekeeper).

See Apple's developer documentation for details on obtaining certificates.

Architecture

┌─────────────────────────────────────────────────────┐
│ ELECTRON MAIN PROCESS │
│ BrowserWindow, server spawn, shell PATH resolution │
└──────────┬──────────────────────┬────────────────────┘
│ fork() │ preload bridge
v v
┌──────────────────┐ JSON-RPC ┌─────────────────────┐
│ SERVER (Node.js) │◄──── WS ──►│ REACT FRONTEND │
│ │ │ │
│ Event Store │ │ Design │ Inspect │
│ (SQLite) │ │ Test │ Review │
│ │ │ Settings │
│ Provider Service │ └─────────────────────┘
│ (Claude / Codex) │
│ │──► SPEC REPO (user's .md files)
│ Git Layer │──► IMPL REPO (agent-generated code)
│ Screenshot Svc │──► Puppeteer (configurable)
└──────────────────┘

Data Flow

  1. Frontend sends commands via WebSocket JSON-RPC
  2. Server validates commands through the Decider (CQRS pattern)
  3. Events are appended to the SQLite Event Store
  4. The Projector folds events into the in-memory read model
  5. Changes are broadcast to all connected clients via WebSocket push
  6. Side effects (agent runs, screenshots, tests) are triggered by event listeners

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Tips

  • The frontend hot-reloads via Vite HMR
  • After running bun run package, run bun install to restore native modules for dev
  • SQLite database is stored at ~/.foundry/foundry.db
  • Project data (spec repos, impl worktrees) lives at ~/.foundry/projects/

License

MIT


Built with Claude & Electron

About

Spec-driven development with AI. Write the spec, let AI build it.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages