3D Article Geo-Archive
An interactive geotagged partial archive of "Modern Love" articles from the NYTConfluence Validator
Automated page validation system for Atlassian cloud migrationTrackd
Social platform for tracking and reviewing comedy sketches, with 4000+ reviews loggedWB Games NY Nexus
Multiplayer web game nexus developed for studio hackathonCSPAN Supercuts
Daily automated supercuts made with the Videogrep Python library, based on the now defunct CSPAN-5 botGeisel School of Medicine
Full-stack engineering and mobile app development as a research assistant in the Center for Technology and Behavioral HealthLocal Files Manager
Managing and customizing metadata for MP3 filesFriend-a-Mendations
Library of user recommendationsGraphics Coding
Computer graphics coding and linear algebra projectsWomen in Media
Website design for Dartmouth organizationMedia Ecology Project
Digital archive and research platform for media history
Therasource is the platform used by clinicians, graduate students and undergraduate researchers to power studies and research related to the Therabot chat app, developed in the Center for Technology and Behavioral Health at Geisel. In working on maintenance of the platform ahead of a 30-day Therabot study (which involved monitoring patient conversations with the bot over 30 days), study facilitators expressed the need for an administrator dashboard to be able to show trends over time with patient activity, view in-app conversations and pull participant data spanning any number of days, tracking all participant id's and holding a record of how much they'd interacted with the chatbot. Clicking on the number of conversations in the table would take authorized users to see the conversations they've had with the bot.
This entailed pulling Therabot app data from Firebase into a local SQLite database, and architecting an administrative portal housed in Therasource to access participant data. I designed and engineered the frontend and backend of this application, utilizing Flask and SQLite for the backend and HTML/CSS/Javascript/jQuery for each page of the dashboard's interactive components (including features like color-coded participant status indicators, and a user-bot messaging interface to display the Therabot-participant conversations).
The code is not publicly available, but feel free to reach out for more details on the project.
For the Mood Triggers study, I worked on remaking the app's UI and backend components for a new study configuration, creating new layouts for the unique question interfaces and user flows associated with the upcoming Act study. To do so, I created a theming system in Flutter to enable different layouts, question interfaces and appearances for different studies and improving the app's UI/UX.
Before:
After:
The code is not publicly available, but feel free to reach out for more details on the project.
Therasource is a
Helpful to have a dashboard to be able to show the different participants in the study and pull their dialogue data spanning any number of days, tracking all participant id's and hold a record of how much they'd interacted with the chatbot. Clicking on the number of conversations in the table would take admin to see the conversations they've had with the bot. The study involved monitoring patient conversations with the bot over 30 days
I designed and developed the first website for Dartmouth Women in Media, integrating custom CSS styles and animations.
As a student in a film class centered on supercuts and new media forms, I encountered Videogrep, a Python library for creating video supercuts from transcript data.
While powerful for highlighting patterns in media content, the command-line tool remained inaccessible to non-technical users, including future students of the course. Additionally, with the discontinuation of the CSPAN5 Twitter bot in June 2023 due to API changes, there was a gap in automated media analysis tools for tracking speech patterns in political discourse.
SolutionI developed a web application that automates the creation of daily supercuts from CSPAN footage, making video analysis accessible through a user-friendly interface. The app uses natural language processing to identify and compile the most frequently used words from daily CSPAN segments into shareable video supercuts.
Technical ImplementationThe site uses moviepy and videogrep for video processing and spaCy for natural language processing. The React frontend handles user input and video playback.
The tool serves dual purposes: providing an accessible web interface for non-technical students to create and analyze video supercuts, while maintaining an archive of political speech patterns previously tracked by the CSPAN5 bot.
Here's a supercut created by the application for 9/4/24, which contains the most common keywords found in the video transcripts.
Github Link for the web interface.
This Flask web application uses The Movie Database API to allow users to search for and add movie recommendations to a library of friend-approved recommendations. The site is deployed on Heroku.
The title is inspired by the now-defunct Substack written by Allison Driskill. I was inspired by the idea of tracking friend-approved recommendations, and decided to build the site to replicate this level of comraderie/community-oriented recommendations by building a library of friends' own "friend-a-mendations."
Background & Problem
50 years of Saturday Night Live have produced over 15,000 short-form sketches, but there was no centralized way for fans to sort through the archive, discover new content through community recommendations or keep track of their favorites (i.e. Goodreads). Additionally, the closure of the SNL app and accompanying archive on nbc.com left a gap in comprehensive database sorting.
SolutionTrackd uses snlarchives.net, the SNL community wiki, and archived nbc.com pages to build the database. The site syncs with SNL's YouTube channel to add new sketches, while enabling users to rate sketches, write reviews, follow other fans, and showcase their favorite content through customizable profiles.
Within its first 48 hours, fans logged over 2,000 reviews, with strong community engagement around content discovery and discussion.
The site was built using React and Tailwind CSS for the frontend, with Node.js/Express powering the backend API and MongoDB managing the database. The platform uses a Python script made with Scrapetube to maintain an up-to-date sketch catalog amd automatically add new videos to the database via cron job. The site uses AWS S3 for profile photo storage and implements JWT authentication for user accounts. A custom activity feed system tracks user interactions and displays them in real-time to followers.
Maintaining the site involves a mix of technical and project management skills, employing design thinking to develop new features and landing pages, as well as creative problem solving to handle traffic, respond to user feedback, and find creative ways to use the extensive sketch database.
Feel free to visit the site here.
As a casual fan of of reading film reviews, I found it interesting to read articles critical of the type of reviews that populated the homepage of review-sharing site Letterboxd--namely, short and concise ones.
As such, I wanted to make a version of the homepage of Letterboxd that filtered the homepage content to filter and see the longest user reviews. I also implemented a search function, which allows users to search for any film on the site and return the longest review.
I built the site with a Node/Express backend, designing the frontend on Figma before implementing it with React.
This website is a partial, interactive archive of the Modern Love column, mapping articles onto a 3D globe.
Background & ProblemThe project began out of interest in finding alternate and accessible ways to comb through large archives, including digital archives like those on the Internet Archive, as well as newspaper archives. I was particularly interested in finding different ways to comb through longrunning columns and find new articles.
SolutionI developed an interactive 3D globe visualization that maps Modern Love articles to their geographical locations. The interface allows users to explore content through spatial navigation by spinning the globe and discovering articles through hoverable points.
145 column entries (including podcasts and tiny love stories) contained geographic keywords, which were then mapped to coordinates. This filtering effect created an interesting lens into the archive - it surfaced a specific subset of stories where location plays a meaningful role in the narrative, offering a way to explore how place and relationships intersect in Modern Love stories.
Technical ImplementationI initially began by coding a 2D illustrated map of the world using D3.js before switching to a 3D globe with Three.js for easier content exploration (dragging to 'spin' the globe and ease of zooming in on the third dimension). I built a script to populate a MongoDB database by querying the New York Times API to fetch articles for the partial archive, using the Open Street Nominatim API to get a latitude and longitude, if any, from the keywords attached to the article. I originally used natural language processing of the article's contents, but keyword matching proved to be a much more accurate way of geotagging the articles if location keywords were present.
This data is served with a Node.js server to a Three.js frontend to render the articles on the globe, using a REST API built with Express.
Articles are rendered on the globe by turning the 2D latitude and longitude from the server into a scaled 3D coordinate. The interface allows users to hover over red article points to view tooltips, which contain URLs to the full article.
Github LinkAs part of the WB Games New York annual summer hackathon, I was on a team of four engineers in creating an online gaming nexus, a centralized hub for Jackbox-esque games for the studio.
Background & ProblemWB Games New York's annual summer hackathon presented an opportunity to create engaging multiplayer experiences for studio team-building. The studio needed a centralized platform for hosting and playing casual multiplayer games, similar to Jackbox Games, but tailored for the studio environment.
ImplementationFrom inception, we decided to create an online gaming nexus for in-studio multiplayer team games, aka our own version of Jackbox games.
To populate the collection, I decide to engineer a web-based card game inspired by social psychology card game "Buffalo," in which teams compete in word association by drawing cards. This involved implementing a game service in C# and Blazor WebAssembly, creating the game menu for players to join games and teams, engineering the game service to serve the game (including team formation and joining, drawing cards, timeouts) and designing and implementing the user interface (including virtual cards) for real-time updates, scoring, and multiplayer capabilities.
I also redesigned the home page of the website, giving it a more modern interface for the user landing page by updating the colors, typography and homepage design. This also involved refactoring the frontend components and CSS styles.
The code is not available to the public, but feel free to reach out for more details on the project.
This app is a custom Forge solution, created to maintain documentation quality during a large cloud migration by tracking and managing content validation states.
Background & ProblemDuring WB Games NY's migration to Atlassian Cloud, the IT Shared Services team faced a critical challenge: how to identify and handle potentially outdated Confluence pages before migration. Prior to my arrival as an intern, automatic archiving of inactive pages was considered, but this approach risked removing valid but infrequently updated documentation. The team needed a more nuanced solution that could distinguish between truly outdated content and stable reference material.
SolutionAfter speaking with team members and stakeholers to understand the problem, I decided to develop a Confluence Cloud Forge app that integrated with existing page interfaces, appearing alongside the native "last updated" feature. The app introduces two key functions: content validation and validation requests. Page owners can actively validate their content, confirming its accuracy without requiring updates, while other users can request validation when they suspect content needs review. When validation is requested, the app automatically notifies relevant team members through Slack, creating an efficient workflow for content verification.
Technical ImplementationBuilt using Atlassian's Forge platform, the app leverages ForgeUI components for native-looking Confluence integration, Forge Storage API for maintaining validation history, Confluence REST API for user and page management, and custom Slack webhook integration for notifications.
I originally wanted to use email (Send Grid API) or the Slack API to send notifications directly to page owners; however, limitations in the Forge API meant these integrations were not permitted. Due to Forge API limitations preventing direct email or Slack API usage, I implemented a webhook-based notification system that could be configured to route messages through team Slack channels. This workaround maintains functionality while adhering to platform constraints.
ImpactThe app provides a sustainable solution for maintaining documentation quality by creating accountability through tracked validation history, enabling proactive content verification, streamlining the review process via automated notifications, and supporting informed migration decisions based on content status. The result is a tool that supported maintaining documentation's accuracy while supporting large-scale migration initiatives.
Background & Problem
While Spotify allows users to add local music files to their library, managing these files can be cumbersome. The default process requires users to navigate their file system, manually edit ID3 tags, and potentially use multiple tools for tasks like adding album artwork. Itunes offers metadata editing but the process requires more manual steps and requires then manually adding the file to a new directory to be accessed by Spotify.
SolutionThe Spotify Local Manager automates the process of uploading local music files, tagging them with the correct metadata (such as artist, album, title), and embedding cover art.
Technical ImplementationBuilt using FastAPI for the backend, the application leverages the Mutagen library to process and modify metadata within audio files. The frontend is a React application styled with TailwindCSS. The backend supports file uploads, path management based on the user's operating system, and integrates with Spotify’s local file system.
One of the challenges was handling file path management across different operating systems (Windows, macOS, Linux). To address this, the backend dynamically determines the correct local file path based on the OS.
content.