Why We Built Zekt

← Back to Zekt

A problem we lived with — then decided to solve, and then turned into a platform

Zekt in one minute

Your platform team already has the automation. Zekt turns it into products the rest of the company can subscribe to.

Connect

A cross-organization event bus for GitHub. One org publishes, every subscribed org's workflow runs — securely, with replay and a full audit trail.

Orchestrate

Requestors send one declarative payload through Zekt Action. Zekt runs the services in order, passes outputs between them, and hands the results back.

Productise

Providers publish services to the Zekt Directory with versioned contracts in the Zekt Registry. Consumers discover, subscribe and self-serve.

The Problem Nobody Talks About

GitHub is the world's development platform. Millions of teams use it every day to build, test, and deploy software. But GitHub was designed around a single assumption: everything that matters happens inside one organization.

In the real world, that's almost never true.

Software supply chains cross organizational boundaries constantly. A platform team publishes a library — and three partner teams in separate orgs need to know immediately. A vendor pushes a security patch — and every customer who depends on that service needs to trigger downstream CI/CD. An internal tools team deprecates an API — and twelve consumer repos across five orgs need to react.

GitHub Actions can do almost anything within your org. But the moment you need one org's event to trigger another org's workflow — you're on your own.

What People Actually Do Today

We asked dozens of engineering teams how they handle cross-org workflow orchestration. The answers were... creative:

  • The Curl Script
    A CI step that calls repository_dispatch on the target repo using a PAT token. It works — until someone rotates the token, or a third consumer needs to subscribe, or someone asks "what happened last Tuesday?"
  • The Shared Database
    A polling mechanism where consumers check a shared store every few minutes. Fragile, wasteful, and impossible to audit.
  • The Slack Message
    "Hey, we just deployed v2.4 — can you update your config?" A human in the loop, every time. Fast for the first month. Unmanageable by month three.
  • Nothing
    Teams simply don't coordinate. They accept the drift, the delayed reactions, and the inevitable "why is this broken?" Slack thread at 2 AM.

None of these approaches give you replay. None give you an audit trail. None enforce zero-trust security. And none scale beyond a handful of point-to-point connections.

The Moment It Clicked

We'd been living with this problem ourselves — stitching together curl scripts, managing PAT tokens, and losing sleep over "did that event actually fire?" questions. One day, after spending hours debugging a failed cross-org dispatch that had silently dropped, we asked a simple question:

Why isn't there an event bus for GitHub? Not a generic webhook relay. Not a 7,000-app-integration platform. Just a purpose-built system that lets GitHub organizations publish events and other organizations subscribe to them — reliably, securely, and with full auditability.

We looked for it. It didn't exist. So we built it.

Then Our Customers Asked the Next Question

An event bus answers "something happened — react to it." Within weeks, the teams using Zekt were asking for something bigger: "Can I ask five services, owned by three teams, to do something for me — in the right order — and get the results back in my own workflow?"

That question is the everyday reality of platform engineering. A product team needs a subscription, then a resource group, then a key vault, then a pipeline identity. Each piece is automated by someone — usually as a GitHub workflow. Nobody has made them composable.

Before: event bus

"Tell the others it happened."

  • One-to-many notifications
  • Consumers decide what to do
  • Fire and forget, with replay
Now: service orchestration

"Do these things for me, in this order."

  • Requestor-driven, declarative chains
  • Outputs flow from one service to the next
  • Results return to the requesting workflow

Declarative Orchestration: One Payload, Many Services

With Zekt, the requestor never scripts the chain. They declare it. A single Zekt Action step sends an orchestration payload to Zekt Core, which dispatches each service to its owner's backend workflow, waits for it to finish, resolves its outputs into the next step's input, and returns the combined result to the requestor.

  1. 1 Requestor workflow Product team declares what it needs
  2. 2 Zekt Action Validates and submits the payload
  3. 3 Zekt Core Orders steps, resolves outputs, tracks every hop
  4. 4 Provider backends Each service runs as a native GitHub workflow
  5. 5 Results returned Outputs land back in the requestor's workflow
orchestration payload
{
  "default_service_owner": "platform-team-org",
  "services": [
    {
      "step_id": "create-sub",
      "service_slug": "new-azure-subscription",
      "input": { "billing_account": "ba-123" }
    },
    {
      "step_id": "create-rg",
      "service_slug": "new-azure-resource-group",
      "depends_on": ["create-sub"],
      "input": {
        "subscription_id": "$zekt{{ steps.create-sub.outputs.subscription_id }}"
      }
    },
    {
      "step_id": "create-kv",
      "service_slug": "new-azure-keyvault",
      "depends_on": ["create-rg"],
      "input": {
        "resource_group": "$zekt{{ steps.create-rg.outputs.resource_group_name }}"
      }
    }
  ]
}
  • What, not how. The requestor names services by their registered slug and supplies inputs. The provider's repositories, runners and scripts stay behind the abstraction.
  • Order is honoured. Steps run in the order you declare, with depends_on making the dependencies explicit — up to 20 services in one request.
  • Outputs become inputs. $zekt{{ steps.X.outputs.Y }} wires one service's result into the next, resolved by Zekt at dispatch time.
  • Results come home. Output metadata is returned to the requesting workflow, so its own logic can carry on with real values.

Contracts You Can Build On: Zekt Registry & Schema Versioning

Composing services owned by other teams only works if you can trust their interfaces. That is what the Zekt Registry is for: every service can publish versioned schemas describing what it accepts and what it returns — the contract between provider and consumer.

v1 → v2

Versioned input schemas

Consumers see exactly which inputs a service expects, and at which version — before they send a single request.

outputs

Published output schemas

Providers declare the fields a step reports on completion, so the next service in the chain can rely on them.

breaking

Breaking changes are flagged

A new schema version that breaks the contract is marked as breaking in the Registry — change becomes visible, not a surprise.

strict

Strict resolution, on request

Opt into strict output resolution and a chain referencing an undeclared output fails at dispatch — not three steps later.

Providers get to evolve their automation. Consumers get to depend on it. The versioned contract is what lets both happen at the same time.

Where Zekt Fits in Platform Engineering

Platform engineering is about one thing: letting product teams consume golden paths without filing a ticket. Most internal developer platforms get there by adding another portal, another backend and another runtime to maintain. Zekt takes a different route — it is a layer on top of GitHub, not a replacement for any part of it.

Providers

Platform, cloud, security & data teams

  • Keep their GitHub workflows
  • Wrap them as an abstracted service
  • Publish a versioned contract
the abstraction layer
Directory Registry Orchestration Subscriptions Tracking Audit
Consumers

Product & application teams

  • Discover services in the Directory
  • Subscribe and self-serve
  • Compose them in one payload

Unopinionated about your tooling

Zekt doesn't care whether a service is written imperatively or declaratively. Because it sits on top of GitHub, whatever a GitHub Actions workflow can run, a Zekt service can offer — the languages, frameworks and marketplace actions you already use.

TerraformBicepPulumiAnsibleHelmKustomizePowerShellBashPythonNode.jsGo.NETAzure CLIAWS CLIgcloudkubectl

A shopping window for central services

The Zekt Directory is where platform teams put their offering on display. Consumers browse it, understand the contract from the Registry, and subscribe — service discovery, tracking and invocation in one place, with the provider approving who gets access.

Self-service without building a platform

No new runtime, no custom API layer, no portal backend to operate. The capability is nothing more than GitHub workflows, wrapped into an abstracted service that others can subscribe to. Your platform team ships products, not plumbing.

Every Service Is a Puzzle Piece — and You Can See the Whole Picture

An orchestration-capable service can itself orchestrate other services. A "new product environment" service might, behind the scenes, call a networking service, which in turn calls a DNS and a firewall service. Each of those is a piece of a puzzle: requestors pick the pieces that fit their needs, and providers can build bigger pieces out of smaller ones.

dev-team-a requests new-product-env
completed
  • 1 new-azure-subscription completed
  • 2 landing-zone-network spawns child orchestration completed
    • 2.1 vnet-peering depth 1 completed
    • 2.2 private-dns-zone depth 1 completed
  • 3 new-azure-keyvault running

Visualised end to end

Every orchestration is drawn as a chain graph — requestor, Zekt Action, each step, each service and its outputs — with nested child orchestrations shown inside the step that caused them.

Abstraction that holds

A requestor sees a child orchestration's status, timing and progress — but not the provider's internal service topology. That privacy is exactly what the provider is selling.

Guardrails built in

Nesting is capped at five levels and cycles are rejected at submission, so one service calling back into its own ancestor can't loop forever.

One prerequisite: know your build order. Zekt executes the order you declare and enforces the dependencies you state — it does not guess them. A resource group still needs its subscription first, and a key vault still needs its resource group. Understanding the order in which your infrastructure can be built is on you; making that order repeatable, visible and self-service is on us.

What We Decided to Build — And Not Build

From the start, we were clear about scope. Zekt would not be:

A general automation platform. Zapier and Pipedream do that brilliantly. We're not competing with them. If you need Salesforce-to-Slack, use those tools.

A generic webhook delivery service. Hookdeck, Svix, and Convoy handle arbitrary HTTP webhooks well. We leverage repository_dispatch — GitHub's native event mechanism — because that's what GitHub workflows understand natively.

A CI/CD pipeline. GitHub Actions is your CI/CD. Zekt doesn't replace it. Zekt is the signal that tells your Actions when to run — and, with orchestration, the conductor that tells them in which order.

We started as exactly one thing: the cross-organization event bus for GitHub. Orchestration, the Registry and the Directory grew on that same foundation, because our customers needed them — not because we wanted to become a general-purpose platform. Everything still runs as native GitHub workflows.

The Principles We Build On

01

Zero-Trust by Default

No shared PAT tokens. No org-level access grants. Consumers subscribe to specific services — providers approve or deny. OIDC-based, no secrets crossing boundaries.

02

Replay, Not Just Retry

Retrying sends the same HTTP request again. Replay in Zekt means re-dispatching the original event with full payload fidelity — zero structural drift, even months later.

03

GitHub-Native

We don't abstract away GitHub. We amplify it. Events arrive as native repository_dispatch — your workflows don't need a Zekt SDK, adapter, or special syntax.

04

Observable Always

Every event and every orchestration step is logged with correlation IDs and timestamps. You can answer "what happened?" without guessing.

05

Contract-First

Services publish versioned input and output schemas in the Zekt Registry. Change is announced, breaking change is flagged.

06

Bring Your Own Tooling

Imperative or declarative, any language, any framework — if GitHub Actions runs it, it can be a Zekt service.

Who Zekt Is For

Platform teams

Turn the workflows you already maintain into subscribable products.

  • Publish once, serve every team
  • Versioned contracts, not tribal knowledge
  • Approve who consumes what
  • See who uses each service, and how

Product teams

Get what you need in one declarative request — no tickets, no waiting.

  • Browse the Directory, subscribe
  • Compose services in one payload
  • Results back in your own workflow
  • Watch the whole chain as it runs

Vendors & partners

Offer automation across organizational boundaries — safely.

  • No shared tokens with customers
  • Internal topology stays private
  • Replay and audit on every call
  • Nothing to host beyond GitHub

Where We Are Now

Zekt is live. Teams use it to connect GitHub workflows across organizational boundaries, and to orchestrate chains of services owned by other teams — connecting platform teams to their consumers, vendors to their customers, and internal tooling orgs to the rest of the company.

We're still early, and there's a lot more to build. But the core proposition is working: publish a GitHub workflow as a service, and anyone you approve can discover it, subscribe to it, and compose it with others — securely, in order, and with full visibility.

If you've ever written a curl script to trigger repository_dispatch across orgs — or answered the same infrastructure ticket for the tenth time — and thought "there has to be a better way": we built it for you.

Ready to see Zekt in action?

Stop stitching together scripts. Start offering services.