The problem
Every time I needed to hand someone a quick installable build — a client, a tester, myself on a different machine — I had to either keep a full local toolchain ready (Android Studio, Flutter SDK, Visual Studio...) or spend 20 minutes reinstalling one just for a single build.
So I built PhilBuilder: upload a zipped source project, pick a platform, get back an installable app. No local setup required.
🔗 Try it: https://philbuilder.netlify.app
What it does
You upload a .zip of your project. The tool:
- Auto-detects the project type (React, Vue, Flutter, React Native, Kotlin, .NET MAUI, Python, Go, Godot, and 14 others — 22 combinations total)
- Builds it on remote CI
- Gives you a download link for an APK, AAB, or Windows
.exe
No account needed for occasional use (3 builds/day). A free account bumps that to 10/day.
How it's built
The stack is intentionally simple:
- Frontend: a single static HTML file, no framework, no build step
- Backend: a Cloudflare Worker handling auth, rate limiting, and dispatching builds
-
Build execution: GitHub Actions — one big workflow with per-language jobs (Cordova for web frameworks, Capacitor for modern web, native Gradle for Kotlin/Java,
dotnet publishfor MAUI,flutter buildfor Flutter,briefcasefor Python,gomobilefor Go, etc.) - Storage: Cloudflare R2 for source zips and build artifacts
The auto-detection logic walks the extracted zip looking for telltale files — pubspec.yaml → Flutter, *.csproj → .NET MAUI, capacitor.config.* or a @capacitor/core dependency → Capacitor, build.gradle without package.json → native Kotlin/Java, and so on — with fallbacks down to plain HTML.
Some technical details
Signing: for Android release builds, it can auto-generate a keystore (and let you download it afterward — losing it means you can never update your app on Play Store again, so this is clearly flagged) or accept an uploaded one.
Windows builds: this is the newest addition. Flutter and .NET MAUI need windows-latest runners; Go cross-compiles from Linux with GOOS=windows. Still beta and unsigned, so SmartScreen shows a warning on install — that part is expected, not a bug.
Rate limiting: layered — global cap, per-IP hourly limit, burst limit, per-email limit — plus a honeypot field and a timestamp check against instant bot submissions. Cloudflare Turnstile handles the rest.
What's next
Thinking about adding Next.js/Nuxt support, and eventually an Electron export for Linux desktop builds.
This is a solo project, still rough around the edges in places. If you try it and hit a wall — wrong project detection, a build failing for a framework I haven't tested enough — I'd genuinely like to know. Happy to dig into logs together in the comments.
Top comments (0)