For the past few months, I’ve been building a personal app to help me track my work and generate structured self-feedback for HR reviews. What started as a small project to solve a specific problem turned into an unexpected journey of learning new tools, debugging frustrating errors, and collaborating with AI to ship something usable.
In this post, I want to share how the idea started, what tools I picked, what I struggled with, and how I finally got the app packaged for internal distribution. Whether you’re building your first fullstack project or exploring AI-assisted development, I hope this helps you see what the journey can really look like.
The Problem I Wanted to Solve
At work, I need to submit self-feedback every six months. The feedback should include my recent tasks, improvements, achievements, and goals.
In addition to that, I also need to publish bi-weekly updates on our team’s P2 (our internal async communication tool, built on WordPress and used like a team blog). These updates help keep everyone in sync and include a short summary of my work and links to important Slack threads, P2 links, or tasks I worked on.
The challenge? My work updates are mostly on Slack and P2, scattered across the weeks. When it’s time to submit my self-feedback to HR or prepare my bi-weekly update, I used to stare blankly at the screen, trying to remember what I worked on and searching high and low for links to include.
I tried several workarounds over time:
- First, I used Simplenote to jot down links and short notes throughout the week. But organizing those into an actual update was still time-consuming.
- Then I moved to a Notion database and even paid for a subscription just to use the automation features. I wrote a small Python script to turn my notes into a Markdown draft of the bi-weekly report.
- Now, I use this task tracker app I built to quickly add tasks as I go, tag them if needed, and generate a clean, organized Markdown report for my bi-weekly updates and self-feedback drafts.
That was the starting point. I didn’t expect this project to teach me so much more than just building a simple app.
Learning Through Building
Before this project, I had heard about Next.js and Docker. I learned about Prisma and Tailwind CSS only after I started planning the app. I also knew about Cursor, but I thought it was just a code-completion tool until I saw my colleague build a full Next.js dashboard with it. That opened my eyes to how powerful AI pair programming could be.
Working on this app gave me a crash course in all of these tools.
I got a rough idea of how a Next.js app is structured just by letting Cursor generate and modify code for me. Watching it create pages, API routes, and components helped me understand how the different parts of the app work together.
I learned what Prisma actually does by using it to manage a SQLite database. I got to see how it connects to the schema, how to seed data, and how to write queries.
I also finally got to try Docker. I’d seen it mentioned everywhere, but this was the first time I used it to package an actual app. Getting it to work took time, but it gave me confidence to try more infrastructure-related tools in the future.
Picking the Tech Stack
I chose tools that were beginner-friendly but also powerful enough to scale later:
- Next.js gave me frontend and backend in one codebase, with built-in routing and server-side support.
- Prisma helped me manage the database with clear models and migrations.
- SQLite kept things simple as I didn’t need a full-blown database server.
- Tailwind CSS made styling fast and flexible.
- Docker helped me bundle everything into one package for easy sharing.
- Cursor (an AI pair programmer) helped speed up code generation and gave me suggestions when I got stuck.
I also plan to use Electron in the future for a lightweight, installable version of the app.
Setup Struggles and Debugging
Even with AI help, setup was not smooth.
I ran into several issues with Prisma. At one point, migrations wouldn’t apply correctly because of SQLite permission errors. Later, the Prisma Studio tool wouldn’t open unless I fixed environment variable paths.
Docker also had its own surprises. I had to figure out how to mount the right volumes, handle environment variables, and make sure the SQLite database persisted correctly. I also struggled with file paths that worked locally but broke inside the container.
And then there were smaller things like incorrect .env configs, broken seed files, or missing scripts. I often found myself thinking something like: “Why is this not working when it should?”
But all of this taught me more than just how to fix bugs. It taught me how to trace errors, how to test assumptions, and how to build in smaller steps.
Collaborating with AI Using Cursor
One of the biggest changes in how I worked was using Cursor as an AI assistant. Cursor is a VS Code-like editor with built-in AI that can generate code based on your prompt, your current file, or even your entire project context.
At first, I let it generate code for me, then tried to understand what it wrote. But soon, I learned that I needed to guide it with better prompts and check its logic carefully.
To make the AI work better, I wrote a .cursorrules file to tell it what to avoid, like not touching the Prisma schema unless I confirm. This helped reduce unwanted changes.
I also experimented with different models inside Cursor. For complex coding or debugging tasks, I usually chose the claude-3.7-sonnet model because it gave more thoughtful and consistent responses. For quick fixes or general questions, I switched to the “Auto-select” mode to save my credits. (Cursor Pro has a limit of 500 Premium credits per month, so I had to be strategic.)
When Cursor got stuck in a loop or couldn’t figure something out, I turned to ChatGPT. One feature I particularly appreciate is how the ChatGPT Desktop app integrates with Cursor. It can directly modify code in Cursor, which makes collaboration feel smooth. And when I was stuck with an error in the Terminal, ChatGPT could access the Terminal output and help me debug it directly. That saved me hours.
This whole process also introduced me to the world of vibe coding, a growing trend where developers work more intuitively with AI tools to stay in flow and build quickly. It can feel a bit chaotic at times, but it’s also really fun.
Packaging the App with Docker and .app
After getting the app to work locally, I wanted a way to share it with teammates who might not be developers. That meant making it easy to launch without asking them to install Node.js or run terminal commands.
I used Docker to bundle the app along with the SQLite database. I wrote a Dockerfile and a docker-compose.yml to simplify the build and startup process.
Then, I created a start.command script that launches the app with one click. To go even further, I used Platypus (a macOS tool) to turn that script into a clickable .app file. Now I can send both the .app file and the Docker-packaged app to my teammates, and they just double-click to launch the tool with minimal setup.
There were still challenges like making sure Docker was already running, or ensuring that the .env was no longer needed because all configs were baked into the app. But overall, the packaging process made the app feel complete.
What’s Next
This version of the app is mainly for internal use, but I’m already thinking about what’s next.
I want to rebuild the app as a native desktop app using Electron. That way, it doesn’t depend on Docker, and I can support both macOS and Windows users more easily.
I’m also planning to improve the app so it becomes more generic and flexible. Right now, it’s highly customized to my own workflow and use case. If possible, I’d love to share it publicly and let other users customize it to fit their own needs, whether it’s for tracking tasks, generating reports, or something else entirely.
I’m also thinking about adding an import/export feature so users can save or migrate their data across versions.
And of course, I want to keep exploring how AI can support me in more advanced development work.
Final Thoughts
This project started as a small side tool to help me with task tracking and HR feedback. But it turned into one of the most useful learning experiences I’ve had in a while.
I got hands-on practice with tools I’ve only read about before. I struggled through setup problems, but learned how to debug better. And I worked with AI in a way that helped me think more clearly about how things work, not just move faster through tasks.
If you’ve been putting off a project because it feels too big or too technical, I encourage you to just start. Use AI as your pair. Build something simple. Learn by doing and share your journey. You might be surprised by how much others can relate.



Leave a Reply