<?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: Natali Hall</title>
    <description>The latest articles on DEV Community by Natali Hall (@nataligmhall).</description>
    <link>https://dev.to/nataligmhall</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%2F1099451%2F874096ec-f4d6-4897-97b7-51da067ec1c2.jpeg</url>
      <title>DEV Community: Natali Hall</title>
      <link>https://dev.to/nataligmhall</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nataligmhall"/>
    <language>en</language>
    <item>
      <title>Get a Mac notification when a Greenhouse, Lever, or Ashby job is posted</title>
      <dc:creator>Natali Hall</dc:creator>
      <pubDate>Wed, 07 Oct 2026 10:00:43 +0000</pubDate>
      <link>https://dev.to/nataligmhall/get-a-mac-notification-when-a-greenhouse-lever-or-ashby-job-is-posted-3e54</link>
      <guid>https://dev.to/nataligmhall/get-a-mac-notification-when-a-greenhouse-lever-or-ashby-job-is-posted-3e54</guid>
      <description>&lt;p&gt;I keep a short list of companies I actually want to work at. I work in marketing, and a broad search turns up a lot of roles outside those companies and outside the places I can work.&lt;/p&gt;

&lt;p&gt;Once I have a link I use &lt;a href="https://github.com/career-ops-hq/career-ops" rel="noopener noreferrer"&gt;career-ops&lt;/a&gt;. It scores the role and drafts the resume. It has the capability to search for jobs for me, but it doesn't always identify the best fits and it also only runs when I tell it to. I built &lt;a href="https://github.com/nataligmhall/job-alerts" rel="noopener noreferrer"&gt;job-alerts&lt;/a&gt; for the step before that: a Mac notification when one of those companies posts something new so that I can apply as soon as a new vacancy drops.&lt;/p&gt;

&lt;p&gt;It reads public Greenhouse, Lever, and Ashby feeds. It does not apply for you.&lt;/p&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnupkloeomcstdvli9ahr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnupkloeomcstdvli9ahr.png" alt="A notification as soon as a new job appears at a watched company" width="714" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;p&gt;A Mac with Python 3, which is already there, and the board name for each company. The repo watches nobody until you add one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/nataligmhall/job-alerts.git
&lt;span class="nb"&gt;cd &lt;/span&gt;job-alerts
&lt;span class="nb"&gt;cp &lt;/span&gt;companies.example.json companies.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;companies.json&lt;/code&gt; is gitignored, so your list is not part of a public copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a company
&lt;/h2&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Acme"&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;"greenhouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"board"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acme"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&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="s2"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"product marketing"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"locations"&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="s2"&gt;"remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"toronto"&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="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;code&gt;keywords&lt;/code&gt; and &lt;code&gt;locations&lt;/code&gt; are optional. Leave them empty to hear about every new role. A role that does not match is still remembered, so changing the filter later does not replay the whole board. A role the board marks as remote matches a &lt;code&gt;remote&lt;/code&gt; location even when the city is somewhere else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Greenhouse.&lt;/strong&gt; The token is the slug in &lt;code&gt;https://boards-api.greenhouse.io/v1/boards/TOKEN/jobs&lt;/code&gt;. Open that URL. If you get JSON, the token is right. &lt;code&gt;"source"&lt;/code&gt; is &lt;code&gt;"greenhouse"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lever.&lt;/strong&gt; The site name is the last part of &lt;code&gt;https://jobs.lever.co/SITE&lt;/code&gt;. The feed is &lt;code&gt;https://api.lever.co/v0/postings/SITE?mode=json&lt;/code&gt;. &lt;code&gt;"source"&lt;/code&gt; is &lt;code&gt;"lever"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ashby.&lt;/strong&gt; The board name is the last part of &lt;code&gt;https://jobs.ashbyhq.com/NAME&lt;/code&gt;. The feed is &lt;code&gt;https://api.ashbyhq.com/posting-api/job-board/NAME&lt;/code&gt;. &lt;code&gt;"source"&lt;/code&gt; is &lt;code&gt;"ashby"&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn on the notification
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 watch.py &lt;span class="nt"&gt;--install&lt;/span&gt;
python3 watch.py &lt;span class="nt"&gt;--status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This checks every 5 minutes while you are logged in and the Mac is awake. The first time, allow notifications for Vacancy tracker in System Settings.&lt;/p&gt;

&lt;p&gt;Click a role banner and the job opens. The first time a company is added, every current role is remembered and no alert is sent. Alerts start with roles posted after that.&lt;/p&gt;

&lt;p&gt;Closing the lid usually sleeps the Mac, so the banner for a role posted while you were away shows up when you open it.&lt;/p&gt;

&lt;p&gt;To stop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 watch.py &lt;span class="nt"&gt;--uninstall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  If the laptop is asleep
&lt;/h2&gt;

&lt;p&gt;The GitHub Action in the repo can open an issue while the machine is off. It does nothing until &lt;code&gt;companies.json&lt;/code&gt; is committed, so put that file in your own copy, made with &lt;strong&gt;Use this template&lt;/strong&gt;. A fork of this repo stays public, which would publish your company list.&lt;/p&gt;

&lt;p&gt;Each new role becomes an issue titled &lt;code&gt;Company: Role&lt;/code&gt;, with the apply link. Close it when you have applied, or when you are not interested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then what
&lt;/h2&gt;

&lt;p&gt;Paste the link into career-ops. That is the step that scores the fit and drafts the resume. You still press submit.&lt;/p&gt;

</description>
      <category>python</category>
      <category>career</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
