Case Study
VM Concepts PWA
Progressive Web App
Overview
This is a progressive web app I built for two reasons: to consolidate the scattered tools I rely on daily into one clean interface, and to give myself a real, ongoing project for experimenting with AI features as they evolve. It started as a replacement for a legacy PHP/MySQL client manager I had been using for years and grew from there into a multi-module platform I actually use every day.
The Challenge
I was spread across too many separate tools. Client credentials in one place, tasks in Trello, notes in Notion, finances in spreadsheets. None of it talked to each other, and none of it was built the way I wanted it to work. I also wanted a personal sandbox where I could integrate AI capabilities in practical, real-world contexts rather than toy demos. Building my own platform gave me full control over both.
Approach
React with Vite keeps the development cycle fast and the builds lean. Supabase handles authentication, the database layer, and real-time subscriptions, so I get a full backend without managing infrastructure. Tailwind was a deliberate tradeoff: for a tool I’m the primary user of, rapid iteration mattered more than a fully custom design system. The app is installable as a PWA and feels native on mobile without going through an app store. Authentication supports both email and Google sign-in.
The Modules
The platform is organized into eight sections, each replacing or improving on something I was already doing elsewhere.
The client manager was the starting point. It replaced a legacy PHP/MySQL app I had outgrown, and stores everything I need for each client: domain and hosting credentials, repository links, and any other access details I manage on their behalf.
The task manager is a full Kanban board built to replace Trello. It supports multiple columns, drag-and-drop card arrangement, labels, due dates, checklists, and keyboard shortcuts. Functionally it covers everything I was using Trello for.
The notes section replaced Notion. It uses a free-writing style editor with auto-save and click-to-edit inline, so there’s no friction between thinking and writing. One of the more personal features is an AI assist button in the lyrics editor, which helps me work through song lyrics so I can stay focused on melodies. I also built an import tool that pulled all my existing notes out of Notion when I made the switch.
The habits tracker covers daily personal goals: reading, walking, running, working out. It’s a lightweight module, but one I built with an eye toward eventually spinning out as a standalone app.
The fitness section goes deeper, with goal setting, milestone tracking, weight management charts, and deadline countdowns.
The life timeline is a section for recording important personal events with a graphic visualization. It’s the kind of thing that’s easy to neglect but meaningful to have.
The projects section tracks active freelance work and revenue, giving me a single place to see what’s in flight and what’s been billed.
The finance section is the most technically involved. It was built primarily for bookkeeping and handles importing bank statements, automatically categorizing transactions, filtering by period (month, quarter, year, last year), and generating reports with charts. The most interesting feature is receipt scanning: I can photograph a receipt, and the app uses AI to detect the amounts and match them to the corresponding transactions. It also supports exporting data and generating profit and loss statements.
The dashboard ties everything together, surfacing key data from across the modules alongside a weather widget powered by the OpenWeatherMap API with a configurable location.
Outcome
The app replaced Trello, Notion, and several spreadsheets I had been maintaining separately. More than the consolidation, it has become a working testbed for integrating AI into tools with real daily utility, from lyric assistance to automated transaction categorization to receipt recognition. Each module added was a chance to go deeper into a different part of the stack.