Skip to content

What the platform does

Automation written as code, running in containers, triggered by real state. Below is what that gets you, what's shipped, and what isn't yet.

Labels used throughout:

Built
shipped and in use.
In progress
being worked on now, not promised for a date.
Planned
on the roadmap, no work started.

Nothing gets a label it hasn't earned.

Resources

Triggers off real state, not a schedule

Built

A resource is a declaration of something the platform should watch. A database table, an object storage prefix, a release feed, an incoming webhook, a Git branch. When it changes, the pipeline runs — and the thing that changed comes with it, as a payload your steps can read.This is the difference between an event and a poll. A builder that checks every five minutes isn’t reacting to your data; it’s guessing, and the guess costs you five minutes and a lot of wasted requests. A resource knows.Resources are also where the “templateless” claim gets settled. There is no catalogue of supported integrations, because there is no catalogue at all — a resource type is a container image implementing a small interface, and you write the ones you need. If the service has an API, it can be a resource.
fragment_resources.yaml yaml
resources:
  # d1-query is user-written. There is no catalogue to pick from.
  - name: form-submissions
    type: d1-query
    source:
      account: ((cloudflare.account_id))
      token: ((cloudflare.api_token))
      database: formzero
      query: SELECT * FROM submissions WHERE notified = 0

d1-query is user-written.

Conditional logic

Branching, in the pipeline spec

Built

if_var and match are part of the pipeline definition, not something reconstructed out of side effects. Branch on a variable, match on a condition, run different steps in each case.The alternative most tools leave you with is one pipeline per case, kept in sync by hand — or a single pipeline with a step that exits early and reports success anyway. Neither is a branch. Both are how you end up with four flows that were supposed to be one.
fragment_if_var.yaml yaml
plan:
  - if_var: ((.webhooks:release))
    when_exists:
      do:
        - put: teams
    when_missing:
      do:
        - task: reconcile
          file: automations/tasks/reconcile.yml
Webhooks

Real payloads, not a ping

Built

A webhook resource receives the request body and makes it available to the pipeline. Steps can read what was sent, branch on it, and pass it downstream.Most CI platforms treat a webhook as a doorbell — it tells you something happened, then you go and fetch what it was. That’s an extra round trip, an extra credential, and a window where the state has already moved on.
Reproducibility

Every step is a container, nothing is shared

Built

Each step runs in its own container with no implicitly shared state between them. Inputs are declared, outputs are declared, and anything not declared isn’t there.The practical consequence is that the hundredth run behaves like the first. No accumulated state on a build agent, no dependency someone installed by hand two years ago, no failure that only reproduces on one machine.It also means the thing you debug locally is the thing that ran, because it’s the same image.
Concurrency

Parallel by default

Built

across fans a step out over a matrix of inputs; in_parallel runs a set of steps at once. Both execute concurrently as written — this isn’t an optimisation you enable after something gets slow.The sequential reading of a parallel instruction is the surprising one, and plenty of tools default to it.
fragment_across.yaml yaml
plan:
  - across:
      - var: region
        values: [ap-southeast-2, us-east-1]
      - var: suite
        values: [unit, integration]
    task: run-suite
    file: automations/tasks/run-suite.yml
Pipeline generation

Pipelines that write pipelines

In progress

Pipeline configuration will be generated programmatically, instead of copied between repositories. Define the shape once, apply it across every repo and team, and change it in one place when the standard changes.This is what removes the per-branch and per-repo pipeline sprawl that otherwise grows with the team.
Authentication

OAuth 2.0, and no secret zero

Built

Pipelines authenticate to the APIs they use directly, rather than reading a long-lived credential someone pasted into a settings page. Secrets are referenced, not stored in the pipeline definition.“Secret zero” is the credential that unlocks the other credentials — the one that has to exist somewhere in plaintext for the chain to start. Removing it is the difference between a secrets story and a secrets problem.
Notifications

Bring your own notifier

Planned

The same extensibility model as resources, applied to alerts: a notifier is something you write, so Slack, PagerDuty, Teams, a webhook to your own service, or anything else is a matter of pointing at it rather than waiting for support.Until this ships, notifications are a put step to whatever you’re notifying — which works, and is what the worked example on the homepage does.
Compatibility

Existing Concourse resources run unmodified

Built

Automeer implements the Concourse resource interface, so a resource type built for Concourse works here without changes. If you have a library of them, it comes with you.How a migration actually works
What the platform doesn't do

Two constraints worth knowing before you start

Both of these shape what you can build, and finding them out later is worse than reading them now.

  • There are no built-in resource types.Every resource is a container image implementing the interface — including the common ones. This is what makes the model open, and it also means there's no catalogue to pick from on day one. Existing Concourse resource types cover most of the obvious cases; anything beyond that, you write.
  • Pipeline variables live in YAML.There is no mechanism for defining vars outside the pipeline definition. Values that change per environment are passed in as var files or as secret references, not computed at runtime.

See what it costs

Usage-based, no per-seat charge, priced in AUD and hosted in the region you choose.