🎃 Phantom IDE - WebApp
Phantom IDE - WebApp is a Halloween-themed, AI-powered development ecosystem that breaks the traditional desktop-only IDE barrier. It allows users to create, design, and execute AI-assisted software projects directly from a web browser, including on mobile phones, while also offering a spooky VS Code extension for desktop power users. This project reimagines the IDE as something portable, accessible, and device-agnostic—an IDE that follows you everywhere.
💡 What Inspired Me
The idea came from a simple frustration. One night, while lying in bed, I thought of a project idea and grabbed my phone to prototype it quickly. That’s when I realized how much friction existed just to start coding: get out of bed, boot the laptop, open the IDE, wait for everything to load, and finally start working.
I asked myself: Why should AI-powered development be locked behind desktop applications? The Halloween hackathon theme gave me the perfect narrative: “The spirit of the IDE, unleashed from its desktop chains.” That’s how Phantom IDE was born—an IDE that haunts you across devices: start on your phone while commuting, continue on a tablet during lunch, finish on your desktop at night.
To support all users, I created two supernatural paths:
🌐 Web Orchestrator — mobile-first, zero installation
🦇 VS Code Extension — spooky power tools for desktop users
🎓 What I Learned
This project pushed me far beyond my expectations.
- Mobile-First Is Not Just Responsive: Designing mobile-first is completely different from resizing desktop layouts. Touch targets must be at least 44px. Typography needs fluid scaling using
clamp(). Real devices reveal issues emulators never catch. - Real-Time Streaming Is Hard: Streaming logs required async generators and careful state handling. Managing reconnects and partial output was challenging. Real-time feedback dramatically improves UX.
- Monaco Editor Integration: Monaco is powerful but heavy. Lazy loading is critical for performance. Mobile touch handling required custom logic. Memory cleanup is essential.
- VS Code Extension Development: Theme creation requires understanding token scopes. Icon themes need precise file associations. Webview security constraints force creative solutions.
- AI Integration Without an API: Using kiro-cli via subprocess was unconventional. Required deep async/await understanding. Process cleanup and error handling were critical.
- Accessibility Matters: WCAG 2.1 AA color contrast improves clarity. Keyboard navigation is essential. Semantic HTML benefits all users.
- The Power of Theming: Halloween aesthetics must enhance—not distract. Consistent theming made the project memorable. Fun and professionalism can coexist.
🛠️ How I Built It
🧱 Architecture (Monorepo)
backend/ → FastAPI orchestration engine
frontend/ → React + TypeScript web IDE
kiro-extension/ → VS Code Halloween extension
👻 Backend — Python + FastAPI
Why FastAPI?
- Native async support
- Automatic API documentation
- Strong validation with Pydantic
Responsibilities
- Project lifecycle management
- CLI execution via kiro-cli
- Real-time task log streaming
- Secure file system browsing
🎃 Frontend — React + TypeScript
Why These Choices
- React 19 for modern patterns
- TypeScript for safety and maintainability
- Tailwind CSS for rapid mobile-first UI
- Monaco Editor for familiar IDE experience
- Framer Motion for smooth animations
Features
- Mobile-first UI
- AI-generated requirements, design, and tasks
- Real-time execution logs
- File explorer with syntax highlighting
- Keyboard shortcuts (Ctrl+K, Ctrl+Enter)
🦇 VS Code Extension
Includes
- Halloween Dark & Light themes (WCAG AA compliant)
- 15+ spooky file icons
- Optional haunted visual effects
- Customizable intensity and toggles
🔧 Key Technical Challenges
📱 Mobile Touch Targets
// Before
<button className="p-2">Click</button>
// After
<button className="p-3 min-h-[44px] min-w-[44px]">Click</button>
🔤 Fluid Typography
font-size: clamp(0.875rem, 0.8rem + 0.375vw, 1rem);
⚡ Real-Time Log Streaming
async def stream_output(process):
while True:
line = await process.stdout.readline()
if not line:
break
yield line.decode().strip()
🧠 Monaco Lazy Loading
const MonacoEditor = lazy(() => import('@monaco-editor/react'));
😅 Challenges I Faced
- Desktop-perfect UI breaking on mobile
- Logs appearing all at once instead of streaming
- Monaco editor memory leaks
- Touch targets too small for real users
- CLI subprocess output capture issues
- Color contrast failing accessibility checks
- File tree performance on large projects
- Keyboard shortcut conflicts with browsers
- Binary files crashing the editor
- Balancing spooky fun with professionalism
Each challenge required iteration—and made the product stronger.
"Why install an IDE when the IDE can haunt you instead?"