Work
Here are the technologies I work with and the projects I've used them on. There's going to be some scrolling involved. If you're a recruiter, you're going to hate this part.
You won't find my resume here, by the way; I tweak it pretty frequently and have a few different copies in rotation. If you're interested in my work history, check me out on LinkedIn. Or, contact me and I'll be happy to forward you a copy.
Projects
Here are some (not all) of the things I've worked on. Many of these can be found on my Github page, in which case I've added a link to the repository. In other cases, I either don't control the repository or no longer have access to the code, in which case I've provided a link to the application when possible. In the case of some internal products that aren't publicly accessible, you'll just have to take my word for it.
This Website (WilliamWhorton.com)
I made this website using Flask because I'm always looking for excuses to use Python, and Flask is a much lighter-weight framework than Django, which would've been overkill.
My old website was a WordPress site that I basically never touched. I know WordPress has been around for ages because it's doing something right, just like PHP, but, just like PHP, I've never liked it. Besides, any CMS is really more than this site needs.
In this case, I'm using Flask-Flatpages to generate most of the article-style content, such as this, and I'm using Frozen-Flask to serve it.
On the frontend, it's just HTML and CSS. There's no JavaScript because it doesn't need it. I'm using Tailwind CSS for styling.
Hero Patient Safety Improvement System
In 2024, I was hired by SafeTower, a startup in the patient safety space, to lead UI development as they rebuilt the Hero application, a patient safety event management system, as a SaaS product. The original application allowed users to create reports of safety events, track and update the status of those events, and analyze metrics based on aggregated data.
The updated version refactored the UI to be more modern and responsive, added AI-powered features, the ability to assign client-defined forms to events based on the event type, and the ability to add user roles and permissions based on custom business rules. It was also modified to allow for multitenant SaaS deployment.
As the original application was built in Angular, and there was tremendous pressure to deliver the updated features to keep pace with the sales team, I had to learn Angular on the fly rather than rebuild the application in React.
Although I would rather have built the application in React, I did learn quite a bit about Angular and its take on the reactive programming paradigm using NgRx and RxJS. Over time, I came to appreciate Angular's opinionated approach. The boilerplate was an issue, but I was impressed with the performance.
The tight deadlines did not make development easy, and the process was complicated by the fact that we were building processes, infrastructure, and everything else as we went. Still, I am very proud of what we were able to achieve, and I had the opportunity to work with and in some cases mentor a very talented team of developers.
Consumer Complaint Database Complaint Explorer
From 2021 to 2024 I worked as UI/UX designer and developer as a subcontractor at the Consumer Financial Protection Bureau, where I worked on a team supporting the Consumer Complaint Database Complaint Explorer. Complaint Explorer is an application used to analyze the CCDB data, allowing users to explore trends and patterns, filter data by various criteria, search through the database, and view specific complaints.
My role was primarily to provide front-end development support, initially by assisting in refactoring the application from Angular.js to React and Redux, and to act in a UX design capacity as needed. As such, I collaborated with bureau experts and stakeholders outside the team to design new features, develop prototypes, demonstrate those prototypes to decision-makers, and ultimately implement those features.
Tech Stack
These are languages and frameworks I use. I've also included some context, as well as my thoughts on them. I know it's long, but it's not an exhaustive list.
| Language | Context | Notes |
|---|---|---|
| JavaScript | 14+ years of frontend development | It goes without saying that, as a frontend developer, JavaScript is my home. It isn't my favorite language, but I come back to it over and over again because I'm used to its quirks. It really has come a long way since I first started using it. |
| HTML | See above | This is another language that's come a long way. It's hard to overstate how big a deal the introduction of semantic HTML was for a number of reasons, not the least of which is accessibility. Also, I think the claim can be made that HTML is as effective a frontend application language as JavaScript simply based on what modern W3C-compliant browsers are capable of doing with it. |
| CSS | See above above | If you'd asked me what I thought about CSS maybe seven years ago I wouldn't have been able to tell you without profanity. Partly because I was building for older browsers, I wasn't able to take advantage of some of the really amazing developments in CSS such as Flexbox. It really is incredible what you can do just with styling rules these days, although CSS is still the most complicated language in computer science. |
| Node | Some professional work, some personal projects | Not much to say about Node, apart from being very relieved that modern Node is basically the same as JavaScript and works with TypeScript. Being able to move seemlessly from frontend to backend is a huge multiplier, and I am surprised more companies don't take advantage of that. |
| TypeScript | Personal and professional exposure | I don't like TypeScript, but I appreciate what it does. It's sort of like the strict mom of JavaScript; you know it's right, and you know you should do what it says, but it's not very fun. It does do a very good job of letting you ease into it, though. And frankly, after my first interface, I was sold. |
| Python | Personal projects, some professional work | I love Python. I don't get to use it on the job much, but it's the first thing I reach for when I'm working on a personal project (sorry node). The only way I can put it is that Python just sort of makes sense. |
| PHP | Professional experience, none recent | PHP 5 was the first scripting language I learned. Because I had experience with Pascal (yep, Pascal) and C, it felt very familiar. I have used it, but I cannot stand it. For some reason, it just doesn't jibe with me. It's the opposite of Python for me in that regard. I will say, however, that PHP has been about to die for at least ten years, and it's still not only standing but thriving, so you've got to respect it. |
| Framework | Context | Notes |
|---|---|---|
| React | 8+ years of personal and professional use | React is amazing. Hooks-based React made it, in my opinion, the absolute king of frontend libraries. Every new version makes it better, without pushing it into the territory of an actual frameworkâand I fully realize the irony of it leading this section. It really is "just JavaScript," or Typescript, as the case may be. |
| Angular | One very intense year building an application | I actually worked with Angular.js years ago, which is an entirely different animal. When Microsoft took over Angular, they reworked the fundamentals for the better, I think. It's still a strange, opinionated framework, but it performs well, and, especially if you're in a Microsoft stack anyway, or working in Azure, it's a solid "batteries included" option. It leans into the reactive pattern, and while that takes some getting used to, it's actually a better state management strategy than Redux, I believe. I fell in love with observables while building the application I learned Angular for, so that influences my opinion here. |
| Next.js | A couple of personal projects | Next is great, in part for the reason I mention above; if you remove the distinction between front and back end, you double the coverage of your development team. At any rate, Next is the predictable end-state of a lot of React-based apps, I think. Whatever your architecture looks like, having at least the first-contact backend be closely coupled with the frontend makes sense. Recent security issues are concering, however. I'm still bullish on Next, and would love to use it professionally. |
| Flask | Personal projects, like this website | As part of my strange desire to use Python as much as possible, I've gone through a few cycles of reinventing my personal website using Python-based frameworks. I actually used Django and Wagtail for a few iterations that failed to launch. Problem is, I would get so fixated on configuration and models and all of the awesome features included that I'd lose track of my purpose. Flask, being so minimal, has been an absolute joy to work with. It reminds me favorably of Express, another framework that gives you the basics and then gets out of the way. Also, blueprints are really cool. |
| Express | A couple of personal projects, and a take-home code test years ago | Not much to say here, other than it shares the qualities I like about Flask, with the added benefit of being in a language I have a lot of experience using. I think it shines in microservices. |
| Tailwind | A couple of years on personal projects | Everyone should be using Tailwind. Speaking as a frontend developer, this solves so many problems with styling and markup. Atomic classes have been around for awhile, but adding a preprocessor turns out to be the magic sauce. Tailwind is the Holy Grail of CSS frameworks. |
| Bootstrap | Nearly my entire professional life, rarely personally | Like hipsters and emo, I find that, while Bootstrap annoyed me to distraction when it was part of my life, in its absence I have come to appreciate it for what it is. Bootstrap never claimed to be an all-in-one styling solution. It's even in the name: "Bootstrap". It's for prototyping something with style rules that are inoffensive and largely there just to make it look like something. In practice, it's used (best-case scenario) as a sort of opinionated reset, or (worst-case scenario) as a full UI library. How you feel about Bootstrap tends to track with whether you were exposed to it during its "everything is a div" era. |
| Testing Library | 5 years personal and professional use | Everybody uses Jest, and everybody has this idea that unit test coverage is the metric for good code. That's bunk on the frontend, and Testing Library acknowledges that and solves the problem by scaling testing up to the integration level and testing user interactions, which are where you'll see the bugs that matter. Pair this with Cypress or Playwright and you've solved your testing problems. |
| Django (mainly with Wagtail) | A few personal projects over the years | I hesitate to even include Django simply because what I've done with it is so limited compared to what it can do. It is a big ol' honkin' framework, but if you want a CMS that's pretty much ready to rock right off the bat, this is it. I've used it with and without Wagtail, and, for blogs, Wagtail is just amazing. I don't know why this hasn't entirely taken over WordPress's market share. It does everything WP does and more without being nearly as difficult to work with. |