<?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: oscyp</title>
    <description>The latest articles on DEV Community by oscyp (@oscyp).</description>
    <link>https://dev.to/oscyp</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%2F612400%2F06addb00-e68b-444a-a4b4-cfc4c7c53dbf.png</url>
      <title>DEV Community: oscyp</title>
      <link>https://dev.to/oscyp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oscyp"/>
    <language>en</language>
    <item>
      <title>AI Job Tracker &amp; Resume Tailoring Tool</title>
      <dc:creator>oscyp</dc:creator>
      <pubDate>Wed, 27 May 2026 14:44:52 +0000</pubDate>
      <link>https://dev.to/oscyp/your-job-search-is-a-crm-problem-i-built-the-crm-2iej</link>
      <guid>https://dev.to/oscyp/your-job-search-is-a-crm-problem-i-built-the-crm-2iej</guid>
      <description>&lt;p&gt;The job market in 2026 is brutal. Tech layoffs keep rolling, "open" roles get 500+ applicants in 48 hours, and every posting is a contest against hundreds of other qualified people. If you're job hunting right now, you're not just looking for work, you're competing in a crowded auction where the only way to win is to apply to more roles, faster, with a sharper pitch each time.&lt;/p&gt;

&lt;p&gt;Which is exactly the problem. Three weeks into my own search last year, I opened a spreadsheet and realized I had no idea what I'd applied for. Was it the Series B fintech or the agency? Did I already send a follow-up to the recruiter from Tuesday? Which version of my CV did I attach?&lt;/p&gt;

&lt;p&gt;Job hunting isn't a motivation problem. It's a &lt;strong&gt;data problem&lt;/strong&gt;. You're running a parallel pipeline of 30+ leads, each with its own stage, contact, deadline, and required artifact - and you're managing it in browser tabs and Gmail search. Meanwhile the person who lands the offer is the one who showed up with a CV tuned to that exact job description.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://jobtrackr.it/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=launch-post" rel="noopener noreferrer"&gt;&lt;strong&gt;JobTrackr.it&lt;/strong&gt;&lt;/a&gt; - a job application tracker that does the boring parts for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  The feature that actually changed my job search
&lt;/h2&gt;

&lt;p&gt;Every tracker on the market lets you list jobs. That's table stakes. The thing that made me ship JobTrackr instead of giving up on the project was &lt;strong&gt;resume tailoring&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You upload your CV once. Then, for any saved job, the AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scores how well your CV matches the job description (0–100)&lt;/li&gt;
&lt;li&gt;Flags missing keywords the ATS will filter on&lt;/li&gt;
&lt;li&gt;Suggests which bullets to rewrite, reorder, or cut&lt;/li&gt;
&lt;li&gt;Generates a tailored version you can copy out&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first time I ran it on a real job, it caught three keywords I'd buried at the bottom of my CV and one I didn't have at all. I rewrote the bullets in five minutes. I got the interview.&lt;/p&gt;

&lt;p&gt;This is the feature I personally use the most, and it's the one I'd build first if I started over.&lt;/p&gt;




&lt;h2&gt;
  
  
  Everything else it does
&lt;/h2&gt;

&lt;p&gt;I grouped the rest into four buckets so you can skip what you don't care about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📥 Capture &amp;amp; track&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-click save from any job site&lt;/strong&gt; via the Chrome / Firefox / Edge extension - right-click → &lt;em&gt;Save to JobTrackr&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI extraction from URLs&lt;/strong&gt;: paste a LinkedIn / Indeed / careers-page link, get company, role, location, salary, and suggested interview stages auto-filled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status machine&lt;/strong&gt; with real transitions (&lt;code&gt;saved → applied → in_process → offer → hired&lt;/code&gt;) and undo paths for when "rejected" companies suddenly reply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow-up reminders&lt;/strong&gt; so you stop wondering whether it's been too long.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-ghosting &amp;amp; auto-archiving&lt;/strong&gt; on configurable thresholds, so dead leads don't clutter your pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📄 Resume superpowers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI resume analysis with an ATS score, strengths, weaknesses, and concrete fixes.&lt;/li&gt;
&lt;li&gt;Resume tailoring per job (the one above).&lt;/li&gt;
&lt;li&gt;CV-vs-job match scoring with gap analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📊 See where your search is leaking&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Sankey diagram&lt;/strong&gt; of your funnel - instantly shows you &lt;em&gt;"80% of my apps die at the recruiter screen"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Advanced analytics: response rate, interview rate, offer rate, time-to-response by company, status trends over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-currency salary comparison&lt;/strong&gt; across 11 currencies - no more mental math comparing a €70k Berlin offer to a $95k remote US role.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🧑‍🏫 AI coaching&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A chat assistant that has context on your applications. Ask &lt;em&gt;"should I negotiate this offer?"&lt;/em&gt; and it actually knows what offer you mean.&lt;/li&gt;
&lt;li&gt;Practice interview quizzes auto-generated from a specific job posting - behavioral, technical, role-specific - with feedback.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The stack, and 3 things I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; React 18 + Vite for the app, Astro 5 for the marketing site, Supabase for everything backend (Postgres, Auth, Storage, Edge Functions on Deno), Tailwind, Recharts for the Sankey, Stripe for billing, Turborepo + pnpm to glue it together. The browser extension is plain WebExtension API + esbuild, built three times for Chrome/Firefox/Edge.&lt;/p&gt;

&lt;p&gt;Three things I'd tell past-me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You don't need a state library.&lt;/strong&gt; I started reaching for Zustand on day one. Ended up with two React Contexts (~1,400 lines for the main one) plus &lt;code&gt;useMemo&lt;/code&gt; for derived state. Optimistic updates - UI changes first, DB write fires-and-forgets with a &lt;code&gt;.catch()&lt;/code&gt; - make the whole app feel instant without any library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store your "is-this-user-Pro?" flag separately from Stripe.&lt;/strong&gt; I keep &lt;code&gt;user_profile.plan&lt;/code&gt; as the source of truth for feature gating, and the Stripe &lt;code&gt;subscriptions&lt;/code&gt; table only for billing metadata. This sounds redundant until you need to manually grant Pro to a friend, or Stripe is down, or you want to test feature gates without a webhook round-trip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalize URLs &lt;em&gt;before&lt;/em&gt; you check for duplicates.&lt;/strong&gt; LinkedIn appends ~14 tracking params to every job URL. Without stripping &lt;code&gt;www&lt;/code&gt;, query strings, and trailing slashes (and lowercasing), users had the same job saved four times. One-line fix, would've saved a week of "why are there duplicates?" bug reports.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Free vs Pro
&lt;/h2&gt;

&lt;p&gt;The free tier lets you try every feature. Pro unlocks unlimited use of the AI features and analytics. No credit card to start.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it (and tell me what your setup looks like)
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://jobtrackr.it/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=launch-post" rel="noopener noreferrer"&gt;&lt;strong&gt;jobtrackr.it&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One specific ask: &lt;strong&gt;drop a comment with what your current job-tracking setup looks like.&lt;/strong&gt; Spreadsheet? Notion? Memory and vibes? I'm collecting horror stories to figure out what to build next.&lt;/p&gt;

&lt;p&gt;Happy hunting.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>NightSwitcher</title>
      <dc:creator>oscyp</dc:creator>
      <pubDate>Sat, 19 Feb 2022 18:56:04 +0000</pubDate>
      <link>https://dev.to/oscyp/nightswitcher-132d</link>
      <guid>https://dev.to/oscyp/nightswitcher-132d</guid>
      <description>&lt;p&gt;Hi all, NightSwitcher is the result of my free time in the week. Basically, I was lacking the functionality to quickly change themes in applications, so after doing some research, I decided to write a system tray application that could extend Windows functionality.&lt;/p&gt;

&lt;p&gt;It's a simple app where you can toggle the current app theme with some extras like auto-turn on.&lt;/p&gt;

&lt;p&gt;Key functionalities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double click the icon to change the theme&lt;/li&gt;
&lt;li&gt;Manually change the light / dark mode of the application with a simple switch&lt;/li&gt;
&lt;li&gt;Auto-turn - adjust the time when dark mode is to turn on and when to turn off&lt;/li&gt;
&lt;li&gt;Run on startup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give it a try and feel free to contribute!&lt;/p&gt;

&lt;p&gt;Here you can find it: &lt;a href="https://github.com/oscyp/NightSwitcher"&gt;https://github.com/oscyp/NightSwitcher&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: Apart from the fact that the application is written in .NET 6, it only works on Windows.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>wpf</category>
      <category>opensource</category>
      <category>xaml</category>
    </item>
  </channel>
</rss>
