Show HN: ProgressCove, calm and smart to-do app with Home Assistant integration

1 pointsposted 4 hours ago
by twentyshores

2 Comments

twentyshores

4 hours ago

I’m a network engineer in my day job, have two school age kids, I volunteer for my kids scouting troop and have many hobbies (astronomy, electronics, gaming, home server lab to name a few) and I always added tasks faster than I can finish them. I started writing projects and tasks on paper, which quickly became unsustainable. I could see everything ongoing at a glance, but it became useless as I complete and add tasks. Eventually I decided to try some of the popular apps.

Many apps are great at what they do, but I just couldn't find one that fit my needs. Some were based on Kanban/Scrum like approach and I really didn’t want something that reminded me of my day job in my free time. Some would not let me create tasks without due dates. I do my personal projects whenever I have free time, not on a fixed schedule . Others had platform limitations, missing web or mobile app, and some did not let family members create their own projects unless they have their own subscription. I eventually settled on one, decided to write a middleware that would read tasks with API, calculate a completion percentage for each project, generate and upload a status image to Amazon photo gallery to show as slideshow on Echo Show screen. The goal was to keep an eye on what projects I am closer to finishing and which tasks are my next goals. It felt like trying to fit a square into a round hole with an app that wasn't designed for how I think. I decided to ditch the whole middleware approach and started building something I truly wanted to use.

I started with a working title of calmprogress. I aimed for an app where every field except name is optional, and no overdues. Everything that would normally be past due is simply due until done, and ongoing is a valid state. For me and I think for many others, red past due warnings are only a cause for anxiety which leads to procrastination, so I skipped red text (except for very few irreversible actions) completely. Smart Home integrations, no platform lock in, open API, access for whole family as first class users (all family members can create their own tasks, separate from the account holder), offline first with online sync were non negotiables. Making progress towards goals while not causing distress is the main goal of the app, so I decided on the final name of ProgressCove.

Architecture Choices

Backend: Python FastAPI was an easy decision, since an open and accessible API was a nonnegotiable of this project. Nginx proxy to accept connections, PostgreSQL with PgBouncer on a Hetzner VPS. Database is backed up to separate attached disk and periodically dumped, encrypted and backed up off cloud. Everything is built with containers, so I can scale it up without too much trouble. I started with one proxy VPS and one backend VPS and Mikrotik CHR to secure all traffic from proxy to the backend. I was spreading the load across more VPS, prices increased by 300% around this time, so I decided to leave most of it consolidated on a shared VPS until user base growth calls for the expansion.

Frontend: All logic, including smart features of the apps run on the server. The only way to read data from the server is through the API. This allows me to host a lightweight React web app on a Cloudflare worker for the web app. Mobile apps use React Native with Expo. This keeps adding features to both web and mobile versions relatively simple.

AI coding without the slop: I could eventually write everything by hand, but it would take significantly longer. It does not make sense to penalize myself for pride; I used Claude Code to write the code while I provided heavy guidance. If you let Claude write your whole codebase without oversight, it’s more than happy to write 80+ lines of useEffect hooks you can get lost in and throw a single page into a single file instead of breaking into reusable components, negating biggest advantages of React. I followed an iterative process, where I write requirements and explain details such as expected classes, attributes, objects, let Claude write the initial version, then go over it and fine tune, telling Claude exactly what needs to be changed. Once that’s done, then have it write tests, do a security review, and adversarial review where it hands it off to several sub agents to find exploits.

Offline first, PIN protected databases for the whole family: Since offline usage is a must, I used WatermelonDB for mobile app versions to store data locally, with a sync function triggered automatically on save and periodically on a timer to the server, and SSE triggered from the server, as long as there’s internet connection. To keep data secure for family devices, each user gets their own PIN protected database. When a different user is selected, app will ask for the user’s PIN, relaunch the app with that user’s database, and lock switching back to the account holder with their PIN. Database picking is limited to app launch, which helps avoid most user/database selection type of bugs. Current family implementation gives only the account holder log in credentials, so account holder needs to log in and switch to the user to give family members their own app installation. I am working on a family based log in system, so all family members can log in directly. Sharing anything with family is already in the app, and with this family log in implementation, task assignments will be added as well.

How to write for different platforms while keeping it sustainable: Flow of the app logic is always same regardless of platform. For example, non mobile clients & integrations follow same sync model as mobile, but they assume always online and skip the code components that write to offline database and sync immediately. I also avoided mixing platform specific code and shared code, which allowed me to minimize the former as much as possible. Keeping all code blocks like lego pieces in the monorepo, I could impor only the relevant blocks for the platform. So far, I have released Android, iOS (and their Widget & Speech integrations, having Google or Siri add your tasks) and Web app from this monorepo and a Home Assistant integration from a separate repo, since it uses MIT license and is fully open. Echo Show and Google Home integrations are on the way, and anyone can write their own for any platform if they desire. (I still need to write and host API documentation, but no additional work required to make it available to everyone, and one could easily figure it out from Home Assistant Integration code).

A contract file is also shared across different platforms, which contains value limits accepted by the API. Clients will check the contract to ensure they send correctly shaped and sized data, but server does not blindly trust the client and also does its own checks on incoming data.

Continued on first reply

twentyshores

4 hours ago

Home Assistant and rethinking chore loop: Native Home Assistant integration provides components that I've been looking forward to having on my own Home Assistant installation. I always imagined a style of chore reminder on Home Assistant, where chores would show as buttons that light up as they needed to be taken care of and dim when done, so I can see a chore that’s not due easily in advance (if I know AC filter needs changing in a week, I can go and buy some), but also not disappear after rolling over to next occurrence (so I know its not something I need to worry about any time soon and rest easy knowing they are truly done). First card I added was this card, repeating task tracker. Tasks will light up and become active when due, after clicking it will go dim, and give you 10 seconds to undo to protect against accidental taps, then roll over to the next occurrence and stay dim until due again. I added two repeat modes to address different cases and these will be available on next app build:

- Until checked: For tasks that can be done at any time. Typical recurring task, will wait for you to check it before it rolls over to next occurrence. - On Schedule: This is for types of tasks that always occur on the due date, such as taking out the garbage. Garbage truck will come and go and does not care whether you marked it on your app.

Integration comes with two more cards, a list view (can show a project, task, life domain, whatever you choose, plus their direct descendants), and summary view, which will show due and ongoing tasks and notifications, which is a copy of the mobile app widgets. These cards can be seen on [ProgressCove Home Assistant GitHub page](https://github.com/Twenty-Shores/progresscove-homeassistant) which is pending HACS inclusion.

Break decision fatigue with Soup Mode: Another repeat mode I have added is something I have not seen in any app before. I called it soup mode after the phrase ‘soup of the day’. This mode is for tasks where you want a little randomization to keep things interesting, such as picking the soup of the day, what movie to watch, workout rotations, bedtime story, and so on.

How it works:

- You create a task, let’s say ‘Soup’. You add your soup varieties as subtasks; Tomato Bisque, Minestrone, Chicken Noodle. - On activation of soup mode, it will pick the first subtask and rename the task to contain the subtask name, ‘Soup: Tomato Bisque’. - On completion, it will roll to the next occurrence and pick the next one, ‘Soup: Minestrone’. - Shuffle option will randomly change order of the list after each subtask completion, so you never know what the next pick will be. - Soup has two repeat modes, 'everything picked once then complete' and 'randomly pick, repeats allowed, never complete'.

Prioritizing project completion over spreading attention with smart weights: One issue I always suffer is having too many open projects at once, making a little progress at a time on each and never reaching completion. I aimed at addressing it by a smart weights algorithm. Projects and tasks by default are ordered by weights, higher is displayed first. Three values contribute to weights: - Highest contribution comes from completion percentage which is on an exponential curve that starts slowly and rapidly ramps up as it nears 100%. - Second highest is project/task age. Newer tasks get the highest values. This ensures newest tasks/projects are always displayed on top to ensure something user entered does not disappear due to not having any progress. As age increases, the value slowly decreases where it bottoms out at 9 to 14 days, after that it starts increasing again, but never reaches value of a new task. - Last contribution comes from subtask completion percentage. This contributes little compared to the other two, mostly as a tiebreaker. This algorithm contributes more value to tasks that have more subtasks completed. I aim to add more smart task management features, such as detecting stuck projects and offering methods to simplify projects (such as breaking into smaller, more easily achievable tasks), offering task management methods to handle them (timeboxing, task batching, 2 or 5 minute rules etc.).

Not giving the user enough rope to hang themselves: There's more advanced features, such as allowing tasks to go 8 levels deep (default is 4, domain -> project -> task -> subtask) behind an advanced setting. Advanced settings can get complicated, allowing users to move an item to a different level (such as turning a subtask into a project), turning off smart weights algorithm, renaming tiers (you could rename the word 'project' into 'donkey' if you wish, having the app tell you that you have 8 donkeys) which is a feature mainly to help users who don't like the ordering of domain, project, task, subtask. Behind the scenes the code simply calls them 'nodes' and only keeps track of the relationship between them. All of these options are hidden in an Advanced settings menu. There's also the opposite, where the user can further simplify things, such as turning off mention of time completely, so you would never see start, due dates or reminder options, to help users with severe anxiety, and make task cards bigger and more spread to have more eye resting room.

Transparency and Pricing:

ProgressCove is a paid app with a 14 day no card required, full feature trial. After that it’s $4.99 per month or $39.99 per year, which will pay infrastructure costs, allow me to keep the apps updated, add new features and integrations. I intend to make a self-hostable version. I love the homelab community and I am one of them, but time constraints make paid versions a priority to be able to afford to spend more time on the project. My aim is to work for my own company full time, building this and many other software applications I have on my mind.

I would love to get your feedback, hear opinions on architecture, design goals, or simply talk about anything else you find discussion worthy.