Own product
Caneta em Dia — Tracking for people on weight-management pens
An app for the day-to-day of people on a weight-management pen treatment. You follow your protein and water goals, log each dose and its injection site on a rotation, record weight, waist and symptoms, and bring a PDF report to your appointment. The app records and organizes, and never recommends or adjusts a dose.

- 9
- 6
- 7 days
Problem.
People on this kind of treatment juggle a lot of loose details: when the last dose was, where it went, how much protein they ate, how the week felt. At the appointment, all that is left is memory. And health content online mixes useful information with promises and with advice only a doctor can give.
Solution.
A mobile-first PWA with a public website alongside: a sales page, a quiz, a guide with articles for search, and the app itself. The app covers daily goals, dose logging with site rotation, weight, waist, symptoms, private progress photos, dose reminders through Web Push, video modules and a report to take to the doctor. Clinical decisions stay with the doctor, and the product says so in writing.
Result.
Live at caneta.joaovitral.com, with a subscription (7 free days, card recurrence and annual Pix), passwordless login, error monitoring and daily off-server backups. A recent product, with no usage numbers published here.
The hard part.
Every project has a point where the obvious solution doesn't cut it. Here, it was these.
A health app that refuses to prescribe
The limit is part of the product. The app only records what the doctor prescribed, and fixed text says it does not recommend or adjust doses. What it does calculate is schedule and rotation: the next dose falls 7 days after the last one, and the suggested site is the one that has rested longest among the six available. The AI protein estimate follows the same line: the prompt forbids medical advice and any mention of medication, dose or diet.
Health data under the LGPD
Dose, weight, symptoms and photos are sensitive data. Consent is stored with the account and the version of the text. Progress photos are private, kept outside the public folder, and shrunk before they leave the phone. Sentry receives only technical information (the scrubbing removes request body, cookies, user and URL tokens), and analytics cookies only load after consent, never inside the app.
A login that survives the installed PWA on iPhone
On iPhone, the installed app can't see a login done through the link opened in Safari or in the email app, and people were left locked out. The fix was to also offer a 6-digit code in the same email. Link and code are valid for 15 minutes and single-use, the server stores only the hash, and the session lasts 180 days so nobody has to sign in every week.
Recurring billing that doesn't cut access by mistake
The card is typed into Mercado Pago's own form and only the token reaches the server. The recurring subscription starts with the first charge in 7 days, which works as the free period, and the annual Pix is a one-time payment. The webhook verifies the notification signature before acting. If a charge is declined, Mercado Pago retries for up to 10 days and access continues in the meantime, while the Profile screen asks for a new card.
Running a sensitive-data product on your own
Everything runs on a VPS with Docker Compose, behind a Cloudflare Tunnel. Since the database is a SQLite file, the daily backup uses SQLite's .backup, which is consistent while the app runs, checks the integrity of each copy and sends a version to a private Cloudflare R2 bucket that expires after 30 days. A monitor hits the health endpoint every 5 minutes and alerts on Telegram after two consecutive failures.
What I did.
- In partnership with Marcelo, I own engineering and product: all the code for the app and the site is in my commits
- The app (PWA), public website, quiz, article guide and an internal funnel dashboard
- Subscription with Mercado Pago: card recurrence, annual Pix, webhook and handling of declined charges
- Login by magic link or 6-digit code, with a long session
- Protein estimation from a photo or description using the Anthropic (Claude) API
- Infrastructure: VPS with Docker Compose, Sentry, daily backups and site monitoring
Stack.
Have a similar project?
Tell me the problem — I answer personally.
See it live.
Public pages of the product, open to anyone.
Sister product.
Same foundation and same rule, for another treatment.