<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nick Clarkson</title>
    <description>The latest articles on DEV Community by Nick Clarkson (@nick_clarkson_ab874ff6f7b).</description>
    <link>https://dev.to/nick_clarkson_ab874ff6f7b</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2972272%2F9cf8fe29-2608-47ae-a0fd-0b5717288e5c.jpg</url>
      <title>DEV Community: Nick Clarkson</title>
      <link>https://dev.to/nick_clarkson_ab874ff6f7b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nick_clarkson_ab874ff6f7b"/>
    <language>en</language>
    <item>
      <title>Building a CLI Contact Manager with Bash, MySQL, and Vibe Coding</title>
      <dc:creator>Nick Clarkson</dc:creator>
      <pubDate>Sun, 06 Apr 2025 13:01:58 +0000</pubDate>
      <link>https://dev.to/nick_clarkson_ab874ff6f7b/building-a-cli-contact-manager-with-bash-mysql-and-vibe-coding-1dj</link>
      <guid>https://dev.to/nick_clarkson_ab874ff6f7b/building-a-cli-contact-manager-with-bash-mysql-and-vibe-coding-1dj</guid>
      <description>&lt;p&gt;&lt;em&gt;My first project using AI pair programming, terminal UI design, and a fast feedback loop.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Did This
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;This wasn’t about building the &lt;em&gt;best&lt;/em&gt; contact manager. It was about exploring &lt;em&gt;vibe coding&lt;/em&gt; — 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;The app I built is called &lt;strong&gt;Kontact&lt;/strong&gt;. It’s a simple, terminal-based contact management system with support for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding, viewing, and searching contacts&lt;/li&gt;
&lt;li&gt;Attaching notes to contacts&lt;/li&gt;
&lt;li&gt;Scheduling contact tasks (like callbacks or follow-ups)&lt;/li&gt;
&lt;li&gt;Toggling task completion&lt;/li&gt;
&lt;li&gt;Viewing everything in structured, styled terminal tables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It uses Bash for the interface logic, MySQL for persistence, and ANSI colours to bring a bit of life to the CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Worked
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  Stage 1: Spec + Setup
&lt;/h3&gt;

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

&lt;p&gt;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 &lt;em&gt;just that part&lt;/em&gt;, not regenerating everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2: Flow + Features
&lt;/h3&gt;

&lt;p&gt;As the structure took shape, I added features one at a time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;directory&lt;/code&gt; view with pagination&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;contact&lt;/code&gt; detail view with schedule and notes&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;schedule&lt;/code&gt; list with inline toggling of task status&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;search&lt;/code&gt; interface with ID-based navigation&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Stage 3: Polishing
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  Reflections on Vibe Coding
&lt;/h2&gt;

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

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

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




&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;You’ll be surprised how far you get when the only goal is to &lt;em&gt;keep going&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>chatgpt</category>
      <category>bash</category>
    </item>
  </channel>
</rss>
