<?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: Kumar Nihal</title>
    <description>The latest articles on DEV Community by Kumar Nihal (@knihal12).</description>
    <link>https://dev.to/knihal12</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3766610%2F52ca5ad6-4940-41cd-87a8-c489ea9c5c60.jpeg</url>
      <title>DEV Community: Kumar Nihal</title>
      <link>https://dev.to/knihal12</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/knihal12"/>
    <language>en</language>
    <item>
      <title>What If Your AI Agent Had Hands? Building Causly Server with MCP</title>
      <dc:creator>Kumar Nihal</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:47:11 +0000</pubDate>
      <link>https://dev.to/knihal12/what-if-your-ai-agent-had-hands-building-causly-server-with-mcp-1e2b</link>
      <guid>https://dev.to/knihal12/what-if-your-ai-agent-had-hands-building-causly-server-with-mcp-1e2b</guid>
      <description>&lt;p&gt;What If Your AI Agent Had Hands?&lt;/p&gt;

&lt;p&gt;AI agents are getting pretty good at writing code. But writing code is only one part of software development.&lt;/p&gt;

&lt;p&gt;At some point, the agent needs to do something with that code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It needs to inspect the repository.&lt;/li&gt;
&lt;li&gt;Run a command.&lt;/li&gt;
&lt;li&gt;Update a database.&lt;/li&gt;
&lt;li&gt;Build a container.&lt;/li&gt;
&lt;li&gt;Deploy an application.&lt;/li&gt;
&lt;li&gt;Check an error.&lt;/li&gt;
&lt;li&gt;Update documentation.&lt;/li&gt;
&lt;li&gt;Send a message to the team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's where things start getting messy.&lt;/p&gt;

&lt;p&gt;The tools exist. The problem is that they're scattered across different environments.&lt;/p&gt;

&lt;p&gt;That's the problem I'm trying to solve with Causly Server.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;One MCP server, many capabilities&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Causly Server is an open-source local MCP server designed to give MCP-compatible AI agents access to a unified set of software-development capabilities.&lt;/p&gt;

&lt;p&gt;The idea looks roughly like this: &lt;strong&gt;Instead of configuring an agent around a collection of completely separate tool interfaces, Causly Server gives it a common MCP layer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent can discover the capability it needs and use it when the task requires it.&lt;/p&gt;

&lt;p&gt;And importantly, Causly Server isn't tied to a specific AI agent.&lt;/p&gt;

&lt;p&gt;If the agent supports MCP, the idea is that you can use it with Causly Server.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Claude, Cursor, Codex, or another MCP-compatible agent.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Use whatever agent you want. Give it Causly.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The real problem is context switching&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Imagine asking your agent:&lt;/em&gt; Fix this issue, update the database, deploy the application, and tell the team what changed.&lt;/p&gt;

&lt;p&gt;That's not one tool call.&lt;/p&gt;

&lt;p&gt;The task crosses several boundaries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Code
 ↓
Git
 ↓
Database
 ↓
Build
 ↓
Infrastructure
 ↓
Deployment
 ↓
Monitoring
 ↓
Communication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A capable agent shouldn't have to stop simply because the next part of the task lives somewhere else.&lt;/p&gt;

&lt;p&gt;That's the bigger idea behind Causly Server.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not more intelligence. More reach.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why MCP?
&lt;/h3&gt;

&lt;p&gt;MCP gives agents a common protocol for discovering and interacting with external capabilities.&lt;/p&gt;

&lt;p&gt;Causly Server uses that protocol as the interface between the agent and the tools around the development environment.&lt;/p&gt;

&lt;p&gt;There can be a large number of available capabilities, but they don't all need to be pushed into the agent's context at once.&lt;/p&gt;

&lt;p&gt;Causly Server uses lazy discovery/loading so the agent can work with the capabilities relevant to the current task.&lt;/p&gt;

&lt;p&gt;That's important.&lt;/p&gt;

&lt;p&gt;If an agent is fixing a file, it doesn't need to spend its context thinking about every infrastructure or communication tool available.&lt;/p&gt;

&lt;p&gt;The goal is capability without unnecessary context.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What can it do?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The current OSS project covers capabilities across areas such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Files and project management&lt;/li&gt;
&lt;li&gt;Git and GitHub&lt;/li&gt;
&lt;li&gt;Supabase&lt;/li&gt;
&lt;li&gt;PostgreSQL and SQL&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Terraform&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;li&gt;Gmail&lt;/li&gt;
&lt;li&gt;Vercel&lt;/li&gt;
&lt;li&gt;Security and credential handling&lt;/li&gt;
&lt;li&gt;Workflow tooling&lt;/li&gt;
&lt;li&gt;Project intelligence&lt;/li&gt;
&lt;li&gt;CI/CD-related operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project currently has a broad toolset, but it's still growing.&lt;/p&gt;

&lt;p&gt;There are more capabilities I want to add, including things around Linear, Jira, Kubernetes, and additional cloud infrastructure.&lt;/p&gt;

&lt;p&gt;It's local. And that's important.&lt;/p&gt;

&lt;p&gt;Causly Server OSS doesn't currently provide a separate Causly-managed execution environment.&lt;/p&gt;

&lt;p&gt;It runs in the user's environment.&lt;/p&gt;

&lt;p&gt;That means credentials and external service configuration remain the user's responsibility.&lt;/p&gt;

&lt;p&gt;Today, the setup is also intentionally developer-oriented: you fork the repository, clone it, configure the environment, and connect the server to your MCP-compatible agent.&lt;/p&gt;

&lt;p&gt;There isn't a polished one-command installer yet.&lt;/p&gt;

&lt;p&gt;That's one of the things I want to improve.&lt;/p&gt;

&lt;p&gt;Giving an agent power also means giving it boundaries&lt;/p&gt;

&lt;p&gt;A system that can interact with your environment shouldn't blindly execute everything.&lt;/p&gt;

&lt;p&gt;Causly Server can require confirmation for potentially destructive operations.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Agent:&lt;br&gt;
I need to run this Terraform operation.&lt;/p&gt;

&lt;p&gt;This may modify your infrastructure.&lt;br&gt;
Continue?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yes&lt;br&gt;
No&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The same idea applies to potentially destructive Docker or infrastructure operations.&lt;/p&gt;

&lt;p&gt;For workflows where the user explicitly wants fewer interruptions, an always-allow option can also be configured.&lt;/p&gt;

&lt;p&gt;The goal isn't to make the agent powerless. It's to make its actions visible and controllable.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And there are still limitations&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Causly Server is open source and still under active development. It doesn't have its own isolated execution environment yet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setup is still manual.&lt;/li&gt;
&lt;li&gt;Some cloud operations intentionally require the user to perform the final operation themselves.&lt;/li&gt;
&lt;li&gt;Some workflow/CLI tools can consume more tokens because a task may involve multiple tools and repeated operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there are still integrations missing.&lt;/p&gt;

&lt;p&gt;That's okay.&lt;/p&gt;

&lt;p&gt;I'd rather show exactly where the project is today than pretend it is something it isn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why open source?
&lt;/h3&gt;

&lt;p&gt;Because I don't think the question of how AI agents should interact with software environments has a single answer.&lt;/p&gt;

&lt;p&gt;There are interesting problems around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool discovery&lt;/li&gt;
&lt;li&gt;Permissions&lt;/li&gt;
&lt;li&gt;Credential handling&lt;/li&gt;
&lt;li&gt;Local execution&lt;/li&gt;
&lt;li&gt;Destructive operations&lt;/li&gt;
&lt;li&gt;Context management&lt;/li&gt;
&lt;li&gt;Agent workflows&lt;/li&gt;
&lt;li&gt;Infrastructure access&lt;/li&gt;
&lt;li&gt;Security boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Causly Server is my attempt to explore those problems in the open.&lt;/p&gt;

&lt;p&gt;And I'd like other developers building with AI agents to help shape it.&lt;/p&gt;

&lt;p&gt;What if your agent had hands?&lt;/p&gt;

&lt;p&gt;That's the question behind Causly Server.&lt;/p&gt;

&lt;p&gt;AI agents already have brains.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They can reason.&lt;/li&gt;
&lt;li&gt;They can plan.&lt;/li&gt;
&lt;li&gt;They can write code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But software work doesn't happen inside a text box.&lt;/p&gt;

&lt;p&gt;It happens across files, repositories, databases, infrastructure, deployment systems, communication tools, and everything around them.&lt;/p&gt;

&lt;p&gt;Causly Server is an attempt to connect those worlds through one MCP interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Use whatever agent you want. Give it Causly.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And let it move from writing code to actually working on the software around that code.&lt;/p&gt;

&lt;p&gt;🔗 Full article: &lt;a href="https://www.causly.in/lab/causly-server-what-if-your-ai-agent-had-hands" rel="noopener noreferrer"&gt;https://www.causly.in/lab/causly-server-what-if-your-ai-agent-had-hands&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 GitHub: &lt;a href="https://github.com/KNIHAL/causly-server" rel="noopener noreferrer"&gt;https://github.com/KNIHAL/causly-server&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>automation</category>
    </item>
    <item>
      <title>I Spent 4 Hours Debugging Google OAuth… Then I Deleted the Feature (A Lesson While Building My First SaaS)</title>
      <dc:creator>Kumar Nihal</dc:creator>
      <pubDate>Thu, 19 Mar 2026 14:35:27 +0000</pubDate>
      <link>https://dev.to/knihal12/i-spent-4-hours-debugging-google-oauth-then-i-deleted-the-feature-a-lesson-while-building-my-4n6d</link>
      <guid>https://dev.to/knihal12/i-spent-4-hours-debugging-google-oauth-then-i-deleted-the-feature-a-lesson-while-building-my-4n6d</guid>
      <description>&lt;p&gt;A few days ago I shared the architecture flow diagram of my SaaS project, LeadIt.&lt;/p&gt;

&lt;p&gt;After that, I also shared a post explaining the core backend components I built — things like the company search API, the analysis engine, lead scoring logic, and the AI outreach generator.&lt;/p&gt;

&lt;p&gt;Since then I’ve been slowly turning those pieces into an actual working product.&lt;/p&gt;

&lt;p&gt;Most of the backend core is now working, and I’ve also been building the landing page that explains the product and its workflow.&lt;/p&gt;

&lt;p&gt;But while trying to implement the next feature — email automation using Gmail OAuth — I ran into a problem that ended up teaching me one of the most important lessons about building MVPs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Plan: Let Users Send Emails From the Platform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the backend intelligence layer was working, the next step felt obvious.&lt;br&gt;
Users should be able to send outreach emails directly from LeadIt.&lt;/p&gt;

&lt;p&gt;The flow I imagined was simple.&lt;br&gt;
A user connects their Gmail account → LeadIt generates an AI outreach message → the user can send the email directly from the platform.&lt;br&gt;
To make that work, I needed Google OAuth with Gmail API access.&lt;/p&gt;

&lt;p&gt;The expected flow looked something like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User logs in using Google OAuth&lt;/li&gt;
&lt;li&gt;LeadIt asks for permission to access Gmail&lt;/li&gt;
&lt;li&gt;Google returns an access token and refresh token&lt;/li&gt;
&lt;li&gt;Those tokens get stored in my Supabase database&lt;/li&gt;
&lt;li&gt;LeadIt uses the Gmail API to send outreach emails automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On paper, this looked straightforward.&lt;br&gt;
But implementing it was a completely different experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting Up Google Cloud&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started by setting up everything inside Google Cloud Console (GCP).&lt;/p&gt;

&lt;p&gt;The usual steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a Google Cloud project&lt;/li&gt;
&lt;li&gt;Enabled the Gmail API&lt;/li&gt;
&lt;li&gt;Configured the OAuth consent screen&lt;/li&gt;
&lt;li&gt;Generated Client ID and Client Secret&lt;/li&gt;
&lt;li&gt;Added redirect URIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Something like this:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="http://localhost:3000/api/auth/callback/google" rel="noopener noreferrer"&gt;http://localhost:3000/api/auth/callback/google&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then I added Gmail permissions using scopes like:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://www.googleapis.com/auth/gmail.send" rel="noopener noreferrer"&gt;https://www.googleapis.com/auth/gmail.send&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At this point everything looked correct.&lt;br&gt;
The configuration seemed fine.&lt;br&gt;
So I moved forward with integrating authentication in the app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication Worked… But the Token Didn’t&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s the weird part.&lt;br&gt;
The Google login itself worked perfectly.&lt;br&gt;
Users could sign in successfully.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OAuth redirect worked&lt;/li&gt;
&lt;li&gt;Client ID was valid&lt;/li&gt;
&lt;li&gt;Consent screen worked&lt;/li&gt;
&lt;li&gt;Authentication succeeded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the Gmail provider token never got stored in my database.&lt;br&gt;
And that token is the most important part.&lt;/p&gt;

&lt;p&gt;Without it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no Gmail API calls&lt;/li&gt;
&lt;li&gt;no sending emails&lt;/li&gt;
&lt;li&gt;no automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So even though authentication worked, the feature itself was useless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 4-Hour Debugging Spiral&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where things started getting frustrating. I spent around 3–4 hours debugging the issue. And I checked almost everything I could think of.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database Layer&lt;/strong&gt;&lt;br&gt;
 First I checked Supabase.&lt;br&gt;
Things I verified:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;database connection&lt;/li&gt;
&lt;li&gt;user table structure&lt;/li&gt;
&lt;li&gt;provider token fields&lt;/li&gt;
&lt;li&gt;row level security policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything looked correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server-Side Logic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then I checked the backend logic.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OAuth callback handler&lt;/li&gt;
&lt;li&gt;parsing provider tokens&lt;/li&gt;
&lt;li&gt;inserting tokens into the database&lt;/li&gt;
&lt;li&gt;session handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client-Side Flow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then I checked the frontend flow.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication session&lt;/li&gt;
&lt;li&gt;provider response&lt;/li&gt;
&lt;li&gt;token availability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again… nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Cloud Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At this point I went back to Google Cloud.&lt;/p&gt;

&lt;p&gt;Checked again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OAuth scopes&lt;/li&gt;
&lt;li&gt;redirect URLs&lt;/li&gt;
&lt;li&gt;Gmail API permissions&lt;/li&gt;
&lt;li&gt;client ID configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything looked fine.&lt;br&gt;
Yet somehow the provider token was never reaching my database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Realization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After spending hours debugging this, I finally asked myself a simple question.&lt;br&gt;
Do I actually need this feature right now?&lt;br&gt;
And the honest answer was: &lt;strong&gt;No&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The real core of LeadIt is not Gmail automation.&lt;/p&gt;

&lt;p&gt;The real core is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;discovering companies&lt;/li&gt;
&lt;li&gt;analyzing their websites&lt;/li&gt;
&lt;li&gt;detecting opportunity signals&lt;/li&gt;
&lt;li&gt;generating AI outreach messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sending emails automatically is definitely useful.&lt;br&gt;
But it is not required to validate the product idea.&lt;br&gt;
And that’s when I made a decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Founder Decision: Cut the Feature&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of wasting more time on OAuth complexity, I decided to remove the feature from the MVP.&lt;br&gt;
Gmail automation will move to Version 2.&lt;br&gt;
For the MVP, the product will focus only on the core features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;company search&lt;/li&gt;
&lt;li&gt;website analysis&lt;/li&gt;
&lt;li&gt;lead discovery&lt;/li&gt;
&lt;li&gt;lead scoring&lt;/li&gt;
&lt;li&gt;AI outreach message generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of automatic email sending, users can simply: &lt;em&gt;copy the generated message and send it manually.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s simple.&lt;br&gt;
But for an MVP, simple is actually good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplifying Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While thinking about this, I also made another decision.&lt;/p&gt;

&lt;p&gt;Instead of implementing complex OAuth systems right now, I’ll use simple Next.js authentication for the MVP.&lt;/p&gt;

&lt;p&gt;OAuth systems bring a lot of complexity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;client IDs&lt;/li&gt;
&lt;li&gt;redirect flows&lt;/li&gt;
&lt;li&gt;token storage&lt;/li&gt;
&lt;li&gt;refresh tokens&lt;/li&gt;
&lt;li&gt;permission scopes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of that takes time to build and even more time to debug.&lt;br&gt;
Right now my focus is simple.&lt;br&gt;
Ship the product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Landing Page Progress&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alongside the backend work, I’ve also been building the LeadIt landing page.&lt;br&gt;
It’s almost complete now.&lt;br&gt;
Soon I’ll share a preview of the landing page and I’d genuinely love feedback from other builders here.&lt;br&gt;
Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;does the product idea make sense?&lt;/li&gt;
&lt;li&gt;is the value proposition clear?&lt;/li&gt;
&lt;li&gt;would you try a tool like this?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Getting early feedback is honestly one of the most useful things when building something from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Today Actually Taught Me&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At first, today felt like a wasted day.&lt;br&gt;
I didn’t ship the feature I planned.&lt;br&gt;
But in reality, I learned something much more important.&lt;br&gt;
Startups don’t need perfect products.&lt;br&gt;
They need working MVPs.&lt;br&gt;
That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shipping fast&lt;/li&gt;
&lt;li&gt;avoiding unnecessary complexity&lt;/li&gt;
&lt;li&gt;cutting features when needed&lt;/li&gt;
&lt;li&gt;Sometimes the smartest engineering decision isn’t fixing the problem.&lt;/li&gt;
&lt;li&gt;Sometimes it’s removing the problem entirely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Final Thought&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building your first SaaS is messy.&lt;br&gt;
You’ll spend hours debugging things that might not even matter in the final product.&lt;br&gt;
But every one of those moments teaches you something about building, prioritizing, and shipping faster.&lt;br&gt;
LeadIt is still very early.&lt;br&gt;
But every small step is slowly turning the idea into a real product.&lt;br&gt;
And honestly, that’s the fun part of the journey.&lt;/p&gt;

&lt;p&gt;If you're building something right now, I’m curious:&lt;br&gt;
Have you ever spent hours debugging a feature… only to realize you didn’t actually need it?&lt;/p&gt;

</description>
      <category>learning</category>
      <category>saas</category>
      <category>sideprojects</category>
      <category>startup</category>
    </item>
    <item>
      <title>From Architecture to Reality: Building My First SaaS (LeadIt) with AI Outreach and Company Analysis</title>
      <dc:creator>Kumar Nihal</dc:creator>
      <pubDate>Sat, 14 Mar 2026 12:21:03 +0000</pubDate>
      <link>https://dev.to/knihal12/from-architecture-to-reality-building-my-first-saas-leadit-with-ai-outreach-and-company-analysis-4f37</link>
      <guid>https://dev.to/knihal12/from-architecture-to-reality-building-my-first-saas-leadit-with-ai-outreach-and-company-analysis-4f37</guid>
      <description>&lt;p&gt;Two days ago I shared the architecture flow diagram of my SaaS project LeadIt.&lt;/p&gt;

&lt;p&gt;Today I want to share what actually happened after that.&lt;/p&gt;

&lt;p&gt;Over the last two days, I started turning that architecture into real working modules. Instead of just diagrams and ideas, LeadIt now has actual APIs, a company analysis engine, and an AI-powered outreach generator.&lt;/p&gt;

&lt;p&gt;This post is basically a build log of what I implemented and what I learned while building my first SaaS product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is LeadIt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LeadIt is a project I’m building to help with B2B lead discovery and AI-powered outreach.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find companies&lt;/li&gt;
&lt;li&gt;Analyze their websites&lt;/li&gt;
&lt;li&gt;Detect opportunity signals&lt;/li&gt;
&lt;li&gt;Generate personalized outreach emails&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of manually researching companies and writing cold emails, the system tries to automate most of that process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Setting Up the Company Search API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first thing I worked on was the database layer.&lt;/p&gt;

&lt;p&gt;I connected my backend with Supabase and verified that I could fetch company records successfully.&lt;/p&gt;

&lt;p&gt;Once the connection was stable, I built a Company Search API.&lt;/p&gt;

&lt;p&gt;This API supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;searching companies by company_name&lt;/li&gt;
&lt;li&gt;filtering by country&lt;/li&gt;
&lt;li&gt;filtering by category&lt;/li&gt;
&lt;li&gt;pagination using page, limit, and offset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pagination was important because once the database grows, returning thousands of records in a single request would slow everything down.&lt;/p&gt;

&lt;p&gt;I also made the response lightweight by returning only the required fields instead of full database objects.&lt;/p&gt;

&lt;p&gt;After testing the endpoint, it successfully fetched companies like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zapier&lt;/li&gt;
&lt;li&gt;Freshworks&lt;/li&gt;
&lt;li&gt;Postman&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seeing clean API responses was a small but satisfying milestone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Building the Company Analyze Engine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once companies could be fetched from the database, the next step was analyzing them.&lt;/p&gt;

&lt;p&gt;For this, I built what I call the Company Analyze Engine.&lt;br&gt;
The idea is to automatically scan a company website and detect useful signals.&lt;br&gt;
To achieve this, I used Playwright for automated browsing.&lt;/p&gt;

&lt;p&gt;The engine visits key pages of a company website:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;homepage&lt;/li&gt;
&lt;li&gt;careers page&lt;/li&gt;
&lt;li&gt;API documentation&lt;/li&gt;
&lt;li&gt;integrations page&lt;/li&gt;
&lt;li&gt;product pages&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To keep the scraper lightweight and fast, I blocked heavy resources like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;images&lt;/li&gt;
&lt;li&gt;fonts&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This significantly improves scraping speed.&lt;/p&gt;

&lt;p&gt;During analysis, the engine looks for business signals, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hiring activity&lt;/li&gt;
&lt;li&gt;availability of APIs&lt;/li&gt;
&lt;li&gt;integrations with other tools&lt;/li&gt;
&lt;li&gt;automation-related keywords&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These signals help determine whether the company might be a good B2B opportunity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Building the Lead Scoring Engine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After detecting signals, I implemented a rule-based lead scoring system.&lt;br&gt;
The goal here is to turn raw signals into a clear opportunity score.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Companies hiring engineers may be scaling fast&lt;/li&gt;
&lt;li&gt;Companies offering APIs may be developer-focused&lt;/li&gt;
&lt;li&gt;Companies mentioning automation might be good targets for outreach tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system calculates a lead opportunity score and also explains the reason behind the score.&lt;/p&gt;

&lt;p&gt;The company endpoint now returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;detected signals&lt;/li&gt;
&lt;li&gt;opportunity score&lt;/li&gt;
&lt;li&gt;reasoning behind the score&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This module basically acts as the intelligence layer of LeadIt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Building the AI Outreach Generator&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the system identifies potential opportunities, the next step is outreach.&lt;/p&gt;

&lt;p&gt;So I built the AI Outreach Generator.&lt;/p&gt;

&lt;p&gt;This module generates personalized cold emails using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;company signals&lt;/li&gt;
&lt;li&gt;company context&lt;/li&gt;
&lt;li&gt;user skills&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the AI model, I integrated Groq LLM using the llama-3.1-8b-instant model.&lt;/p&gt;

&lt;p&gt;To make the emails more effective, I designed three outreach styles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Observation Style: Point out something interesting about the company.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Opportunity Style: Suggest a possible improvement or opportunity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Curiosity Style: Spark curiosity to encourage a reply.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI response is then parsed into structured output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;email subject&lt;/li&gt;
&lt;li&gt;email body&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The endpoint now takes company signals and generates context-aware outreach emails automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Production Considerations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even though this is an early version, I tried to keep production stability in mind.&lt;/p&gt;

&lt;p&gt;Some safeguards I added include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input sanitization&lt;/li&gt;
&lt;li&gt;prompt injection protection&lt;/li&gt;
&lt;li&gt;token limits&lt;/li&gt;
&lt;li&gt;timeout protection&lt;/li&gt;
&lt;li&gt;rate limiting&lt;/li&gt;
&lt;li&gt;concurrency limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These help prevent abuse and keep the system stable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Debugging Moment: Tailwind CSS Version Conflict&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not everything went smoothly.&lt;/p&gt;

&lt;p&gt;While setting up Next.js 14, I kept getting repeated build errors related to Tailwind CSS.&lt;br&gt;
After debugging configs and dependencies, I realized the issue:&lt;/p&gt;

&lt;p&gt;I had installed Tailwind CSS v4, which is designed for Next.js 15.&lt;br&gt;
But my project runs on Next.js 14, which caused PostCSS and CSS compilation errors.&lt;/p&gt;

&lt;p&gt;The fix was simply downgrading to: Tailwind CSS v3&lt;/p&gt;

&lt;p&gt;Once I did that, the build errors disappeared.&lt;br&gt;
A small mistake, but a good reminder about framework compatibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where LeadIt Stands Now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After the last two days of development, LeadIt can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;search companies from a database&lt;/li&gt;
&lt;li&gt;analyze company websites automatically&lt;/li&gt;
&lt;li&gt;detect business signals&lt;/li&gt;
&lt;li&gt;calculate lead opportunity scores&lt;/li&gt;
&lt;li&gt;generate AI-powered outreach emails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is starting to look like the foundation of an automated B2B lead generation platform.&lt;/p&gt;

&lt;p&gt;Still early days, but it’s exciting to see the architecture slowly turn into a real product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building your first SaaS product is chaotic.&lt;/p&gt;

&lt;p&gt;You spend hours debugging small things.&lt;br&gt;
You question your architecture decisions.&lt;br&gt;
You rewrite code multiple times.&lt;/p&gt;

&lt;p&gt;But the moment your system actually starts working — APIs responding, AI generating emails, data flowing — it feels incredible.&lt;/p&gt;

&lt;p&gt;LeadIt is still early, but the core engine is finally starting to work.&lt;/p&gt;

&lt;p&gt;And that feels like real progress.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;If you're also building a SaaS or experimenting with AI tools,&lt;br&gt;
I'd love to hear what you're working on.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>nextjs</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building my first AI lead generation SaaS (LeadIt) — MVP architecture</title>
      <dc:creator>Kumar Nihal</dc:creator>
      <pubDate>Thu, 12 Mar 2026 09:41:07 +0000</pubDate>
      <link>https://dev.to/knihal12/building-my-first-ai-lead-generation-saas-leadit-mvp-architecture-f1d</link>
      <guid>https://dev.to/knihal12/building-my-first-ai-lead-generation-saas-leadit-mvp-architecture-f1d</guid>
      <description>&lt;p&gt;Hi everyone 👋&lt;/p&gt;

&lt;p&gt;I'm currently building my first SaaS product called &lt;strong&gt;LeadIt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea behind LeadIt is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality over quantity in lead generation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of scraping thousands of random leads, the system tries to identify &lt;strong&gt;companies that actually show signals of being a good fit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is still an &lt;strong&gt;MVP&lt;/strong&gt;, and I'm trying to keep the architecture simple while validating the idea.&lt;/p&gt;

&lt;p&gt;Here is the architecture I designed for the MVP:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp39sm8k1u8cfclfhm70e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp39sm8k1u8cfclfhm70e.png" alt=" " width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Next.js UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Next.js server API&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Google OAuth 2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Lead Analysis Modules
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Scraper using Playwright&lt;/li&gt;
&lt;li&gt;Web intelligence using Tavily API&lt;/li&gt;
&lt;li&gt;Signals detection (job listings, API docs, integration pages)&lt;/li&gt;
&lt;li&gt;AI-generated outreach emails&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Groq for LLM processing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supabase database&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Outreach
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gmail API for sending emails&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Workflow
&lt;/h2&gt;

&lt;p&gt;The flow of the system is roughly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User searches for companies&lt;/li&gt;
&lt;li&gt;Scraper collects company data&lt;/li&gt;
&lt;li&gt;Signals detection analyzes companies&lt;/li&gt;
&lt;li&gt;AI generates personalized outreach emails&lt;/li&gt;
&lt;li&gt;Emails are sent and tracked using Gmail API&lt;/li&gt;
&lt;li&gt;Data is stored in Supabase&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Why I'm building this
&lt;/h2&gt;

&lt;p&gt;I noticed that most lead generation tools focus on &lt;strong&gt;volume&lt;/strong&gt;, not &lt;strong&gt;relevance&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal of LeadIt is to find &lt;strong&gt;high-quality opportunities&lt;/strong&gt; instead of sending thousands of cold emails.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feedback welcome 🙏
&lt;/h2&gt;

&lt;p&gt;Since this is still an MVP, I’d love feedback from other builders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this architecture make sense?&lt;/li&gt;
&lt;li&gt;Am I overengineering anything?&lt;/li&gt;
&lt;li&gt;What would you simplify?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm building this &lt;strong&gt;in public&lt;/strong&gt;, so I'll keep sharing progress as I go.&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>saas</category>
      <category>ai</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
