The complete story of building a cross-platform app with no dev background: what worked, what broke, and what I learned.
Built by a project manager with zero software development background. Try the app →
Not a developer. Not pretending to be one. But not starting from zero, either.
The big boss roles gave me scope discipline, budget instincts, and the ability to make decisions under pressure. The coordinator role gave me something different: a front-row seat to how dev teams work, and more recently, hands-on collaboration with teams building tools for real users.
What I learned from those experiences wasn't how to write code. It was how people who solve problems think. How they organize workloads, communicate with their team, and engage their stakeholders. That turned out to matter more than the code.
The skills transferred from the office. The work didn't. ForkIt! was built on my own time, on my own equipment. 80% of commits land on evenings and weekends, with the rest on dedicated break times or automated work from background processes.
Early in a previous role, someone coached me on managing a meeting that was running long. When the exact scenario came up, I did exactly what I'd been told. The room went cold. Afterward, I was informed that I needed to "remember who pays the bills around here."
The lesson: the stated process isn't always the real process. Following instructions perfectly can still be wrong if you misread which instructions matter.
Someone says: "We need hard limits on meeting time."
What they mean: we aren't getting what we need out of this meeting, and trying to is just running us out of time.
Someone says: "Build me a dashboard."
What they need: a way to connect people with data. If the dashboard becomes "The Solution" instead of a tool, you've lost the thread.
With that in mind: this app doesn't solve the problem of "where should we eat?". It's a Solution to the decision fatigue that gets in the way of just living your life.
Swipe or use arrows
Strangers testing my app to pick dinner. Everyone loved it until one guy said: "I want ANYTHING BUT Indian food. That's what we eat all day." I'd only built for inclusion. He needed exclusion. The real feature lives at the intersection of both.
A user in a walkable city: "0.5mi? Maybe even 0.25. For us city folk." I'd built the app in a car-centric area. My defaults had excluded him. The fix wasn't just a walk toggle — the app now notices when you should walk and suggests switching. He told me the app lessened his sense of isolation. That was an impact I didn't design for, but it was the one that mattered.
Restaurant owners wanted to buy ad space. A hostel stranger asked if I was planning to sell. A friend described the inevitable path: sell ads, hide restaurants that don't pay. Me: "Yelp 2.0." That crystallized the guiding principle: no ads, no tracking, no sponsored listings. Ever.
Mom groups gave cultural context. Hostel strangers gave failure points by walking away. Reddit gave structured feedback and actual testers. Three sources, three completely different types of value. The skill is knowing what each one tells you, not ranking them. I weighted the wrong source and made design decisions based on enthusiasm instead of stress-tested behavior. Full breakdown →
Two questions for every feature: Does it reduce friction? and Does it reduce decision fatigue? Both have to be yes, and it can't introduce new stress. That filter killed a shopping cart feature (solves one friction, creates five) and deferred food truck mode (good idea, no data source). "Not yet" is different from "no."
The "fix the platform to fix the fix" loop. Android sign-in was failing for users with non-Chrome default browsers. Three sessions deep, the original bug was still there. The PM instinct: stop. Ship the workaround, not the platform fix.
"Build me a button that picks a random restaurant"
Copy, paste, run. It either worked or it didn't. If it didn't, paste the error back in. Repeat.
"Here's my architecture doc. Here's the constraint. Here's what I tried. Here's the error."
The evolution wasn't about better prompts; it was about learning enough to ask better questions.
"Research current web trends. Update these 5 files. Report back."
I'm not talking to one LLM anymore. I'm dispatching specialized agents in parallel, reviewing their findings, correcting course, and directing next steps. It's not a conversation. It's a team I'm managing.
Confident wrong answers (told me Google had a $200/month API credit — it didn't), circular self-citation (the LLM cited its own previous wrong answer as proof), and no pushback on bad ideas. The full list of LLM failures →
I was running a full product development workflow, just with an LLM instead of a team. Stakeholder engagement (SE), communications, product management, development, UI/UX: most of the roles a product team fills, we covered between the two of us. Not by being experts, but by knowing the workflow existed and managing the handoffs.
The roles we didn't fill are where things broke. No dedicated QA (edge cases on devices we didn't own). No legal or compliance (Apple rejected the app). No DevOps (Sentry was added after crashes, not before). No marketing or growth strategy. No accessibility audit. No data analytics. We touched all of these eventually, but touching a role and filling it are different things.
The 31-review suite now covers most of these gaps on paper. There are reviews for accessibility, store compliance, operational readiness, testing coverage, data privacy, and investor readiness. But a review that checks for accessibility is not the same as a user who depends on a screen reader. A compliance checklist is not a lawyer. The reviews catch what I think to look for. They don't catch what I've never seen.
Hover over (or click) a step to see it in action: how a check-in feature request became Group Fork.
v1 was an app and an API. v2 added real-time group sessions (Redis, a web joiner). v3 added user accounts, cloud sync, and subscriptions. Suddenly: 13 services talking to each other. Things that worked in isolation started breaking at the seams.
Apple rejected the app for missing subscription compliance. A live demo failed at a restaurant because of an untested backend deploy. A "cleanup" refactor renamed working API endpoints and broke every deployed app. The LLM cited its own previous wrong answer as proof when I asked about build credits.
Add debug info to responseMigrate to Places APITier 2 visual polish: 8 issues (#88, #36, #85, #92, #93, #15, #14, #31)30 commits and 68 days between the first commit and the first GitHub issue.
The response: a 31-point code review suite (5 automated, 26 manual), a tiered triage system, and a dev cycle that doesn't ship until the loop closes. Build → Review → Loop Back. Functional before cosmetic. Always.
Cost discipline: 13 services, most on free tiers. Guiding principle: keep it as free as possible.
See the review suite and dev cycle → · See the cost breakdown →
The code was never the hard part. These are the toolkits that don't exist for solo builders, the things I had to figure out by getting burned.
How to evaluate what cultural or ambient biases are shaping user feedback. When to approach someone for live testing vs. when to back off. I made someone mad by picking the wrong moment. How many questions are too many before you're a nuisance. Who to ask for what and when.
Most importantly: how to ask questions that surface the experience the app provides, not aesthetic opinions. "The button doesn't even work, yo. THAT'S what we're testing today", not "I liked the orange highlights a little thicker."
I built a color theory (orange = problem, teal = solution), a typography system (Montserrat), and a design governance doc through trial and error across months. Every new feature gets measured against these before a line of code is written. Without them, scope creep would have won.
No one hands you a design system when you're a solo dev. You build it, or every screen feels like a different app.
How are subscription flows typically structured? What's the standard pattern for group sessions? How do apps handle forced upgrades? What's the right testing assertion strategy? How should API versioning work in serverless?
These are questions that would take 5 minutes from a mentor. I asked an LLM instead, not because it was better, but because it didn't make me feel like a nuisance.
I organically built a tiered triage system, a dev cycle (Build → Stabilize → Ship), deploy sequencing, a 31-review code quality suite, and testing gates. All learned through mistakes, not from a playbook.
The hardest skill: telling a tool that can build anything you ask for "not yet."
A way to distinguish what kind of value each source provides. Mom groups gave cultural context about how families think about food apps. Hostel strangers gave behavioral data by walking away. Reddit gave structured feedback, bug reports, and actual testers.
Three sources, three completely different types of value. The skill is knowing what each one tells you, not ranking them.
Shipping the app didn't close the loop. The API costs scale linearly with users. The paywall exists to survive, not to profit. 13 vendor dependencies could change terms at any time. The full cost and scale analysis →
One person. If I step away for a month, the app runs, but nothing improves and nothing gets caught.
What does long-term maintenance look like for a solo-built, LLM-assisted product? I don't have a model for that yet. Nobody does.
This was not a coding project. It was a project management project that happened to produce code.
The LLM wrote the code. I managed the product: who it serves, what to build, what to cut, how to evaluate feedback, when to ship, and when to stop.
The failures were never about bad code. They were about missing process: no security review, no demo prep, no vendor verification, no stakeholder register. The skills that fixed them were not technical. They were organizational.
Every one of you has expertise that transfers to something you haven't tried yet. The tool just has to meet you where you are.
You don't need to become an expert. You need to build systems that catch what you can't, and bring what you already know.