Case study 07 / 09
Personal project · open-source extension · 2023
The Banker
An open-source Django banking app that I extended with money transfers, email and SMS alerts, PDF statements and live currency rates.
- Role
- Developer of the extensions
- Stack
- Python
- Django
- PostgreSQL
- Bootstrap 5
- Twilio
- ReportLab
- Jazzmin
- Links
- Original open-source project (opens in a new tab)github.com/saadmk11/banking-system
Credit
Built on the open-source banking-system project by Maksudul Haque (MIT licence). The accounts and transaction core come from that project.

01
Overview
The Banker is an online-banking demo in which customers manage an account, deposit and withdraw money, send transfers and review their history.
I started from an existing open-source Django project that handles accounts and basic transactions, and built a new interface and a set of features around it over about a month in 2023.
02
The brief
A banking product is mostly about what happens around a transaction: telling the customer, keeping a record they can download and showing what their money is worth. The original project covered the transactions themselves; the brief I set myself was to add the services around them.
03
Role and scope
- Role
- Developer of the extensions
- Scope
- Built on Maksudul Haque’s MIT-licensed banking-system project, which provides accounts and basic transactions. Everything listed under features is my addition.
04
Main features
Money transfers
Transfers between accounts, alongside the existing deposits and withdrawals.
Email notifications
HTML emails for account activity, sent automatically when transactions happen.
SMS alerts
Text-message alerts delivered through Twilio.
PDF statements
The date-filtered transaction report can be exported as a PDF.
Currency rates
A currency page showing live exchange rates against the Afghan afghani.
Profiles and support
Profile editing, password change and reset by email, and a contact form.
05
How it’s built
Notifications from signals
Email notifications are triggered by Django signals on transaction events, so the views that move money stay free of messaging code.
Generated documents
Statements are rendered server-side with ReportLab, so the PDF matches the report the customer filtered on screen.
A rebuilt interface
28 templates in a new Bootstrap 5 interface replaced the original front end; the login, registration, transaction-form and report templates were reworked from it.
Pull requests on a solo project
Each feature was built on its own branch and merged through a pull request, 20 in total, which kept the history reviewable.
Integrations
- Twilio SMS
- SMTP email
- FastForex exchange-rate API
- REST Countries API
- ReportLab PDF
06
Challenges and decisions
Extending without rewriting
The original models and transaction logic were kept intact. New behaviour hooks into them through signals and new views, which made the additions easier to reason about.
07
What was delivered
- Transfers, notifications, PDF statements and a currency page on top of the original core
- A rebuilt Bootstrap 5 interface
- An admin back office styled with Jazzmin
Retrospective
What I would change for production
Atomic transfers
In this demo a transfer updates two balances in separate steps. A production system needs both updates inside one database transaction, with row locking.
Tests around money movement
The project has no automated tests. Transfers, statements and notifications would be the first things to cover.
Isolating third-party APIs
The REST Countries version the currency page used has since been deprecated. Wrapping external calls in a small adapter makes that kind of change a one-file fix.
