info keyboard baffled smile earth mail4 git
Bill Lovett

Here's some stuff I haven't disavowed yet.

Let me tell you about my projects.

I mostly work on web-related things for my own use, both to solve a problem and to try different things. The userbase for these projects is me.

I previously built many websites while freelancing. I don't do as much of that now, but I'll mention some of that work at the end before it becomes dust in the wind.


A CRUD-style application for time tracking and invoicing.

Built with Laravel, Vue, and SQLite.

It's on GitHub.

The Good

I used to work at web development agencies that tracked billable hours per client. The tools were UX-poor, the value was dubious, and the effort was compulsory.

When I started freelancing, I wanted better insight into where my time was going and less data-entry burden. So I did it…my way.

The Less Good

This is the second incarnation of the application. The first one used CodeIgniter and is still in use in spite of its shortcomings. The short-list of new features I have in mind is more of an infinite list.


A bookmarklet that cleans up crappy writing.

Built with TypeScript and the TreeWalker API.

It's on GitHub.

The Good

I stay relatively current by reading sites like Hacker News and Reddit. For every insightful tidbit, there's a horde of mannerism, hipsterism, and quirk.

A long list of regular expressions replaces these annoyances with more palatable alternatives. The TreeWalker API makes the process efficient, and the bookmarklet approach keeps it browser agnostic.

The Bad

Language is always changing and shabby writing comes in endless variation. The best I can hope for is a temporary reprieve one page at a time.

Aside from agnosticism, bookmarklets are limiting and have varying degrees of convenience depending on the browser. Or in the case of Edge, none.


A notification hub.

Built with Node.js, Express, Angular 1, and Faye for websockets.

It's on GitHub.

The Good

This application is about funneling important events into a central location that can be accessed from any device without being impaired by OS constraints or polluted with distractions.

Messages are sent over HTTP. Delivery occurs over websockets, either to other client scripts or to a purpose-built browser UI. Messages can be about anything. I use them for phone calls, email, daily reminders, CI builds, and activity on this site.

The Bad

As of macOS Sierra, Safari closes the websocket connection to conserve power more aggressively than it did previously. That puts a damper on the realtime utility.

Performance on mobile isn't rainbows and unicorns. In spite of app cache, mobile browsers end up doing full page refreshes at the drop of a hat. In day-to-day use I get more benefit from integration with Pushbullet than with using the browser UI. Which means I need a notification app for my notification app. Lame.

The Ugly

There were previous iterations of this app that leveraged XMPP and were geared toward IM client interactions, and the websocket approach is probably also headed for the past-tense. Email by itself would better leverage what mobile devices are already doing reasonably well, and OS integration would be easier (and preferable to having a dedicated native app).

It's a similar story with the use of Angular 1 for the browser UI. At the time it was a decent choice, but the world is moving on.


The thing I use instead of Google Reader.

Build with Node.js with Restify, Redis as primary data storage, and Angular 1.

It's on GitHub.

The Good

It's better than nothing.

The Bad

Initially I integrated with a Google service that provided unified parsing for all feed dialects. Then they shut it down.

I haven't gotten the UI to a point where the volume of content isn't overwhelming. I mostly ended up exchanging one mountain of starred items in Google Reader with an equivalent one in this application.

The Ugly

I came up with an alternative setup for local feed parsing based around SQLite, but never finished it up. I'm tempted to start all over and migrate to a different stack, because there's more to life than Node.


An odds-and-ends collection of mini applications under one roof.

Built with CherryPy and Python 3. Deployed to a Raspberry Pi with Ansible.

It's on GitHub.

This is where I put small-scale, single-page utilities. I did it in Python for a change of pace from PHP and JavaScript.

The common thread among these applications is their need for basic services like data storage and UI. Having that already accounted for means less time to go from idea to implementation.

The original idea was to keep this compact and lightweight with few moving parts, so that the hardware limits of the Rasperry Pi wouldn't be as noticeable. But they are.


What I set as my browser homepage.

It's on GitHub.

Built with Silex. Deployed to Azure and integrates with Azure Active Directory.

I like having quick access to all the links to my projects. Typically that's one each for dev, test, and production sites, admin links, version control, hosting control panels, and so on. Browser history autocomplete doesn't hack it when you're using multiple browsers on multiple machines.

Freelance Sites

I have worked on over 100 sites over the years. Many of them are long gone or have been replaced. Here are a few that are still standing.