Personal Projects

Things I build for myself.
And others.

A collection of web apps, Android apps, and browser extensions I’ve designed, built, and shipped end to end.

Selected work

Personal projects

Eleven products I designed, built, and shipped on my own time.

Web

Ask Football answering a natural-language question with a top-10 goalscorer table
Web Live · borna.hopto.org/football-data

Ask Football

A queryable football database you can ask questions of in plain English. Type something like “Mbappé goals at the 2022 World Cup” and an LLM translates it to SQL and runs it - covering the top 5 European leagues since 2010, every World Cup since 1930, and Euro, Copa América, and European club competitions.

What’s interesting Seven different open data sources, each with its own naming quirks, reconciled into one MySQL schema. Generated SQL is validated (single SELECT only, keyword denylist, forced read-only transaction) before it ever runs, and successful queries are cached so a repeat question never re-hits the LLM - a template-substitution layer even reuses a cached query for a new one that only swaps the team or season.

  • FastAPI
  • MySQL
  • Gemini
  • Python
  • GitHub Actions
Hearth's screensaver with the clock, a background photo, and the PIN-free groceries panel open
Hearth's full-screen weather report with an 8-day forecast, wind, UV, and air quality
Hearth's hourly calendar with a few all-day events spread across the week
Web Home LAN only

Hearth

A locked family calendar and household dashboard for the kitchen wall. Runs on a wall-mounted tablet, served from a Raspberry Pi Zero 2 W on the home network - each family member gets a PIN-locked profile with their own calendars, shared tasks, and a grocery list.

What’s interesting The kitchen is a semi-public room, so the calendar itself stays behind a PIN - but music and the grocery list are the deliberate exceptions, reachable straight from the screensaver with no PIN at all. A one-tap Guest mode swaps real household photos for generic stock ones, and light/dark follows the sun, computed locally from sunrise/sunset so the theme never depends on a network call. Tapping the screensaver's hourly forecast strip opens a full-screen weather report - multi-day outlook, wind, UV, and air quality - sourced from Open-Meteo, which needs no API key at all.

  • SvelteKit
  • Raspberry Pi
  • Google Calendar
  • Todoist
  • Open-Meteo
Job tracker showing applications pulled from Notion
Web Chrome

Job Tracker

A personal job-search cockpit: browse and edit interview Q&A answers, and track every application pulled from a Notion workspace, enriched with the matching Gmail threads (confirmations, rejections, interview invites). A companion Chrome extension shows the stage of any job posting you’re viewing as a colored dot on the toolbar.

What’s interesting Node/Express glued to two real integrations - the Notion API and the Gmail API. The extension writes new jobs straight into a structured Notion database, so saving a posting while browsing and reviewing it later are the same source of truth.

  • Node.js
  • Express
  • Notion API
  • Gmail API
  • Chrome Extension
Event Tracker board showing a Movie Night event with fictional families
Event Tracker board showing a Service Project event with fictional families
Web Local-first

Event Tracker

A local-only Kanban board for organizing family and community events - started as a movie night tracker, now generalized to any event type. Movie Night and Service Project ship built in, or define your own with custom fields. Drag each family’s card across six columns - To Invite through Attended - and archive the whole event to History with one click, ready for the next one.

What’s interesting Zero npm dependencies, running on Node 22’s built-in node:sqlite and global fetch. Event types are pluggable - each just declares its own extra fields and whether it gets a TMDB-backed Watchlist (Movie Night) or a plain Ideas list (everything else) - while the board, History, and Families tab work identically underneath regardless of type.

  • Node 22
  • node:sqlite
  • TMDB API
  • Vanilla JS
Activity Mapper showing sample pins grouped by activity type
Web Live · activitymapper.hopto.org

Activity Mapper

A geocoding tool for visualizing community activity locations on a map. Import a CSV or XLSX of addresses and activities, and it plots color-coded pins by category, with a neighborhood filter and built-in checks for activities missing a facilitator or an unmatched address.

What’s interesting Runs with no backend of its own - geocoding requests go straight from the browser to Mapbox, and nothing is persisted anywhere. That also means the screenshot above is sample data I generated myself, not anything imported by a real user.

  • React
  • Google Maps API
  • Mapbox
  • XLSX/CSV parsing
Generated devotional reading program
Web Live · bahaiprograms.hopto.org

Holy Day & Feast Program Generator

Generates randomized devotional reading programs for Bahá’í Holy Days and Nineteen Day Feasts. Pick an event, set the number of readings and a maximum length, and it assembles a print-ready program - readings distributed round-robin across authors, with reading-time estimates and a full admin CMS behind it.

What’s interesting PHP 8.5 + MySQL on vanilla PDO, with a real deployment pipeline: merging to main runs the PHPUnit suite and, only if it passes, auto-deploys to a DigitalOcean LAMP droplet via GitHub Actions. No manual steps.

  • PHP 8.5
  • MySQL
  • GitHub Actions
  • DigitalOcean
The Kitáb-i-Aqdas study companion homepage
Web Live · theaqdas.org

Kitáb-i-Aqdas Study Companion

A cross-referenced study website for the Kitáb-i-Aqdas that links the Synopsis & Codification to the underlying verses, questions-and-answers, and explanatory notes - turning a dense text into something you can actually navigate.

What’s interesting A hand-built concordance connecting hundreds of passages, written in vanilla PHP with no framework - and still held to a professional bar with PHPStan static analysis and a PHPUnit test suite. It’s been quietly serving readers at theaqdas.org for years.

  • PHP
  • PHPStan
  • PHPUnit
  • Vanilla JS

Android

Bahá'í Prayers app - categories Bahá'í Prayers app - reading a prayer
Android On Google Play

Bahá’í Prayers

An Android app for exploring and reading prayers organized by category, each with author and word count, HTML-rendered text, and beautiful imagery. Users can even upload and crop their own images for any prayer.

What’s interesting Privacy-first by design - it uses the modern, permission-less Android Photo Picker, so it never asks for storage access. Built in Kotlin with a CI/CD pipeline on Jenkins and Bitrise, and published on Google Play.

  • Kotlin
  • Android
  • Jenkins
  • Bitrise
Ruhi Quote Memorizer - quote viewer Ruhi Quote Memorizer - quote list
Android On Google Play

Ruhi Quote Memorizer

An Android app for memorizing sacred writings from the Ruhi books. Drill down from books to quotes into a distraction-free memorization viewer, with search and full light/dark support.

What’s interesting Kotlin/Android held to a strict engineering workflow: every change goes through a branch and pull request, and merges are gated on both unit and instrumented tests passing in CI. Shipped on Google Play.

  • Kotlin
  • Android
  • CI Tests

Chrome Extensions

Football Match Tracker Chrome extension popup
Chrome Open source

Football Match Tracker

A Chrome extension inspired by the FotMob mobile widget: upcoming fixtures for your favorite clubs and national teams, grouped by date, with crests, kick-off times, live scores, and a toolbar badge counting today’s matches. Configurable kickoff notifications keep you posted in the background.

What’s interesting It stitches two data sources - football-data.org for fixtures and FotMob for live scores - and caches results for an hour to stay within free-tier rate limits. Match filtering and date logic are covered by a Jest test suite.

  • JavaScript
  • Chrome Extension
  • REST APIs
  • Jest

macOS

Now Playing menu bar dropdown showing the current track and playback controls
macOS Open source

Now Playing

A macOS menu bar app that shows whatever track is currently playing - Music, Spotify, Podcasts, a browser tab, anything - right in the menu bar, with playback controls (play/pause, previous, next) one click away.

What’s interesting No Xcode project needed - it’s built and bundled entirely from the command line via Swift Package Manager. A background process streams live updates from the media-control CLI (a wrapper around macOS’s private MediaRemote framework) and parses them incrementally as JSON arrives, with artwork cached separately so it doesn’t flicker on the brief gap between tracks.

  • Swift
  • Combine
  • AppKit
  • Swift Package Manager