Every job type you need
Python, Spark, SQL, bash, notebooks, SAS and dbt, each in its own runtime image, with its libraries and secrets.
Orchestration and compute
A job is declared in a few fields, a workflow is assembled as a dependency graph, and scheduling is set without a single line of YAML. Every run executes in your Kubernetes, at the size you chose, and can be followed live.


A run followed live: who triggered it, on which resources, at which attempt, and its logs line by line.
Real graal console interface, not retouched; fictional demonstration data (tenant energie-demo — people, projects and tokens are invented).
Key capabilities
Python, Spark, SQL, bash, notebooks, SAS and dbt, each in its own runtime image, with its libraries and secrets.
You chain jobs of different types, set the dependencies, and each step retries on its own when it fails.
A cron expression, a file landing in a bucket, or a catch-up over a date range: every run knows its logical date.
Number of attempts and maximum duration per job; an alert goes out on failure or success, to the recipients you choose.
A driver and its workers, created for the run and removed after it, on your Kubernetes. No permanent Spark cluster to maintain.
You pick an instance type per job, GPUs included. Project quotas cap what a run can request.
How it works
Step 01
A type, a code file, an image, an instance type. Parameters and secrets are injected by reference.
Step 02
You connect jobs into a workflow and pick the trigger: cron, event, or on-demand launch.
Step 03
Live logs, step-by-step events, output files and metrics: every run keeps its record.
A run is born with its own containers, identity and network rules, and disappears with them. It only sees its project’s secrets and only reaches the destinations it is allowed to. Containers run without privileges, under Kubernetes’ restricted security profile.
Cron schedules, triggers and workflows are handled by graal itself, not by one more scheduler to install. A schedule is changed in the console, through the API or by an agent, and takes effect at the next trigger.
Standards and integrations
Governance
Yes. A Python script, a Spark job or a dbt project is uploaded as is; your job chains are rebuilt as workflows.
No. Spark runs on your Kubernetes, sized run by run: a driver and its workers, then nothing.
It is retried as many times as planned. If it still fails, the alert goes out, and its logs are waiting for you in the console.
With a backfill: you pick a date range, and graal creates one run per date, without duplicates, within the project’s quotas.
One job, a two-step workflow, a schedule: end to end, in a demonstration.