A Solo Developer Built a Full-Stack AI Goal Coach Using Vibe Coding
Foreword
This is not a technical tutorial, but a complete record of a product creator—from a vague idea in mind to launching a real product that includes a user client, API, admin panel, and AI integration, all built collaboratively with Codex.
I. Prologue: The Birth of an Idea
I've always had a frustration.
The market lacks a tool that lets me "truly execute" my goals.
Notion is too free-form; you need to build your own templates, and after building them, you lose the motivation to execute. To-do lists are too simple; they only record "what to do today," but can't solve "why do this today" or "what to do tomorrow." OKRs are too enterprise-level, suitable for team management but not for personal daily life.
What I wanted was actually very simple:
A tool where I tell it my goal, it breaks it down into daily tasks, then reminds me every day, gives me feedback, and finally reviews with me.
This idea lingered in my mind for a long time. But every time I thought about implementing it—frontend pages to write, backend APIs to build, database tables to design, plus AI integration, an admin panel, and deployment—I felt I couldn't handle it alone.
Until I encountered vibe coding.
To be precise, I encountered tools that support vibe coding.
II. Discovering Needs: Pain Points Aren't Imagined, They're Uncovered Through Conversation
The needs for this product didn't come from brainstorming in front of a computer. They came from two places: my own failed experiences and conversations with friends.
Starting with Myself
I've had many experiences of "making a grand plan and giving up after three days."
Wanted to get fit, got a gym membership, went twice, stopped. Wanted to learn English, downloaded an app, checked in for three days, forgot about it. Wanted to save money, checked at the end of the month, still overspent.
The reasons for each failure were actually similar:
- The goal itself was too vague ("I want to be healthy"—what does healthy mean?)
- It wasn't broken down to the level of "what to do tomorrow" ("I want to exercise every day"—exercise what? How long? Where?)
- No feedback during execution (checking in is just ticking a box, then what?)
- No review after giving up (making the same mistake next time)
Talking with Friends
I found this wasn't just my problem.
When chatting about this topic over dinner with friends, almost everyone had similar experiences. One friend said:
"Every time I make a plan, I get super excited, feeling like my life is about to change. Then after three days of execution, it's gone. Next time, I make an even more exciting plan."
Another friend said:
"I know what I should do, but I just don't know where to start with the first step."
These conversations made me realize: The pain point isn't 'setting goals,' but 'the first mile from goal to execution.'
Five Core Problems
I organized these observations into five problems, which later directly determined the product's functional design:
| # | Problem | Product Response |
|---|---|---|
| 1 | Unsure if the goal is realistic | AI first assesses feasibility, gives a score and suggestions |
| 2 | Don't know what to do on the first day | AI breaks the goal down into specific daily tasks |
| 3 | Don't know how to break down a long cycle | Plan is divided into phases (Adaptation → Execution → Intensification → Wrap-up) |
| 4 | Check-in is just a record, no feedback | AI coach gives targeted daily feedback |
| 5 | No review after failure, repeat mistakes next time | Automatically generates a final review after plan completion |
The product positioning emerged: a tool where AI helps you go from a 'vague goal' to 'what to do each day.'
III. Inspiration: From Fragments to Product
With the pain points identified, the next step was turning them into an interactive product. This process wasn't linear; it was more like a puzzle—piecing together fragments of inspiration one by one.
Initial Inspiration Fragments
Fragment 1: Let users 'speak' their goal, not 'fill in' a goal.
The first step in most goal management tools is filling out a form: goal name, deadline, priority, category... You feel tired before even starting to execute.
The experience I wanted was: the user just says one sentence—"I want to lose 10 pounds in three months" or "I want to score 6.5 on the IELTS in half a year"—and the rest is handled by AI.
Fragment 2: AI is a 'coach,' not a 'tool'
Most tools on the market position AI as a Q&A assistant: you ask, it answers. But in this scenario, AI should be a proactive role—it helps you evaluate goals, generate plans, give you daily feedback, and finally review with you.
Fragment 3: A closed loop is more important than features
This product doesn't need many features. It just needs to do one thing well: let users go from "I have a goal" to "I finished what I needed to do today," and then back to "I'm one step closer to my goal."
Core Experience Loop
Ultimately, the product's core experience was designed as a short closed loop:
State goal → AI evaluates feasibility → Generate structured plan → Daily check-in → AI coach feedback → Completion review
The most critical link in this loop isn't "generation," but "execution." So the database and backend aren't just for saving a piece of AI text, but for breaking down AI results into actionable structured data—plans, phases, days, tasks, check-ins, feedback, reviews.
The Origin of the Product Name "Bound to Succeed"
The name came from a very direct thought: Whether it's the product or the user, both need a confident voice.
Users need a tool that makes them believe "this time it will work." I needed it too—a project built from 0 to 1 with AI, unsure if it would succeed. So this name is both for the user and for myself.
IV. Tech Stack Selection: Why Codex
Before settling on Codex, I tried two other AI coding tools.
Tools Tried
Claude Code
Claude's conversational ability is strong, and its code generation quality is good. But at the time, its support for Chinese projects was unstable—table comments, API documentation, and prompts in Chinese were prone to encoding issues. Moreover, when continuously iterating on a project with an existing structure, the context wasn't maintained coherently enough—often encountering situations where "a design agreed upon earlier was forgotten when switching to a new conversation."
Trae Domestic Version
Trae is very friendly to the domestic ecosystem, with good Chinese support and understanding of commonly used domestic tech stacks. However, its experience leaned more towards "generating from scratch," and the workflow wasn't smooth enough for "making continuous modifications and iterations on an existing project."
Why Codex Ultimately Won
The three points that impressed me most about Codex:
1. Project-Level Context
It's not a single Q&A session. It works within the entire project repository—reads your code structure, understands your naming conventions, knows how your database tables are related. This means you can say "add an API to the user service that queries what day of check-in it is today," and it knows where to add it, how to name it, and how to interface with existing code.
2. Full-Stack Coverage
Going from an idea to a runnable full-stack project involves:
- Database table creation + migration scripts
- Backend APIs + routes + middleware
- Frontend pages + components + state management
- AI integration + exception handling + fallback logic
- Admin management system
- Deployment configuration
- Test cases + documentation
Codex, as a single tool, covered all these aspects. The switching cost was almost zero—no need to frequently switch contexts between frontend frameworks, backend frameworks, database tools, and AI SDKs.
3. Iterative Collaboration
This is what impressed me most. Codex's way of working isn't "you ask a question, it gives an answer," but rather:
You first state an idea, it generates a version; you run it to see what's wrong; you supplement experience requirements; it continues to modify APIs, pages, data; finally, it solidifies into documentation.
This process feels very much like having an engineering partner sitting beside you: I'm responsible for judging direction, proposing product feelings and acceptance criteria; it's responsible for breaking down ideas into code, files, APIs, and data structures.
Honest Boundaries
Of course, Codex isn't omnipotent. My judgment:
Suitable Scenarios:
- Personal products from 0 to 1
- Rapid prototype validation
- Projects needing full-stack capability but with only one person on the team
- Code quality requirements of "good enough to launch, continuously optimize after"
Unsuitable Scenarios:
- Systems requiring high concurrency and high security
- Legacy system refactoring (it has no existing context)
- Scenarios requiring deep performance optimization
V. Solution Design: AI Generates, Humans Constrain
This is the most important part of the entire product design.
Overall Architecture
┌──────────────────┐ ┌──────────────────┐
│ User Client │ │ Admin Panel │
│ (uni-app/H5) │ │ (Vue 3 + Element)│
└────────┬─────────┘ └────────┬──────────┘
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ User API │ │ Admin API │
│ (Koa + JWT) │ │ (Koa + JWT) │
└────────┬─────────┘ └────────┬──────────┘
│ │
└──────────┬──────────────┘
▼
┌──────────────────┐
│ MySQL │
│ (d_c_DB) │
└──────────────────┘
Four projects, sharing the same database.
Why split into four projects?
Separation of concerns. If the user API goes down, it doesn't affect the admin panel; high-traffic queries on the admin panel don't affect the user service. Plus, they can be deployed independently—after going live, the user API and admin API were actually deployed on different ports.
Why share a database?
Initially, I considered using different databases for the user and admin sides, syncing via APIs. I decisively abandoned that idea—for a one-person project, adding a data synchronization layer only introduces more bugs. A shared database + reasonable front-end and back-end validation is simple and reliable enough.
Core Business Flow
Login
→ Create Goal (fill form: goal name, cycle, expected outcome, daily available time...)
→ POST /api/v1/goals/evaluate → AI feasibility assessment (or local fallback)
→ Score >= 60 → POST /api/v1/plans/generate → Generate plan
→ Homepage shows active plan, today's tasks, AI coach feedback
→ Daily check-in → Tick off tasks → Update progress
→ Plan completed → AI generates final review
→ History page view all plan statuses
AI Boundary Design: The Core Design Decision
Initially, I easily fell into a misconception: since we're using AI, should we let it freely generate everything?
Later I realized—a truly reliable AI in a product isn't one that 'says whatever,' but one that 'outputs structured results after being constrained.'
So the backend was designed with several layers of protection:
1. AI output must be JSON, not Markdown text
Mandatory use of DeepSeek's response_format: { type: 'json_object' }. If the AI doesn't return valid JSON, it directly goes to fallback.
2. All output must go through normalization and validation
AI might return missing fields, incorrect formats, or non-consecutive phase days. So the backend has a normalize layer specifically for cleaning:
- Field length truncation
- Date format unification
- Phase day continuity validation
- Task count control within a reasonable range
- Required field checks
3. Local fallback when no Key or call fails
When AI_API_KEY is empty, or the AI call times out/returns an exception, the system automatically uses a local algorithm to generate evaluations and plans. Although the quality isn't as good as AI, the product won't become unusable because of it.
4. Log every call
Every AI call (success or failure) is written to the ai_model_logs table, containing the complete request, response, duration, and status. This provides foundational data for future troubleshooting and rate limiting.
5. Independent daily call limits per scenario
Configured via the system_configs table, each scenario has a daily call limit. This prevents a single user from exhausting the quota by spamming an API.
The core philosophy in one sentence: AI is the 'generation engine,' product boundaries are controlled by code.
VI. Database Design: Modeling Around the 'Execution Loop'
The database design principle was simple: Everything is to enable users to execute their goals.
Core Relationship Chain
users
→ goal_evaluations (Goal Evaluation)
→ plans (Plan Master Table)
→ plan_phases (Phases)
→ plan_days (Days)
→ tasks (Tasks)
→ checkins (Check-ins)
→ coach_feedbacks (Coach Feedback)
→ plan_final_evaluations (Final Review)
[Screenshot Placeholder: Screenshot of the core table list in the MySQL database — showing all table names under the ding_cheng library]
[Screenshot Placeholder: Screenshot of the plans table field structure — showing key fields and types]
[Screenshot Placeholder: Screenshot of several sample data rows in the tasks table — showing the data structure of AI-generated tasks]
Why Break Down into 4 Layers (Plan - Phase - Day - Task)
This was a decision made very early on: What AI generates is not a piece of text, but a tree structure.
plans: The overall plan, saving status (active / completed / abandoned)plan_phases: Phases, like "Startup Adaptation Period," "Stable Execution Period," "Intensive Improvement Period," "Wrap-up Review Period"plan_days: Each day, bound to a real date, supporting future makeup check-ins, skipping, and statisticstasks: The specific tasks for each day; this is the layer where users tick boxes
The benefits of this design are:
- Users see what to do today, not a large block of plan text
- The backend can do statistics by phase, day, and task dimensions
- Future support for makeup check-ins (makeup tasks inherit original task fields)
- During the final review, the execution quality of each day can be seen
Design Background of the Three Day-Counting Modes
Different users have different needs for "check-in frequency." So three modes were designed:
| Mode | Description | Applicable Scenarios |
|---|---|---|
calendar |
Natural days, check in every day | Short-term sprints, habit formation |
workday |
Workday check-ins, skip weekends and statutory holidays | Study plans, work projects |
rest_day |
Rest day check-ins (only 2 days every 7 days) | Fitness, sports (need recovery days) |
The workday mode brings an additional problem: China's compensatory leave system. Weekends might be makeup workdays, and workdays might be holidays. So a holiday_calendars table is needed, configured by the admin in the backend, also supporting annual synchronization.
Why Check-in Status Has Three Levels
It's not a simple true/false, but a three-level status:
completed: All completedpartial: Partially completedincomplete: Not completed
This allows for a more realistic view of execution quality during reviews—"Completed 2 out of 3 tasks today" carries more information than "Check-in failed today."
Design Intent of the AI Log Table
ai_model_logs is one of the most valuable tables after going live. Each record contains:
- User ID
- Scenario (evaluation / plan generation / coach feedback / review / preference assessment)
- Provider and model name
- Complete request content
- Complete response content
- Duration (milliseconds)
- Status (success / failure / partial success)
Without this table, troubleshooting AI issues would rely on guesswork. With it, the backend can investigate problems by scenario, user, and time period, and also do usage statistics and cost estimation.
Operational Support Tables
Besides the core business tables, there's a set of operational tables designed from the start:
| Table | Purpose |
|---|---|
system_configs |
System configuration (AI call limits, site name, feature toggles) |
announcements |
Announcements (configurable display time, whether to show only once) |
user_feedbacks |
User feedback (and processing status flow) |
avatars + association tables |
System avatar management (supports categorization by tags, sorting) |
preference_assessment_* |
User preference assessment questions and results |
These tables transform the project from "runnable" to "operable."
VI.5: An Interlude—Why the Admin Panel Was Built Early
Not a full chapter, but worth mentioning separately.
Many personal projects only build the user client first, leaving the admin panel for "later." This time, I built the admin panel from the very beginning.
The reason is simple: AI products need observation.
I needed to know:
- What goals are users creating?
- What content is the AI returning? Is the format correct?
- Which calls are failing? Why?
- How many times is each AI scenario called daily?
- What feedback are users giving? Are there common issues?
- Is the holiday configuration correctly affecting plan dates?
Without an admin panel, these questions could only be guessed at. With one—even just a simple list page + log viewer—problems become visible.
So the admin panel isn't the icing on the cake; it's the debugging entry point and operational entry point.
VII. The Real Workflow of Vibe Coding
Many people are curious about what it feels like to "build a product with AI." I'll illustrate with a real case.
A Typical Development Cycle
Take the "check-in feature" as an example to see how it went from idea to code:
Step 1: Propose the Requirement (Colloquial Description)
"I want users, after entering the check-in page, to see today's task list, tick off completed ones, click submit, and then have the AI give a piece of feedback based on completion status."
Step 2: Codex Understands the Requirement + Reads Existing Code
It doesn't start writing immediately. It first reads the existing project structure—what fields the plans table has, how the tasks table is related, whether there are any existing check-in related APIs, and what component library the frontend pages use.
Step 3: Generate a Plan
It will give a plan, including:
- New backend APIs needed (
POST /api/v1/plans/:planId/checkins) - Whether the database needs adjustment (the existing
checkinstable is sufficient) - Component structure for the frontend check-in page
- Timing and parameters for the AI call
Step 4: I Review, Adjust Direction
I check if the plan is reasonable. For example, the trigger timing for AI feedback—should AI be called on every check-in, or only under certain conditions? Is the call frequency too high? Should throttling be added?
Step 5: Codex Implements the Code
Involves multiple files:
- Backend controller, service, route
- Frontend page, components, API calls
- Possibly database migration scripts
Step 6: Start Service for Verification
Start the backend and frontend, actually walk through the process. Find issues—like a field's return format being wrong, or the page displaying abnormally on mobile—and continue iterating.
Role Shift
In this process, my role underwent an interesting shift.
In the traditional development model, I was the "executor"—every API, every page, every field had to be written by myself. The rhythm was: think clearly → write code → test → discover what's missing → go back and change.
In the vibe coding model, I'm more like a "product manager + verifier"—I'm responsible for clearly stating what I want, judging if what's produced is correct, and deciding which direction to go next. Codex is responsible for turning ideas into code.
This doesn't mean I don't need to understand technology. Quite the opposite—to judge whether AI's plan is good, whether the code is stable, and whether the data structure is reasonable requires stronger technical judgment.
VIII. A Record of Pitfalls
I stepped into quite a few pitfalls making this project. I'll pick a few of the most memorable ones to discuss.
Pitfall 1: Database Couldn't Run on ECS
During the development phase, I used a local MySQL, and everything was normal. After deploying to Alibaba Cloud ECS, a problem arose—database queries were very slow, a simple list page took several seconds to load.
Initially, I thought it was a code issue, so I added various indexes, optimized SQL, and added caching, with limited effect. Later, I discovered the ECS disk IOPS was insufficient—MySQL running on a cloud server, especially burstable instances (t5/t6), would lag as soon as database operations increased.
Solution: Migrate the database from the self-built MySQL on ECS to Alibaba Cloud RDS. After migration, query latency dropped from seconds to milliseconds, with immediate effect.
Lesson: For database-intensive applications, don't cram the database and application onto the same low-spec ECS. RDS costs a bit more, but the troubleshooting time saved far exceeds the cost.
Pitfall 2: Static Image Bundling Caused Bundle Size Explosion
The user client H5 used some asset images—navigation icons, AI coach avatar, goal category images, empty state placeholders. During development, I thought "local referencing is convenient" and put them all in the static/ directory for direct bundling.
As a result, the first build produced an absurdly large JS bundle, with the first screen taking seven or eight seconds to load. Inspection revealed all images had been base64-encoded and packed into the JS.
Solution: Upload all static images to Alibaba Cloud OSS and reference them via URL on the frontend. Also managed them by type (avatars, icons, background images...), allowing the backend to replace and add new ones anytime.
Incidental Gain: OSS also incidentally solved the user avatar problem—user-uploaded avatars are also stored on OSS, and the backend can manage all assets.
Pitfall 3: Unstable AI Output
This was an expected pitfall, but when actually encountered, it was more frequent than imagined.
Typical problems:
- AI returned Markdown format instead of the requested JSON
- JSON fields were missing (e.g.,
phase_namenot returned) - Phase days were non-consecutive (Phase 1 covered days 1-3, Phase 2 started from day 5, skipping day 4)
- Too many tasks (15 tasks listed for one day, impossible to display on mobile)
Solution: Added a normalize layer on the backend specifically for cleaning and validation. This layer doesn't trust the AI's output—it checks if fields exist, if formats are correct, if data is consecutive, and if quantities are within a reasonable range. If it fails, it goes to fallback or retries.
[Screenshot Placeholder: Screenshot of illegal JSON log returned by AI — showing a real case of non-standard AI output]
[Screenshot Placeholder: Screenshot of normalize layer code — showing the core logic for cleaning and validation]
Pitfall 4: Frontend-Backend API Alignment
When one person does a frontend-backend separation project, the most common problem is "the API was agreed upon, but it doesn't match during implementation."
For example, date formats—backend returns 2026-06-19, frontend expects 2026/06/19. Or status enums—backend uses active/completed/abandoned, frontend code writes ACTIVE/DONE/ABANDONED.
There's no communication cost between two people, but when switching between frontend and backend contexts, you forget things yourself.
Solution: Unified API documentation (docs/api.md in the project), synchronously updated every time an API is changed. Later, I developed a habit—after changing an API, run through the frontend pages first to ensure all fields render normally.
Pitfall 5: Documentation Lag
The project's README and actual code were often out of sync. Early on, there were several instances of "the README had the old API path, but the code had already switched to the new path."
Lesson: Documentation needs to be verified just like code. Later, I set a rule—if AI changes code involving API or table structure changes, the corresponding documentation must be updated synchronously. This rule was written into the checklist for every change.
IX. A Re-understanding of Vibe Coding
After completing this project, I gained a deeper understanding of vibe coding.
Vibe Coding Isn't "AI Replacing Humans"
There are many posts online discussing vibe coding, and a common anxiety is "AI will replace programmers."
My feeling is exactly the opposite.
In this project, AI took on the work of the execution layer—writing code, creating tables, modifying files, supplementing documentation. But all the work of the decision layer—defining product boundaries, checking field semantics, smoothing page interactions, controlling AI output—was done by humans.
So the division of labor is actually:
| Human Responsible For | AI Responsible For |
|---|---|
| Product direction judgment | Code generation |
| Feature boundary definition | Data structure implementation |
| Experience verification | File modification |
| Decision-making and trade-offs | Documentation writing |
| Quality assurance | Testing assistance |
AI is not a replacer; it's a high-intensity collaborator.
What Vibe Coding Changed
It didn't change "how code is written," but "the distance between thinking and doing."
Before, an idea going from mind to launch involved setting up frameworks, writing APIs, making pages, tuning databases, deploying online—everything took time, and context switching itself was energy-consuming.
Now this process is compressed. You can quickly produce a version, run it to see what's wrong, and then continue iterating. The rhythm shifted from 'think clearly first, then do' to 'do it first, see what's wrong, then keep pushing forward.'
Who It Suits, Who It Doesn't
Suits people like this:
- Have product judgment, know what they want
- Can clearly express requirements (colloquial is fine, no technical jargon needed)
- Willing to review AI's output, not blindly trusting
- Have a certain technical foundation to judge if a plan is reasonable
Doesn't suit people like this:
- Completely no technical background (still need to judge plan quality)
- Cannot clearly describe requirements (AI can't guess what you're thinking)
- Unwilling to read AI-written code (trust but don't verify, problems are inevitable)
X. Conclusion
"Bound to Succeed" is my first complete attempt at vibe coding a product.
It's not a demo. It has a user client (uni-app/H5), business APIs (Koa + MySQL), an admin panel (Vue 3 + Element Plus), AI integration (DeepSeek), complete test cases (XMind), and deployment configurations.
Going from an idea to all of this being implemented, if done alone using traditional methods, might have taken me two months, and it would have been easy to give up midway due to getting stuck on some part.
Vibe coding paved this path.
The biggest gain isn't 'how much code AI wrote for me,' but the first-time feeling that when ideas can be quickly implemented, verified, and modified, the rhythm of making a product is completely different.
Before, many ideas would stop in my mind—because thinking about setting up architecture, writing APIs, making pages, tuning databases made me hesitate. Now it's more like: make it first, see where it's wrong, then keep pushing forward.
It's not that code has become unimportant, but the resistance between idea and code has decreased.
And when the resistance decreases, one person can also get closer, faster, to what they truly want to make.
"Bound to Succeed"—this phrase is for the users, and also for myself.
Appendix A: Common Prompt Examples
Below are the prompt styles actually used in this project, for reference:
Scenario 1: Proposing a New Feature
"I want to add a feature: after users enter the 'My' page, they can see their check-in statistics—consecutive check-in days, total check-in count, total completion rate. Data is calculated from the checkins table. Help me design the API and frontend display."
Scenario 2: Modifying an Existing Feature
"Currently, the task list on the check-in page scrolls up and down, but I want completed tasks to automatically sink to the bottom, uncompleted ones to stay on top, and completed ones sorted in reverse chronological order of completion time. Only change the frontend, don't change the backend API."
Scenario 3: Fixing a Bug
"When creating a plan, if the user fills in daily_time as 0 (meaning no fixed time), the time_label field of the task in the AI-generated plan is null, causing the frontend display to crash. Help me fix this—make the frontend display 'Flexible Arrangement' when time_label is null."
Scenario 4: Adding a Database Field
"The plans table doesn't have a field to record the total number of days in the plan. Now I need to add a total_days field. Note that the migration script must be idempotent, and existing plans need to have this value backfilled."
Appendix B: Data Table Quick Reference
| Table | Row Count (Reference) | Core Field Count | Purpose |
|---|---|---|---|
users |
Low | 15+ | User Info |
goal_evaluations |
Low | 20+ | Goal AI Evaluation |
plans |
Low | 20+ | Plan Master Table |
plan_phases |
Low | 10+ | Plan Phases |
plan_days |
Low | 10+ | Plan Days |
tasks |
Medium | 15+ | Daily Tasks |
checkins |
Medium | 12+ | Check-in Records |
coach_feedbacks |
Medium | 10+ | AI Coach Feedback |
ai_model_logs |
High | 15+ | AI Call Logs |
system_configs |
Low | 6 | System Config |
holiday_calendars |
Medium | 8 | Holiday Config |
End.