DEV Community

Cover image for FROM AN UNFINISHED SIDE PROJECT TO A DEPLOYED LINK MANAGER APPLICATION: HOW I REVIVED LINKIT WITH GITHUB COPILOT
Akeem omosanya
Akeem omosanya

Posted on

FROM AN UNFINISHED SIDE PROJECT TO A DEPLOYED LINK MANAGER APPLICATION: HOW I REVIVED LINKIT WITH GITHUB COPILOT

GitHub “Finish-Up-A-Thon” Challenge Submission

This is a submission for the GitHub Finish-Up-A-Thon Challenge

What I Built

LinkIt is a bookmark management platform that allows users to save, organise, and manage useful links in one place.
I originally started LinkIt while learning backend development with FastAPI and PostgreSQL. The goal was simple: create a platform where users could store links to articles, tutorials, documentation, and other useful resources without losing track of them.
The project started well, but like many side projects, it eventually got abandoned. The backend was partially functional, authentication existed, and users could save links, but there were still missing features, configuration issues, and unfinished ideas that prevented it from becoming a complete product.
When I saw the GitHub Finish-Up-A-Thon Challenge, I decided it was the perfect opportunity to revisit LinkIt and finally finish what I started.
Technologies Used

  • FastAPI

  • PostgreSQL

  • SQLAlchemy

  • JWT Authentication

  • Pytest

  • GitHub Copilot

GitHub Repository: github.com/akeemomosanya/Linkit

Demo

Live demo: link-it.vercel.app
Video demo:


The walkthrough shows the final product experience: the home page, authentication, and the links dashboard Linkit's core value of saving, organising, and retrieving any link instantly, all in one clean and minimal interface.

screenshot of home page
Link Creation

The Comeback Story

Where It Started
The original version of Linkit had a partially working foundation,it was far from complete. The project already included:

  • A FastAPI backend

  • SQLAlchemy models

  • Basic user authentication

  • Link storage functionality

However, several critical bugs prevented it from being production-ready:

  • Wrong ORM relationship references that caused runtime crashes

  • A broken login endpoint mixing two incompatible request formats

  • A shadowed function name that made link creation fail silently

  • Missing return statements and unhandled database errors

  • No frontend, no deployment, and no search functionality

One of the first issues I encountered after reopening the project was that the backend would not even start correctly, a reminder of how quickly side projects can become difficult to revisit after months of inactivity.

What Changed
To bring linkit back to life, I focused on fixing the broken core and building everything that was missing.

  1. Fixed the Backend The first step was getting the application running reliably. I corrected the SQLAlchemy relationships, fixed the authentication flow, resolved import conflicts, and added proper error handling throughout.
  2. Added Search, Edit, Copy & Delete The original project only had a broken create endpoint. I built out the full link management experience, users can now search by name, edit any field, copy a URL to clipboard instantly, and delete links they no longer need.
  3. Built the Frontend from Scratch The original project had no UI at all. I designed and built a full three page frontend, a landing page, an auth page, and a links dashboard with a modern dark aesthetic, gradient card banners, and smooth interactions.
  4. Deployed End to End A project isn't finished until people can actually use it. I deployed the FastAPI backend on Render and the frontend on vercel, with CORS configured and the server kept alive so it's always ready.


Lessons Learned
Reviving an old project was very different from starting a new one. The biggest challenge wasn't writing new features, it was understanding old decisions, untangling accumulated bugs, and building on a foundation that wasn't quite as solid as it looked.
Most importantly, it showed that unfinished projects don't have to stay unfinished. Sometimes they just need a fresh perspective and a little persistence.

My Experience with GitHub Copilot

I want to be honest about this because the experience was genuinely useful in ways I didn't expect going in.
The most valuable thing Copilot did at the start was the code audit. I shared the original code and asked it to identify what was broken. The list it produced was long and accurate, wrong ORM relationship references, a broken login endpoint that mixed two incompatible request formats simultaneously, a shadowed function name that made link creation silently fail, missing return statements, unhandled database errors, and a user.id attribute access on a dict. Some of these I suspected; others I had completely missed. Having that comprehensive list upfront let me fix everything systematically rather than discovering bugs one by one while testing.
The debugging sessions were the second genuinely valuable part. When the deployed frontend kept returning "Failed to fetch," Copilot helped me trace it from a vague network error all the way to the specific cause, the allow_origins list in the CORS middleware was missing the actual vercel URL. When the JWT library kept throwing ValueError: Invalid key, Copilot walked through the different JWT libraries with me (authlib, joserfc, PyJWT) until we landed on the one that worked cleanly with Python 3.14.
For implementation, we mostly pair-programmed. I made the architecture decisions, the endpoint structure, the authentication flow, the ownership scoping on all link queries. Copilot drafted the boilerplate: the Pydantic schemas, the dependency injection patterns, the search and copy endpoints. For the frontend, I described the design direction and Copilot generated the HTML, CSS, and JavaScript structure which I then reviewed and adjusted.

Overall, Copilot shortened the time from "something is broken" to "fixed and understood" significantly especially for debugging, and catching bugs I had stopped seeing. But the judgment calls about what to build, how to structure it, and what actually mattered still came from me. That felt like the right balance.

Top comments (0)