Repository files navigation

AppCaddy

Warning

Superseded by Kaddy (locally at ~/kaddy). Kaddy replaces this local-folder architecture with a Cloudflare Worker: apps live in Durable Objects, not folders on disk, and each has its own AI agent. Do not build new features here — this repo is kept for reference.

CILicense

The home for your personal software: a local, open-source desktop platform where the apps you vibe-code actually live — no servers, no ports, no docker, no deploy step. Like the vintage caddy that held your floppy disk collection, AppCaddy is one container for all the little apps that are yours.

AI tools made writing personal apps (recipe collector, personal CRM, finance dashboard) nearly free. Running them is still miserable: stateful apps need a database, a server process, dependency management, and a launch ritual every time. AppCaddy removes all of that — an app is just a folder, and it's always running.

Docs

Repo layout

  • host/ — the Host: the single Node process that mounts every app (backend via export-default Hono routers loaded through Vite SSR, frontend via per-app Vite middleware) and serves the platform UI at /. Control API: /host/api/apps, per-app /logs and /reload.
  • examples/ — bundled demo apps: 🍲 recipes, 👥 contacts. User apps do NOT live here — they live anywhere on disk (default ~/AppCaddy/), tracked in ~/.appcaddy/registry.json.
  • template/ — the starter template appcaddy create scaffolds from: Vite + React + Tailwind + Hono + Drizzle + SQLite, with AGENTS.md and a pre-generated initial migration.
  • cli/ — the appcaddy CLI: create, register, list, conventions, schema, query (read-only), reload, logs, migrate. Agents drive it via the appcaddy skill (.claude/skills/appcaddy/) and each app's generated AGENTS.md. Dependency-free (SQLite via node:sqlite); in a checkout, node cli/src/index.ts <command> runs it directly.
  • shell/ — the Tauri desktop shell: a native window on the Host. On every launch it installs the appcaddy skill into agent skill directories and writes the CLI launcher at ~/.appcaddy/bin/appcaddy. Release builds bundle everything the CLI needs — a private Node runtime, pnpm, the CLI, the template — via shell/scripts/stage-resources.mjs, so installed users need no repo checkout, Node, or pnpm.

Run it

cd host && pnpm install && pnpm dev # Host on http://localhost:4800# examples install their own deps once: (cd examples/recipes && pnpm install; cd examples/contacts && pnpm install)cd shell && pnpm install && pnpm dev # desktop window (Tauri)

Open http://localhost:4800 — left-nav app switcher, active app in the content pane. Apps are equally reachable in any normal browser tab.

Status

M0 (spike) is done: the Host mounts both example apps in one process — each with its own vite.config.ts, per-app node_modules, lazy mounting — and the Tauri shell renders the platform UI.

M1 infrastructure is done: the CLI passes an end-to-end agent loop (create scaffolds + installs + serves; schema edit → migrate → reload applies on next mount; query is read-only-enforced; adoption validates the contract with actionable fixes), and distribution is in place — the Release workflow builds installers for macOS/Windows/Linux, and the shell ships the skill and the appcaddy CLI (with a private Node runtime) to end users on launch. Remaining for M1: dogfood — build a real personal app end-to-end using only a coding agent + AppCaddy. See plan.md.

License

Apache-2.0

About

The home for your personal software — a local, open-source desktop platform where the apps you vibe-code actually live. No servers, no docker, no deploy step.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

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

AppCaddy

Warning

Superseded by Kaddy (locally at ~/kaddy). Kaddy replaces this local-folder architecture with a Cloudflare Worker: apps live in Durable Objects, not folders on disk, and each has its own AI agent. Do not build new features here — this repo is kept for reference.

CILicense

The home for your personal software: a local, open-source desktop platform where the apps you vibe-code actually live — no servers, no ports, no docker, no deploy step. Like the vintage caddy that held your floppy disk collection, AppCaddy is one container for all the little apps that are yours.

AI tools made writing personal apps (recipe collector, personal CRM, finance dashboard) nearly free. Running them is still miserable: stateful apps need a database, a server process, dependency management, and a launch ritual every time. AppCaddy removes all of that — an app is just a folder, and it's always running.

Docs

Repo layout

  • host/ — the Host: the single Node process that mounts every app (backend via export-default Hono routers loaded through Vite SSR, frontend via per-app Vite middleware) and serves the platform UI at /. Control API: /host/api/apps, per-app /logs and /reload.
  • examples/ — bundled demo apps: 🍲 recipes, 👥 contacts. User apps do NOT live here — they live anywhere on disk (default ~/AppCaddy/), tracked in ~/.appcaddy/registry.json.
  • template/ — the starter template appcaddy create scaffolds from: Vite + React + Tailwind + Hono + Drizzle + SQLite, with AGENTS.md and a pre-generated initial migration.
  • cli/ — the appcaddy CLI: create, register, list, conventions, schema, query (read-only), reload, logs, migrate. Agents drive it via the appcaddy skill (.claude/skills/appcaddy/) and each app's generated AGENTS.md. Dependency-free (SQLite via node:sqlite); in a checkout, node cli/src/index.ts <command> runs it directly.
  • shell/ — the Tauri desktop shell: a native window on the Host. On every launch it installs the appcaddy skill into agent skill directories and writes the CLI launcher at ~/.appcaddy/bin/appcaddy. Release builds bundle everything the CLI needs — a private Node runtime, pnpm, the CLI, the template — via shell/scripts/stage-resources.mjs, so installed users need no repo checkout, Node, or pnpm.

Run it

cd host && pnpm install && pnpm dev # Host on http://localhost:4800# examples install their own deps once: (cd examples/recipes && pnpm install; cd examples/contacts && pnpm install)cd shell && pnpm install && pnpm dev # desktop window (Tauri)

Open http://localhost:4800 — left-nav app switcher, active app in the content pane. Apps are equally reachable in any normal browser tab.

Status

M0 (spike) is done: the Host mounts both example apps in one process — each with its own vite.config.ts, per-app node_modules, lazy mounting — and the Tauri shell renders the platform UI.

M1 infrastructure is done: the CLI passes an end-to-end agent loop (create scaffolds + installs + serves; schema edit → migrate → reload applies on next mount; query is read-only-enforced; adoption validates the contract with actionable fixes), and distribution is in place — the Release workflow builds installers for macOS/Windows/Linux, and the shell ships the skill and the appcaddy CLI (with a private Node runtime) to end users on launch. Remaining for M1: dogfood — build a real personal app end-to-end using only a coding agent + AppCaddy. See plan.md.

License

Apache-2.0

About

The home for your personal software — a local, open-source desktop platform where the apps you vibe-code actually live. No servers, no docker, no deploy step.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

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

AppCaddy

Warning

Superseded by Kaddy (locally at ~/kaddy). Kaddy replaces this local-folder architecture with a Cloudflare Worker: apps live in Durable Objects, not folders on disk, and each has its own AI agent. Do not build new features here — this repo is kept for reference.

CILicense

The home for your personal software: a local, open-source desktop platform where the apps you vibe-code actually live — no servers, no ports, no docker, no deploy step. Like the vintage caddy that held your floppy disk collection, AppCaddy is one container for all the little apps that are yours.

AI tools made writing personal apps (recipe collector, personal CRM, finance dashboard) nearly free. Running them is still miserable: stateful apps need a database, a server process, dependency management, and a launch ritual every time. AppCaddy removes all of that — an app is just a folder, and it's always running.

Docs

Repo layout

  • host/ — the Host: the single Node process that mounts every app (backend via export-default Hono routers loaded through Vite SSR, frontend via per-app Vite middleware) and serves the platform UI at /. Control API: /host/api/apps, per-app /logs and /reload.
  • examples/ — bundled demo apps: 🍲 recipes, 👥 contacts. User apps do NOT live here — they live anywhere on disk (default ~/AppCaddy/), tracked in ~/.appcaddy/registry.json.
  • template/ — the starter template appcaddy create scaffolds from: Vite + React + Tailwind + Hono + Drizzle + SQLite, with AGENTS.md and a pre-generated initial migration.
  • cli/ — the appcaddy CLI: create, register, list, conventions, schema, query (read-only), reload, logs, migrate. Agents drive it via the appcaddy skill (.claude/skills/appcaddy/) and each app's generated AGENTS.md. Dependency-free (SQLite via node:sqlite); in a checkout, node cli/src/index.ts <command> runs it directly.
  • shell/ — the Tauri desktop shell: a native window on the Host. On every launch it installs the appcaddy skill into agent skill directories and writes the CLI launcher at ~/.appcaddy/bin/appcaddy. Release builds bundle everything the CLI needs — a private Node runtime, pnpm, the CLI, the template — via shell/scripts/stage-resources.mjs, so installed users need no repo checkout, Node, or pnpm.

Run it

cd host && pnpm install && pnpm dev # Host on http://localhost:4800# examples install their own deps once: (cd examples/recipes && pnpm install; cd examples/contacts && pnpm install)cd shell && pnpm install && pnpm dev # desktop window (Tauri)

Open http://localhost:4800 — left-nav app switcher, active app in the content pane. Apps are equally reachable in any normal browser tab.

Status

M0 (spike) is done: the Host mounts both example apps in one process — each with its own vite.config.ts, per-app node_modules, lazy mounting — and the Tauri shell renders the platform UI.

M1 infrastructure is done: the CLI passes an end-to-end agent loop (create scaffolds + installs + serves; schema edit → migrate → reload applies on next mount; query is read-only-enforced; adoption validates the contract with actionable fixes), and distribution is in place — the Release workflow builds installers for macOS/Windows/Linux, and the shell ships the skill and the appcaddy CLI (with a private Node runtime) to end users on launch. Remaining for M1: dogfood — build a real personal app end-to-end using only a coding agent + AppCaddy. See plan.md.

License

Apache-2.0

About

The home for your personal software — a local, open-source desktop platform where the apps you vibe-code actually live. No servers, no docker, no deploy step.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

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

AppCaddy

Warning

Superseded by Kaddy (locally at ~/kaddy). Kaddy replaces this local-folder architecture with a Cloudflare Worker: apps live in Durable Objects, not folders on disk, and each has its own AI agent. Do not build new features here — this repo is kept for reference.

CILicense

The home for your personal software: a local, open-source desktop platform where the apps you vibe-code actually live — no servers, no ports, no docker, no deploy step. Like the vintage caddy that held your floppy disk collection, AppCaddy is one container for all the little apps that are yours.

AI tools made writing personal apps (recipe collector, personal CRM, finance dashboard) nearly free. Running them is still miserable: stateful apps need a database, a server process, dependency management, and a launch ritual every time. AppCaddy removes all of that — an app is just a folder, and it's always running.

Docs

Repo layout

  • host/ — the Host: the single Node process that mounts every app (backend via export-default Hono routers loaded through Vite SSR, frontend via per-app Vite middleware) and serves the platform UI at /. Control API: /host/api/apps, per-app /logs and /reload.
  • examples/ — bundled demo apps: 🍲 recipes, 👥 contacts. User apps do NOT live here — they live anywhere on disk (default ~/AppCaddy/), tracked in ~/.appcaddy/registry.json.
  • template/ — the starter template appcaddy create scaffolds from: Vite + React + Tailwind + Hono + Drizzle + SQLite, with AGENTS.md and a pre-generated initial migration.
  • cli/ — the appcaddy CLI: create, register, list, conventions, schema, query (read-only), reload, logs, migrate. Agents drive it via the appcaddy skill (.claude/skills/appcaddy/) and each app's generated AGENTS.md. Dependency-free (SQLite via node:sqlite); in a checkout, node cli/src/index.ts <command> runs it directly.
  • shell/ — the Tauri desktop shell: a native window on the Host. On every launch it installs the appcaddy skill into agent skill directories and writes the CLI launcher at ~/.appcaddy/bin/appcaddy. Release builds bundle everything the CLI needs — a private Node runtime, pnpm, the CLI, the template — via shell/scripts/stage-resources.mjs, so installed users need no repo checkout, Node, or pnpm.

Run it

cd host && pnpm install && pnpm dev # Host on http://localhost:4800# examples install their own deps once: (cd examples/recipes && pnpm install; cd examples/contacts && pnpm install)cd shell && pnpm install && pnpm dev # desktop window (Tauri)

Open http://localhost:4800 — left-nav app switcher, active app in the content pane. Apps are equally reachable in any normal browser tab.

Status

M0 (spike) is done: the Host mounts both example apps in one process — each with its own vite.config.ts, per-app node_modules, lazy mounting — and the Tauri shell renders the platform UI.

M1 infrastructure is done: the CLI passes an end-to-end agent loop (create scaffolds + installs + serves; schema edit → migrate → reload applies on next mount; query is read-only-enforced; adoption validates the contract with actionable fixes), and distribution is in place — the Release workflow builds installers for macOS/Windows/Linux, and the shell ships the skill and the appcaddy CLI (with a private Node runtime) to end users on launch. Remaining for M1: dogfood — build a real personal app end-to-end using only a coding agent + AppCaddy. See plan.md.

License

Apache-2.0

About

The home for your personal software — a local, open-source desktop platform where the apps you vibe-code actually live. No servers, no docker, no deploy step.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

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

AppCaddy

Warning

Superseded by Kaddy (locally at ~/kaddy). Kaddy replaces this local-folder architecture with a Cloudflare Worker: apps live in Durable Objects, not folders on disk, and each has its own AI agent. Do not build new features here — this repo is kept for reference.

CILicense

The home for your personal software: a local, open-source desktop platform where the apps you vibe-code actually live — no servers, no ports, no docker, no deploy step. Like the vintage caddy that held your floppy disk collection, AppCaddy is one container for all the little apps that are yours.

AI tools made writing personal apps (recipe collector, personal CRM, finance dashboard) nearly free. Running them is still miserable: stateful apps need a database, a server process, dependency management, and a launch ritual every time. AppCaddy removes all of that — an app is just a folder, and it's always running.

Docs

Repo layout

  • host/ — the Host: the single Node process that mounts every app (backend via export-default Hono routers loaded through Vite SSR, frontend via per-app Vite middleware) and serves the platform UI at /. Control API: /host/api/apps, per-app /logs and /reload.
  • examples/ — bundled demo apps: 🍲 recipes, 👥 contacts. User apps do NOT live here — they live anywhere on disk (default ~/AppCaddy/), tracked in ~/.appcaddy/registry.json.
  • template/ — the starter template appcaddy create scaffolds from: Vite + React + Tailwind + Hono + Drizzle + SQLite, with AGENTS.md and a pre-generated initial migration.
  • cli/ — the appcaddy CLI: create, register, list, conventions, schema, query (read-only), reload, logs, migrate. Agents drive it via the appcaddy skill (.claude/skills/appcaddy/) and each app's generated AGENTS.md. Dependency-free (SQLite via node:sqlite); in a checkout, node cli/src/index.ts <command> runs it directly.
  • shell/ — the Tauri desktop shell: a native window on the Host. On every launch it installs the appcaddy skill into agent skill directories and writes the CLI launcher at ~/.appcaddy/bin/appcaddy. Release builds bundle everything the CLI needs — a private Node runtime, pnpm, the CLI, the template — via shell/scripts/stage-resources.mjs, so installed users need no repo checkout, Node, or pnpm.

Run it

cd host && pnpm install && pnpm dev # Host on http://localhost:4800# examples install their own deps once: (cd examples/recipes && pnpm install; cd examples/contacts && pnpm install)cd shell && pnpm install && pnpm dev # desktop window (Tauri)

Open http://localhost:4800 — left-nav app switcher, active app in the content pane. Apps are equally reachable in any normal browser tab.

Status

M0 (spike) is done: the Host mounts both example apps in one process — each with its own vite.config.ts, per-app node_modules, lazy mounting — and the Tauri shell renders the platform UI.

M1 infrastructure is done: the CLI passes an end-to-end agent loop (create scaffolds + installs + serves; schema edit → migrate → reload applies on next mount; query is read-only-enforced; adoption validates the contract with actionable fixes), and distribution is in place — the Release workflow builds installers for macOS/Windows/Linux, and the shell ships the skill and the appcaddy CLI (with a private Node runtime) to end users on launch. Remaining for M1: dogfood — build a real personal app end-to-end using only a coding agent + AppCaddy. See plan.md.

License

Apache-2.0

About

The home for your personal software — a local, open-source desktop platform where the apps you vibe-code actually live. No servers, no docker, no deploy step.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

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

AppCaddy

Warning

Superseded by Kaddy (locally at ~/kaddy). Kaddy replaces this local-folder architecture with a Cloudflare Worker: apps live in Durable Objects, not folders on disk, and each has its own AI agent. Do not build new features here — this repo is kept for reference.

CILicense

The home for your personal software: a local, open-source desktop platform where the apps you vibe-code actually live — no servers, no ports, no docker, no deploy step. Like the vintage caddy that held your floppy disk collection, AppCaddy is one container for all the little apps that are yours.

AI tools made writing personal apps (recipe collector, personal CRM, finance dashboard) nearly free. Running them is still miserable: stateful apps need a database, a server process, dependency management, and a launch ritual every time. AppCaddy removes all of that — an app is just a folder, and it's always running.

Docs

Repo layout

  • host/ — the Host: the single Node process that mounts every app (backend via export-default Hono routers loaded through Vite SSR, frontend via per-app Vite middleware) and serves the platform UI at /. Control API: /host/api/apps, per-app /logs and /reload.
  • examples/ — bundled demo apps: 🍲 recipes, 👥 contacts. User apps do NOT live here — they live anywhere on disk (default ~/AppCaddy/), tracked in ~/.appcaddy/registry.json.
  • template/ — the starter template appcaddy create scaffolds from: Vite + React + Tailwind + Hono + Drizzle + SQLite, with AGENTS.md and a pre-generated initial migration.
  • cli/ — the appcaddy CLI: create, register, list, conventions, schema, query (read-only), reload, logs, migrate. Agents drive it via the appcaddy skill (.claude/skills/appcaddy/) and each app's generated AGENTS.md. Dependency-free (SQLite via node:sqlite); in a checkout, node cli/src/index.ts <command> runs it directly.
  • shell/ — the Tauri desktop shell: a native window on the Host. On every launch it installs the appcaddy skill into agent skill directories and writes the CLI launcher at ~/.appcaddy/bin/appcaddy. Release builds bundle everything the CLI needs — a private Node runtime, pnpm, the CLI, the template — via shell/scripts/stage-resources.mjs, so installed users need no repo checkout, Node, or pnpm.

Run it

cd host && pnpm install && pnpm dev # Host on http://localhost:4800# examples install their own deps once: (cd examples/recipes && pnpm install; cd examples/contacts && pnpm install)cd shell && pnpm install && pnpm dev # desktop window (Tauri)

Open http://localhost:4800 — left-nav app switcher, active app in the content pane. Apps are equally reachable in any normal browser tab.

Status

M0 (spike) is done: the Host mounts both example apps in one process — each with its own vite.config.ts, per-app node_modules, lazy mounting — and the Tauri shell renders the platform UI.

M1 infrastructure is done: the CLI passes an end-to-end agent loop (create scaffolds + installs + serves; schema edit → migrate → reload applies on next mount; query is read-only-enforced; adoption validates the contract with actionable fixes), and distribution is in place — the Release workflow builds installers for macOS/Windows/Linux, and the shell ships the skill and the appcaddy CLI (with a private Node runtime) to end users on launch. Remaining for M1: dogfood — build a real personal app end-to-end using only a coding agent + AppCaddy. See plan.md.

License

Apache-2.0

About

The home for your personal software — a local, open-source desktop platform where the apps you vibe-code actually live. No servers, no docker, no deploy step.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

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

AppCaddy

Warning

Superseded by Kaddy (locally at ~/kaddy). Kaddy replaces this local-folder architecture with a Cloudflare Worker: apps live in Durable Objects, not folders on disk, and each has its own AI agent. Do not build new features here — this repo is kept for reference.

CILicense

The home for your personal software: a local, open-source desktop platform where the apps you vibe-code actually live — no servers, no ports, no docker, no deploy step. Like the vintage caddy that held your floppy disk collection, AppCaddy is one container for all the little apps that are yours.

AI tools made writing personal apps (recipe collector, personal CRM, finance dashboard) nearly free. Running them is still miserable: stateful apps need a database, a server process, dependency management, and a launch ritual every time. AppCaddy removes all of that — an app is just a folder, and it's always running.

Docs

Repo layout

  • host/ — the Host: the single Node process that mounts every app (backend via export-default Hono routers loaded through Vite SSR, frontend via per-app Vite middleware) and serves the platform UI at /. Control API: /host/api/apps, per-app /logs and /reload.
  • examples/ — bundled demo apps: 🍲 recipes, 👥 contacts. User apps do NOT live here — they live anywhere on disk (default ~/AppCaddy/), tracked in ~/.appcaddy/registry.json.
  • template/ — the starter template appcaddy create scaffolds from: Vite + React + Tailwind + Hono + Drizzle + SQLite, with AGENTS.md and a pre-generated initial migration.
  • cli/ — the appcaddy CLI: create, register, list, conventions, schema, query (read-only), reload, logs, migrate. Agents drive it via the appcaddy skill (.claude/skills/appcaddy/) and each app's generated AGENTS.md. Dependency-free (SQLite via node:sqlite); in a checkout, node cli/src/index.ts <command> runs it directly.
  • shell/ — the Tauri desktop shell: a native window on the Host. On every launch it installs the appcaddy skill into agent skill directories and writes the CLI launcher at ~/.appcaddy/bin/appcaddy. Release builds bundle everything the CLI needs — a private Node runtime, pnpm, the CLI, the template — via shell/scripts/stage-resources.mjs, so installed users need no repo checkout, Node, or pnpm.

Run it

cd host && pnpm install && pnpm dev # Host on http://localhost:4800# examples install their own deps once: (cd examples/recipes && pnpm install; cd examples/contacts && pnpm install)cd shell && pnpm install && pnpm dev # desktop window (Tauri)

Open http://localhost:4800 — left-nav app switcher, active app in the content pane. Apps are equally reachable in any normal browser tab.

Status

M0 (spike) is done: the Host mounts both example apps in one process — each with its own vite.config.ts, per-app node_modules, lazy mounting — and the Tauri shell renders the platform UI.

M1 infrastructure is done: the CLI passes an end-to-end agent loop (create scaffolds + installs + serves; schema edit → migrate → reload applies on next mount; query is read-only-enforced; adoption validates the contract with actionable fixes), and distribution is in place — the Release workflow builds installers for macOS/Windows/Linux, and the shell ships the skill and the appcaddy CLI (with a private Node runtime) to end users on launch. Remaining for M1: dogfood — build a real personal app end-to-end using only a coding agent + AppCaddy. See plan.md.

License

Apache-2.0

About

The home for your personal software — a local, open-source desktop platform where the apps you vibe-code actually live. No servers, no docker, no deploy step.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

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

AppCaddy

Warning

Superseded by Kaddy (locally at ~/kaddy). Kaddy replaces this local-folder architecture with a Cloudflare Worker: apps live in Durable Objects, not folders on disk, and each has its own AI agent. Do not build new features here — this repo is kept for reference.

CILicense

The home for your personal software: a local, open-source desktop platform where the apps you vibe-code actually live — no servers, no ports, no docker, no deploy step. Like the vintage caddy that held your floppy disk collection, AppCaddy is one container for all the little apps that are yours.

AI tools made writing personal apps (recipe collector, personal CRM, finance dashboard) nearly free. Running them is still miserable: stateful apps need a database, a server process, dependency management, and a launch ritual every time. AppCaddy removes all of that — an app is just a folder, and it's always running.

Docs

Repo layout

  • host/ — the Host: the single Node process that mounts every app (backend via export-default Hono routers loaded through Vite SSR, frontend via per-app Vite middleware) and serves the platform UI at /. Control API: /host/api/apps, per-app /logs and /reload.
  • examples/ — bundled demo apps: 🍲 recipes, 👥 contacts. User apps do NOT live here — they live anywhere on disk (default ~/AppCaddy/), tracked in ~/.appcaddy/registry.json.
  • template/ — the starter template appcaddy create scaffolds from: Vite + React + Tailwind + Hono + Drizzle + SQLite, with AGENTS.md and a pre-generated initial migration.
  • cli/ — the appcaddy CLI: create, register, list, conventions, schema, query (read-only), reload, logs, migrate. Agents drive it via the appcaddy skill (.claude/skills/appcaddy/) and each app's generated AGENTS.md. Dependency-free (SQLite via node:sqlite); in a checkout, node cli/src/index.ts <command> runs it directly.
  • shell/ — the Tauri desktop shell: a native window on the Host. On every launch it installs the appcaddy skill into agent skill directories and writes the CLI launcher at ~/.appcaddy/bin/appcaddy. Release builds bundle everything the CLI needs — a private Node runtime, pnpm, the CLI, the template — via shell/scripts/stage-resources.mjs, so installed users need no repo checkout, Node, or pnpm.

Run it

cd host && pnpm install && pnpm dev # Host on http://localhost:4800# examples install their own deps once: (cd examples/recipes && pnpm install; cd examples/contacts && pnpm install)cd shell && pnpm install && pnpm dev # desktop window (Tauri)

Open http://localhost:4800 — left-nav app switcher, active app in the content pane. Apps are equally reachable in any normal browser tab.

Status

M0 (spike) is done: the Host mounts both example apps in one process — each with its own vite.config.ts, per-app node_modules, lazy mounting — and the Tauri shell renders the platform UI.

M1 infrastructure is done: the CLI passes an end-to-end agent loop (create scaffolds + installs + serves; schema edit → migrate → reload applies on next mount; query is read-only-enforced; adoption validates the contract with actionable fixes), and distribution is in place — the Release workflow builds installers for macOS/Windows/Linux, and the shell ships the skill and the appcaddy CLI (with a private Node runtime) to end users on launch. Remaining for M1: dogfood — build a real personal app end-to-end using only a coding agent + AppCaddy. See plan.md.

License

Apache-2.0

About

The home for your personal software — a local, open-source desktop platform where the apps you vibe-code actually live. No servers, no docker, no deploy step.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages