Development Experience
Drupal
The main Johns Hopkins University Press website runs Drupal 10. I work primarily on the front end: building & improving templates, improving CSS for accessibility & user experience, and developing minor changes to the custom theme. Private repository.
Johns Hopkins Unversity Press builds and maintains websites for academic organizations (e.g. Dante Society of America) using a Drupal multisite, which drastically speeds up development while allowing for customizations on a per-site basis. I handle all parts of the multisite: developing an extensive custom theme, custom modules (php/javascript), accessible & usable CSS, and robust twig templates. Private repository.
Next (TypeScript)
The Book Chatbot is embedded on some Hopkins Press books (e.g. on Teaching with AI). The chatbot uses Retrieval Augmented Generation to answer questions about the book. The chatbot is built with Next TypeScipt, the AI SDK, server routes to handle the calls to the database, and constructed URLs based on the unique identifier of the book. Chatbot repository
JobNote is a hobby project to improve the job search experience. It uses Next TypeScript, with server routes for user management (most server functionality handled with a separate Express server). JobNote repository
Math Fun is a work project turned passion project. It uses Next.js and p5.js to illustrate math concepts. Math Fun repository
I created a simple, lightweight portfolio site for a friend, Jess Tran. Because it was important for the site to look slick, but also for her to be able to make edits to her content (without any knowledge of html/git), I used Next for the frontend and integrated Payload CMS for the backend. Jess Tran Portfolio repository
Accessiblity & CSS
This site reflects my values on accessibility. The HTML uses semantic elements and proper structure. Colors were chosen to look good while accounting for users with low vision or color blindness. Images are not used to convey information; they are purely decorative. Font and font size were chosen to ensure legibility for users anywhere on the disability spectrum.
I incorporate responsive design into any CSS I write: relative measurements, flex box design, image srcsets, etc. Moreover, I test rigorously: a design may work in principle but fail in practice; it is therefore vital to test it on many viewports before moving to a production server.
The CSS frameworks I work the most with are Tailwind and SASS. I appreciate Tailwind for its lightweight, straightforward patterns, and I use it mainly with Node projects. I appreciate SASS for its modularity and syntax, and I use it primarily for Drupal projects.
Express
I enjoy writing servers with Express, as it offers a lighweight, easy-to-use Node environment.
I used Express for the backend of my mobile app, FortunAI (private repository). To bring the server for the mobile app to life, I used node packages including aws-sdk, OpenAI, Resend, and Prisma.
While I handled user management for JobNote with Next's built-in server routes, I needed more power for the actual functionality. The Express backend includes node packages including huggingface/transformers, zod, OpenAI, and Prisma.
Python
I use Python not for applications, but rather to automate one-time procedures.
PLACEHOLDER FOR VECTOR EMBEDDINGS SCRIPT
To convert about 800 GEOSET videos from an outdated file format to mp4, I wrote a collection of Python scripts that downloaded the collection of files, converted the slides (images) into video based on timings pulled from xml, and overlaid the slides with a speaker video if necessary. This used a Selenium bot and video manipulation libraries for Python.
Rather than using part-time staff to manually compile thousands of entries in the FSU Libraries’ eTextbook program, I automated calls to an API, compiled results in the needed CSV files, and ran a bot with Selenium to check access models (generated separately from the API). eTextbook Automation Github Repo.
Servers
For work projects, we run Apache on Red Hat Enterprise Linux machines. These server configurations pass rigorous security audits, and I consistently make tweaks to remedy any issues disocvered in these audits.
For personal projects, I typically use nginx on linux servers (DigitalOcean Droplets). I use pm2 to keep the node projects running and responding to requests.
Git
For work projects, we use Enterprise Bitbucket. I configure SSH keys on the server and "ddev auth" locally.
For personal projects, I use GitHub. I use this mainly as backup and to keep production servers up to date with the latest changes.