I Built an AI Holding Company That Runs From My Phone
I Built an AI Holding Company That Runs From My Phone
Two days ago I had an idea. What if I could run an entire portfolio of software products from Telegram? Not manage them. Run them. Scout ideas, approve them, build them, deploy them, launch them. All from my phone, all with AI doing the actual work.
48 hours later, it works.
What I built
The system is simple. I send a Telegram message. A bot on a $25/month VM in Mumbai picks it up, spawns Claude Code, and Claude writes real code, pushes to GitHub, deploys to Cloud Run, updates Notion, and reports back.
Here is the actual workflow:
- I type
/approve AI storybook generator for kidsin Telegram - The bot creates a GitHub repo, writes a SKILL.md file that describes the product, creates a Notion entry, and tells me what to build first
- I type
/work storybook-generator - Claude reads the SKILL.md, picks up where it left off, writes code, commits after every milestone, deploys, updates the SKILL.md with what to do next, and updates Notion
- I type
/work storybook-generatoragain. It picks up from where it stopped - When it's ready, I type
/launch storybook-generatorand get a full launch package: Product Hunt copy, Twitter thread, LinkedIn post, cold email template, SEO keywords
Each /work session is stateless. Claude Code starts fresh every time. The trick is SKILL.md. It lives in the repo and acts as the memory between sessions. It tracks what's done, what's next, what decisions were made, and what's broken. Every session reads it at the start and updates it at the end.
The hard problems I solved
Notion MCP doesn't work in headless mode. Claude Code's --print flag runs without a terminal. Notion's MCP server requires OAuth, which requires a browser. I spent hours debugging SSH port forwarding for OAuth callbacks before realizing this was a dead end. The fix was simple: pass the Notion API token as an environment variable and tell Claude to use curl. Works perfectly.
15-minute timeouts killed builds mid-work. Claude Code was building a product, getting 80% through, then the process would get SIGTERM'd. Exit code 143. Nothing was saved because all the git commits happened at the end. I fixed this two ways: bumped the timeout to 30 minutes, and more importantly, told Claude to commit after every checkpoint. Scaffold the project, commit. Build core features, commit. Add styling, commit. Now if it times out, the progress is on GitHub.
No visibility into running jobs. I'd send /work and then stare at silence for 15 minutes wondering if it was working or stuck. I added a progress parser that watches Claude Code's stdout for keywords like "cloning", "npm install", "deploying" and sends real-time status updates back to Telegram. I also added a /jobs command that shows what's currently running, how long it's been going, and the last 5 errors.
Secrets management for a headless bot. The bot needs API keys for Anthropic, GitHub, Notion, Stripe, Cloudflare, and Telegram. All stored in GCP Secret Manager, loaded at startup, and injected as environment variables into every Claude Code process. Adding a new integration means adding one secret and one line of code.
What actually works today
The bot runs as a systemd service on a GCE VM. It survives reboots. It has 14 commands. The full lifecycle works: scout ideas, approve them, build iteratively, deploy to Cloud Run, map custom subdomains on ani.computer, generate launch materials.
Products get their own subdomain automatically. I type /dns storybook-generator and it creates a Cloudflare CNAME record and a Cloud Run domain mapping. SSL provisions automatically. The product is live at storybook-generator.ani.computer within 30 minutes.
Everything syncs to Notion. When I approve an idea, it creates a Notion entry. When I build, it updates the status. I can open Notion on my phone and see the state of every product without asking the bot.
The whole codebase is 6 files. Gateway (command routing), executor (process management), prompts (all the AI instructions), secrets (GCP Secret Manager), DNS (Cloudflare API), and a cron endpoint for future scheduled tasks.
What I learned
SKILL.md is the real invention here. Not the bot. Not the Telegram integration. The persistence layer. Each product has a single markdown file that contains everything Claude needs to pick up where it left off. It's a YAML frontmatter block with status, stack, and metadata, followed by sections for architecture, current state, what's next, decisions made, known issues, and a changelog. It turns stateless AI into an iterative builder.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ SKILL.md โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ --- โ
โ name: storybook-generator (slug) โ
โ status: building (state) โ
โ domain: storybook.ani.computer (URL) โ
โ repo: ani-computer/storybook (code) โ
โ stack: Next.js, Tailwind, TS (tech) โ
โ --- โ
โ โ
โ ## What It Is (pitch) โ
โ AI-powered storybook generator... โ
โ โ
โ ## Current State (progress) โ
โ โ
Project scaffolded โ
โ โ
Core functionality โ
โ โฌ UI/UX complete โ
โ โฌ Stripe integration โ
โ โ
โ ## What's Next (the key) โ
โ Build the story editor UI. โ
โ Add character selection. โ
โ Connect to image generation API. โ
โ โ
โ ## Decisions Made (context) โ
โ - Using GPT-4o for story gen โ
โ - Stable Diffusion for images โ
โ โ
โ ## Known Issues (bugs) โ
โ - Image gen slow on long stories โ
โ โ
โ ## Changelog (history) โ
โ - 2026-02-22: Session 1 - scaffold โ
โ - 2026-02-22: Session 2 - core gen โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Headless AI needs different patterns than interactive AI. MCP, OAuth, browser-based auth flows all assume a human is sitting at a terminal. When you're spawning AI processes from a bot, you need env vars, direct API calls, and explicit instructions. Every tool integration follows the same pattern: get an API token, store it in Secret Manager, inject it as an env var, and tell Claude how to use it via curl in the system prompt.
Timeouts are a feature, not a bug. A 30-minute timeout forces the AI to scope its work. It can't boil the ocean in one session. It has to pick a chunk, do it well, commit, and leave clear instructions for the next session. This is actually better than giving it unlimited time.
The numbers
Total build time: 2 days of focused work across 4 sessions.
Infrastructure cost: $25/month for the VM. Claude API costs are roughly $0.10-0.50 per /work session depending on complexity. Cloud Run and Cloudflare DNS are free tier.
Lines of code: about 1,200 across 6 files.
Time from idea to first working /work session that built and committed real code: about 8 hours.
Monthly Cost Breakdown
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
GCE VM (e2-medium, Mumbai) $25.00 โโโโโโโโโโโโโโโโโโโโ
Claude API (~30 sessions) $9.00 โโโโโโโ
Cloud Run $0.00 (free tier)
Cloudflare DNS $0.00 (free)
GCP Secret Manager $0.06
โโโโโโ
Total ~$34/mo
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
What's next
The system works. Now I need to use it. The goal is simple: ship one product per week, each on its own subdomain, each tracked in Notion, each built entirely through Telegram commands.
The first product is already approved and in progress. The SKILL.md is written. The next /work session will pick it up.
I'm one person running a holding company from my phone. The AI does the building. I do the deciding.
Built in 48 hours. 6 files. $34/month. One founder, zero employees, unlimited products.