Built & Shipped · LinkedIn Chrome Extension · Nov 2025

I noticed a friction.
I built the fix.

Built and shipped a LinkedIn Chrome Extension in 2 weeks, solo end-to-end. Built using AI-powered tools: Claude, Cursor, and Figma Make.

My Role
Product Designer & Builder (Solo)
Timeline
2 weeks, Nov 2025
Platform
Chrome Extension (Web)
Tools
Figma, ChatGPT, Claude, Cursor, Figma Make
How this went from frustration to live product
😤
Spot Friction
Personal frustration, modal hides name while I'm writing a note
🗣
Validate
LinkedIn community post, 5+ people confirm same frustration
✏️
Design
6 options explored in Figma, drag handle chosen for zero learning curve
🤖
Build with AI
PRD → Cursor → Figma Make. I directed, AI executed
🚀
Ship
Rejected once, debugged permissions, resubmitted as Draggit. Live.
01 Problem

The modal that blocked your context.

LinkedIn's "Add Note" modal opens directly on top of the person's profile, hiding their name, title, and company at the exact moment you need it to write something personal. So you close the modal, re-read the profile, reopen the modal, try to hold the details in working memory, and start writing. Every time. For every connection.

A small friction, but one that compounds fast when you're actively networking. And for a platform built around meaningful connection, it was a surprisingly avoidable problem.

The LinkedIn Add Note modal covering the profile
LinkedIn's "Add Note" modal blocking the profile info you need to write the message
Validated Fast · LinkedIn Community Post
5+ responses within hours.

I posted about the friction on LinkedIn. Product designers and engineers replied within hours confirming the same pain. That was the signal I needed to move forward.

Soumyarup Lahiri
Engineer at Apple

"This is something I deal with every single day."

Prarabdh G.
MS ECE · Carnegie Mellon

"Pretty cool solution. I would even like it."

Akanksha Murmure
Sr Product Designer

"So relatable! Love the speed of your brainstorming."

The Goal

Find a fix that anyone could use.

Goal

Fix the UX friction on LinkedIn's "Add Note" modal and ship a solution anyone could use publicly, not just a personal workaround.

The Friction

LinkedIn's modal covers the person's profile at the exact moment you need to read it to write something personal.

The Constraint

Lightweight, Chrome-compatible, no personal data parsed or recorded, and simple enough to ship publicly on the Chrome Web Store.

02 Design Process

Two decisions. Both tested.

I started by sketching on paper, not Figma. Six approaches for the same constraint: how do you expose profile context without creating a new interaction pattern? Each one tested against three questions: does it feel native? Does it break LinkedIn's layout? Can it be built safely without reading personal data?

One concept cleared all three. Then the icon needed two tries.

Hand-drawn UI iterations
Hand-drawn explorations across 6 UI approaches before picking up Figma

Why the final concept was selected for the build

Lightweight and technically feasible

A drag handle requires minimal DOM injection, no scraping, no new UI surface. One element. That's it.

🤖
Simplest to build with AI

Less complex logic meant Cursor could generate cleaner, more reliable code. Simpler to describe in a PRD, fewer edge cases to get wrong.

🔒
Zero personal data involved

Critical: the extension doesn't parse or record any personal data from the person receiving the connection request. Privacy-safe by design.

Icon iteration explorations for Draggit

Icon ideation sketches, exploring drag metaphors before landing on the 6-dot grip

Informal Test

Showed two icon options to two friends. Both picked the 6 dots. Both guessed "drag" without prompting.

03 Build Process

Vibecoded with AI tools.

I didn't just prompt-and-paste. I treated AI as a specialized collaborator on each phase of the build, with a different tool playing a different role. The design and product decisions stayed mine throughout.

ChatGPT
ChatGPT: Feasibility Check

Before writing code, used ChatGPT to evaluate the technical feasibility of each solution option. Key question: what can a Chrome extension actually do to LinkedIn's DOM? Confirmed injecting a drag handle via content script was viable.

Claude
Claude: Built the PRD

Wrote the full PRD, translating interaction specs, edge cases, and design decisions into structured engineering requirements. Having a PRD meant Cursor had clear context and constraints, not just vibes.

Cursor
Cursor: Built the Product

Built the Chrome extension: manifest, content script, drag logic, position memory. I directed the build, reviewed every output, debugged failures, and iterated when LinkedIn's dynamic DOM caused issues. Cursor wrote code; I owned the product.

Figma Make
Figma Make: Iterated the Icon

Rapidly explored UI variations of the drag handle and icon: color, size, shape, hover states without touching code each time. Landed on the 6-dot grid that tested best with real users.

04 The Product

One drag. Full context restored.

The Product: Connect with Convenience

Drag the modal

Move it to clearly see the hidden profile information: name, title, company, while you write.

No more close-and-reopen

Reference the profile while you're writing. No need to close the modal, re-read, and reopen just to double-check a spelling.

More confident networking

Write a personalised note knowing you have the full context in front of you. Fewer generic notes. More genuine first impressions.

05 Challenges

Rejected by Chrome. Debugged. Resubmitted.

After submitting, I received a rejection email. I was gutted, I'd put real work into this. But I decided to sit with it, read through the manifest carefully, understand exactly why Chrome had flagged it, and fix it properly. I'd gotten this far. I wasn't stopping at the finish line.

❌ Submission 1: Rejected
ConnectRight

Overly broad manifest permission flagged by Chrome. No appeal. Fix and resubmit.

✅ Submission 2: Approved
Draggit

Scoped permission to minimum needed. Rewrote manifest fields. Approved within 72 hours.

06 Impact

Goal met. Then some.

From a personal frustration to a live product with real users, the goal of fixing the friction and shipping it publicly was fully realised.

Live on Chrome Web Store
20+
Active Users
5★
Chrome Store Rating
07 Reflection

What I took away.

Build fast. Fail fast. Learn faster.

Simply animating a concept in Figma gave me everything I needed: validation that the pain was real, and early feedback on what features people actually wanted. I didn't need a polished prototype, a rough animation was enough to get signal.

🔄
Rejection is a debugging task.

The Chrome Store rejection forced me to understand the permission model properly. Highest-value moment of the whole build.

View more projects
View all 8 ↗
B2B SaaS Platform
CliquePrize

Small businesses deserved a landing page that spoke their language. We rebuilt it.

AI Dashboard [NDA]
OpsIQ

Small businesses had the data. They couldn't use it. We built the tool that changes that.