Projects
These are the projects on which most of my time is currently spent:
Pushover (2012 - present) (Ruby, Ruby on Rails, MariaDB, Objective C, Java, Javascript)
Pushover is a platform and bundled client applications for sending and receiving push notification messages on Android, iOS, and Desktop devices. It has a simple REST API that allows quick integration with servers, websites, backend processes, e-mail servers, and anything else needing to send notifications, without having to write any frontend applications for receiving them. It currently processes over three million messages a day.
In addition to the backend API, message daemons, and e-mail gateway, I authored and maintain the device clients for Android, iOS, and web browsers, which were written in native Java, Objective C, and Javascript, respectively.
I do all of the day-to-day operations from customer support and billing, to system administration, to software development on the device clients, backend API, and frontend website.
C Programming on System 6 (2020 - present) (C)
I started writing an IMAP client for Mac System 6, doing all development in THINK C on my Macintosh 512Ke (since upgraded to a Macintosh Plus). A few months into it, I started recording videos of my development to help others get started in C development on System 6. Over time I've released some of the software and source code that I've developed on my Mac.
Active Web Projects
Countinual (2013 - present) (Ruby on Rails, MariaDB)
Countinual is a self-contained, lossless statistics and graphing system, similar to Graphite. I initially wrote it to store and graph simple counters, such as the number of Pushover signups per day. It now tracks all kinds of app metrics, server statistics, and bandwidth for all of my servers.
den.im (2011 - present) (Ruby on Rails, MariaDB)
den.im is an integrated reader for things like RSS feeds (and formerly, Twitter feeds). It was in varying states of development over the years and was set to launch at some point, until Twitter changed the terms of use for its API (many years ago, before killing it completely in 2023) and overall usage of RSS on the web declined greatly.
It started life as a Ruby on Rails application, was then rewritten in my halfmoon PHP framework, then later rewritten again in Ruby on Rails.
I still use it every day as my own RSS reader.
deskto.ps (2021-present) (Ruby, Sinatra)
I created this desktop screenshot-sharing website to make it easier to describe all of the programs running in a screenshot when sharing it, and to provide a library of screenshots of any given program, window manager, or operating system.
jcs.org (2001 - present) (Ruby)
My personal website has lived at a few different URLs and had many different designs. Once it became a dynamic site, it was originally in Perl, then PHP, then Ruby+Sinatra, then Rails, then a static site generated by Jekyll, and now a static site generated by a custom Ruby script.
OpenBSD on Laptops (2000 - present)
I've been using OpenBSD on a laptop as my primary workstation since the early 2000s. Since many other OpenBSD developers tend to stick to what already works so they can focus on hacking, my OpenBSD hacking is largely focused on making laptops work. To do that, I frequently acquire new laptops to try them out, review the hardware itself, and then try to make OpenBSD work well on them.
plan.cat (2020 - present) (Ruby, Sinatra)
A simple .plan
hosting site, available via web and finger.
Active Classic Macintosh Projects
My open source Macintosh code can be found on AmendHub.
Amend (2021 - present) (C)
A small, self-contained revision control system for classic Mac OS.
BlueSCSI Wi-Fi Desk Accessory (2023 - present) (C)
A desk accessory to view and control the Wi-Fi functionality that I added to BlueSCSI v2.
ReStuff (2020 - present) (AppleScript)
ReStuff was originally "StuffIt as a Service", used to convert StuffIt 5 archives into the older StuffIt 3 format which can be opened on System 6 Macs. It spawned a Basilisk II virtualized machine on my server with a Mac OS System 7 image, automatically unpacked the StuffIt 5 archive to a temporary directory, and then used StuffIt 3 to re-pack the directory and serve it back to the user for download.
The new ReStuff 2 operates similarly but runs the Mac VM in the user's browser so there's nothing to run on my server.
Subtext (2021 - present) (C)
A multi-user BBS server for classic Mac OS.
Wallops (2022 - present) (C)
A modern IRC client for classic Mac OS.
Wikipedia Reader (2022 - present) (C)
A Wikipedia reader for classic Mac OS.
Other Active Projects
Most of my open source code can be found on GitHub.
Kludge BBS (2015-present) (C, Telephony)
I created this multiuser BBS software for the temporary Lobsters BBS but later setup my own system while continuing to improve the software. After a few years of running the Ruby version on a modern server, I wrote a new BBS server in C to run on a Macintosh Plus which is where it currently operates. It currently offers telnet, dialup modem, and web (Javascript+WebSockets) interfaces to a central backend which supports threaded message forums, FTN/FidoNet feeds, multiuser chat, and file storage areas.
login_duress (2018) (C)
A BSD authentication module providing duress functionality upon authentication. The concept is modeled after the pam_duress module for PAM.
msTERM (2019-present) (Z80 Assembly, C)
An ANSI terminal program for the Cidco MailStation that can use the built-in modem to call BBSes, or a WiFiStation to telnet to anything over WiFi.
NO_COLOR
(2017 - present)
I proposed this simple mechanism for standardizing the disabling of colored output in command-line programs after being frustrated at the trend of outputting color by default and how every program seemed to have its own environment variable or flag to disable it. While I would prefer that it not have to exist, it's now supported by nearly 40 color libraries and directly by more than 100 programs.
OpenBSD (2001 - present) (C)
I became an OpenBSD developer (jcs@) in 2001. I initially focused on ports and packages that pertained to the use of OpenBSD at my day job, then slowly moved into writing userland and then kernel code.
In 2004, I wrote the
nvram(4)
driver for i386 providing /dev/nvram
(just to support running
tpb
on various ThinkPad laptops).
In 2005, I wrote
tftp-proxy(8)
for pf
while working at my old job, to support our new OpenBSD-based PBX and
firewall products which had many VoIP phones requiring TFTP for provisioning.
tftp-proxy
was later rewritten by another developer to be a standalone daemon
instead of relying on inetd
to increase performance.
In 2006, I attended OpenCON 2006 and the OpenBSD 10-year anniversary party in Venice, Italy.
In 2007, I attended the c2k7 General Hackathon in Calgary, Alberta, Canada.
In 2008, I attended
NYCBSDCon 2008
at Columbia University in New York City.
I also wrote the
acpithinkpad(4)
ACPI driver to support hardware buttons and various quirks on newer ThinkPads,
largely deprecating
nvram(4)
and the tpb
package.
In 2013, I attended the
t2k13 General Hackathon
in Toronto, Ontario, Canada.
I also wrote the
ubcmtp(4)
USB driver to support Broadcom multi-touch trackpads found on MacBook laptops.
In 2015, I attended the c2k15 General Hackathon in Calgary, Alberta, Canada.
In 2016, I founded the Chicago Area BSD Users Group. and attended the g2k16 General Hackathon in Cambridge, England. I also wrote a number of new hardware drivers:
dwiic(4)
driver for the Synopsys DesignWare I2C controllerihidev(4)
driver for HID-over-I2C deviceshidmt(4)
HID driver for Windows Precision Touchpad devicesims(4)
andimt(4)
HID-over-I2C drivers to support multitouch touchpadsacpials(4)
driver for ambient light sensors found on some laptopsacpicbkbd(4)
driver for keyboard backlight on the Chromebook Pixel and HP Chromebook 13iatp(4)
driver for the Atmel touchpad and touchscreen on the Chromebook Pixelchromeec(4)
driver for the Chrome Embedded Controller found on the Chromebook Pixel, among others (never committed upstream)
In 2017, I attended the
t2k17 General Hackathon
in Toronto, Ontario, Canada.
I also wrote the
acpisbs(4)
driver for ACPI Smart Batteries.
In 2018, I wrote the
umt(4)
driver for USB Windows Precision Touchpad devices like on the Microsoft
Surface Go.
In 2019, I attended the g2k19 General Hackathon in Ottawa, Ontario, Canada.
In 2020, I wrote the
umstc(4)
driver for USB Microsoft Surface Type Cover keyboards, and the
acpihid(4)
driver for ACPI HID event and 5-button array devices, both used on the
Microsoft Surface Go.
In 2023, I wrote the
viogpu(4)
driver for VirtIO GPU functionality.
Payphone (2013-present) (Asterisk, Telephony)
A fun project to get a working payphone in my home, complete with coin detection and totalizing.
progman (2020 - present) (C)
A window manager modeled after Windows 3.1.
sdorfehs (2019 - present) (C)
Pronounced "starfish", my fork of the Ratpoison tiling window manager which I forked after maintaining my own branch of patches for many years.
xbanish (2013-present) (C)
xbanish is a small X11 utility to automatically hide the mouse cursor when typing, and show it again when the mouse is moved.
Completed/Abandoned Projects
Adium PipeEvent Plugin (2010-2012) (Objective C)
PipeEvent was a plugin for Adium that could be used to pipe event information to an external script. It stopped working with newer versions of Adium and I've since developed and now use a Pushover-specific plugin.
Audi/VW Dealer Ratings (2003-2007) (PHP, MySQL)
As an avid member of the Audi (and later, Volkswagen) enthusiast community, I started this website pre-Yelp-era for other users to rate the dealerships (and later, tuning companies) around them. When I ended its run in 2007, it had over 5,000 ratings from individuals and was a frequently-consulted resource within the community. I even got a discount on the Volkswagen I purchased in 2004 from the top-rated dealership in my area, after discussing my involvement in the site.
Blandroid (blandroid.org) (2011 - 2012) (Java, C, PHP)
Blandroid was an Android (2.3 to 4.1) ROM focusing on stability, supporting the AOSP devices Nexus One, Nexus S, Nexus S 4G, and the Galaxy Nexus. It had a small following of users that didn't want to put up with the instability of Cyanogenmod and other Android ROMs. I added some minor features to the ROM that were later made obsolete by Android 4.
I discontinued the project as Android 4 became more popular and Google's separation between AOSP and Android proper became wider. I now just use factory images on my Android test devices.
ChiBUG (2016 - 2024) (I have people skills!)
I founded the Chicago-Area BSD Users Group to facilitate discussion and support for users of the various BSD projects in the Chicago area. The monthly meetings never had more than a few regulars so we just continue meeting now without calling ourselves a BSD user group.
Corduroy (corduroysite.com) (2006 - 2012) (Ruby/Ruby on Rails, MySQL, OFX, Plaid)
Corduroy was a web-based billing system for small businesses. I created it in 2006 to handle the invoicing for my company after I got fed up using QuickBooks. After adding things like banking integration for downloading transactions (via OFX), online invoice payment through PayPal and other merchants, and project management, I turned it into a software-as-a-service and began hosting it for other companies. The service was not a major focus of my company and was not advertised much, so it didn't gain many users.
Many competitors had been established that were much more popular and better suited for this type of service, so I stopped offering it in 2012. I still use it for my company's book keeping and occasionally add features, such as switching from OFX to using Plaid's API for increased security and easier maintenance.
Domain iCal (domainical.{org,com}) (2011 - 2018) (PHP/Halfmoon, MySQL)
A free site that let one list domain names which would be looked up through whois and/or queried through SSL and their domain and SSL certificate expiration dates were published as an iCalendar feed for easy monitoring.
I later purchased the .com domain to try to commercialize the service but the constant changes among the whois servers for all available TLDs (which was constantly expanding) was too difficult to keep up with, so I just discontinued the service.
Endless (2014-2019) (Objective C)
Endless was a web browser for iOS with enhanced security and privacy, like HTTPS Everywhere and analytics blocking built in.
It become the basis for the Tor Project's Onion Browser 2.X rewrite.
I stopped development when Apple deprecated UIWebView
and announced that
applications were going to be prevented from using it.
Fitbit Low Battery Notifier (fitbit.jcs.org) (2011 - 2016) (Ruby on Rails, MySQL, Pushover, Twilio)
This free service was built to use the Fitbit API to monitor the battery level of each user's Fitbit tracker and notify them by e-mail, SMS, and/or Pushover when the battery is low or the tracker had not synched within a certain timeframe.
It was used by over 73,000 Fitbit users and sent out more than 2 million alerts in the 5 years it was in operation.
It was shut down in mid-2016 due to the high costs associated with sending out SMS messages every day and its declining usefulness since Fitbit eventually added e-mail and push notifications to its mobile apps to alert of low battery status.
Garbage Podcast (2015 - 2019)
Originally hosted at garbage.fm
, this was a technology-focused podcast that
was produced with fellow OpenBSD developer
Brandon Mercer
where we complained about technology and occasionally provided useful information.
Episodes were recorded weekly on Thursday evenings and released on Fridays for
about ten months straight before we got too busy to continue the pace, finally
ending in early 2019.
I did the show's audio editing and backend administration, such as developing the custom CMS and hosting the website.
goingtorain.com (2008 - 2012) (PHP/Halfmoon, SQLite)
This single-page website was created in May of 2008 as an alternative to busy, ad-ridden sites like weather.com. All I cared about was whether it was going to rain that day, so I created this simple site to automatically lookup your city/state by geolocating your IP address, check the weather for that city, then parse the result and tell you in a one-word answer "yes" or "no", whether it was going to rain.
When it was initially released, it made the front page of Hacker News, Delicious, and Mashable.
In July 2009, some Chinese developers released a cheap-looking iPhone app that cost 99 cents and would just load goingtorain.com and show the answer. I blocked the app from accessing the site and it has since been removed from the App Store.
In March 2011, an API was created for integration into the DuckDuckGo search engine's zero-click information for "is it going to rain" and related searches.
In August 2012, Google shut down its weather API without notice and since the only remaining weather APIs cost money, the site was forced to shut down.
halfmoon (2010 - 2017) (PHP)
halfmoon is a small MVC framework for PHP that does things like Ruby on Rails (2.3) wherever possible. I started writing it in 2010 after doing Rails for a number of years and needing to use PHP for a small web project. I've since used it for a handful of small web projects and APIs, but I have mostly switched back to using Rails.
HN Trades (hntrades.com) (2010 - 2012) (PHP/Halfmoon, MySQL)
HN Trades was a site for Hacker News users to trade domain names, books, and other stuff. It was created after seeing yet-another thread on HN about unused domain names.
Lobsters (2012 - 2017) (Ruby on Rails, MySQL)
A link aggregation site that I created in 2012 after being banned from Hacker News. The backend of the site was open source.
After running the site for five years, I handed it over to the community and it continues to grow.
Metra Train Schedules (metra.jcs.org) (2009 - 2012) (Ruby on Rails, MySQL)
Metra spent part of $3.9M on a new website in 2009 that still had no mobile browser support. I created this website, optimized for the iPhone and Android, to display train schedule and delay information. Metra later added a basic mobile interface to their site, though its interface was still quite clumsy.
The maintenance required to manually update the schedules from Metra's PDFs, as well as the availability of many offline iPhone and Android applications and the Google Transit mobile site prompted this site to be shut down in early 2012.
PowerBook 1XX Battery (2023-2024) (3D Modeling)
I sourced NiMH battery packs compatible with the 68k PowerBook 1XX series (140, 145, 145B, 150, 160, 165, 165c, 170, 180, 180c) and modeled a case to fit them in these PowerBooks, with the ability to adapt a factory door from an original battery. I purchased the batteries in bulk, 3D-printed the cases, cut and bent copper strips, soldered the battery leads to the strips, and then load tested them in my PowerBook 180. I built and sold 60 of them.
rt.fm (2000 - 2009)
rt.fm
was a personal server that I colocated at the ISP I used to work at
and eventually turned into a second-level OpenBSD FTP, Web, AnonCVS, and CVSup
mirror (and occasional Tor exit node).
After a number of hardware failures and upgrades, I finally took it out of
service in 2009 and sold the domain name due to its high renewal cost being a
"premium .fm domain".
Rubywarden (2017 - 2020) (Ruby, Sinatra)
A small, self-contained alternative API backend to the open source Bitwarden password management applications.
I documented the API and wrote the server to facilitate migrating from 1Password.
I stopped development in 2020 when it became too difficult to keep up with upstream client changes, and there is now another open source implementation of Bitwarden's API.
Twitframe (2013 - 2023)
In the spirit of Colin Percival's Payment iframe, Twitframe allows one to display Embedded Tweets on one's website to dynamically show retweet and favorite counts, inline media/card data, and allow users to retweet/reply /favorite Tweets, all while isolating the Javascript and DOM manipulation to an embedded iframe.
I gave up caring about it when Twitter died in 2023, though it's still being hosted on GitHub's infrastructure.
WiFiStation (2021-2024) (Z80 Assembly, PCB Design)
I developed a hardware WiFi adapter for the Cidco MailStation and sold them as a kit. I sold out of my stock of parts and am no longer selling the kits or updating the firmware.