A complete, working bank portal: accounts, transfers, cards, bill pay, statements, notifications, and an admin console — with a real Node.js/Express + SQLite backend behind a fast, no-build-step HTML/CSS/JS frontend.
cd backend
npm install
node db/seed.js # creates demo + admin accounts with sample data
npm start # starts the server on http://localhost:4000
Then open http://localhost:4000 in your browser. The Express server serves the frontend directly, so there’s nothing else to run.
Requires Node.js 22.5+ (24.x is fine). The database layer uses Node’s
built-in node:sqlite module, so there’s no native compiler, Python, or
build tools needed — npm install only installs plain JavaScript packages.
You’ll see a one-line ExperimentalWarning: SQLite is an experimental
feature at startup — that’s expected and harmless.
| Role | Password | |
|---|---|---|
| Customer | demo@novabank.com | Demo@12345 |
| Admin | admin@novabank.com | Admin@12345 |
Or click “Open an account” on the login screen to register your own.
Backend (backend/) — Express + SQLite (better-sqlite3), JWT auth, bcrypt
password hashing.
routes/auth.js — register, login, sessionroutes/accounts.js — checking/savings accounts, deposits, withdrawalsroutes/transactions.js — transfers between own or other accounts, full ledgerroutes/cards.js — issue virtual cards, freeze/unfreeze, spending limitsroutes/billpay.js — payees, billers, one-off paymentsroutes/profile.js — edit profile, change passwordroutes/notifications.js — in-app notificationsroutes/admin.js — bank-wide oversight, freeze customers/accountsFrontend (frontend/) — plain HTML/CSS/JS (no build step, loads instantly).
login.html / register.html — split-screen auth screensdashboard.html — balance ledger, spending breakdown, recent activityaccounts.html, transfer.html, cards.html, billpay.html,
statements.html (with CSV export), profile.html, admin.htmlbackend/db/bank.db (SQLite file), created on first run.JWT_SECRET in backend/.env before using this anywhere but locally.