ENGINEERING PLATFORM · SELF-HOSTED

Best practices that don't depend on discipline.

Catalog, infrastructure, secrets, databases, internal access, releases and incidents on one platform, in your infrastructure. One rule for every access, and every access on record.

Opens a WhatsApp chat. Prefer email? [email protected]

TERMINALheimdall db access
heimdall db access request pg-orders-orders --operations SELECT,UPDATE --tables public.orders,public.customers --reason "corrigir pedidos com total errado" --task-key OPS-101
✓ Access request submitted for database 'pg-orders-orders'
  Operations: SELECT, UPDATE
  Reason: corrigir pedidos com total errado
  Task: OPS-101
  Expires: 2026-10-10T08:13:58.978413Z
  Duration: this database's default for those operations
  ('heimdall db expiry show --database pg-orders-orders' shows the defaults and the ceilings.)
  Status: pending approval
  An approver decides it with 'heimdall db access approve <grant-id>'.

heimdall db access approve 05512517-3276-4918-af87-79ef234fbd9d
✓ Access request 05512517-3276-4918-af87-79ef234fbd9d approved
  Status: active
  The requester can connect now with 'heimdall db connect <database>'.
Real CLI output. Whoever asks can't approve their own request.

THE PLATFORM

The whole cycle, under one set of rules.

From the map of what you run to the response to an incident: seven modules under the same access control, and every access on record.

  • 01

    CATALOG

    The map every module uses as its address.

    Domain, System, Component and environment. Everything else builds on it: releases, incidents, secrets and network services point to the same Component, instead of separate records nobody reconciles.

    See the Catalog module

  • 02

    INFRASTRUCTURE MANAGER

    Infrastructure requested from the catalog, applied inside your network.

    Heimdall plans and applies Terraform in your infrastructure, and keeps the state in your account's bucket. On AWS, GCP and Azure, the credential comes from OIDC federation by default and is never stored. When the resource schema requires approval, someone else approves the exact version they saw. Works with AWS, GCP, Azure, Kubernetes, Helm and Cloudflare.

    See the Infrastructure Manager module

  • 03

    SECRET MANAGER

    A secret's value only exists in your Agent.

    The API refuses to receive the value; it governs the name, the version, who may read it and who did. The Agent stores the value under a key you hold, and only serves a read once it has recorded it. When someone leaves the company, every secret they read is marked at_risk.

    $ heimdall secret access-log db-password
    ACCESSED_AT           ACCESSOR                ENVIRONMENT  VERSION  SERVED_BY   FROM       READS
    2026-10-10T06:18:58Z  agent site-agent        prod         3        site-agent  127.0.0.1  1
    2026-10-10T06:18:45Z  [email protected]  prod         2        site-agent  127.0.0.1  1
    2026-10-10T06:18:45Z  [email protected]  prod         3        site-agent  127.0.0.1  1

    See the Secret Manager module

  • 04

    DATABASE MANAGER

    Production access: requested, approved by someone else, set to expire.

    Every access has a named approver and an expiry, and nobody approves their own request. Commands and migrations respect the database's time window. The password is created in the Agent and stays there.

    masking by source column: a tax ID comes back as [CPF] even when the query renames it, reads it in a subquery or goes through a view. guardrails refuse a DELETE without WHERE on the spot; for it to run, someone else has to approve it, and the approval covers a single execution.

    NOTICE:  Heimdall authenticated this connection as PostgreSQL role "hd_pg_orders_orders_7cyjmwi7_hdm" under access grant 05512517-3276-4918-af87-79ef234fbd9d; any credentials you supplied were not used and were not sent to the database.
    psql (18.6, server 17.11)
    Type "help" for help.
    
    => select cpf as documento, upper(email) as e, name from customers limit 1;
     documento |    e    |   name    
    -----------+---------+-----------
     [CPF]     | [EMAIL] | Ana Souza
    (1 row)
    
    => UPDATE customers SET name = 'cliente de teste';
    ERROR:  HEIMDALL GUARDRAIL: UPDATE without WHERE clause is blocked by guardrail "DELETE and UPDATE need a WHERE" [require-where]. To run it, get it approved first, then run it again: heimdall db command submit 'b4bc0108-1814-47df-a9a9-7e591423dae6' --reason '<why this must run>' --sql 'UPDATE customers SET name = '\''cliente de teste'\'';'
    Real output, through the Heimdall proxy.

    See the Database Manager module

  • 05

    INTERNAL APP ACCESS

    Internal apps in the browser, without a VPN.

    The edge runs in your infrastructure, and that is where TLS terminates. Each access is granted to one person for one service, with an expiry and a reason, and is recorded before the first byte goes through.

    See the Internal app access module

  • 06

    RELEASE MANAGER

    You approve the exact change that goes to production.

    Heimdall commits the new version to your manifests repository, and your GitOps tooling delivers it. Approvers see the diff, the gate is asked again right before the commit, and a rollback returns to the previous known version, with no one picking the target by hand.

    See the Release Manager module

  • 07

    INCIDENT MANAGER

    An incident only closes once its postmortem is approved.

    Every rollback opens an incident automatically, dated from when the bad version landed. A database break-glass is tied to the open incident, but the incident never grants access: it records why the access happened.

    See the Incident Manager module

THE RULE IS YOURS

You set the rule. The platform enforces it.

Each organization sets, database by database, how long access lasts, who approves and when a command may run. From then on, the rule doesn't depend on anyone remembering it. Some limits, though, no configuration can exceed: no access lasts more than 30 days, and no break-glass more than 4 hours.

YOU SET IT
heimdall db expiry set --database pg-orders-orders --class write --default 2h --max 8h
✓ write access to 'orders' now defaults to 2h and is capped at 8h

  Grants already open keep the window they were approved with — withdraw one with
  'heimdall db access revoke <grant-id>', which is attributable and audited.

heimdall db expiry set --database pg-orders-orders --class read --default 8h --max 7d
✓ read access to 'orders' now defaults to 8h and is capped at 7d

  Grants already open keep the window they were approved with — withdraw one with
  'heimdall db access revoke <grant-id>', which is attributable and audited.

heimdall db expiry show --database pg-orders-orders
CLASS  DEFAULT  CEILING  SOURCE
read   8h       7d       configured on this database
write  2h       8h       configured on this database

  A request mixing SELECT with INSERT, UPDATE or DELETE takes the write ceiling.
  No access may ever exceed 30d, whatever is configured here.
  Change one with 'heimdall db expiry set --database pg-orders-orders --class write --default 8h --max 72h'.
THE PLATFORM ENFORCES IT
heimdall db window add --database pg-orders-orders --kind command --timezone America/Sao_Paulo --days weekdays --from 09:00 --to 18:00
✓ command may be released on 'orders' during weekdays 09:00-18:00 America/Sao_Paulo
  Window ID: 9ab22742-4c85-4537-8f47-b3d826d40588

  Run 'heimdall db window list --database pg-orders-orders' to see whether it is open now.

heimdall db command approve 03fd8c04-9800-4369-a93a-6a1f1431316a
Error: OUTSIDE_EXECUTION_WINDOW: outside the permitted execution window for this database: a command may only be released during weekdays 09:00-18:00 America/Sao_Paulo. The next window opens Mon 2026-10-12 09:00 -03 (in 53h42m)

INSTEAD OF

One permission model. One place to look.

Today every point of the cycle has its own tool, its own invoice and its own permission model. Heimdall puts all of it under the same policy.

What Heimdall offers in place of each category.
INSTEAD OFWHAT HEIMDALL OFFERS
A service catalog Domain, System, Component and environment, used as the address by releases, incidents, access and infrastructure. Circular dependencies refused. What goes down together, in one command
Infrastructure provisioning Resources requested from your team's resource schema, approved by someone else. Terraform running in the Agent, in your network. State in your cloud account's bucket. OIDC federation instead of keys
A secrets manager Values in your Agent, under your key. A trail of who read each version. heimdall run and the External Secrets Operator. A leaked version deactivated on the spot. at_risk when someone leaves. Rotation of the database service user password
Database access tooling Named approvers and expiry set by your organization, and a password nobody sees. Time windows for commands and migrations. Sensitive data masked by source column. guardrails that refuse before the database, and an approved command that runs once. A capped, reviewed break-glass. migrations approved and run inside your network
Internal app access Web apps and APIs in the browser, without a VPN. TCP services by their real names, from the terminal. A grant per person and per service, with an expiry and a reason. Every flow recorded before the first byte
Deploy approval The exact diff, approved by a named person and refused if the file changed. Window and freeze checked the instant before the commit. One-step rollback, to a version already approved
Incident management A fixed lifecycle that only closes with an approved postmortem. Incidents opened by rollback. break-glass tied to the incident. A notice when an incident stalls

Talk to the people who build Heimdall.

Tell us how your engineers store secrets and reach the database today. We'll answer with what Heimdall would put under rules first, and how the deployment would get there.

Talk to engineering

Opens a WhatsApp chat. Prefer email? [email protected]

YOUR DATA

It runs entirely in your infrastructure. Your data stays with you.

API, Agent, edge and database stay with you, with the encryption key under your control. Your secret values, your database passwords and query results, your infrastructure state, your traffic and your audit trail stay inside your network.

See where everything lives

DEPLOYMENT

Yops deploys it with your team.

Deployment is part of the product. It happens inside your infrastructure, alongside your engineers, and ends with your team running Heimdall.

  1. Agree on the first phase with you: what goes under rules first, and whatever needs building for it, on an agreed timeline.
  2. Install the API, the Agent and the edge in your infrastructure, with your team.
  3. Put your first secrets and databases under rules, with your real data.
  4. Train the people who operate and the people who approve.

Leaving doesn't depend on us: you can export the organization at any time, and the Terraform state already lives in your bucket.

Talk to the people who build Heimdall.

Tell us how your engineers store secrets and reach the database today. We'll answer with what Heimdall would put under rules first, and how the deployment would get there.

Talk to engineering

Opens a WhatsApp chat. Prefer email? [email protected]