Security built into the
data layer, not bolted on.
Security controls are designed into the data flow, agent access, and API surface — not added as an afterthought.
Five security layers
AES-256-GCM token encryption
Plaid access tokens are encrypted at rest using AES-256-GCM. Keys never leave the server environment.
const ALGORITHM = "aes-256-gcm";
const IV_LENGTH = 12; // GCM recommended
const TAG_LENGTH = 16; // integrity tag
const iv = randomBytes(IV_LENGTH);
const cipher = createCipheriv(ALGORITHM, key, iv);
const authTag = cipher.getAuthTag();
// stored as iv:ciphertext:authTagDatabase-layer agent boundaries
Agent tool access is constrained through database views that exclude sensitive columns from AI context.
CREATE VIEW agent_accounts_view AS
SELECT
id, name, type, subtype,
current_balance, available_balance,
credit_limit, is_active
FROM accounts
WHERE is_active = true;
-- plaid_access_token: EXCLUDED
-- sync_cursor: EXCLUDEDLayered rate limiting
Independent rate limits on login, chat, reports, and global API traffic prevent abuse at each surface.
login: 5 req / 15 min
sync: 3 req / 15 min
chat: 20 msg / 1 min
planner: 3 runs / 1 hr
reports: 5 req / 1 minWebhook signature verification
Plaid webhooks are verified with JWT signature and body-hash checks before any processing occurs.
const signedJwt = headers["plaid-verification"];
// 1. verify JWT signature (SHA256 + ECDSA)
crypto.verify("SHA256", data, publicKey, sig);
// 2. verify body integrity
const hash = crypto.createHash("sha256")
.update(body).digest("base64url");
return payload.request_body_sha256 === hash;Audit log for security events
Critical account and security events (login, token exchange, deletions) are recorded with IP and timestamp.
type AuditAction =
| "login"
| "password_change"
| "institution_link"
| "institution_delete"
| "report_download";
// failures never block the primary action
await db.insert(auditLog)
.values({ action, ip, metadata });Deployer checklist
Powerhour handles application-level security. These infrastructure concerns are on you.
- Serve the application over HTTPS with a valid TLS certificate.
- Rotate
SESSION_SECRETand Plaid credentials periodically. - Keep Node.js and npm dependencies up to date with security patches.
- Restrict database network access to the application host only.
Your data never leaves
your infrastructure.
Every security control is open source. Read the implementation, audit the code, verify the claims.