# AquaLog Case Study: Aquarium Logbook App

Source: https://www.plutonapps.com/work/aqualog

Published 2026-10-24, updated 2026-10-24. By Irfan Habib (https://www.plutonapps.com/authors/irfan-habib).

An aquarium logbook for people who keep fish: tanks and cleanings, a journal of every fish, water tests, what the hobby costs, the store room and reminders, in one calm app that still works with no signal. It began in Lovable from its founder's brief. We engineered what sits underneath: reminders that follow each keeper's own day, one model for money in any currency, a database that refuses impossible values and walls each keeper's records off, and an admin console whose audit log cannot be rewritten.

## At a glance

AquaLog is an aquarium logbook for fishkeepers: tanks and cleanings, a livestock journal, water tests, hobby spending, a store room and reminders, in one web app that works offline. It began in Lovable from its founder's brief; Plutonapps engineered the system underneath, from one notion of a day to one model for money. It is live at aqualog.space, with free guides and tools beside the app.

- **Product:** An aquarium logbook: tanks and cleanings, livestock, water parameters, hobby finances, a store room and reminders
- **Built in Lovable:** The first version, from the founder's own brief
- **Stack:** React 19 · TanStack Start · Tailwind CSS v4 · TanStack Query · Clerk · Supabase PostgreSQL · Vercel
- **Sign-in:** A six-digit code sent by email, with no password
- **Timeline:** First commit June 14, 2026, in Lovable · direct engineering from August 17 · production build October 17, 2026
- **Status:** Live at aqualog.space

Product site: [aqualog.space](https://www.aqualog.space)

## What was AquaLog designed to do?

AquaLog started in Lovable on June 14, 2026, from its founder's own brief: many aquariums of different sizes, cleanings kept only in memory, the fish in each tank, the money, and a store room to keep track of. The first version took that shape in Lovable as a set of screens for tanks, fish, finances and stock. That brief became the specification, and the six records on today's home page still follow it.

## Why could the first version not go live as it was?

A logbook is only useful if it is right. In the first version of AquaLog's database, reminders converted every log to UTC, so a keeper in Kolkata logging a water change at 2 a.m. would get yesterday's date and a reminder due again at once. A monthly reminder was 30 days, and drifted off the calendar. Equipment prices and maintenance costs created no expense, so a new filter never reached the budget, and one database function would hand any caller another keeper's time zone. Each of these is recorded in the migration that fixed it.

Plutonapps engineered six parts of the system under AquaLog's screens: the notion of a day, money, privileges, value limits, the admin console and offline use. Each row sets the risk beside what replaced it.

## Product decisions

### Six records, done properly

Tanks and cleanings, a livestock journal, water parameters, hobby finances, a store room and reminders: the records a fishkeeper actually keeps, and no dashboards nobody opens.

### Logging that takes seconds

A water change, a new fish, a bag of food or a test result is one quick entry. Tanks in storage stay out of the way, and the overview shows what is overdue and what is running low.

### No password to remember

A keeper signs in with a six-digit code sent to their email, and the app installs to the home screen like any other.

### Guides and tools in the open

Beside the app, a public care guide, fishkeeping guides and free calculators for tank volume, water changes, stocking and electricity cost, with the public pages published in 22 languages besides English.

## What did Plutonapps engineer?

### One notion of a day

Risk in the prototype: Reminders converted every log with a fixed UTC offset, so a keeper outside UTC could log a water change on the wrong day, and a monthly cadence stored as 30 days drifted five days off the calendar in a year.

Each keeper now carries a time zone, and the trigger that schedules the next reminder uses it. Cadence is stored as a number and a unit, so monthly means a real calendar month, and the old count of days is derived from that pair, so the two can never disagree.

### One model for money

Risk in the prototype: Costs booked outside the transactions table had no currency at all, a half-typed currency could break a row's formatting for good, and four ways of writing money disagreed: a filter's price never reached the budget.

Every amount now has a currency beside it, checked for shape. A costed record owns at most one linked expense, kept in step by a single database function, while expenses a keeper enters by hand are never touched by it. Stock carries its price per unit, so the store room can be valued.

### Privileges closed at the database

Risk in the prototype: Postgres grants every new function to the public by default. One function took any keeper's id and returned their time zone, a genuine read across accounts.

Every table in the first schema has row-level security switched on, and the default public grant on database functions is revoked. The function that read across accounts is no longer callable by clients at all.

### Limits the database enforces

Risk in the prototype: The browser is not a trust boundary. A hand-written request with a valid session could store a fish count of a billion trillion and poison every total on the dashboard.

Every numeric limit the forms check is mirrored as a constraint in the database, which holds the authoritative copy, so an impossible value is refused whichever way it arrives.

### An admin console with a record

Risk in the prototype: Running a product means acting on people's accounts, and an action nobody can trace, or a log that can be edited afterwards, is a trust problem.

The admin console writes every action to an audit log that is append-only three times over: no grant to change it, no policy to change it, and a trigger that refuses any change. An account switch can suspend a user, and every admin request re-checks the session and the role in the database.

### Readable with no signal

Risk in the prototype: Fish rooms and store rooms are not known for good reception, and a change that fails silently is a log that is quietly wrong.

AquaLog installs as an app, keeps tanks, logs and stock readable offline from a cache scoped to the signed-in keeper, and holds a change made offline until there is a connection instead of dropping it.

## What were the results?

- **159** Automated test files in the production build
- **13 of 13** Tables in its first schema with row-level security on
- **22** Numbered database migrations, each safe to re-run
- **29** Fishkeeping guides on its public site, beside 4 free tools
- **22** Languages its public pages are published in, besides English

_Counted from AquaLog's own repository at its production build of October 17, 2026, and from its live sitemap on October 24, 2026. It has no published user figures, so none are quoted._

## Outcomes

- 159 automated test files in the production build.
- Row-level security on every table of its first schema.
- Reminders that follow each keeper's own time zone and calendar.
- Live at aqualog.space, with its guides and free tools beside the app.

## What do we hold ourselves to while it runs?

- **Dates:** Each keeper's own time zone, real calendar months
- **Money:** A currency beside every amount, one linked expense
- **Access:** Row-level security and revoked default grants
- **Audit:** An admin log nobody can rewrite

## What else do people ask about AquaLog?

### What does AquaLog keep track of?

Six records a fishkeeper keeps: tanks and their cleanings, every fish and what happened to it, water test results, what the hobby costs, the food, medicine and spares in the store room, and reminders for each recurring job.

### Does AquaLog work offline?

Yes. It installs to a phone's home screen, tanks, logs and stock stay readable with no signal, and a change made offline waits for a connection instead of failing silently.

### What did Plutonapps build for AquaLog?

The system under its screens: reminders that follow each keeper's own time zone and real calendar months, one model for money with a currency beside every amount, row-level security with tightened function privileges, value limits enforced by the database, and an admin console with an audit log nobody can rewrite.

### Is AquaLog live?

Yes. AquaLog is live at aqualog.space, with its fishkeeping guides and free tools beside the app.

## Sources

- [AquaLog's own site, aqualog.space](https://www.aqualog.space)
