Posts

How to Manage Loan Repayments and Collection Visits | CobroRuta

Image
CobroRuta is an Android app for managing loan records and in-person repayment visits. It brings together customers, loan balances, installment schedules, payment history, and visit records so you can see what needs attention and what happened at each stop. CobroRuta's home screen keeps the main portfolio tools together. A practical workflow for in-person collections Create a customer profile and record the loan with its installment schedule. Generate a route from installments due today or overdue. Overdue stops come first. When usable location data is available, CobroRuta orders stops by approximate geographic distance; otherwise, due dates guide the order. At each visit, record the outcome: no contact, a payment promise and date, or a partial or full payment. Add a note or optional GPS location when useful. Review the updated balance and portfolio reports. Keep customers, loans, and payment history connected Link each loan to a customer and review its ...

Why I Built lazy_wrap for Flutter

Image
I wanted a Flutter layout that creates children lazily but still lets different-sized items wrap naturally. The fixed mode is there for items with known dimensions. By Hensell I built lazy_wrap after running into a gap in Flutter’s collection widgets. Wrap gives children their natural size and flows them into runs, which is exactly what I want for a small collection. I needed that same behavior for a much larger collection without creating every child up front. GridView.builder creates children lazily, but assumes regular grid cells. I wanted lazy creation with wrap behavior, including when item widths vary. I also wanted a simple option for uniform items: provide their width and height once, then let the layout wrap them. That became LazyWrap.fixed . LazyWrap.dynamic handles the cases where each item’s size is different or unknown until it is built. Choosing between Wrap, lists, and grids Flutter already has strong collection widgets. The right choic...

Widgets and a clearer workflow in FrogHappy

Image
This update changes much of FrogHappy’s interface. Android’s new home-screen widgets bring habits and mood check-ins within easy reach, and Work now follows a clearer route from areas to projects to tasks. I also revisited Journal, Notes, Settings, and reminders, so common actions are easier to find and the screens feel more connected. A quiet workspace for small habits, planning, and reflection. Conceptual artwork, not a screenshot. Small widgets, right where you need them Android now has two FrogHappy home-screen widgets. The Habits widget lets you check off a habit without opening the app. It puts unfinished habits first and fits up to three rows, depending on the widget’s height; larger sizes can also show when more habits are waiting. The mood widget brings a quick “How are you feeling today?” check-in to the same place, with the familiar frog faces. I like that these are small, practical pieces of FrogHappy you can keep close throughout the day. A clearer path through Work ...

Why We're Moving Consoly's Backend from Supabase to Railway

Image
Supabase worked well for us. We’re moving for financial reasons, and we expect a leaner backend on Railway to lower our recurring costs substantially. The migration has just begun, and we’ll move one module at a time. A conceptual illustration of moving from a ready-made backend platform toward a backend built for Consoly. Supabase had served us well as we built Consoly, a project in my portfolio , and we were happy with it. This decision is about costs: we currently pay for Supabase Pro and a separate DigitalOcean Droplet for multiplayer. Once the migration is complete, we expect a substantial reduction in recurring costs by moving to a leaner backend built around our own API on Railway. The options we considered We first compared running the backend in Docker on a Droplet with running that same container on Railway . The cost estimates were fairly similar, so changing where the container ran was not enough to meet our goal. We started looking at the backend itself and the op...