
TL;DR
TanTap is a Business Relationship Management platform that helps B2B teams track who's talking to which companies and what's happening next. Started as a QR business card generator, pivoted when I realized my friend's startup was drowning in spreadsheets. Currently in active development with a paying customer and a mobile app hitting the Play Store. Built with Next.js 16, Supabase, and probably too much AI.
Why I Built This
My friend Iheb runs a startup. One day over coffee, he was complaining about how his team had no idea who was talking to which potential partners. They tried a bunch of tools even ClickUp but nothing felt right. Too complex, too sales-focused, or just not built for how small teams actually work.
At the time, I was finishing up this QR code business card generator. You know, one of those "I'll build something cool over the weekend" projects. But hearing Iheb's frustration made me think: what if I combined these? Business owners need simple ways to manage relationships AND share their info. Plus, I'd been wanting to learn multi-tenancy properly, and this seemed like a perfect excuse.
The real trigger though? Iheb kept talking about his problem weeks later. When someone won't shut up about a problem, that's usually a sign it's worth solving.
What I Was Trying to Solve
Here's the thing about B2B relationships: they're messy. Your salesperson talked to Company X in March. Your CTO had a call with them in June. Your CEO ran into their founder at a conference. Nobody knows what anyone else said, what was promised, or what the next step should be.
Existing solutions? CRMs are built for sales pipelines and territory management. They're overkill. ClickUp and project management tools work, but you're fighting the tool to do something it wasn't designed for. Nothing just tracks relationships simply.
The problem isn't that tools don't exist. It's that they solve the wrong problem. Teams need visibility, not automation. They need to know "who talked to whom and what happened" not "predictive AI lead scoring" or whatever.
How I Actually Built It
The Pivot That Wasn't Really a Pivot
I had already built the QR business card generator. It worked you could generate vCards, create PDF business cards, even make email signatures for entire teams. I was about to ship it when Iheb's problem kept nagging at me.
Then I realized: why not both? Business owners need relationship tracking AND they need to share their contact info. So I kept all the QR/business card features (they're under Tools now) and built the BRM platform around it. The code was there. Why throw it away?
Starting With What I Wanted to Learn
I'll be honest I chose this project partly because I wanted to understand multi-tenancy. How do you build an app where Company A can't see Company B's data? Row Level Security in Supabase seemed perfect for this.
And it was! Until it wasn't.
Getting RLS working was actually pretty smooth. The database schema with organization_id everywhere, the policies that automatically filter queries it all clicked. But then I realized something: for an MVP, this was overkill. I was spending days setting up the perfect multi-tenant architecture when I had zero customers.
So I made a call: keep the structure (because I'd already built it), but stop obsessing over enterprise-grade isolation. Ship first, iterate later. Once we have actual customers with actual security concerns, I'll tighten it up. Right now? Iheb and his team are my only users. They're not exactly going to hack each other.
Lesson learned: Sometimes "I want to learn X" is valid, but know when to stop learning and start shipping.
The Features That Actually Mattered
I built three core pieces first:
1. Contacts (the companies you work with) This is the heart of it. Track who you're doing business with, what stage the relationship is in (Initial Contact -> Negotiating -> Active -> Paused -> Churned), and all the boring details like website, contact info, etc.
The interesting part: automatic logo extraction from company websites. Give me a URL, I'll grab the favicon. Small detail, but it makes the UI feel alive instead of just a boring table.
2. Activities (what happened) Meetings, calls, emails, contracts log everything manually. I know everyone's obsessed with auto-logging from calendar and email, but here's the thing: manual logging forces you to think about what actually matters. If you can't be bothered to write "had coffee with X, discussed Y," was it really important?
Plus, building email/calendar integration is a time sink. Maybe later.
3. Projects (tracking specific initiatives) Sometimes you're not just maintaining a relationship you're working on something specific with them. Projects let you link contacts to actual work, set priorities, track budgets. The folder UI metaphor came from watching how people actually organize work. Everyone gets folders.



The AI Experiment
Iheb specifically asked for AI features. So I built 3 AI features.
Quick Create from Business Card Point your camera at a business card (or any sign, poster, whatever) and we'll extract the company info and create a contact. Uses vision AI to read text, then structures it into our fields. This actually works really well and feels like magic when you use it.
Website Scraping Give me a company website, I'll try to extract address, email, phone, etc. This... doesn't work as well. Websites are chaos. Some put contact info in footers, some in dedicated pages, some hide it behind forms. I got it working like 60% of the time, which isn't good enough. Still iterating on this.
The AI Agent Rebuild Initially, I built the AI as a series of single-purpose prompts. "Create a project" was one prompt, "log an activity" was another. Dumb.
Then I realized: this should be an agent with tools. Let the LLM decide what to do based on what the user asks. Built it properly using Mastra framework the agent can search existing contacts, create projects, log activities, whatever it needs. Way better UX.
(Side note: I just discovered Vercel's new AI workflow tools. Need to check if that's better than what I built. Always something new to learn.)

The Features That Kicked My Ass
CSV Import Everyone wants to import their existing contact list. Simple, right? Wrong.
Every CSV is different. Column names vary "Company Name" vs "Business" vs "Organization" vs "Name". Some have phone numbers formatted as +1-234-567-8900, some as (234) 567-8900, some as 2345678900. Some have multiple contacts per company, some have one.
I built a mapper that tries to auto-match columns based on names and patterns, then lets you manually fix the rest. It works, but it took forever to get right. Import features are never as simple as they seem.
Business Card Export I wanted to generate actual PDF business cards from contact data. Not just vCards physical, printable cards. Still haven't finished this. The layout is hard (what if someone has a long company name? what about multiple phone numbers?), and making it look professional without being a designer is brutal.
It's in the codebase, it's 70% done, but it's not shipped. One day.
The Design Paralysis Trap
Ahmed (my friend who's building the mobile app) and I wasted two entire days trying different card/tile designs for displaying contacts. Should they be cards? Should they have shadows? Rounded corners? What about the hierarchy name big, company small, or vice versa?
We built like six different versions. Compared them. Rebuilt them. Then we looked at actual CRMs and realized: they all just use tables. Boring, simple, scannable tables.
We switched to a table view and moved on. Shipped more features that week than the entire previous week.
The lesson: Design can be a procrastination tool disguised as work. Sometimes the boring solution is the right solution. Make it work first, make it pretty later.
After that realization, we made a pact: skip the beauty, focus on the logic. Get it working, ship it, refine later. The app doesn't look bad (shadcn/ui carries hard), but we stopped obsessing over pixel-perfect designs.
Tech Stack Decisions
Next.js 16 + React 19: Wanted to stay current, learn the new stuff. App Router is great once you get over the Server Components learning curve. No regrets here.
Supabase: PostgreSQL + auth + real-time + storage in one package. RLS policies are powerful when you need them. The TypeScript type generation from the database schema is chef's kiss.
shadcn/ui: This saved my life. I'm not a designer. Having good-looking components that I can customize without fighting a design system? Perfect. The sidebar component alone saved me days of work.
Mastra for AI: Relatively new framework, but it handles LLM agents and tools cleanly. Better than duct-taping together OpenAI calls and function parsing.
Tailwind v4: Utility-first CSS just makes sense to me now. Took a while to click, but once it did, I can't go back.
The "Oh Shit" Moments
1. Multi-tenancy Rabbit Hole Week two, I'm deep in RLS policies, testing edge cases, reading Supabase docs at 2 AM. Then I step back and realize: I have no users. Why am I optimizing for enterprise-scale security? Stopped, shipped, moved on.
2. The AI Agent Rewrite Built the whole AI interaction as separate prompts. Launched it to Iheb. He tried it and said "can it do X and Y in one request?" Nope. Couldn't. Realized I built it wrong. Spent two days rebuilding it as a proper agent with tools. Now it works like people expect.
3. The Import CSV Feature Thought I'd knock this out in an afternoon. Three days later, I'm still debugging why some CSVs parse correctly and others don't. Learned more about character encoding, CSV parsing edge cases, and data normalization than I ever wanted to know.
The Mobile App Saga
Ahmed is building the mobile version (React Native). We're in review on the Play Store right now huge milestone. We collaborate daily: I handle the web app, he handles mobile, we share the same Supabase backend.
The split works because we made a key decision early: API-first design. Everything goes through Supabase, so web and mobile stay in sync. No custom backend logic that only works on one platform.
We're also learning together. When I figure out something on the web side (like the AI agent architecture), I share it with Ahmed so he can implement similarly on mobile. When he figures out a UX pattern that works better on mobile, I steal it for the web. Good collaboration.
The First Customer
Remember Iheb, the friend who inspired this? I made him pay.

Not a lot 10 dinars (about $3 USD). But real money. Why? Because Ahmed recommended this book called "The Million Dollar Weekend" that emphasizes getting people to pay something, even if it's tiny. It proves they value it. It keeps them engaged. It makes them a customer, not a favor recipient.
I actually took a photo of the payment notification because it felt surreal. My first paying customer for something I built.
And you know what? It worked. Iheb takes the app seriously because he paid for it. He requests features, reports bugs, uses it regularly. He's not just humoring me he's invested.
Next meeting, I'm pushing him to add his team members. I've already set up PostHog analytics to see how they actually use it. Real usage data will tell me what to build next.


What I Learned
Technical Stuff
CSV import is harder than I thought: Data is messy. People are messy. Expect every edge case. Build a good mapper UI early.
AI agents need tools, not scripts: Single purpose prompts feel like chatbots. Agents with tools that decide what to do feel like assistants. Big difference.
Tables > Cards for data-heavy UIs: Everyone wants cards and tiles because they look modern. But when you have lots of data, tables win. They're boring for a reason they work.
Product Stuff
Charge early, even if it's small: That 10 dinars changed the relationship with Iheb. He's a customer now, not a friend doing me a favor.
Design can be procrastination: Two days on card designs taught me that "making it pretty" can be an excuse to avoid shipping. Function first.
Build for one person first: I'm building for Iheb's team. Not "B2B companies" in the abstract. Specific use case, specific people. It keeps decisions clear.
Features you think are easy often aren't: CSV import, business card export, website scraping all seemed like "afternoon tasks." All took days or weeks. Always underestimate your optimism.
Collaboration Stuff
Ahmed and I work well because we split clearly: web vs mobile. No overlap, no confusion. When we hit design paralysis, we call it out and move on. We're both learners, not experts, so we're comfortable being wrong.
Where It Stands Now
We're actively building. Not "maintaining," not "on hold" actively shipping features.
Current status:
- Web app: Production, being used by Iheb and me
- Mobile app: In Google Play Store review (🤞)
- Users: 3 people (Iheb, Ahmed, me)
- Revenue: 10 dinars/month (😄)
- Next milestone: Get Iheb's team onboarded, watch how they use it
What's next:
- Finish the business card export (that 70% haunts me)
- Improve website scraping accuracy
- Watch PostHog analytics when Iheb's team starts using it
- Iterate based on real usage patterns
- Maybe explore Vercel's 'use workflow' new tool
Why it's not "done": Because it's not abandoned it's in use. Done means shipped and forgotten. This is shipped and evolving.
The learnings are already paying off. I'm using this tech stack for other projects. The multi-tenancy patterns I figured out here? Applied them elsewhere. The "ship fast, refine later" mindset? Changed how I approach everything now.
Would I Do It Again?
Yes, but differently.
What I'd keep:
- The pivot to combine QR cards + BRM (why waste working code?)
- Charging Iheb early (even small amounts matter)
- The API-first design for web + mobile
- Using shadcn/ui (designer's best friend)
- The "function over beauty" rule Ahmed and I adopted
What I'd change:
- Skip the multi-tenancy deep dive until I had 10+ customers
- Build the CSV importer with more pessimism about data quality
- Start with tables for data-heavy UIs (learned this the hard way)
- Set clearer scope: "3 features, ship, then iterate" instead of "let's build everything"
Would I build this knowing what I know now about BRM tools?
Honestly? Yes. Not because the market is wide open or because I'll make millions. But because I learned a ton, I helped a friend solve a real problem, and I'm building something people (ok, 3 people) actually use.
Plus, the mobile app hitting the Play Store? That's a real milestone. Most projects don't get that far.
The Stack
Frontend: Next.js 15, React 19, Tailwind CSS v4, shadcn/ui
Backend: Supabase (PostgreSQL, Auth, Storage, Real-time)
AI: Mastra framework, OpenAI, Vercel AI SDK
Mobile: Flutter (Ahmed's domain)
Analytics: PostHog
Forms: react-hook-form + Zod
Email: Resend + React Email
Working With Others
The collaboration has been smooth because we made clear boundaries: Ahmed owns mobile, I own web, we share the backend.
The key insight: design can kill momentum if you let it. When we caught ourselves spending days on how contacts should look instead of building the features that matter, we made a pact. Ship ugly, refine later. That mindset shift accelerated everything.
Having Iheb as our first paying customer (even at $3/month) was crucial. He's not just a user he's a stakeholder. He requests features, reports bugs, and keeps us honest about what actually matters vs what's just cool to build.
Constraints & Tradeoffs
Time constraint: Building solo (+ Ahmed on mobile) means I had to be ruthless about scope. Multi-tenancy deep dive? Cut it. Perfect website scraping? Good enough for now. Business card export? 70% done is fine until users actually ask for it.
Design constraint: I'm not a designer. shadcn/ui carried me hard, but it also meant I had to accept "good enough" instead of "pixel perfect." The tradeoff: I shipped faster and learned more about functionality than aesthetics.
AI features: Added because Iheb asked, but also because I wanted to experiment. The tradeoff: spent time on something that's "nice to have" not "must have." But the learning about AI agents and tools? That's paying off in other projects now.
CSV import complexity: Could've punted on this. Most MVPs don't need it. But I knew real adoption meant letting people bring their existing data. Built it knowing it would take longer than expected. Worth it.
The biggest tradeoff: perfectionism vs shipping. I chose shipping every time, and I'd do it again.
TanTap is live and evolving. If you're tracking B2B relationships in spreadsheets and want something simpler, hit me up. If you're building something similar and want to compare notes, even better. https://www.tantap.app