about | projects | rss | e-mail | github | twitter


These are the projects (both technology-related and not) on which most of my time is currently spent.

Pushover (2012 - present) (Ruby, Ruby on Rails, MariaDB, Objective C, Java)

Pushover is a platform for sending push notification messages to Android, iOS, and Desktop devices. It has a simple REST API that allows quick integration with servers, websites, backend processes, and anything else needing to send notifications.

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 and network operations, to software development on the device clients, backend API, and frontend website.

OpenBSD (2001 - present) (C)

I have been an OpenBSD developer (jcs@) since 2001. I initially focused on ports and packages that pertained to the use of OpenBSD in my professional work, then slowly moved into writing userland and 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 DLS, to support our new OpenBSD-based PBX and firewall products. tftp-proxy has since been rewritten to be a standalone daemon instead of relying on inetd.

In 2008, I wrote the acpithinkpad(4) ACPI driver to support knobs and buttons on newer ThinkPads, largely deprecating nvram(4) and tpb.

In 2013, I wrote the ubcmtp(4) USB driver to support Broadcom multi-touch trackpads found on newer MacBook laptops.

In 2016, I wrote a number of new hardware drivers:

  • dwiic(4) driver for the Synopsys DesignWare i2c controller
  • ihidev(4) driver for HID-over-i2c devices
  • hidmt(4) HID driver for Windows Precision Touchpad devices
  • ims(4) and imt(4) HID-over-i2c drivers to support the multitouch touchpad on my Samsung laptop
  • acpials(4) driver for the ambient light sensor on the Chromebook Pixel
  • acpicbkbd(4) driver for keyboard backlight on the Chromebook Pixel and HP Chromebook 13
  • iatp(4) driver for the touchpad and touchscreen on the Chromebook Pixel 2015

Lobsters (2012 - present) (Ruby on Rails, MySQL)

A link aggregation site that I created in 2012. The code that runs the site is on Github.

ChiBUG (2016 - current) (Halfmoon, PHP)

I founded the Chicago-Area BSD Users Group to facilitate discussion and support for users of the various BSD projects in the Chicago area.

I created the website and wrote the custom mailing list archive viewer in PHP, which fetches message archives from an IMAP server.

Garbage Podcast (2015 - present) (Voice, Halfmoon, Audacity)

A technology-focused podcast produced with fellow OpenBSD developer Brandon Mercer where we complain about technology and sometimes provide useful information. Episodes were recorded weekly on Thursday evenings and released on Fridays for about ten months straight before we decided to release on a more relaxed schedule.

I do the show's audio editing and backend administration, such as developing our CMS and hosting the website.

Endless (2014-present) (Objective C)

Endless is a web browser for iOS with enhanced security and privacy, like HTTPS Everywhere and analytics blocking built in.

Other Active Projects

Most of my open source code can be found on GitHub, though most of the websites listed here are not open source.

den.im (2011 - present) (PHP/Halfmoon, MySQL)

den.im is an integrated reader for things like RSS feeds and 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 and overall usage of RSS on the web declined greatly.

I still use it every day as my own RSS reader and Twitter client.

Domain iCal (2011 - present) (PHP/Halfmoon, MySQL)

A free site that lets one list domain names which will be looked up through whois and/or queried through SSL and their domain and SSL certificate expiration dates added to an iCalendar. For easy and automatic monitoring of domain name and SSL certificate expiration and renewal dates.

halfmoon (2010 - 2012) (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 other small web projects like Domain iCal and various forums, though I have mostly switched back to using Rails with simpler deployment methods.

Twitframe (2013 - present) (PHP)

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.

It is in use on a number of high-profile news websites.

Velvet (2005 - present) (Ruby on Rails, MySQL)

Velvet is a hosted software solution for executive recruiting firms that handles project, contact, and company management and reporting. It was created as a hosted software-as-a-service through a partnership with Prospect City.

I provide hosting, backend support, and custom development for the service in addition to creating private, customized versions of Velvet for new customers.

vmwh (2010-present) (C)

vmwh is a userland helper for running OpenBSD under VMWare. It currently supports automatic clipboard synchronization.

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.


I usually keep detailed modification and maintenance logs for my cars while I own them, both for my own reference and to help anyone with a similar car.

1986 Volvo 740 GLE (1998-1999)

My first car that my dad bought me during high school. It was baby blue, had leather interior, and a smashed-in front fender.

1990 Acura Legend LS Coupe (1999-2002)

A more luxurious upgrade from the Volvo. A high school friend got an Acura Integra, so I got this Legend and started taking more interest in cars. I started modifying it and changed the wheels and suspension, and dumped a bunch of money into massively upgraded stereo components. It had transmission troubles and I wanted to upgrade to an Audi.

1999.5 Audi A4 1.8T Quattro (2002-2004)

This car launched much of my appreciation for cars and driving in general, with it being my first manual-transmission car. I joined the Audi Car Club Chicagoland Chapter and did many driving events with them and made a bunch of new friends. I dumped way too much money into this car and spent too much time reading Audiworld forums. In the end it wasn't even that fast, so I converted it back to stock and sold off all the parts.

2004 Volkswagen R32 (2004-2010)

I bought this R32 new, right as they debuted in the US, and not long after took it to my first track day. I did a bunch more track days and upgraded lots of things on it, at one time having a completely stripped interior and a roll cage. Once I bought my Lotus, it went back to my daily driver, where it stayed until I moved to Chicago and no longer needed a car.

1992 Mercedes-Benz 190e (2005-2006)

I always loved the lines on these cars and found a clean one for sale locally, so I bought it as a cheap second car. Had throttle issues that I didn't want to invest time into fixing.

1991 BMW 318i (2006)

Someone from AudiWorld wanted to trade his E30 for a 190e, so we did a straight-up trade. This one was a manual which made it more fun to drive, and aftermarket parts were more easily available. I ended up not really driving it much since I was working from home by this time, so I sold it.

2006 Lotus Exige (2007-2009)

After modifying my R32 to do track days, I decided it would be best to stop spending lots of money on that and get a car for the track that I didn't have to upgrade. I did many more track days with this car and took it to local car shows and things. Eventually I decided to sell it in order to build an Ultima GTR, which I never did.

1988 BMW M3 (2009-2010)

I found this track-ready E30 for sale in Minneapolis, so my friend and I drove out to pick it up. I did some further gutting of it since the previous owner had cut all of the HVAC lines behind the dash but didn't pull any of the center console out. Eventually I moved to Arizona and couldn't take two cars with me, so I had to sell it. I regret that decision deeply.

2008 Lotus Exige S 240 (2013-2016)

After moving back from Arizona and living in Chicago for a number of years, I sold my R32 after it kept getting dinged on the street since I never drove it. After a while, I started getting the itch to do track days again, so I bought this Exige S 240 from someone on LotusTalk. It was kind of inconvenient living in Chicago, having to rent a separate garage nearby, but I made it work. Eventually I sold it in order to buy a house with my wife.

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.

American Volkswagen R32 Registry (2005 - 2014) (Awful single-file PHP, MySQL)

This site was a registry for MKIV Volkswagen R32 owners to list their cars, find other local owners, and view R32s for sale.

Blandroid (blandroid.org) (2011 - 2012) (Java, C)

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 devices.

Corduroy (corduroysite.com) (2006 - 2012) (Ruby/Ruby on Rails, MySQL, Plaid)

Corduroy was a web-based billing system for small businesses. I created it in 2006 to handle the invoicing for Superblock 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 Superblock and was not advertised much, so it didn't gain many users.

Many competitors had since 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 Superblock's book keeping and occasionally add features for my own use, such as switching from OFX to using Plaid's API for increased security.

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.

goingtorain.com (2008 - present) (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.

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.

It was taken down after I was banned from Hacker News.

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.

pixelclock (2005) (C)

pixelclock is a small pixel-based clock for X11.

rt.fm (2000 - 2009)

rt.fm was a personal server that I colocated at DLS and soon 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.

Trip Tracker (2012) (Java)

Trip Tracker is a small Android app that I wrote to track my location on a road trip. It sends the GPS coordinates of the device to a web server, which I used to display a continuously-updated map of my location on my website during the trip.