It’s been a lot of work for me to keep my jobs page up-to-date. Previously, I’ve been crawling through LinkedIn a couple times a day to try to find all the relevant IT jobs. However, many were still getting missed. So I signed up for the USAJobs API, and wrote a script to scrape relevant technology jobs from it. (As always, that script is open source, so you can take it and manipulate it for your own regular searches.) My default settings only searches for GS-12 and above, technology-related job series (2210, 1550, 1560), does not include defense, intelligence, and law-enforcement agencies: DOD, DOJ, and most of DHS are excluded (except for CISA and FEMA).

I only post the most interesting results on my jobs page, but I figured some folks would want access to the full firehose of positions, so I’ve set up a new page for all the results from that search, and it has its own RSS feed as well. I’m not 100% happy with this setup, since the main jobs feed has a few jobs that are not federal jobs, and thus don’t show up on the usajobs feed, so there’s no “comprehensive” jobs feed today; you’ll have to check both to see all the jobs. But that’s work for another day.

I’ve also added a lot of documentation on my Digital Policy website around pay grades and how the GS system works.

As a result of these additions, I realized that my site was quickly becoming a spaghetti mess of code. To clean this up, I’ve rationalized the growing number of RSS feeds, only these are now discoverable:

I also completely redid both the RSS feed template and the list template to simplify showing many different types of content using a single layout. To achieve this, I’ve had to do some truly unholy hacks to Jekyll.

Jekyll - well, Liquid, technically - allows you to set your own custom variables on a page, but it doesn’t allow you to set the value of hash elements. So I wrote a plugin to allow you to do this. The HUGE caveat here is that pre-defined values are not writable - meaning if you have a loop of posts, the post.content cannot be overridden - it’ll throw an error. To get around that, I’m hacking in new values instead, things like post.afterwards for content I want to append to the bottom of the post.

For pages like the main RSS feed, I’m also using some hacks to create empty arrays, and then iterate through the various content types, massaging them into new formats that work with the simplified templates. In this way, I have been able to remove most of the custom handling logic from the templates, and put it all into the individual pages. It’s much cleaner this way.

Though I really, really wish Jekyll natively supported the manipulation of hashes and arrays. I was unable to find a way to create an entirely new Hash, and I would love a way to override predefined values as well. Ah well.

So that’s a lot of new stuff! Hopefully some of you folks will find some of these various hacks and tools useful!