Instant transfers, no waiting.

Open an account in minutes, watch your balance update the moment a transfer settles, and send money to any NEO account by ID — all behind bank-grade session security.

saga
atomic transfers
cents
integer money only
0
floats in balances
NEO Bank dashboard showing an account balance of $12,480.55 USD, recent transactions, and quick actions

Everything you need to move money

A focused set of features that make everyday banking effortless — no feature bloat, no hidden fees.

Instant transfers

Send money to any NEO account by ID. The saga debits and credits atomically, so a transfer either completes fully or compensates cleanly.

Bank-grade security

Argon2id password hashing, RS256 JWT sessions with rotating refresh tokens, and authorisation checks on every account-scoped request.

Real-time balances

Your balance and transaction history update the moment the saga confirms a movement — amounts are stored as integer cents, never floats.

Full audit trail

Every security-relevant event lands in an append-only audit log inside the owning service's keyspace, correlated end to end.

Event-driven core

Go microservices over Kafka and Cassandra — an API gateway, Auth, Account, Transfer, and Transaction services, each owning its own keyspace.

Open source

The entire platform — Go microservices, React frontend, Cassandra, Kafka, Docker Compose, and Terraform — is on GitHub.

Security is architectural, not bolted on

NEO Bank denies by default: every protected endpoint validates a JWT, every account-scoped query is authorised against verified ownership, and cross-account access returns 404 rather than leaking existence.

  • Passwords hashed with Argon2id; refresh tokens stored as SHA-256 hashes and rotated on every use
  • Reuse of a revoked refresh token revokes the entire token family
  • Balance mutations run only in Kafka consumers via Cassandra lightweight transactions — never in request handlers
  • All mutating operations are idempotent via Idempotency-Key
NEO Bank transaction history showing debit and credit entries with status badges

How it works

From signup to a settled transfer in three steps.

01

Register

Open an account in minutes. Credentials are hashed with Argon2id and sessions run on rotating RS256 JWT refresh tokens.

app.neo.bank/register
02

Send

Enter a recipient account ID and amount. The Transfer Service orchestrates a saga over Kafka: debit and credit commands go to the Account Service.

POST /api/v1/transfers
03

Settle

Cassandra lightweight transactions apply the balance changes atomically. Failures trigger compensation, and every step is idempotent.

balance updated · audit logged

Run it locally

Copy .env.example to .env, fill in the JWT keys, and bring the whole stack up with Docker Compose — gateway, four Go services, Cassandra, Kafka, and the React frontend.

Install
$ git clone https://github.com/hieudoanm/neo.bank
$ cd neo.bank
$ cp .env.example .env   # fill in JWT keys
$ docker compose up --build
frontend → :3000 · api gateway → :8080

NEO Bank is a software demonstration — synthetic data, no real money. See the README for the full stack overview.