Building a Flat-Pack Firepit
June 2026
June 2026
April 2026
The final result of the project: a firepit that warms up the night.
The firepit is just big enough to fit a duraflame/petroleum-based log, making it easy to start a fire.
The finished firepit in use outdoors, with the drop-in base and bolted side panels holding shape.
The assembled, unpainted firepit: four bolted sheet-metal walls, angle-iron corner posts, and a drop-in base panel.
The painted panels and corner posts drying after the high-heat finish, ready to be packed flat or bolted together for use.
The platform in its stowed configuration, fitted into the rear cargo area with space underneath for gear storage.
The first platform fit in the rear cargo area, with the fixed deck covering the storage space below.
The sliding deck extended over the folded seats before bedding, showing how the platform turns the cargo area into a sleeping surface.
The sliding front section pulled forward over the folded seats to create a flat sleeping surface long enough to actually use.
Leon Leibmann, Galen Weld, Amy X. Zhang, Tim Althoff
ICWSM 2025 — Copenhagen, Denmark
Galen Weld, Leon Leibmann, Amy X. Zhang, Tim Althoff
arXiv Preprint — 2024
SpotifyPredictor explores which audio and metadata features are associated with Spotify song popularity. The app lets users inspect the dataset, compare predictors, and experiment with model outputs.
I built it with Seung Won Seo, Emelie Kyes, and Oscar Wang using Python, Streamlit, pandas, Altair, and scikit-learn. The project turns an open-source Spotify dataset into an interactive modeling and visualization tool for musicians and music fans.
Try the hosted app at spotify-data.streamlit.app or inspect the source on GitHub.
Employee Scheduler creates shift schedules from employee availability, preferences, and staffing constraints. It was built for the familiar problem of filling every shift while still respecting the people who need to work them.
The app combines heuristics with linear programming to search for a practical schedule, then exports the result for faster operational turnaround. It is a compact example of optimization work tied to a real management workflow.
Try the live app at employee-scheduler.streamlit.app or inspect the source on GitHub.
Codel is a Wordle-inspired game for programming languages. Instead of guessing a word, players identify the language behind a hidden code sample.
The project uses a Flask backend with a browser-based interface and a curated language dataset. It is lightweight, replayable, and built around the kind of small implementation details that make a game feel fair.
Try the live game at codel.leibmann.org or inspect the source on GitHub.
Cronometer MCP exposes Cronometer nutrition tracking through the Model Context Protocol. It uses the mobile REST API to search foods, log meals, inspect macros and micronutrients, and work with fasting data.
The project is a compact example of agent tooling: credentials stay local, the server presents a clean tool surface, and MCP-compatible assistants can operate against a real health-tracking workflow.
The source code is available on GitHub.
BreachNews studies how major publications report on data breaches. It combines public breach datasets with a large headline corpus, then classifies whether articles mention a breach and which organization is involved.
The repository includes scrapers, PySpark processing notebooks, GPT/few-shot classification, SetFit and RoBERTa experiments, human agreement checks, and visualization outputs. The generated datasets power comparisons by publication, industry, company size, and breach severity.
The source repository is available on GitHub.
Shortener is a URL shortener that I made for my own personal use and to explore various browser fingerprinting techniques. It's a simple web app that allows you to create short links, but also allows you to track and map the IP geolocation of users who use your link. It also displays their browser information and time of access.
The app is written in Python using the Flask framework and adds SQLite as a database. It's hosted on a Raspberry Pi 4 and is accessible at links.leibmann.org.
The source code is available on GitHub.
My first published site, Brainstormer, is a simple idea generating tool that creates a word cloud from the given topic.
It queries the bing cognitive search api and runs NLP sentiment analysis to gather the most impactful words from the results, displaying them.
It was built using Bootstrap, Flask, Nginx, and elbow grease. Deployed with Cloudflare
Peopledle is a wordle-like game where you try to guess the historically-significant person based on sentences from their Wikipedia page.
Significant sentences are distinguished using PageRank, the powerful algorithm that powers Google's search engine. This allows for an accurate ranking of sentence significance, keeping the game challenging through any wikipedia article.
Your score is saved! Check out the hardest days using the Past People feature, which publishes scores. Go for the easy ones, or take on a challenge!
The site was built using Flask, as a backend, storing data in SQLite and JSON files with a frontend based on Jinja Templating .
Check it out on the site or take a peek at the source on GitHub
It uses wikipedia's list of important people, using the Wikipedia API the site to gather the information needed. If you have any suggestions for people to add, feel free to email me, I'm always looking to add to the list
This site was built entirely without javascript, using the checkbox hack and many other techniques to create a responsive, accessible, and fast website.
Built by hand in pure HTML/CSS3, uses twemoji, OpenSans, and Material Icons . Deployed on Netlify sourced from Github
Don't do anything silly, like open another instance of this website in the embedded window. Only you know your limits.
To visualizing the ever-changing nature of the NBA, I teamed up with Melisa Li, Clarence Muchina, and Rich Chen to visualize the NBA's rapid change over the past 10 years. We collected data on teams' three-point shooting statistics through the past decade and created interactive visualizations that highlight the significant increase in three-point attempts and makes over time.
Overall, we consumed over 5,554,545 rows of data, totalling 1411 MB. This was condensed and aggregated to produce the final, web-ready data.
We built our exploration using D3.js, Observable's Swatches, and Todd Schneider's NBA Shots Scraper
Built in 24 hours for DubHacks '21, HuskyFetch is a web app that allows you to search for any ongoing or upcoming lectures at the University of Washington.
It gathers this information through the many public course pages, and displays it in a simple, easy to read format.
While it originally gathered events from many other sources, including the official Google Maps API and several campus event calendars, it was refactored to focus on providing the best lecture finding and auditing experience.
It was built using Bootstrap, Flask, Nginx, and deployed on a Raspberry Pi 4. Check out the project on GitHub.
DubScrape is a web scraper that gathers information from the UW Student Directory . It was built to help me find the email addresses of my classmates, counting fellow CS students, and to help me learn how to use BeautifulSoup and LXML, extracting the results to a single CSV file for analysis.
While you must be a UW student to get access to student information, you can still use the tool to gather information about faculty, including getting a ratio of professors to staff.
The source code is available on GitHub.
CompreSUS is a python command-line utility that explores lossy compression, compressing and decompressing images into a pattern of pixels.
Of course, it earned its name from this combination of pixels: they take the form of everyone's favorite spaceman.
It was built to help me learn about compression, and uses Pillow and NumPy, with a fun and functional end-product.
The source code is available on GitHub.
Counting Royale is a discord bot that allows you to play the classic game of Counting with your friends.
After a channel is designated, people must count, starting from one. A person cannot count twice in a row or skip a number, otherwise the count resets. Sounds simple, right? It's not.
Losses are counted, and the person who loses the most is crowned the Counting Champion and "rewarded" with a channel mute, server kick, or any number of other actions.
These actions can persist across multiple servers and have an admin-decided time limit
The bot can be setup and has per-server configurations, allowing you to customize the actions and other settings to your discretion.
It was built using discord.py and SQLite.
The source code is available on GitHub.
CamRand is a simple web app that allows you to generate random bytes or a random number from a within a range.
Built to explore the concept of cryptographic randomness, it uses a combination of on-board hardware and webcam noise to generate these bytes, ensuring that they are truly random.
The app is built using my usual toolkit of Bootstrap, Flask, and Nginx, and deployed on a Raspberry Pi 4. The camera faces outside, making it responsive to daylight changes, the weather, wind speeds, and of course noise.
The source code is available on GitHub.
Download my resume for a more detailed overview of my work experience, education, and skills.
BS. Computer Science, Data Science Option
GPA: 3.74
Thanks for wanting to get in touch!
Feel free to fill out the form or
send an email to
contact@leibmann.org