Early development · open source, Apache-2.0

Who deployed what, to where, and when. And how sure you can be.

Afe watches every way a deployment can happen in your delivery tools, and who caused it. It shows what is live in every environment, says how certain each answer is, and tells you when it could not see a source instead of going quiet.

Watches GitHub ArgoCD Vercel Terraform

Environments

What is live where, since when, how it got there, and how sure Afe is.

Data may be missing from 1 connection — Afe cannot observe it right now. Events from that period will be backfilled when it recovers.

6 live placements 2 weak, ambiguous or unknown 1 flagged by an observation gap 1 drift finding

Service Production Staging Preview
Webweb
8289f2acommit
certain deploy
since 2 h ago
Vercel · web · production
c41d09ecommit
certain deploy
since 40 min ago
Vercel · web · staging
b527614commit
strong deploy
since 9 d ago
acme/web (feat/checkout)
Shop APIshop-api
shop-api:hotfix-1022image
unknown manual drift
since 10 d ago
ArgoCD · shop-api-production
Not produced by any observed build
97532e9commit
probable deploy
since 11 d ago
ArgoCD · shop-api-staging
–
Workerworker
a047a20commit
ambiguous deploy
since 6 d ago
ArgoCD · worker-production
evidence in a gap
e13b163commit
strong deploy
since 6 d ago
ArgoCD · worker-staging
–
An example environment matrix: services as rows, environments as columns, each cell showing what runs, since when, through which tool, and a confidence badge.

The problem

Your delivery pipeline has more doors than your dashboard shows.

A change can reach production through a workflow, a GitOps sync, a manual override, a preview promotion or a Terraform apply. Each tool only knows its own part.

Deploys happen in four tools

GitHub, ArgoCD, Vercel and Terraform each name environments their own way. Nobody can say what is running in production without opening all of them.

Webhooks get dropped

A missed delivery or an expired token leaves a hole in the record. Most dashboards cannot tell a quiet afternoon from a blind spot.

Not everything traces to Git

A hand-edited image tag, a deploy from a laptop or an instant rollback puts code live that no commit explains. You find out during the incident.

Product

One place to see what is live, and why.

Afe is read-only by default. It connects to the tools you already use and builds one picture from what they report.

Environment matrix

Services by environments. Each cell says what runs (commit, image or deployment), since when, which event put it there, and how sure Afe is.

One timeline

Every event from every connected tool, newest first. Filter by tool, actor, target, trigger, outcome or how the event was observed.

Commit journeys

Follow a commit from change to CI, artifact, config, deploy and runtime, with the evidence for every step. Ask whether it is already live in production.

Drift and untracked deploys

Flags manual ArgoCD overrides, deploys without Git metadata, images no observed build produced and out-of-band rollbacks, with the evidence.

Observation gaps, not silence

Webhooks for speed, polling and reconciliation for completeness. When a source is unreachable, Afe records the gap, shows it, and backfills when it recovers.

GitHub Actions, from Afe

Opt in to run, re-run and cancel workflows, follow live steps and read logs without leaving Afe. Actions use the permissions of your own linked GitHub account.

Environment mapping

Rules turn each tool's names (production, an ArgoCD app, a Vercel target) into one set of services and environments for your whole organization.

Permissions you already have

People see what their linked GitHub, ArgoCD and Vercel accounts can see. Administrators manage users and sign-in; there is no second permission model to keep in sync.

Runs on your infrastructure

One image plus PostgreSQL. Credentials are encrypted with a key you hold, and events are deleted after a retention window you choose.

Timeline

Every door, in one feed.

A workflow run, an ArgoCD sync, a Vercel promotion and a Terraform apply land in the same timeline, in the same shape, with the actor and the target.

  • Exactly once. Webhooks, polling, reconciliation and backfill can all report the same event; Afe stores it once.
  • Late arrivals are marked. Events found by reconciliation or backfill say so, so you know a webhook was missed.
  • Source-qualified names. argocd.sync.succeeded means the same thing everywhere in the app and the API.
Todaynewest first

Honest answers

Says how sure it is. Says when it could not see.

Linking a deploy back to a commit is sometimes exact and sometimes a judgement. Afe shows which, the same way on every page, and never hides a blind spot behind an empty list.

  • certainExact identifiers match: the deploy names the commit or image digest.
  • strongLinked through a build or artifact with recorded provenance.
  • probableLinked through a tag or a reference that usually holds.
  • weakOnly timing suggests a link. Treat it as a lead, not an answer.
  • ambiguousSeveral commits fit, for example a mutable tag rebuilt twice.
  • conflictTwo sources disagree about what is running.
  • unknownNothing observed explains where this came from.

Data may be missing from 2 connections — Afe cannot observe them right now. Events from those periods will be backfilled when each connection recovers.

  • ArgoCDargocd.acme.dev credentials rejected · since 14:02 Alert open
  • Vercelacme-web rate limited · since 15:40 degraded

Commit journeys

Where did this commit go?

Pick a commit and follow it across tools. Every edge carries its evidence and its confidence: solid when identifiers match, dashed when Afe is inferring.

  1. Change 8289f2a
    GitHub
    merged as #412 into main
  2. CI deploy.yml #918
    GitHubsucceeded
  3. Artifact ghcr.io/acme/web@sha256:4e1c…
    certain
  4. Config web/overlays/prod
    GitHubstrong
  5. Deploy web-production
    ArgoCDprobable
  6. Runtime production
    healthy
    live since 2 h ago
Is 3f9a1c2 live in production? Yes: it is an ancestor of 8289f2a, which has been running there since 14:41. Afe checks containment against what is actually live, not against the branch.

How it works

Connect once. Afe keeps watching.

  1. Connect your tools

    A read-only GitHub App for your organization, ArgoCD with a token or an in-cluster agent for clusters behind a firewall, Vercel projects and Terraform runs.

  2. Observe every path

    Signed webhooks arrive in seconds. Polling and reconciliation catch what webhooks miss, and outages are recorded as gaps, then backfilled.

  3. Correlate across tools

    Commit SHAs, image digests, tags and deployment ids link events into placements and journeys. Your mapping rules name the services and environments.

  4. Answer, with evidence

    The matrix, timeline, journeys and drift findings show what is live, how it got there and how sure Afe is, in the UI and through the API.

Self-host

Running in about fifteen minutes.

Afe ships as one image plus PostgreSQL. Your events and credentials stay in your infrastructure.

  • No other infrastructure. PostgreSQL is the database and the job queue.
  • Recent, not forever. Events are kept for 30 days by default, up to 60, then deleted.
  • Apache-2.0. Read the code, run it, change it.
Terminal
# 1. Get the compose file (pick the latest release)
mkdir afe && cd afe
VERSION=v0.1.0
curl -fsSLO https://raw.githubusercontent.com/theafeai/afe/$VERSION/docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/theafeai/afe/$VERSION/.env.example -o .env.example

# 2. Generate the encryption key and admin token (keep both)
mkdir -p secrets && chmod 700 secrets
openssl rand -base64 32 > secrets/afe_encryption_key
openssl rand -hex 32 > secrets/afe_admin_token
chmod 644 secrets/afe_encryption_key secrets/afe_admin_token

# 3. Configure
cp .env.example .env
sed -i.bak "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$(openssl rand -hex 24)/" .env
sed -i.bak "s/^AFE_VERSION=.*/AFE_VERSION=${VERSION#v}/" .env && rm .env.bak

# 4. Start, then open http://127.0.0.1:8080
docker compose up -d --wait

Security

Built to watch, not to touch.

Afe needs read access to observe. Anything that changes a tool is opt-in, scoped, and uses your own permissions.

Read-only by default

Observation uses read-only scopes. Delivery actions in GitHub are opt-in and can be restricted per repository and action.

Verified webhooks

Every inbound webhook is signature-checked before it is parsed or stored, and replayed deliveries are rejected.

Encrypted credentials

Tokens, keys and webhook secrets are encrypted with a key you keep outside the database. Secrets and authorization headers are never logged.

Roadmap

Where Afe is going.

From observing every deploy to operating them, and keeping a permanent record of each one.

Available now

shipped
  • GitHub, ArgoCD, Vercel and TerraformWebhooks, polling, reconciliation and backfill, with an in-cluster agent for private ArgoCD.
  • Environment matrix, timeline and journeysWith confidence on every placement and commit containment.
  • Drift and untracked deploy detectionFindings with evidence, optional alerts.
  • GitHub Actions operationsRun, re-run and cancel workflows; live steps and logs.
  • Users and inherited permissionsAdmin-managed users, local sign-in and email invitations.

Next

in progress
  • Live deployment logsTail Vercel, ArgoCD and Terraform logs in Afe, next to the event.
  • Operate every tool from AfeVercel deployments, ArgoCD applications and Terraform runs, with the same opt-in model as GitHub.
  • Drift in the matrixDrift badges directly in environment cells.

Later: Afe Cloud

planned
  • Hosted AfeThe same product without running it yourself.
  • Custom permissionsAfe-managed roles and per-resource access, on top of inherited permissions.
  • Alerts and notifications centreAlerts and findings in one place, with a notification history behind a bell in the app.
  • Immutable audit logA permanent, tamper-evident record of every deployment and its lifecycle, from trigger to rollout to rollback, kept beyond the open-source retention window.

Plans, not promises: no dates are committed. Follow progress on GitHub, or get in touch if you want Afe Cloud.

FAQ

Questions, answered.

Is Afe an audit log?

Not today. The open-source Afe shows what is deploying where, now and recently: events are kept for a retention window (30 days by default, at most 60) and then deleted, so it is not a compliance record.

An immutable audit log of every deployment and its lifecycle is on the roadmap for Afe Cloud.

Does Afe change anything in my tools?

Not unless you opt in. Observation is read-only. GitHub Actions operations are optional, use the permissions of each person's own linked GitHub account, and administrators can block specific actions per repository.

Which tools are supported?

GitHub (Actions, deployments, packages and attestations), ArgoCD (any instance, including clusters behind a firewall through a read-only in-cluster agent), Vercel and Terraform. Afe also records its own configuration changes.

What happens when a webhook is missed or a tool is down?

Reconciliation polling finds missed events and marks them as late. If a source cannot be reached, Afe records an observation gap, shows it on every affected page, and backfills the period when the connection recovers.

Where does my data live?

In your PostgreSQL database. Credentials are encrypted with a key you hold outside the database. Afe sends nothing to us.

Is there a hosted version?

Not yet. Afe Cloud is on the roadmap, with hosting, custom permissions, an alerts and notifications centre, and an immutable audit log of every deployment. Today Afe is self-hosted and open source under Apache-2.0. If you want to hear when it is ready, get in touch.

See every deploy. Know how sure you can be.

Self-host Afe in about fifteen minutes, star the repository to follow along, or talk to us about your delivery setup.