A small terminal ATM I built to mess around with Python. Started as a homework-style toy and grew into something a bit more fun — multiple accounts, persistence between runs, transfers, history, the works.
Runs fully offline. Account state lives in accounts.json, transactions in history.json. Delete those files to reset.
┌─────────────────────────────────────┐
│ PINNACLE BANK ATM v2 │
│ insert card to begin │
└─────────────────────────────────────┘
- multiple cards, each with its own pin and balance
- pin entry hidden with
getpass(no shoulder surfing) - 3 wrong pins = card locked for 60 seconds (and the lockout sticks across restarts)
- withdraw in GEL / USD / EUR with a 1.5% commission
- deposit money back in
- transfer between cards
- change pin without touching the file
- per-card transaction history (last 10 shown)
- colored output (works on Windows 10+ too)
python ATM.pyNo dependencies. Python 3.7+.
Default cards to play with:
| card | pin | balance |
|---|---|---|
| card | 1111 | 10000 ₾ |
| demo | 0000 | 500 ₾ |
Rates and the commission live at the top of ATM.py:
RATES = {
"GEL": (1.0, "₾"),
"USD": (2.68, "$"),
"EUR": (3.08, "€"),
}
COMMISSION = 0.015
LOCKOUT_SECONDS = 60