Bridge

Featured

A self-hosted household operations dashboard managing chore rotations, fitness tracking, and plant care, built for daily use and running 24/7 on a home server.

Screenshots

Gallery

Overview

About This Project

Bridge is a household operations dashboard I built to manage my daily life. It handles chore rotations, fitness tracking, and plant care schedules. It's self-hosted on a machine running in the house, accessible from any device on the LAN, and constantly being updated with new features added almost daily.

The starting point was replacing a collection of scattered apps and spreadsheets with one tool built around how my wife and I actually operate. This also gives us control to customize our data in the exact way we want.

Recurrence engine

Every morning a scheduled command runs and builds the day's chore list. Each chore stores a plain rule string (daily, weekly by day, biweekly, monthly by date, or on a fixed interval) and a single method decides whether it's due on a given date. The parser uses no regex and no external library, just string checks and splits.

Plant watering plugs into the same system. A separate morning task generates a watering chore for any plant that's due. Completing one triggers a side-effect chain: a watering log is created, and the plant's next water date is recalculated from the latest completion and stored. Reads are instant because the next date is always pre-computed.

Fitness tracking

After logging a workout, the fitness dashboard shows your entire history. The strength progression chart lets you pick any exercise you've actually logged, a time range (30d / 90d / 1yr), and a metric that adapts to the exercise type: weightlifting surfaces Max Weight, Total Volume, Sets, and Reps; bodyweight exposes Max Reps and Total Reps; cardio and stretching show Total Duration. Volume is computed server-side across all sets for the day. A body weight chart sits alongside it to help correlate weight changes with training.

The workout log page has a client-side rest timer with pause, resume, and restart. Timer durations are saved, and the five most-recently-used values surface as quick-picks that persist across sessions and devices.

The exercise library lets you browse exercises as cards. Opening one shows an image or video of how it's performed and lets you add it to a routine. There's a full routine builder, and a workout history section you can navigate with a calendar or a searchable dropdown. This section is one of my favorites and is constantly growing.

Plant photo upload

Plant profile photos use a custom crop UI built in Alpine. The crop selection is tracked as center and size percentages relative to the preview container, then mapped back to source pixel coordinates before cropping with GD. The math accounts for the difference in aspect ratio between the preview and the original, so a landscape photo and a portrait photo cropped to the same position in the UI produce identical-composition results.

Component architecture

Every page is a Livewire Volt single-file component (PHP class and Blade template in one file) with no hand-written controllers. Common patterns (stat cards, data tables, confirmation modals, inputs) live in shared components so updating the look of any element site-wide means changing it in one place.

Admin panel

Widget visibility runs on two independent layers: a global toggle that admins control, and a per-user toggle that each person controls from their settings. An admin turning a widget off globally overrides any user preference. The admin can also manage exercises and equipment, and control what each user can access in the app.

Theming

Dark and light modes use CSS custom properties, not Tailwind's dark: variant. The preference is stored per user and applied on load. Swapping one attribute on <html> updates every color in the UI.

Explore

More Projects

All projects
Dinner With Lucy
Live

Dinner With Lucy

A recipe and cookbook manager with fraction-accurate ingredient scaling, star ratings, and cookbook collections.

PHP Laravel Livewire MySQL +2 more
View details
CronosPulse
Live
Featured

CronosPulse

A real-time geophysical dashboard surfacing USGS earthquake data, volcano monitoring, NWS flood alerts, and stream gauge readings.

PHP Laravel Livewire MySQL +5 more
View details
EonMap
Live
Featured

EonMap

A public dashboard querying the Paleobiology Database in real time, letting users map and browse fossil occurrence records by taxon, time period, and region.

PHP Laravel Livewire MySQL +5 more
View details