This is not a story about clean architecture diagrams, carefully written specs, or rock-solid requirements.
This is a story about vibe coding.
I had an idea stuck in my head: “What if my own WordPress blog could behave a bit like Bitly?”
During my Nerd @ Work Lab Podcast I’m displaying long urls, I wanted something branded to shorten links at no cost.
I didn’t want yet another SaaS, another dashboard, another API key. I just wanted my blog to:
- create short, memorable links
- redirect them reliably
- give me some basic stats
- all inside the CMS I already use
So I did what any nerd with an idea and a phone does: I opened ChatGPT.
TLDR; Jump to the GitHub repository https://github.com/enreeco/lino-shortlinks-wordpress-plugin.
Step 1 – The Terrible Phone Prompt That Started It All
I wasn’t at my desk. I wasn’t in “serious dev mode”. I was just poking my phone and typed this, more or less in one breath:
is it possibile to create a wordpress plugin with “bit.ly” capabilities? I mean using the CMS to handle:
- quick links
- redirect links
- admin interface
I mean not integrating bit.ly but creating something that works like bit.ly
Not a great prompt. No structure, no detail, written with phone-typing energy (no typos…so strange).
But it was enough.
ChatGPT 5.1 responded with something way more organized than what I deserved: different plugin architectures, trade-offs, and options on how this “WordPress as Bitly” thing could be structured.
And that’s when the vibe coding switch flipped in my brain.
Step 2 – Turning Vibes Into Constraints
Once I saw the possible architectures, I picked one that felt right: more control, more scalability, still reasonably simple.
So I replied with something more targeted:
package a plugin using the following constraints:
- Custom DB table (more control / scale)
- routing using a custom path like
blog_domain/go/abc123(I suggest using up to 6 charsa-zA-Z0-9_)- Add a UI or backend mode:
- UI mode: the link is shown in a page where users see a countdown (configurable, default 10 seconds), the UI is actually a page of the blog
- backend mode: redirect is done at the HTTP level (302/301 probably)
- admin interface to handle links (create/edit/disable)
- each link will have: title (optional), full link, slug customizable (default random 6 chars, otherwise up to 50 chars, this is mandatorily a unique code for the links db)
- description (optional)
- simple stats
- Gutemberg block
- guide on any manual configuration needed to put this in place
No secret I had no idea how to build a WordPress plugin.
I didn’t design a full spec up front. I just nudged the model with constraints, like building with Lego while someone keeps handing you new pieces.
Step 3 – From Prompt to ZIP File
The wild part?
That conversation led to a complete ZIP file of a working WordPress plugin.
Not a gist. Not a half-broken snippet.
A full plugin I could download, install, and activate.
This is where vibe coding with AI feels almost magical: you stay high-level, you shape behaviour and UX in natural language, and the model takes care of the boring boilerplate.
Of course, there was still tweaking, debugging, and some manual adjustments. But the starting point wasn’t a blank file—it was a living project.
At that moment, I knew this needed a name.
Step 4 – Naming the Thing: LINO Is Born
I have a rule: if a side project survives longer than a weekend, it earns a name.
I wanted something short, memorable, a little Italian, and still meaningful.
So I asked ChatGPT to brainstorm Italian-sounding acronyms around the idea of links, redirects, in/out flows.
That’s how LINO happened: Link IN / Link Out.
Short. Friendly. Easy to remember. And to an Italian ear, it just sounds like a real name.
LINO stopped being “that Bitly plugin idea” and became an actual character in my mental cast of projects.
Step 5 – Giving LINO a Face: Icon Vibes
Once you name a thing, you start caring about its aesthetics.
So naturally, I asked for icon suggestions too.
One of the options immediately clicked with me:
Icon “short link” → Simple broken chain
A short chain (two links) with an arrow.
It looks technically related to links without being banal.Something like:
[O—>](mini chain)the word LINO in small text underneath (optional)
A tiny chain with a little arrow. Technically linked to URLs, visually minimal, not screaming “enterprise tracking suite™”.
Again, the details weren’t coded by hand in Illustrator. They emerged out of a conversation. Vibe-driven product design.

Step 6 – Refining With Cursor
Once the core was there, I moved to Cursor to continue the journey.
There the focus shifted from “can this exist?” to “how nice can this be to use?”:
- improving the admin interface for managing links
- tightening up settings and defaults
- making it easier to configure countdown behaviour and UI vs backend mode
- smoothing edge cases in how links are handled and displayed
- import / export
- using default page for UI redirect or custom built page to handle all the layout
The pattern was the same:
- I had a small idea or annoyance.
- I described it in natural language.
- The AI suggested changes.
- I accepted, adapted, or rejected them based on gut feeling and testing.
Vibe coding doesn’t mean “no structure”. It means the structure emerges from fast feedback loops between intuition, prompts, and what actually runs.
What LINO Is (Without the Low-Level Details)
I won’t go into PHP internals, rewrite rules, database schemas, or hook names here. That’s not the interesting part of this story.
You can go directly to the GitHub reposity if you want to go in full details: https://github.com/enreeco/lino-shortlinks-wordpress-plugin
What matters is what LINO feels like:
- My WordPress blog can now behave a bit like a self-hosted Bitly
- I can create short links with custom slugs
- I can choose between a fast redirect or a UI countdown page
- I get simple stats so I know whether links are being used
- I can manage everything from an admin interface that lives inside the CMS I already use
All of this came out of conversations rather than formal specs.




Why This Project Matters to Me
LINO is more than “just another plugin.” It’s a personal proof-of-concept that:
- AI is actually useful at architecture level, not just for filling in missing
;in your code. - You can start from an ugly phone prompt and still end up shipping something real.
- Naming, icon design, UX decisions—everything can be co-created with a model, as long as you keep the final taste and direction.
- Vibe coding works when you treat AI like a very fast, very pedantic pair programmer who doesn’t mind your chaotic brain.
In the end, LINO is a small tool. But it’s built on top of a big shift: going from “I must design everything before I start” to “I can design while I build, in conversation with an assistant.”
And that, to me, is the real fun.
A Tiny Note on the Build Script
One last piece of the story deserves a mention: the build script.
After the plugin started growing, repeating the classic “zip the folder, exclude the junk, keep only what WordPress needs” routine felt like the opposite of vibe coding. So I asked ChatGPT to help me shape a tiny build script that:
- cleans temporary files
- excludes development artifacts
- bundles only the actual plugin code
- generates a clean distributable ZIP
Nothing complex — just a small automation step. But it felt like adding a bow on top of the project: a way to ship LINO easily without thinking about the filesystem every single time.
And in typical vibe-coding fashion, even that script wasn’t architected up front. It emerged naturally the moment I needed it.
LINO started as a random idea on my phone and grew into a self-hosted short-link system that now lives happily inside my blog. Not because I meticulously planned it, but because I let vibes, tools, and curiosity do their thing—one prompt at a time.

