<?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: Vaibhav Bhardwaj</title>
    <description>The latest articles on DEV Community by Vaibhav Bhardwaj (@vaibhavxbhardwaj).</description>
    <link>https://dev.to/vaibhavxbhardwaj</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%2F3876324%2Faf77e487-1687-4820-8396-fc12c677b382.png</url>
      <title>DEV Community: Vaibhav Bhardwaj</title>
      <link>https://dev.to/vaibhavxbhardwaj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vaibhavxbhardwaj"/>
    <language>en</language>
    <item>
      <title>ADpulse - a Forgotten Idea &gt;&lt;</title>
      <dc:creator>Vaibhav Bhardwaj</dc:creator>
      <pubDate>Sat, 23 May 2026 19:30:34 +0000</pubDate>
      <link>https://dev.to/vaibhavxbhardwaj/adpulse-a-forgotten-idea--46g0</link>
      <guid>https://dev.to/vaibhavxbhardwaj/adpulse-a-forgotten-idea--46g0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;AdPulse is a real-time e-commerce intelligence platform built for Amazon and Shopify&lt;br&gt;
sellers. The core idea is simple — connect your store and the platform automatically&lt;br&gt;
monitors what your competitors are charging, tracks inventory signals, and fires&lt;br&gt;
intelligent alerts the moment something changes. Price dropped below your threshold?&lt;br&gt;
Alert fires. You get a live dashboard showing your prices versus competitors over&lt;br&gt;
time with a drag and drop rule builder to define exactly what you want to be notified&lt;br&gt;
about.&lt;/p&gt;

&lt;p&gt;This is not a tutorial project. It mirrors the core product of funded startups like&lt;br&gt;
Atom11, Perpetua, and Sellics — companies that have raised millions of dollars building&lt;br&gt;
exactly this. I am building a production-grade version of their core product as my&lt;br&gt;
final year project.&lt;/p&gt;

&lt;p&gt;The tech stack is Node.js 20 + TypeScript 5 on the backend, PostgreSQL 16 with&lt;br&gt;
pgvector, Redis 7, Prisma ORM, Docker + Docker Compose, Nginx, JWT auth, bcrypt,&lt;br&gt;
Winston structured logging, and Next.js 14 on the frontend. Every architectural&lt;br&gt;
decision was made the way a real engineering team would make it — not the way a&lt;br&gt;
tutorial would.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/VaibhavXBhardwaj/adpulse" rel="noopener noreferrer"&gt;https://github.com/VaibhavXBhardwaj/adpulse&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The project is currently in active development — Day 9 of a 90 day build plan.&lt;br&gt;
The backend is fully functional and running in Docker. Here is what the API&lt;br&gt;
looks like right now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Health check — both services confirmed connected:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"services"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"database"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"connected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"connected"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"development"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Product created and tracked:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cmovax4zl000113o6wcv7579m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"asin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B08N5WRWNW"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apple AirPods Pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"brand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Electronics"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;360 price points seeded across 30 days — own price vs two competitors:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cmovb8k6m0003j29h2gz412fs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;258.06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"own"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recordedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-07T15:55:12.810Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Frontend dashboard, charts, and alert rule builder are coming in Days 29-56.&lt;br&gt;
Live deployment on AWS EC2 is planned for Days 57-70.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;This project started as a blank folder. No boilerplate, no starter template,&lt;br&gt;
no YouTube tutorial to follow. Just a PDF blueprint and a code editor.&lt;/p&gt;

&lt;p&gt;The first few days were rough. Docker port conflicts with three other projects&lt;br&gt;
running on my machine. Prisma 7 breaking changes that silently removed datasource&lt;br&gt;
URL support from schema files — had to debug that from a cryptic error message&lt;br&gt;
and downgrade to Prisma 5. The Prisma binary target mismatch between Windows and&lt;br&gt;
Alpine Linux inside Docker — the container was generating for Windows but needed&lt;br&gt;
linux-musl. Each one of these took real debugging to understand and fix properly.&lt;/p&gt;

&lt;p&gt;By Day 9 here is what is fully built and working:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monorepo with Node.js 20 + TypeScript 5 backend and Next.js 14 frontend&lt;/li&gt;
&lt;li&gt;Full Docker Compose stack — PostgreSQL 16 with pgvector, Redis 7, Nginx,
backend — all containerized and communicating correctly&lt;/li&gt;
&lt;li&gt;Complete Prisma schema with seven models — User, Tenant, Product, PricePoint,
Alert, Notification, ApiKey — with proper relations, indexes, and cascade deletes&lt;/li&gt;
&lt;li&gt;Environment variable validation that refuses to start with missing config&lt;/li&gt;
&lt;li&gt;Winston structured JSON logging with per-request HTTP logging middleware&lt;/li&gt;
&lt;li&gt;Global error handler that catches everything and returns consistent responses&lt;/li&gt;
&lt;li&gt;Full JWT authentication built from scratch — register creates a Tenant and User
in a single atomic Prisma transaction, bcrypt at cost factor 12, 7 day tokens&lt;/li&gt;
&lt;li&gt;RBAC middleware with ADMIN, ANALYST, VIEWER role hierarchy&lt;/li&gt;
&lt;li&gt;API key system — raw key shown once, SHA256 hash stored, same pattern Stripe uses&lt;/li&gt;
&lt;li&gt;Redis rate limiting per API key with sliding window and response headers&lt;/li&gt;
&lt;li&gt;Tenant isolation middleware — every database query is automatically scoped to
tenantId at the middleware level, not the application level&lt;/li&gt;
&lt;li&gt;Full products service — create, list with search and pagination, get by ID,
price history, competitor prices, delete&lt;/li&gt;
&lt;li&gt;PricePoint service with time series aggregation using PostgreSQL DATE() and
DISTINCT ON for efficient latest-per-source queries&lt;/li&gt;
&lt;li&gt;Mock price generator that creates 360 realistic price points across 30 days
for three sources — own, competitor_a, competitor_b&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The comeback is that every single one of those pieces was built correctly the&lt;br&gt;
first time in terms of architecture. No shortcuts. No copy-pasted code I cannot&lt;br&gt;
explain. Every design decision was made the way a real engineering team would&lt;br&gt;
make it.&lt;/p&gt;

&lt;p&gt;The project is not finished. That is the point. It is 90 days of consistent,&lt;br&gt;
committed, production-grade work. Every day gets a commit. The GitHub contribution&lt;br&gt;
graph will be green every single day until this ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;I have not used GitHub Copilot for the backend work built so far. Every line of&lt;br&gt;
the authentication system, RBAC middleware, tenant isolation, and pricing service&lt;br&gt;
was written manually — deliberately, because I needed to be able to explain every&lt;br&gt;
line of it in a technical interview.&lt;/p&gt;

&lt;p&gt;Starting from Day 29 when the frontend phase begins, I plan to use GitHub Copilot&lt;br&gt;
specifically for the Next.js dashboard UI work. My intended workflow is to write&lt;br&gt;
the component structure and business logic myself, then use Copilot to accelerate&lt;br&gt;
the repetitive parts — generating Tailwind class combinations for layout, scaffolding&lt;br&gt;
similar components once the pattern is established, and autocompleting recharts&lt;br&gt;
configuration once I have set up the first chart correctly.&lt;/p&gt;

&lt;p&gt;The goal is to use it as an acceleration tool for work where the pattern is already&lt;br&gt;
clear in my head, not as a replacement for thinking through the architecture. The&lt;br&gt;
backend was the architecture-heavy phase. The frontend is where speed matters more&lt;br&gt;
and Copilot fits naturally into that workflow.&lt;/p&gt;

&lt;p&gt;I will update this post when the frontend is complete with specific examples of&lt;br&gt;
where Copilot helped and where I still had to write things manually.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
    </item>
  </channel>
</rss>
