<?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: Matthew Raynor</title>
    <description>The latest articles on DEV Community by Matthew Raynor (@matthew_raynor_09db52ec02).</description>
    <link>https://dev.to/matthew_raynor_09db52ec02</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%2F1755817%2Ff2b0ae74-4bf4-474c-9ffb-ac0ac6f6a186.gif</url>
      <title>DEV Community: Matthew Raynor</title>
      <link>https://dev.to/matthew_raynor_09db52ec02</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matthew_raynor_09db52ec02"/>
    <language>en</language>
    <item>
      <title>I built a free job search tool that scrapes 185k+ engineering jobs by tech stack. Roast it.</title>
      <dc:creator>Matthew Raynor</dc:creator>
      <pubDate>Mon, 16 Mar 2026 20:02:38 +0000</pubDate>
      <link>https://dev.to/matthew_raynor_09db52ec02/i-built-a-free-job-search-tool-that-scrapes-185k-engineering-jobs-by-tech-stack-roast-it-57m4</link>
      <guid>https://dev.to/matthew_raynor_09db52ec02/i-built-a-free-job-search-tool-that-scrapes-185k-engineering-jobs-by-tech-stack-roast-it-57m4</guid>
      <description>&lt;p&gt;I've been job hunting as a full-stack dev. I usually do freelance work but I'm not the best businessman and honestly it would be nice if somebody just told me what to build and I could get paid. But all the jobs on LinkedIn are ghost jobs, they're just accumulating resumes into a black hole and none of them ever actually get checked. You write a whole cover letter for a job that doesn't exist.&lt;/p&gt;

&lt;p&gt;I checked out a bunch of the newer tools. HiringCafe looked like the backend wasn't even hooked up, which is kinda ridiculous. They have money. StackJobs wouldn't load. Scoutify wanted money and I was like nah, I'll just build this myself with Claude. Jobright kinda works but the matching wasn't what I wanted, I wanted to be able to search for specific engineering jobs that match my exact tech stack. Like I build with Django, React, TypeScript, I don't want to read through every JD guessing if they use what I use.&lt;/p&gt;

&lt;p&gt;So I built this thing called RepoRadar. I wanted it to be click click results, because my attention span is pretty short.&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%2F9cnszqkh70utd5b13hvd.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%2F9cnszqkh70utd5b13hvd.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  how it works
&lt;/h2&gt;

&lt;p&gt;Google SSO &amp;gt; upload your resume &amp;gt; Claude API parses it and auto-selects your tech stack &amp;gt; hit search &amp;gt; see matching jobs sorted by recent. This way you avoid the ghost jobs because everything's pulled fresh. You click a job and it takes you to the actual company page to apply. minimal bs.&lt;/p&gt;
&lt;h2&gt;
  
  
  where the jobs come from
&lt;/h2&gt;

&lt;p&gt;After doing some research it turns out most tech companies use one of like four ATS platforms and they all have public APIs. No auth needed. You can hit them as much as you want which is pretty sweet. So what I did is I mapped over 6,000 companies to their ATS platform Greenhouse, Lever, Ashby, Workable. I created a Celery beat task that hits all of them every morning around 6am and pulls fresh listings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://boards-api.greenhouse.io/v1/boards/stripe/jobs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That gives you every open role at Stripe in JSON. All four platforms work like this.&lt;/p&gt;

&lt;p&gt;I also pull from RemoteOK, Remotive, We Work Remotely, and the monthly HN Who's Hiring thread. But it's mostly from the ATS boards — there's some ridiculous amount that show up on RepoRadar, like 185,000 jobs right now.&lt;/p&gt;

&lt;p&gt;The mapping was honestly the hardest part of the whole project. Took way longer than expected, and I kept having to reprocess them and losing my SSH connection to Railway in the middle of it.&lt;/p&gt;
&lt;h2&gt;
  
  
  how the matching works
&lt;/h2&gt;

&lt;p&gt;Every job description gets run through a regex extractor with ~170 keyword patterns: Django, React, PostgreSQL, TypeScript, Next.js, etc. It tags each job with what it detected. When you search it just filters where your stack overlaps with what's in the JD.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;TECH_PATTERNS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\bdjango\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;react&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\breact(?:\.js|js)?\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;postgresql&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(?:postgres(?:ql)?|psql)\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;typescript&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\btypescript\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;next_js&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\bnext\.?js\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# ~170 more
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_techs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description_text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;detected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;text_lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;description_text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tech_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;TECH_PATTERNS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text_lower&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tech_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;detected&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No ML, no embeddings, no vector search. If I get some traffic maybe I'll add that stuff, who knows. Is it perfect? No. But is it tailored for engineering jobs? Absolutely.&lt;/p&gt;

&lt;p&gt;I also wanted to make it so you could search by what companies are actually building with. Like I build with Claude, so I want to find companies that match my exact workflow. That's kind of the vision.&lt;/p&gt;
&lt;h2&gt;
  
  
  the stack
&lt;/h2&gt;

&lt;p&gt;Django 5 / DRF on Railway, React 19 / TypeScript / Vite / Tailwind on Netlify, PostgreSQL, Redis + Celery for background jobs, Claude API for resume parsing, Google OAuth via django-allauth. Railway runs a single container that starts gunicorn and a Celery worker from a start.sh script. Frontend proxies API requests through netlify.toml. OAuth goes straight to Railway because you can't proxy OAuth redirects — learned that the hard way.&lt;/p&gt;
&lt;h2&gt;
  
  
  what I learned
&lt;/h2&gt;

&lt;p&gt;ATS public APIs are a goldmine. You can hit them way more than you can hit the GitHub API (which wasn't that useful anyway since most company repos are private). There's so many jobs out there it's actually crazy once you start pulling from these endpoints.&lt;/p&gt;

&lt;p&gt;The company-to-ATS mapping took way longer than writing the application. Like, significantly. Ok, maybe an exaggeration. But annoying either way&lt;/p&gt;

&lt;p&gt;Freshness matters more than volume. The older a posting is, the less likely you are to hear back from anybody. So everything on RepoRadar is sorted recent-first and refreshed daily.&lt;/p&gt;

&lt;p&gt;Originally I had set up a GitHub integration to search repos and find organizations by tech stack then map that way, but it turns out most company repos are private so that didn't work the way I wanted. I pivoted to focusing on the ATS boards and remote platforms instead.&lt;/p&gt;
&lt;h2&gt;
  
  
  what's not great
&lt;/h2&gt;

&lt;p&gt;6,200 companies is a lot but it's not everything, no Workday, iCIMS, or Taleo coverage yet. Regex misses some edge cases. And if I get concurrent user load I'm gonna have to split Celery out into its own Railway service instead of running it in the same container, but that's all doable.&lt;/p&gt;

&lt;p&gt;Right now I've got it hooked up with Sentry for monitoring. I'd love to add OpenTelemetry if I can get some real users on it. I also set up a bunch of MCP servers — Railway, Chrome MCP — but the Chrome one isn't that helpful because you can't get past the Google SSO login screen with it.&lt;/p&gt;
&lt;h2&gt;
  
  
  try it
&lt;/h2&gt;

&lt;p&gt;It's free. You can try it and complain to me and tell me what I did wrong — in fact I would love that. It'd be really cool if I can get some users on this thing.&lt;/p&gt;

&lt;p&gt;Note: I made it so you can filter for us remote only&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-netlify"&gt;
  &lt;iframe src="https://reporadar-app.netlify.app" title="Netlify embed"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;





&lt;p&gt;Email me: &lt;a href="mailto:Mnraynor90@gmail.com"&gt;Mnraynor90@gmail.com&lt;/a&gt; - Direct complaint line. Also can tell me its cool.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>django</category>
      <category>react</category>
    </item>
    <item>
      <title>A Quadriplegic Developer’s Story: From Nursing Home to Production Deployments</title>
      <dc:creator>Matthew Raynor</dc:creator>
      <pubDate>Mon, 26 May 2025 21:15:53 +0000</pubDate>
      <link>https://dev.to/matthew_raynor_09db52ec02/a-quadriplegic-developers-story-from-nursing-home-to-production-deployments-32bi</link>
      <guid>https://dev.to/matthew_raynor_09db52ec02/a-quadriplegic-developers-story-from-nursing-home-to-production-deployments-32bi</guid>
      <description>&lt;p&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%2Fvupsycu0ov2ov3i3b0vd.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%2Fvupsycu0ov2ov3i3b0vd.png" alt="Cover Image" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hi, I’m Matt — a self-taught full-stack developer and C5 quadriplegic.&lt;br&gt;&lt;br&gt;
Six years ago I was a commercial fisherman. A diving accident during a morning swim changed everything — I broke my neck. I Became paralyzed collarbone down and lost hand function. Eventually I ended up in a nursing home, alone, broke and powerless.&lt;/p&gt;

&lt;p&gt;I needed to take back control. So I taught myself how to code — day after day, typing one key at a time on an old Windows PC. It was slow. Frustrating. But I kept at it.&lt;/p&gt;

&lt;p&gt;With persistence, discipline and focus things evolved. The self-doubt was replaced with ability. &lt;/p&gt;

&lt;p&gt;Today, I build beautiful things with a MacBook, voice commands, styluses, and AI. And I’d love to share what I’ve made.&lt;/p&gt;




&lt;p&gt;🔧 Projects I'm Most Proud Of&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://www.matthewraynor.com" rel="noopener noreferrer"&gt;MatthewRaynor.com&lt;/a&gt; — My Flagship Portfolio Site&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/mattyray/matthew_raynor_website" rel="noopener noreferrer"&gt;💻 GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full case study portfolio with interactive project pages
&lt;/li&gt;
&lt;li&gt;Motivational blog (cross-posted to Substack)
&lt;/li&gt;
&lt;li&gt;Online store for my artwork &amp;amp; memoir &lt;/li&gt;
&lt;li&gt;OpenAI-powered chatbot I developed (and open-sourced)
&lt;/li&gt;
&lt;li&gt;Google SSO, Stripe Checkout, mobile-responsive
&lt;/li&gt;
&lt;li&gt;Dockerized, PostgreSQL, Whitenoise for static files
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;🚛 Art Mover App — For My First Client&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/mattyray/ej-art-mover" rel="noopener noreferrer"&gt;💻 GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Django-based CRM &amp;amp; logistics system
&lt;/li&gt;
&lt;li&gt;Work orders, invoicing (PDF), calendar scheduling
&lt;/li&gt;
&lt;li&gt;FullCalendar.js integration + dynamic AJAX forms &lt;/li&gt;
&lt;li&gt;Custom auth model, client side facing &lt;/li&gt;
&lt;li&gt;Admin dashboard, status tracking, and more
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;🤖 Django AI Chat Widget (Open Source)&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/mattyray/django-chatwidget" rel="noopener noreferrer"&gt;💻 GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drop-in Django app to embed OpenAI-powered assistants
&lt;/li&gt;
&lt;li&gt;JSON-configurable knowledge base
&lt;/li&gt;
&lt;li&gt;Custom UI with Bootstrap + ChatGPT backend
&lt;/li&gt;
&lt;li&gt;Packaged and published on GitHub
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;💸 Matt’s Fundraiser for Freedom  - To help me escape the nursing home &lt;br&gt;
🌐 &lt;a href="https://www.mattsfreedomfundraiser.com" rel="noopener noreferrer"&gt;Live Site&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/mattyray/fundraiser-website" rel="noopener noreferrer"&gt;💻 GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom donation platform (Django + Bootstrap 5)
&lt;/li&gt;
&lt;li&gt;Embedded YouTube documentary, blog, and AI chatbot
&lt;/li&gt;
&lt;li&gt;Live contact form, Heroku-deployed, donation CTA&lt;/li&gt;
&lt;li&gt;First practical application of my programming skills
&lt;/li&gt;
&lt;li&gt;Just dropped in my open source AI Widget and trained it to assist visitors&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;🔄 Django + React Work Orders App&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/mattyray/django-react-workorders" rel="noopener noreferrer"&gt;💻 GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separate Django REST API backend + React frontend
&lt;/li&gt;
&lt;li&gt;PostgreSQL database, Gunicorn, Dockerized
&lt;/li&gt;
&lt;li&gt;Tailwind-powered React UI built with Vite
&lt;/li&gt;
&lt;li&gt;Token-based authentication
&lt;/li&gt;
&lt;li&gt;Dynamic CRUD work order management
&lt;/li&gt;
&lt;li&gt;FullCalendar integration for event scheduling
&lt;/li&gt;
&lt;li&gt;Optimized build and deployment workflows
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I'm Open to Feedback &amp;amp; Opportunities&lt;/p&gt;

&lt;p&gt;I'm currently working with my first client, but I’m actively looking for freelance work, collaboration, or employment.&lt;/p&gt;

&lt;p&gt;If you’re a developer, I’d love your feedback — whether it’s code architecture, design, UX, or ideas for growth.&lt;/p&gt;

&lt;p&gt;If you’re someone hiring or mentoring — I’d be grateful to talk.&lt;/p&gt;

&lt;p&gt;And if you’re someone just trying to turn your life around like I was… never stop pushing. &lt;/p&gt;




&lt;p&gt;My Stuff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://www.matthewraynor.com" rel="noopener noreferrer"&gt;Visit MatthewRaynor.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/mattyray" rel="noopener noreferrer"&gt;GitHub – @mattyray&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;✍️ &lt;a href="https://substack.com/@mnraynor90" rel="noopener noreferrer"&gt;Substack – My Writing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>django</category>
      <category>react</category>
      <category>showdev</category>
      <category>career</category>
    </item>
  </channel>
</rss>
