| TLS for client-server traffic | In place |
| Secrets kept out of Git in restricted private files | In place |
| Separate database roles; application role cannot read bank secrets | In place in development and staging; production to come |
| Automated tests before deployment | In place |
| Plaid webhook signature verification | Implemented, wiring pending |
| Fictitious data outside production | In place |
| MFA on online administrator accounts (GitHub, AWS, Coolify, Plaid, Google, Apple, DNS) | In place |
| SSH key-only access with password authentication disabled | In place |
| MFA on SSH access to the server | To do |
| Production database on an encrypted volume with a KMS-protected key | To do |
| KMS envelope encryption of Plaid access tokens | Implemented; production KMS key to create |
| Encrypted backups to S3 in Canada and restore test | To do |
npm audit and Trivy in continuous integration, before every production release and weekly | In place |
| Automatic server security updates | In place |
| Access, incident, exception and end-of-life registers | Created, to be maintained |
| User MFA (email code, then passkeys) | To do |