Running a Solo AI Studio with Antigravity × Google AI — Automating Every Stage of App Development as One Developer
How to combine Antigravity 2.0 and Antigravity CLI with Stitch and Veo 3 into a pipeline that takes an app from design through implementation, testing, asset generation, and App Store submission, driven by one developer. Covers where to delegate to agents and the operational pitfalls.
Building apps that reach users around the world, continuously, as a solo developer — that used to be virtually impossible without a team. Not anymore.
My perspective shifted during one particular week. Monday: I sketched a concept for a wallpaper app. Tuesday: Antigravity generated the UI. Wednesday: tests passed. Thursday: store materials were ready. Friday: the review notification arrived. Throughout this process, what I actually did was make directional decisions and verify quality. The agents handled the execution.
This guide walks through how to build a "solo AI studio" — using Antigravity as the conductor for Google's AI tools (Stitch, Veo 3, Gemini CLI) — to automate the entire app development lifecycle at an implementation level.
Why Build a Solo AI Studio Now
Time is the defining constraint for indie developers. Programming, design, marketing, QA, localization, legal copy — doing all of this alone meant an average of 3–6 months from concept to release. That timeline has fundamentally changed.
Here's what the pipeline does to those numbers:
Time to first release: 8 weeks → 2–3 weeks
Update cycle: 3–4 weeks → under 1 week
Store asset refresh: 2–3 days → under half a day
4-language localization: 5–7 days → 1–2 hours
The point isn't just volume. When AI handles the repetitive work, your judgment and creativity can focus on what matters most: the actual user value you're trying to create.
In 2026, the gap between developers who have this kind of system and those who don't shows up not just in release frequency, but in their ability to respond to users and iterate meaningfully.
The Pipeline Architecture: 4 Phases × 4 Tools
The system runs across four phases using four tools.
Tool roles:
Antigravity: The conductor. Coordinates all phases via agents defined in AGENTS.md
Stitch (Google): UI prototyping and screenshot generation
Gemini CLI: Localization copy, store descriptions, and press materials
Veo 3 (Google): Promotional video and App Preview generation
Phase 4: Store submission & ASO optimization (App Store Connect API + Gemini CLI)
Antigravity orchestrates all phases through a team of agents defined in AGENTS.md. At each phase boundary, you review and approve before the next phase begins. This split — AI executes, human decides — is what makes the system reliable in practice.
✦
Thank you for reading this far.
Continue Reading
What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.
WHAT YOU'LL LEARN
✦The full architecture of a one-person pipeline from design to store submission, built on Antigravity 2.0 and Antigravity CLI
✦Concrete setups for multi-agent division of labor via AGENTS.md, overnight background execution, and CI/CD integration
✦How to draw the line between work you delegate to agents and decisions you keep human, plus the pitfalls hit in real operation
Secure payment via Stripe · Cancel anytime
✦
Unlock This Article
Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.
A June 2026 Toolchain Update: From Gemini CLI to Antigravity CLI
I first assembled this pipeline in May 2026. Since then, one part of the plumbing has changed in a meaningful way. Gemini CLI and the personal Gemini Code Assist IDE extension stopped accepting requests on June 18, and the command-line experience was folded into Antigravity CLI.
Everywhere this article calls gemini, I now run that step through an Antigravity CLI agent instead. The new CLI was rewritten in Go, and the responsiveness is noticeably better. The benefit is largest in the steps where waiting time accumulates — overnight localization runs, for example.
Alongside that, Antigravity 2.0 (announced at I/O 2026) now ships as five surfaces — the desktop app, the CLI, an SDK, a Managed Agents API, and an enterprise deployment path — that all share the same agent harness. The agent behavior you designed on the desktop carries over to the CLI and the API unchanged. The AGENTS.md design in this article still holds on the new setup. If anything, with true parallel execution and background scheduling now being platform-standard, the overnight runs I used to express in .antigravity/tasks.json are simpler to compose.
A note on pricing: the public preview is free, and the AI Ultra plan ($100/month) raises the usage ceiling to five times that of AI Pro. The more continuous overnight execution you add, the more this ceiling starts to matter.
If I had to name one lesson from the migration, it is this: do not swap your whole automation over at once. I replaced each CLI call with its Antigravity CLI equivalent one at a time, checking that the output held the same quality before moving on. Early in a large update, it is safest to migrate the step you can least afford to break last.
Phase 1: Idea Validation and UI Design
Scoring Ideas with a Market Research Agent
Start by defining a market research agent that quantifies your app idea rather than relying on gut feeling.
# AGENTS.md — Phase 1: Idea Validator## market-researcherYou evaluate app ideas with quantitative market research. Search for data on App Store / Google Play category rankings, top competitor review counts, and keyword competition.Evaluate each idea across:1. Market size (ranking stability in the category, competitor trajectory)2. Technical feasibility (can one developer ship in 4 weeks?)3. Monetization outlook (AdMob CPM benchmarks, subscription pricing norms, one-time pricing)4. Differentiation (what does this offer that top-10 apps don't?)5. ASO difficulty (keyword competition for the 3 primary terms)Output: Markdown scoresheet + recommended ASO keywords + alternative concepts if score < 6
Feeding this agent a concept takes seconds, and the report comes back in minutes:
antigravity agent run market-researcher \ --input "A wallpaper app delivering one high-resolution nature photo per day. \ Offline save. Focused on Japanese seasons."
Sample output:
## Idea Evaluation — Score: 8.2/10
Strengths:
- Wallpaper category consistently holds top-100 in Photo apps globally
- Japanese seasons niche provides clear differentiation from generic competitors
- AdMob monetization timing (wallpaper swap) is highly natural; estimated CPM: $3–8
- SwiftUI + Cloudflare R2 architecture is feasible in ~3 weeks solo
Risks:
- Ongoing photo sourcing cost (consider Unsplash API or building a library)
- Seasonal content requires year-round planning
Recommended ASO keywords: wallpaper, 4K, Japan, seasons, nature, scenic, lock screen
Generating UI Prototypes with Stitch MCP
Once the concept passes, connect Antigravity to Stitch via MCP to generate the initial UI.
Rather than one generalist agent trying to do everything, split implementation into focused specialists.
# AGENTS.md — Phase 2: Implementation Team## ui-builderRole: Generate Swift / Kotlin UI components from Stitch outputConstraints:- SwiftUI / Jetpack Compose only (no UIKit / XML layouts)- Every interactive element and meaningful image must have an accessibilityLabel- Accept Stitch JSON as input, output working code- Handle Dynamic Type at all size classes — no layout breakage at largest accessibility sizesOutput: src/Views/## data-layer-engineerRole: Implement data persistence and CloudKit syncConstraints:- Use SwiftData (not Core Data)- CloudKit sync via CKContainer using private database only- Offline behavior: serve from local cache, sync in background after reconnection- Users without iCloud should get fully functional local-only experienceOutput: src/Models/ and src/DataLayer/## test-writerRole: Auto-generate XCTest / JUnit tests for implemented componentsConstraints:- Must cover happy path, error cases, and edge cases for each component- Target 80%+ line coverage- Use DI container for mocks; no real network calls in unit tests- Write async/await-compatible XCTest using structured concurrency## localizerRole: Produce localized strings for all app textLanguages: Japanese (source), English, Simplified Chinese, Korean, SpanishConstraints:- Natural expressions, not literal translations- No phrases that would trigger App Store review concerns- Output: Localizable.strings format per language
Overnight Implementation via Background Agent
While you're doing other things, Background Agent handles the heavy lifting.
// .antigravity/tasks.json{ "tasks": [ { "id": "overnight-data-layer", "description": "Implement SwiftData + CloudKit sync for the wallpaper app. Create WallpaperItem model and WallpaperRepository. Offline cache must fall back gracefully; sync resumes in background after reconnection.", "agent": "data-layer-engineer", "schedule": "22:00 JST", "outputDir": "./WallpaperApp/Models/", "validation": "swift build && swift test WallpaperAppTests/DataLayerTests" }, { "id": "overnight-ui", "description": "Convert Stitch-generated design (./stitch-output/main-screen.json) into SwiftUI code. Full accessibility support required.", "agent": "ui-builder", "schedule": "22:30 JST", "outputDir": "./WallpaperApp/Views/", "validation": "swift build" } ]}
You wake up to implementation complete, tests passing. A few critical things still require human review:
Anything touching security (auth, billing, API key handling)
How user data is stored and transmitted — cross-reference your privacy policy
Performance characteristics — profile with Instruments before shipping
What AI-Generated Tests Actually Look Like
// WallpaperFetcherTests.swift — auto-generated by test-writer agentimport XCTest@testable import WallpaperApp@MainActorfinal class WallpaperFetcherTests: XCTestCase { // Happy path: correct URL generated for a valid date func testFetchURL_ValidDate_ReturnsCorrectURL() async throws { let fetcher = WallpaperFetcher( baseURL: URL(string: "https://cdn.example.com")! ) let date = Calendar.current.date( from: DateComponents(year: 2026, month: 5, day: 6) )! let url = try await fetcher.fetchURL(for: date) XCTAssertEqual(url.host, "cdn.example.com") XCTAssertTrue(url.path.hasSuffix("2026-05-06.jpg")) } // Edge case: falls back to cache when offline func testFetch_WhenOffline_ReturnsCachedURL() async throws { let mockMonitor = MockNetworkMonitor(isConnected: false) let cache = WallpaperCache() let cachedURL = URL(string: "https://cdn.example.com/cached.jpg")! await cache.set(key: "latest", value: cachedURL) let fetcher = WallpaperFetcher(networkMonitor: mockMonitor, cache: cache) let result = try await fetcher.fetchURL(for: Date()) XCTAssertEqual(result, cachedURL) } // Error case: future dates throw WallpaperFetchError func testFetch_FutureDate_ThrowsError() async { let fetcher = WallpaperFetcher( baseURL: URL(string: "https://cdn.example.com")! ) let futureDate = Date().addingTimeInterval(86400 * 30) do { _ = try await fetcher.fetchURL(for: futureDate) XCTFail("Expected error not thrown") } catch let error as WallpaperFetchError { XCTAssertEqual(error, .futureDateNotAllowed) } catch { XCTFail("Unexpected error type: \(error)") } }}
Phase 3: Generating Marketing Assets
This phase delivers the largest time savings in the pipeline. Store screenshots and promotional videos used to require 2–3 days with a designer. Now they take a morning.
Screenshot Automation (Stitch + Fastlane)
# fastlane/Fastfilelane :generate_screenshots do # Pull screenshot frame templates from Stitch sh("python3 scripts/fetch_stitch_frames.py") # Capture from simulator at all required device sizes capture_screenshots( workspace: "WallpaperApp.xcworkspace", scheme: "WallpaperAppUITests", output_directory: "fastlane/screenshots", devices: [ "iPhone 16 Pro Max", "iPhone SE (3rd generation)", "iPad Pro (12.9-inch) (6th generation)" ], languages: ["ja-JP", "en-US", "zh-Hans", "ko-KR"], override_status_bar: true, concurrent_simulators: true ) # Apply branded overlay from Stitch template sh("python3 scripts/apply_brand_overlay.py \ --input fastlane/screenshots \ --template stitch-output/screenshot-frame.json \ --output fastlane/framed_screenshots") frame_screenshots(path: "fastlane/framed_screenshots")end
Generating Promotional Videos with Veo 3
# scripts/generate_promo_video.py"""Generate three variants of a 30-second App Preview using Veo 3.Variants enable A/B testing in App Store Connect."""import timefrom pathlib import Pathfrom google import genaiclient = genai.Client(api_key="YOUR_GEMINI_API_KEY")PROMO_VARIANTS = { "morning": """ 30-second app promo video with a morning light theme: 1. Phone lock screen appears, showing a stunning mountain wallpaper (5s) 2. Slow swipe to a cherry blossom scene (8s) 3. User taps 'Favorite' to save the wallpaper (5s) 4. Home screen shows the wallpaper blending with a living room setting (8s) 5. App icon appears with the tagline 'Japan. Every day.' (4s) Style: cinematic, warm tones, no audio (silent) """, "zen": """ 30-second app promo with a minimal zen theme: Wallpapers slowly appear center-frame — Japanese garden, temple, snow scene. Quiet, unhurried transitions. Subtitle: 'Quiet Japan in your hand, every day.' Style: near-monochrome, extremely restrained """, "vivid": """ 30-second high-energy promo: Japanese seasons cycle quickly — cherry blossoms, summer green, fireworks, autumn leaves, snow. Each scene 2 seconds. App UI appears at the end. Tagline: 'Every season. Every day.' Style: vibrant colors, upbeat pacing """}def generate_all_variants(): operations = [] for name, prompt in PROMO_VARIANTS.items(): print(f"Generating: {name}") op = client.models.generate_videos( model="veo-3-0-generate-preview", prompt=prompt, config={ "numberOfVideos": 1, "durationSeconds": 30, "aspectRatio": "9:16", "resolution": "1080p", } ) operations.append((name, op)) time.sleep(2) # Wait for all to complete for name, op in operations: while not op.done: time.sleep(15) op = client.operations.get(op) uri = op.response.generated_videos[0].video.uri out = Path(f"fastlane/promo_videos/{name}.mp4") out.parent.mkdir(exist_ok=True) import urllib.request urllib.request.urlretrieve(uri, out) print(f"✅ {name}: {out}")if __name__ == "__main__": generate_all_variants()
#!/bin/bash# scripts/generate_metadata.sh — managed by AntigravityAPP_DESCRIPTION=$(cat docs/app-description-en.md)for lang in "ja-JP" "zh-Hans" "ko-KR" "es-ES"; do echo "Generating for: $lang" gemini " Translate and localize the following English app description for the $lang market. Requirements: - Comply with App Store review guidelines - Use natural, native-sounding expressions — not literal translation - Include primary keywords in the first paragraph - Stay within 4,000 characters App name: Japan Seasons Wallpapers Description: ${APP_DESCRIPTION} " > "fastlane/metadata/${lang}/description.txt" sleep 2done
Antigravity's SwiftUI output is often functionally correct, but VoiceOver labels frequently get skipped.
// ❌ Common AI output — no accessibility contextImage(wallpaper.imageName) .resizable() .aspectRatio(contentMode: .fill) .ignoresSafeArea()// ✅ Properly labeledImage(wallpaper.imageName) .resizable() .aspectRatio(contentMode: .fill) .ignoresSafeArea() .accessibilityLabel("\(wallpaper.title) — \(wallpaper.locationName)") .accessibilityAddTraits(.isImage)
Fix: Explicitly state in AGENTS.md that every interactive element and semantically meaningful image requires an accessibilityLabel.
Pitfall 2: Using Gemini CLI output for store copy without review
Gemini CLI produces high-quality copy, but Apple's review team flags certain patterns — superlatives ("best in the world"), competitor comparisons, and claims that contradict your privacy policy. Always run generated copy through a human review step before submission.
Pitfall 3: Veo 3 video licensing
Veo 3-generated videos are subject to Google's terms of service. Verify commercial use rights against the current terms before submitting to the App Store. As of May 2026, Veo 3 API permits commercial use, but check for updates.
Pitfall 4: Long-running Background Agent tasks that stall
Background Agents can stop mid-task on long jobs. Design tasks around 30-minute completion windows:
# AGENTS.md — Task size principleBreak all long tasks into subtasks that complete within 30 minutes.❌ "Implement the entire app data layer" (could take hours)✅ "Implement WallpaperFetcher class only — network + error handling" (20–30 min)✅ "Implement WallpaperCache class only — read/write/expiry" (20–30 min)Commit after each subtask. Reference previous commit in the next task's description.
Where I Draw the Line on What Agents Handle
The question I get most about this pipeline is not how to configure the tools — it is how much I actually delegate to the agents. Over years of solo development, I have redrawn that line more than once.
My rule of thumb is simple. Any task whose correct answer is fixed by a spec, a guideline, or a past decision goes to an agent without hesitation. Test scaffolding, formatting Localizable.strings, batch-producing screenshots, drafting release notes — correctness here is measured against an external standard, so all I have to check is whether anything is missing.
Conversely, tasks whose answer lives only in my head stay with me. Which idea to ship next, what to price it at, which single sentence in the description should lead. These are judgments about user value, so I treat an agent's suggestions as raw material and choose the final words myself.
There is one more boundary I always keep on the human side: security and billing. Authentication flows, how API keys are handled, verification of payment logic — even when working code appears, I read it line by line. A single oversight there is not the kind of thing you can recover later through more automation.
When you run several projects in parallel on background schedules, the agents quietly pile up a large volume of output. That is exactly why the human decision of whether to accept what has been produced now weighs more on me than it used to. The further automation goes, the more what remains at the end is the quality of judgment.
Post-Launch: Keeping the Pipeline Running
Automated Weekly Analytics Report
# scripts/weekly_report.py"""Auto-generated every Monday by Antigravity scheduler.Fetches performance data and creates improvement proposals as Antigravity tasks."""import subprocessdef generate_report(downloads, dau, crash_rate, avg_rating, top_complaints): prompt = f""" Analyze the following app performance data and identify the 3 highest-priority improvements for the next 2-week sprint. For each improvement, include: - What to change - Why it matters (user impact estimate) - How to implement it (concrete steps) Weekly metrics: - Downloads: {downloads} - DAU: {dau} - Crash rate: {crash_rate}% - Average rating: {avg_rating} - Top user complaints: {top_complaints} """ return subprocess.run( ["gemini", prompt], capture_output=True, text=True ).stdout
Here's what this pipeline produced on an actual wallpaper app:
Metric
Before
After
Concept to release
~8 weeks
2–3 weeks
Screenshot + video production
3–4 days
Under half a day
4-language localization
5–7 days
1–2 hours
Update cycle
3–4 weeks
Under 1 week
Total effort (hours)
250–300
60–80
The 75% reduction in effort went directly into the next app and into responding to users. The velocity compounds: each shipped app becomes a source of user feedback that informs the next concept, which moves through the pipeline faster because the tools are already configured.
There's no need to implement all four phases at once. Start with whatever's costing you the most time.
Weeks 1–2: Environment setup
Configure Antigravity + Stitch MCP. Automate UI prototyping for your current project.
Weeks 3–4: Implementation automation
Define your first two agents in AGENTS.md. Run one overnight Background Agent task. Review the output in the morning.
Weeks 5–6: Test automation
Add the test-writer agent. Connect to GitHub Actions so tests run on every push.
Weeks 7–8: Marketing automation
Automate screenshot generation via Fastlane + Stitch. Use Gemini CLI for one set of store descriptions.
Week 9+: Video generation
Integrate Veo 3. Generate three variants and A/B test them in App Store Connect.
The tools powering this pipeline didn't exist in the same form a year ago. The combination will keep evolving. What stays constant is the underlying design — Antigravity as conductor, specialized agents as performers, you as director.
Share
Thank You for Reading
Antigravity Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.