My first project using AI pair programming, terminal UI design, and a fast feedback loop.

Why I Did This

I wanted to do something unfamiliar. Something just technical enough to scratch the itch, but not so deep that I’d lose momentum. I didn’t want to spin up another React app, or lean on tools I already knew inside out.

Instead, I challenged myself to build a command-line contact manager from scratch — using Bash, MySQL, and a lot of iteration. I gave myself no GUI, no frameworks, and minimal prior knowledge of Bash scripting or MySQL syntax.

This wasn’t about building the best contact manager. It was about exploring vibe coding — that low-stakes, flow-state style of development where you get things working fast, fix problems as they crop up, and let the shape of the thing emerge naturally.

What I Built

The app I built is called Kontact. It’s a simple, terminal-based contact management system with support for:

  • Adding, viewing, and searching contacts
  • Attaching notes to contacts
  • Scheduling contact tasks (like callbacks or follow-ups)
  • Toggling task completion
  • Viewing everything in structured, styled terminal tables

It uses Bash for the interface logic, MySQL for persistence, and ANSI colours to bring a bit of life to the CLI.

How I Worked

I used ChatGPT as my pair programmer throughout — not as a code generator, but as a collaborative assistant. Here’s how the process evolved:

Stage 1: Spec + Setup

I started by asking for help creating the SQL schema — tables for contacts, contact_types, notes, and schedules. I didn’t want anything abstract. Just a solid base to build from.

Once the database was up, I moved onto the shell script. I wanted a clean UI with reusable functions. Every time I hit a wall — formatting issues, syntax errors, layout quirks — I asked for focused help fixing just that part, not regenerating everything.

Stage 2: Flow + Features

As the structure took shape, I added features one at a time:

  • A directory view with pagination
  • A contact detail view with schedule and notes
  • A schedule list with inline toggling of task status
  • A search interface with ID-based navigation

At every step, I’d test, identify friction, fix bugs, and commit. I even created a colour helper file to keep the UI consistent.

Stage 3: Polishing

I gradually evolved from having AI write chunks of code to giving it micro-tasks: "Make this column line up", "Fix this bug on line 43", "Let’s roll this back to the last working version". At this point, ChatGPT was less of a tool and more like a second pair of eyes — rapid, precise, and fully in the loop.

What I Learned

  • Bash is powerful but opinionated. You learn quickly to avoid assumptions.
  • Date handling across Linux/macOS is a minefield — date -d vs -v vs -f.
  • Simplicity breeds clarity. A lot of features just fell out of good UI thinking.
  • AI isn’t just a generator — it’s a debugger, a strategist, and a sounding board.

Reflections on Vibe Coding

Vibe coding isn’t chaotic — it’s exploratory. You build something to see what it might be. You don’t polish too soon. You accept the friction and use it to make better decisions.

This project reminded me how much you can accomplish without boilerplates, build tools, or external dependencies. Just you, a script, a database, and a loop.

What’s Next

  • I’ll likely polish Kontact up for GitHub, with an installer and README.
  • I’d like to try building a TUI version using dialog or fzf.
  • Or I might just leave it as-is: a successful first foray into vibe coding.

If you’re a dev looking for a small, self-contained project to stretch your thinking — try this. Pick a tool you’re unfamiliar with. Choose a constraint. And get coding.

You’ll be surprised how far you get when the only goal is to keep going.