Nine days ago, we had zero internal web apps. Today we have 53 — live, deployed, backed by a real database, sharing a unified design system. No React. No Next.js. No webpack. No frontend team. Just one engineer, an AI agent called Alpha Agent, and a deliberate bet on radical simplicity.
This is the story of how that happened, what the architecture looks like, and why we think this model is the future of internal tooling.
Every engineering org has the same dirty secret: internal tools are terrible. The meeting notes app is a Google Doc. The client health dashboard is a spreadsheet. Sprint planning lives in someone's head. Sales tracking is vibes.
Nobody builds internal tools because the ROI math never pencils out. A "real" React app with CI/CD, tests, and a design system takes a frontend team weeks to ship — for an audience of maybe 20 people. So teams do without, and institutional knowledge lives in Slack threads and tribal memory.
We decided to solve this differently. What if the cost of building an internal app was effectively zero?
Our thesis was simple: if an AI agent can scaffold, build, and maintain apps using a shared component library, the marginal cost of each new app drops to near-zero. But to make that work, we needed constraints:
theme.css file (imported via relative path) provides dark/light mode, glass morphism, typography, spacing — everything. Change it once, every app updates.<cc-card>, <cc-nav>, <cc-hero>, <cc-stat-card>, <cc-tabs>, and more — that work in any HTML page with a single script include.Every app lives in ~/apps/<app-name>/ and is served at https://<app-name>.adam-harris.alphaclaw.app. The structure is dead simple:
apps/
├── shared/
│ ├── theme.css # Global design tokens
│ ├── components/ # 59 web components
│ │ ├── cc-card.js
│ │ ├── cc-nav.js
│ │ ├── cc-hero.js
│ │ ├── cc-stat-card.js
│ │ ├── cc-tabs.js
│ │ ├── cc-modal.js
│ │ ├── cc-sidebar.js
│ │ └── ... (59 total)
│ ├── supabase-client.js # Shared DB client
│ └── app-tracker.js # Usage analytics
├── daily-updates/
│ └── index.html
├── sprint-planning/
│ └── index.html
├── client-scorecard/
│ └── index.html
└── ... (53 apps total)59 web components cover everything from layout primitives to full interactive patterns:
| Category | Components | Examples |
|---|---|---|
| Layout | 8 | cc-card, cc-sidebar, cc-tabs, cc-modal |
| Data Display | 10 | cc-stat-card, cc-stat-counter, cc-timeline, cc-star-rating |
| Navigation | 6 | cc-nav, cc-topbar, cc-app-nav, cc-pill-filter |
| Content | 12 | cc-hero, cc-intro-text, cc-feature-list, cc-blog |
| Animation | 8 | cc-fade-in, cc-parallax, cc-particles, cc-typewriter |
| Interactive | 9 | cc-search, cc-filter-drawer, cc-edit-mode, cc-lightbox |
| Utility | 6 | cc-toast, cc-confetti, cc-share, cc-prefs |
Every component uses Shadow DOM for style isolation, observes data-theme for automatic dark/light mode switching, and inherits design tokens from theme.css. No configuration required.
One CSS file. 30 design tokens. Dark mode by default, light mode via data-theme="light". Glass morphism aesthetic with amber accents. It covers backgrounds, cards, borders, text colors, accent gradients, shadows, and typography — everything an app needs to look cohesive on day one.
The key insight: by keeping the design system outside the components (as CSS custom properties), we can retheme every app in the fleet by editing a single file. We've done this twice already — adjusting the accent color and glass opacity — and all 53 apps updated instantly.
A shared supabase-client.js provides authenticated access to our Supabase instance. Each app that needs data gets its own table(s) with row-level security. The agent creates migrations, sets up RLS policies, and wires the frontend to the API — all in one pass.
Apps with database backing include: daily standup updates, meeting summaries, sprint planning boards, client scorecards, sales pipeline, lead management, user directories, recipe collections, travel logs, and more.
Here's a sampling of what got built — every one of these is live and in use:
When a new app is requested — whether by a team member in Slack or through a scheduled task — the agent follows a consistent workflow:
index.html with the shared theme and component imports.<cc-*> components.<app-name>.adam-harris.alphaclaw.app — no CI/CD pipeline, no deploy step. Static hosting means the file system is the deployment.Total time from request to live URL: 5–15 minutes for a typical app. Complex apps with database integration and multiple pages take 20–30 minutes.
Every night, Alpha Agent runs an automated review across all 53 apps. It checks for:
Issues get logged, prioritized, and — in many cases — auto-fixed. The agent commits the fixes with detailed messages explaining what changed and why. When a fix requires human judgment, it creates a summary in the daily updates.
We get this question a lot. The answer is pragmatic:
index.html per app is the right level of complexity.This isn't an argument against React for customer-facing products — that's a different conversation. For internal tools, the simplicity advantage of static HTML is massive, especially when an AI agent is doing the writing.
| Metric | Value |
|---|---|
| Total apps deployed | 53 |
| Shared web components | 59 |
| Frontend developers | 0 |
| Days from zero to first 47 apps | 9 |
| Average time to ship a new app | ~10 minutes |
| Lines of shared CSS (theme.css) | ~200 |
| Build tools required | 0 |
| npm install required | No |
The decision to use static HTML and web components felt limiting at first. In practice, it's what made the 53-app velocity possible. Every constraint we added (no build step, shared theme, component library) removed a decision the agent had to make and a failure mode it had to handle.
Without theme.css and the shared component library, we'd have 53 apps that all look different and none of them would look good. The design system turns every app into a first-class citizen from the moment it's created.
An agent with access to React, Vue, Svelte, and vanilla JS will make inconsistent choices. An agent that can only use web components and a shared theme will produce consistent, high-quality output every time. Reduce the solution space and the agent gets dramatically better.
The first 10 apps were interesting. At 30 apps, something shifted — the team started expecting that any workflow could become an app. "Can we get an app for tracking client sentiment?" "Can the meeting notes become a searchable app?" When the answer is always yes and the turnaround is 10 minutes, the entire team's relationship with tooling changes.
The dad joke app and meme generator aren't ROI-positive. But they got people clicking around, discovering the real tools, and internalizing that this app ecosystem exists. Culture apps are adoption engines.
We're continuing to expand the library — both apps and components. The current focus areas:
cc-chart), Kanban boards (cc-kanban), and rich text editingYou don't need a frontend team to have great internal tools. You need:
We went from zero to 53 apps in under two weeks. The apps are in use daily. The team loves them. And we never hired a frontend developer.
The economics of internal tooling just fundamentally changed. The question isn't whether you can build that internal app — it's why you haven't already.
Adam Harris is VP of Engineering at Last Rev, where he leads AI-augmented engineering practices. Alpha Agent is Last Rev's AI agent platform for engineering teams.