Back to Projects
NestJSTypeScriptReact NativeExpoNext.jsPostgreSQLRedisOpenAIPaystackTamaguiReduxDockerHetzner

Melo

A savings app for Africa that deliberately holds none of your money. Name a goal, and it breaks the target into a weekly number, coaches you through it in plain language, and lets you join community savings challenges. Ten countries, ten currencies, and an AI that proposes but never writes.

Melo

Project Overview

Melo is a savings app for Africa, and the decision that shaped everything else was choosing not to touch anyone's money. It holds no bank accounts, no wallet balances, no card details and no access to a broker. It tracks behaviour: what you said you wanted to save for, how much you have put aside, and whether you are keeping up. That sounds like a smaller product until you consider the alternative, which is a small team asking people in ten countries to trust it with their savings before it has earned the right to.

What it does instead is the part people actually fail at. You name a goal, say what it costs and when you need it, and the target gets broken into a weekly number you can look at without flinching. Ten goal types, and the list tells you who this is for: emergency fund, school fees, groceries, rent, business, medical, transport, wedding, holiday, custom. Nobody is saving for a yacht. Goals can be pinned to a vision board, which is the least technical feature in the system and probably the most effective one, because a goal you see every time you open an app is a goal you remember on payday.

Melo is the coach, and it is an AI with one firm restriction: it never writes to the database. A conversation happens in plain language, the model works out what the goal is, and then it emits a structured payload with the name, type, amount, currency, dates and a computed weekly target. That payload goes back to the user as a confirmation card. Only a confirm turns it into a row. The same pattern handles logging progress: "I put away 500 this month" becomes a proposed entry against a specific goal that you approve before it lands. Every AI action in the system is a proposal, never a write, so the worst a bad parse can do is waste a tap.

Sessions live in Redis, goals live in Postgres, and each message costs one AI prompt credit off the user's balance, checked before the call and consumed before the model is reached rather than after. The balance resets weekly, and the whole thing is tracked so the cost of the model is a number somebody can look at instead of a surprise at the end of the month.

Challenges are the community half. An admin builds a savings programme with a duration in weeks and weekly tasks, users join, complete a week at a time, and get an AI written message for each one. The tone is a property of the challenge, chosen from gentle, motivational, celebratory and strict, which is a very small enum carrying a lot of product thinking: some people want a cheerleader, and some people want to be told off. Challenges are filterable by country, because a savings target that makes sense in Lagos is nonsense in Gaborone.

Ten countries are supported with their own currencies: Zimbabwe, South Africa, Kenya, Nigeria, Ghana, Uganda, Tanzania, Zambia, Botswana and Malawi. Monetisation runs on Paystack in the local currency rather than converting everyone to dollars, with eight product types covering single goals, goal bundles, unlimited goals, single and bundled challenges, all challenges, prompt credit bundles and a premium subscription. The user balance entity is the single source of truth for what someone is entitled to, so a quota question has exactly one answer no matter which screen asks it.

Notifications are a set of cron jobs rather than a queue, which for this shape of product is the right call. Sunday morning to plan the week, Wednesday evening for the midweek nudge, Monday for challenge progress, daily runs for goal reminders, and hourly sweeps for the time sensitive ones. Push goes out through Expo. There is nothing clever in it and nothing to go wrong at three in the morning.

Security got more attention than the feature list suggests. Email verification, password resets and email changes all run on signed one time URLs: HMAC-SHA256 over a token, stored and validated server side, compared with a timing safe comparison, expiring after an hour, and issuing a new one invalidates the old. Four roles, from super admin down to an analytics viewer who can read dashboards and change nothing, and an audit log recording admin actions.

The pieces: a NestJS API of 196 files and about 17,000 lines across fifteen modules, an Expo app of the same size again, and a Next.js web application for the admin dashboard, subscriptions and the account flows that have to work in a browser, like confirming an email or deleting an account. The mobile app is Tamagui and Redux with bottom sheets instead of modals, which is in the project's own rules for a reason: a modal on a small Android phone covers the thing you were reading.

The strict rule I am most glad about is the one at the top. When you do not hold the money, you do not need a licence, a reconciliation process, or a very bad week explaining to somebody where their savings went. You just need to be right about the arithmetic and honest about the nudging.

Key Features

  • Savings goals with a target, a deadline and an automatically computed weekly number
  • Ten goal types covering school fees, rent, groceries, medical, business and emergencies
  • A vision board you pin goals to, so they are the first thing you see when you open the app
  • An AI coach that proposes a structured goal from a plain language conversation
  • Progress logged by conversation too, as a proposal against one goal that you confirm
  • Every AI action is a proposal and never a write, so a bad parse costs a tap and nothing else
  • Chat sessions in Redis, goals in Postgres, with prompt credits checked and consumed before the model is called
  • Admin built savings challenges with weekly tasks and AI written encouragement per week
  • Coach tone set per challenge: gentle, motivational, celebratory or strict
  • Ten African countries with their own currencies, and challenges filterable by country
  • Paystack payments in the customer's local currency rather than converted to dollars
  • Eight product types from a single extra goal through bundles to a premium subscription
  • A user balance entity as the single source of truth for quotas, with a weekly prompt reset
  • Cron driven nudges: Sunday planning, a Wednesday midweek push, Monday challenge progress
  • Signed one time URLs for verification, password reset and email change, HMAC-SHA256 and timing safe
  • Four roles including an analytics viewer who can read every dashboard and change nothing
  • Expo push notifications, a Next.js admin dashboard, and audit logging on admin actions

Get the apps

Melo Money app icon

Melo Money

Set a savings goal, then let the coach break it into weeks

iOS soonGoogle Play

Challenges & Solutions

Choosing to hold no balances at all, which removes a licence problem and a whole class of incident

Letting a model create records without letting a model create records, which the confirmation payload solves

Pricing across ten currencies through one payment provider instead of converting everyone to dollars

Keeping one answer to what a user is entitled to, rather than a quota check per screen

Metering prompt credits before the model call so a runaway conversation cannot outrun the balance

Picking notification times that help rather than annoy, which is a product question wearing a cron expression

Key Learnings

Deciding what a product will not store is as much a design decision as what it will
An AI that proposes and waits for a confirmation is safe enough to point at a real database
Tone belongs in the data, because some people want a cheerleader and some want to be told off
Local currency pricing is not a nicety in Africa, it is the difference between a sale and an abandoned checkout
One balance entity beats four places that each think they know your quota
A vision board outperformed several features that took ten times as long to build

Project Info

Timeline

Ongoing

Team

Solo build for Dryback Technology

Status

Live on Google Play

Tech Stack

Backend

NestJSTypeScriptTypeORM

Mobile

React NativeExpoTamaguiRedux

Web

Next.jsReactTailwindshadcn

Data

PostgreSQLRedis

AI

OpenAI

Payments

Paystack

Security

JWTHMAC-SHA256RBAC

Infrastructure

DockerHetznerSentry