<?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: AN</title>
    <description>The latest articles on DEV Community by AN (@an_8d1ae8c6e66bb).</description>
    <link>https://dev.to/an_8d1ae8c6e66bb</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%2F3713218%2F7699ec54-8acd-42f4-9034-5084a8e1ae91.png</url>
      <title>DEV Community: AN</title>
      <link>https://dev.to/an_8d1ae8c6e66bb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/an_8d1ae8c6e66bb"/>
    <language>en</language>
    <item>
      <title>I built a tool to stop wasting 15 hours/week job hunting (and it monitors 6 platforms automatically)</title>
      <dc:creator>AN</dc:creator>
      <pubDate>Mon, 19 Jan 2026 14:12:11 +0000</pubDate>
      <link>https://dev.to/an_8d1ae8c6e66bb/i-built-a-tool-to-stop-wasting-15-hoursweek-job-hunting-and-it-monitors-6-platforms-automatically-27ki</link>
      <guid>https://dev.to/an_8d1ae8c6e66bb/i-built-a-tool-to-stop-wasting-15-hoursweek-job-hunting-and-it-monitors-6-platforms-automatically-27ki</guid>
      <description>&lt;h2&gt;
  
  
  The Problem 😫
&lt;/h2&gt;

&lt;p&gt;As a freelance developer/consultant, I was spending &lt;strong&gt;15+ hours every week&lt;/strong&gt; manually checking job boards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reddit (r/forhire, r/startups, r/freelance, etc.)&lt;/li&gt;
&lt;li&gt;Hacker News (Ask HN, Who's Hiring)&lt;/li&gt;
&lt;li&gt;Dev.to jobs&lt;/li&gt;
&lt;li&gt;Product Hunt jobs&lt;/li&gt;
&lt;li&gt;RemoteOK&lt;/li&gt;
&lt;li&gt;We Work Remotely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The worst part? I'd miss posts that went up at 3 AM. By the time I woke up, they'd have 50+ responses already.&lt;/p&gt;

&lt;p&gt;I was always &lt;strong&gt;too late&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Breaking Point 💔
&lt;/h2&gt;

&lt;p&gt;One month, I tracked my time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;15 hours/week&lt;/strong&gt; scrolling job boards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;780 hours/year&lt;/strong&gt; wasted&lt;/li&gt;
&lt;li&gt;At my consulting rate ($100/hr) = &lt;strong&gt;$78,000/year&lt;/strong&gt; in opportunity cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus, I was only finding 10-15 opportunities per week because I couldn't check everything constantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution 🚀
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Craffr&lt;/strong&gt; - a tool that monitors all 6 platforms automatically and sends instant email alerts when opportunities match my skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add keywords&lt;/strong&gt; ("React developer", "Node.js", "full-stack", etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select platforms&lt;/strong&gt; to monitor (or use smart presets)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get email alerts&lt;/strong&gt; within 5 minutes of posts going live&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be first to respond&lt;/strong&gt; and win more clients&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Here's what I used to build this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 15 (App Router)&lt;/li&gt;
&lt;li&gt;TypeScript (strict mode)&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;Shadcn/ui components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase (Postgres + Auth + Real-time)&lt;/li&gt;
&lt;li&gt;Next.js API routes&lt;/li&gt;
&lt;li&gt;OpenAI API (for quality scoring)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Platform Monitoring:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reddit: RSS feeds (no rate limits!)&lt;/li&gt;
&lt;li&gt;Hacker News: Algolia API&lt;/li&gt;
&lt;li&gt;Dev.to: Public API&lt;/li&gt;
&lt;li&gt;RemoteOK: RSS feed&lt;/li&gt;
&lt;li&gt;We Work Remotely: RSS feed&lt;/li&gt;
&lt;li&gt;Product Hunt: GraphQL API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Email:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resend (for email delivery)&lt;/li&gt;
&lt;li&gt;React Email (for templates)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hosting:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vercel (Next.js)&lt;/li&gt;
&lt;li&gt;Supabase (database + auth)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Technical Challenges 🛠️
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Email Deliverability
&lt;/h3&gt;

&lt;p&gt;Getting emails to inbox (not spam) was &lt;strong&gt;the hardest part&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SPF, DKIM, DMARC records are critical&lt;/li&gt;
&lt;li&gt;Use a dedicated email service (Resend &amp;gt; SendGrid for my use case)&lt;/li&gt;
&lt;li&gt;Warm up sending domain gradually&lt;/li&gt;
&lt;li&gt;Monitor bounce rates obsessively&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 98% deliverability rate&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Rate Limits
&lt;/h3&gt;

&lt;p&gt;Different platforms have different limits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rateLimits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;reddit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;None (RSS)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 🎉&lt;/span&gt;
  &lt;span class="na"&gt;hackerNews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10,000 requests/day (Algolia)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;devTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;30 requests/min&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;remoteOK&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No official limit (RSS)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;weWorkRemotely&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No official limit (RSS)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;productHunt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100 requests/hour&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Batch requests intelligently&lt;/li&gt;
&lt;li&gt;Cache aggressively&lt;/li&gt;
&lt;li&gt;Use exponential backoff&lt;/li&gt;
&lt;li&gt;Poll at different frequencies per platform&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. AI Quality Scoring
&lt;/h3&gt;

&lt;p&gt;Not all "jobs" are real jobs. Needed to filter spam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approach:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scorePost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JobPost&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
    Score this job post quality (0-1):
    - Is it a real job? (not spam/scam)
    - Is it clearly written?
    - Does it have a budget/rate?
    - Is the poster credible?

    Post: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
  `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 88% accuracy filtering spam&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Duplicate Detection
&lt;/h3&gt;

&lt;p&gt;Same job appears on multiple platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hash title + description&lt;/li&gt;
&lt;li&gt;Fuzzy matching for slight variations&lt;/li&gt;
&lt;li&gt;95% accuracy&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results (My Own Usage) 📊
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before Craffr:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏰ 15 hours/week searching&lt;/li&gt;
&lt;li&gt;📧 10-15 opportunities/week found&lt;/li&gt;
&lt;li&gt;🐢 12-hour average response time&lt;/li&gt;
&lt;li&gt;📉 ~15% win rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After Craffr:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏰ 30 minutes/week (just responding!)&lt;/li&gt;
&lt;li&gt;📧 60-100 opportunities/week found&lt;/li&gt;
&lt;li&gt;⚡ 15-minute average response time&lt;/li&gt;
&lt;li&gt;📈 ~28% win rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real impact:&lt;/strong&gt; 12 new clients in 6 months. Average project value: $5K-15K.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│     Platform Monitoring (Cron Jobs)     │
│  Reddit | HN | Dev.to | PH | RO | WWR  │
└──────────────┬──────────────────────────┘
               │
               ▼
┌─────────────────────────────────────────┐
│         Supabase (PostgreSQL)           │
│   • job_posts table                     │
│   • user_keywords table                 │
│   • user_alerts table                   │
└──────────────┬──────────────────────────┘
               │
               ▼
┌─────────────────────────────────────────┐
│      Matching Engine + AI Filter        │
│   • Keyword matching                    │
│   • OpenAI quality scoring              │
│   • Duplicate detection                 │
└──────────────┬──────────────────────────┘
               │
               ▼
┌─────────────────────────────────────────┐
│      Email Delivery (Resend)            │
│   • Instant alerts                      │
│   • Daily digest (optional)             │
└─────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code Snippet: Reddit RSS Monitor
&lt;/h2&gt;

&lt;p&gt;Here's how I monitor Reddit (simplified):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/cron/monitor-reddit/route.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Parser&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rss-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@supabase/supabase-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Parser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SUPABASE_URL&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SUPABASE_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subreddits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;forhire&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;startups&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;freelance_forhire&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sub&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;subreddits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parseURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;`https://www.reddit.com/r/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/new/.rss`&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Check if already in database&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;existing&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;job_posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;external_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;single&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Insert new post&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;job_posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;external_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reddit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;posted_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pubDate&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="c1"&gt;// Match against user keywords&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;matchAndAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lessons Learned 🎓
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Reddit RSS &amp;gt; Scraping
&lt;/h3&gt;

&lt;p&gt;Reddit's RSS feeds are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Legal (no ToS violation)&lt;/li&gt;
&lt;li&gt;✅ Reliable (rarely down)&lt;/li&gt;
&lt;li&gt;✅ No rate limits&lt;/li&gt;
&lt;li&gt;✅ Simple to parse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't overcomplicate with scraping.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Start with One Platform
&lt;/h3&gt;

&lt;p&gt;I initially tried to build all 6 platforms at once. Bad idea.&lt;/p&gt;

&lt;p&gt;Better approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with Reddit only (2 weeks)&lt;/li&gt;
&lt;li&gt;Get users, get feedback&lt;/li&gt;
&lt;li&gt;Add one platform at a time&lt;/li&gt;
&lt;li&gt;Each platform = new marketing push&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. Free Tools = Growth Hack
&lt;/h3&gt;

&lt;p&gt;Built 3 free tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reddit Lead Finder&lt;/li&gt;
&lt;li&gt;Freelance Rate Calculator&lt;/li&gt;
&lt;li&gt;Response Timer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These drove &lt;strong&gt;50%&lt;/strong&gt; of my signups. Give value first.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Pricing is Hard
&lt;/h3&gt;

&lt;p&gt;Tried 3 different pricing models:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v1:&lt;/strong&gt; $20/month (too cheap, didn't value it)&lt;br&gt;
&lt;strong&gt;v2:&lt;/strong&gt; $99/month (too expensive, no conversions)&lt;br&gt;
&lt;strong&gt;v3:&lt;/strong&gt; $49/month ✅ (sweet spot)&lt;/p&gt;

&lt;p&gt;Also learned: 7-day free trial &amp;gt; forever free tier&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Email Deliverability Takes Time
&lt;/h3&gt;

&lt;p&gt;Don't launch with email alerts on day 1. You need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Warm up your domain (2-4 weeks)&lt;/li&gt;
&lt;li&gt;Start with low volume&lt;/li&gt;
&lt;li&gt;Monitor bounce rates&lt;/li&gt;
&lt;li&gt;Gradually increase&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next 🔮
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;February:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter/X monitoring (most requested feature)&lt;/li&gt;
&lt;li&gt;Mobile app (React Native)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;March:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discord community monitoring&lt;/li&gt;
&lt;li&gt;Slack integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Q2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LinkedIn posts monitoring&lt;/li&gt;
&lt;li&gt;API for developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; $10K MRR by June&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself 🚀
&lt;/h2&gt;

&lt;p&gt;I'm offering the Dev.to community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;7-day free trial&lt;/strong&gt; (no credit card)&lt;/li&gt;
&lt;li&gt;Use code &lt;code&gt;DEVTO50&lt;/code&gt; for &lt;strong&gt;50% off first month&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Live site:&lt;/strong&gt; &lt;a href="https://craffr.com" rel="noopener noreferrer"&gt;https://craffr.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also built free tools&lt;/strong&gt; (no signup required):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reddit Lead Finder: &lt;a href="https://craffr.com/tools/reddit-lead-finder" rel="noopener noreferrer"&gt;https://craffr.com/tools/reddit-lead-finder&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rate Calculator: &lt;a href="https://craffr.com/tools/rate-calculator" rel="noopener noreferrer"&gt;https://craffr.com/tools/rate-calculator&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Questions? 💬
&lt;/h2&gt;

&lt;p&gt;Happy to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Technical implementation details&lt;/li&gt;
&lt;li&gt;How I approach freelance lead gen&lt;/li&gt;
&lt;li&gt;Pricing strategies&lt;/li&gt;
&lt;li&gt;Launch tactics&lt;/li&gt;
&lt;li&gt;Anything else!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop your questions in the comments 👇&lt;/p&gt;




&lt;p&gt;*Currently live on Product Hunt too if you want to support: &lt;a href="https://www.producthunt.com/products/craffr?launch=craffr" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/craffr?launch=craffr&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  BuildInPublic #Freelance #SaaS #NextJS #TypeScript
&lt;/h1&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>saas</category>
      <category>freelance</category>
    </item>
  </channel>
</rss>
