Apache Airflow Java SDK 1.0.0-beta1
First release of the Apache Airflow Java SDK (beta).
A platform to programmatically author, schedule and monitor data workflows.
| May | Jun | Jul | Aug | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sunday | No releases on Apr 26, 2026 | No releases on May 3, 2026 | No releases on May 10, 2026 | No releases on May 17, 2026 | No releases on May 24, 2026 | No releases on May 31, 2026 | No releases on Jun 7, 2026 | No releases on Jun 14, 2026 | No releases on Jun 21, 2026 | No releases on Jun 28, 2026 | No releases on Jul 5, 2026 | No releases on Jul 12, 2026 | No releases on Jul 19, 2026 | No releases on Jul 26, 2026 | No releases on Aug 2, 2026 | No releases on Aug 9, 2026 |
| Monday | No releases on Apr 27, 2026 | No releases on May 4, 2026 | No releases on May 11, 2026 | No releases on May 18, 2026 | No releases on May 25, 2026 | No releases on Jun 1, 2026 | No releases on Jun 8, 2026 | No releases on Jun 15, 2026 | No releases on Jun 22, 2026 | No releases on Jun 29, 2026 | 1 release on Jul 6, 2026 | 1 release on Jul 13, 2026 | No releases on Jul 20, 2026 | No releases on Jul 27, 2026 | No releases on Aug 3, 2026 | No releases on Aug 10, 2026 |
| Tuesday | No releases on Apr 28, 2026 | No releases on May 5, 2026 | No releases on May 12, 2026 | No releases on May 19, 2026 | No releases on May 26, 2026 | No releases on Jun 2, 2026 | No releases on Jun 9, 2026 | No releases on Jun 16, 2026 | No releases on Jun 23, 2026 | No releases on Jun 30, 2026 | No releases on Jul 7, 2026 | No releases on Jul 14, 2026 | No releases on Jul 21, 2026 | No releases on Jul 28, 2026 | No releases on Aug 4, 2026 | No releases on Aug 11, 2026 |
| Wednesday | No releases on Apr 29, 2026 | No releases on May 6, 2026 | No releases on May 13, 2026 | No releases on May 20, 2026 | No releases on May 27, 2026 | 1 release on Jun 3, 2026 | No releases on Jun 10, 2026 | No releases on Jun 17, 2026 | No releases on Jun 24, 2026 | No releases on Jul 1, 2026 | No releases on Jul 8, 2026 | No releases on Jul 15, 2026 | No releases on Jul 22, 2026 | No releases on Jul 29, 2026 | No releases on Aug 5, 2026 | |
| Thursday | No releases on Apr 30, 2026 | No releases on May 7, 2026 | No releases on May 14, 2026 | No releases on May 21, 2026 | No releases on May 28, 2026 | No releases on Jun 4, 2026 | No releases on Jun 11, 2026 | No releases on Jun 18, 2026 | No releases on Jun 25, 2026 | No releases on Jul 2, 2026 | No releases on Jul 9, 2026 | No releases on Jul 16, 2026 | No releases on Jul 23, 2026 | No releases on Jul 30, 2026 | No releases on Aug 6, 2026 | |
| Friday | No releases on May 1, 2026 | No releases on May 8, 2026 | No releases on May 15, 2026 | No releases on May 22, 2026 | 1 release on May 29, 2026 | No releases on Jun 5, 2026 | No releases on Jun 12, 2026 | No releases on Jun 19, 2026 | No releases on Jun 26, 2026 | No releases on Jul 3, 2026 | No releases on Jul 10, 2026 | No releases on Jul 17, 2026 | No releases on Jul 24, 2026 | No releases on Jul 31, 2026 | No releases on Aug 7, 2026 | |
| Saturday | No releases on May 2, 2026 | No releases on May 9, 2026 | No releases on May 16, 2026 | No releases on May 23, 2026 | No releases on May 30, 2026 | No releases on Jun 6, 2026 | 1 release on Jun 13, 2026 | No releases on Jun 20, 2026 | No releases on Jun 27, 2026 | No releases on Jul 4, 2026 | No releases on Jul 11, 2026 | No releases on Jul 18, 2026 | No releases on Jul 25, 2026 | No releases on Aug 1, 2026 | No releases on Aug 8, 2026 |
10 releases since Mar 19, 2026
First release of the Apache Airflow Java SDK (beta).
📦 PyPI: https://pypi.org/project/apache-airflow/3.3.0/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.3.0/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.3.0/release_notes.html 🐳 Docker Image: "docker pull apache/airflow:3.3.0" 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.3.0
Building on the asset partitioning introduced in 3.2.0, Airflow 3.3.0 substantially expands how a
single upstream asset event fans out to partitioned downstream Dag runs. New partition mappers —
RollupMapper (many-to-one), FanOutMapper (one-to-many), and FixedKeyMapper +
SegmentWindow (categorical rollup) — compose with time windows (day/week/month/quarter/year) and a
wait_policy (WaitForAll or MinimumCount(n)) to control when partitioned runs fire. Windows
can fan out forward or backward in time, and total fan-out per upstream event is bounded by the new
[scheduler] partition_mapper_max_downstream_keys config (configurable per mapper). Airflow 3.3.0
also adds the PartitionedAtRuntime timetable, which lets a Dag declare that its partition key(s)
are assigned when the run starts rather than mapped from an upstream event.
For detailed usage instructions, see :doc:/authoring-and-scheduling/assets.
Airflow 3.3.0 introduces a first-class state store for tasks and assets (AIP-103). Tasks can persist
arbitrary key-value state that survives across retries and runs via a new task_state_store accessor, and
assets can carry their own state via asset_state_store — both available from the Task SDK. State is kept
in the metadata database by default, or in a custom worker-side backend ([workers] state_store_backend), supports per-key retention with periodic garbage collection and an optional
clear_on_success, and is fully manageable through the Core API and Execution API.
For detailed usage instructions, see :doc:/core-concepts/task-and-asset-state-store.
Task retry behaviour is now pluggable (AIP-105). In addition to a fixed retries count, you can
attach a custom retry policy that decides whether and when a task is retried, enabling strategies such
as retrying only on specific exceptions or backing off based on custom logic.
For detailed usage instructions, see :ref:concepts:retry-policies.
Airflow 3.3.0 adds a Coordinator layer (AIP-108) that lets individual task implementations be written
in non-Python languages while the Dag and its scheduling stay in Python. A task is declared in the Dag
with @task.stub(queue=...); the worker routes it to a configured coordinator
(JavaCoordinator for JVM languages, ExecutableCoordinator for self-contained native binaries
such as Go) that runs the task in a language runtime and proxies Variables, Connections, and XComs back
through the Execution API.
.. warning::
The Coordinator layer and the Java/Go SDKs are experimental in 3.3.0 and may change in future versions based on user feedback.
For detailed usage instructions, see :doc:/authoring-and-scheduling/language-sdks/index.
The new rerun_with_latest_version setting controls whether a cleared, rerun, or backfilled Dag run
uses the latest bundle version or the original version from the initial run. The default is resolved
by precedence: an explicit request parameter/CLI flag, then the Dag-level rerun_with_latest_version,
then [core] rerun_with_latest_version, and finally False for clear/rerun and True for
backfills (preserving historical behaviour). Airflow 2.x always reran with the latest code; 3.x
introduced bundle versioning defaulting to the original version, and this setting gives users control.
See :doc:/administration-and-deployment/dag-bundles for full details.
Example Dags shipped by provider distributions are now discovered via ProvidersManager and
registered as their own Dag bundles — one per provider, named
apache-airflow-providers-<distribution>-example-dags (or <distribution>-example-dags for
third-party providers). The [core] load_examples option still gates whether they are registered.
REST API clients that filtered bundle_name by "dags-folder" for provider-shipped example Dags
must update to the new per-provider bundle names; Dag identifiers are unchanged.
airflow.logging_config (#67056)Remote task log handler resolution is now owned by the shared airflow_shared.logging.factory
module and applies a single, well-defined precedence:
[logging] logging_config_class exporting REMOTE_TASK_LOG /
DEFAULT_REMOTE_CONN_ID (existing custom configs keep working);ProvidersManager scheme dispatch — the scheme of [logging] remote_base_log_folder selects a
provider RemoteLogIO class, instantiated via a no-argument from_config() classmethod;airflow_local_settings.py (to be removed in Airflow 4.0).airflow.logging_config.load_logging_config is deprecated (it now emits DeprecationWarning and
delegates to new private helpers), and configure_logging no longer eagerly resolves the remote
handler — resolution is lazy on first use. Providers that registered a remote-logging: block but do
not implement from_config are skipped with a warning and fall through to the legacy path.
Migration: replace direct calls to airflow.logging_config.load_logging_config() with the new
helpers, and have provider remote-log handler classes implement a no-argument from_config
classmethod that reads airflow.providers.common.compat.sdk.conf.
OpenTelemetry timer and timing metrics are now recorded as Histograms instead of Gauges, preserving count, sum, and bucket distribution across recordings.
dag_processing.last_run.seconds_ago.{dag_file} is now a legacy metric. The new
dag_processing.last_run.seconds_ago is emitted with file_path, bundle_name and
file_name tags (file_path + bundle_name uniquely identify the Dag file). The legacy metric
is still emitted by default and can be disabled via [metrics] legacy_names_on.
A new Deadlines page is available under the Browse menu, accessible to any role that already has
can_read and menu_access on Dag Runs.
clearPartitions endpoint and partition_key/partition_date window selectors on clearDagRuns (#68702)[core] mp_start_method and [core] mp_forkserver_preload configuration options (which can be overridden per [scheduler]/[triggerer]/[dag_processor]) to control the multiprocessing start method (#68875)durable toggle to ResumableJobMixin to opt out of resumable execution (#68623)@result decorator to mark a TaskFlow task as the Dag's result task (#64563)[triggerer] shared_stream_cohort_grace_period to reduce missed events on triggerer restart (#68888)partition_date from producer Dag runs to consumers of partitioned assets (#67285)AssetStateStoreAccessors (#67839)accessors for async tasks (#68299)aget_hook method to BaseHook for async tasks (#68506)Window subclasses via a plugin registry (#68717)extra field for the Coordinator (#68694)rerun_with_latest_version to TriggerDagRunOperator reruns (#67273)partition_date for partitioned Dag runs whose composite asset key has a single time-based dimension (#68442)--team-name support to the pool CLI commands (#68110)awaiting_input task state for Human-in-the-Loop, running off the triggerer (#68028)output_type classes from a worker-side Dag walk (#67875)FixedKeyMapper and SegmentWindow for categorical asset-partition rollup (#67716)POST /dags/{dag_id}/clearDagRuns API endpoint (#67709)consumer_teams to AssetAccessControl in the Task SDK (#67625)team_name at creation time for multi-team support (#67605)forward kwarg on Window (AIP-76) (#67475)expires_at support in the set API (AIP-103) (#67319)team_name column to the trigger table for multi-team triggerer support (#67305)--team-name CLI argument to the triggerer for multi-team (#67254)allow_global option to asset access control (#67251)max_fan_out override for partition fan-out cap (#67184)ResumableJobMixin with SparkSubmitOperator for surviving worker failures (#67118)nav_top_level option for plugin nav items (#67084)allow_producer_teams with access_control on Asset (#66954)wait_policy (#66848)callback_execution_timeout config for deadline callbacks (#66609)clear_on_success config to wipe task state on success (AIP-103) (#66586)partitions clear CLI command to reset DagRun partition fields (#66520)allow_credentials configurable (#66503)teams sync CLI command (#66418)AssetUriRef support (AIP-103) (#66336)FanOutMapper for one-to-many partition fan-out (#66030)Variable.keys() to list variable keys by prefix in the Task SDK (#66022)airflow dags clear command for partition-range reprocessing (#66004)memray_detailed_tracing option for deeper memory profiling (#65996)allow_producer_teams to the Asset SDK class (#65790)on_kill() hook to BaseTrigger to handle user actions on triggers (#65590)[] (#65586)format="Duration" in params (#65469)partition_key to the task context (#65359)is_backfillable property to Dag API responses (#64644)[] (#64430)DagRunType for operators (#63733)run_after to TriggerDagRunOperator (#62259)start_from_trigger feature with template-field rendering (#55068)partition_date to the Dag run detail page (#68977)partition_key on triggering_asset_events and dag_run.consumed_asset_events (AIP-76) (#69120)get/set/delete/clear of AssetStateStoreAccessor to run on the triggerer (#68966)KubernetesExecutor scheduler crash caused by a pod_override that cannot be pickled when running in-cluster (#68831)wait endpoint by ordering on task_id/map_index (#68550)InProcessExecutionAPI (#68840)super().__init__() (#68636)Variable.set() or Variable.delete() fails (#68542)partition_date when manually triggering partitioned Dags (#68458)ti:self scope on /execution/task-reschedules/{ti}/start_date (#67628)BackfillDagRun.partition_key type annotation (#68432)DagRunInfo partition fields (#68342)airflow db clean failing on foreign-key-referenced dag_version rows (#68339)deadline_alert.interval JSON conversion (#68337)partition_date for temporal asset partitions (#68266)retry_policy on non-deferrable TriggerDagRunOperator wait failures (#68254)DagFileProcessorManager silent hang on database lock contention (#68118)SimpleAuthManager not preserving the deep-link next URL on first login (#67965)example_asset_store consumer crash (#67922)InvalidJwtError in JWTValidator.avalidated_claims() when the key ID does not match (#67909)pod_override being stringified without the cncf provider (#67895)default_retention_days in the Task SDK and core API routes (#67890)none_failed_min_one_success trigger rule checks (#67873)airflow dags clear clearing the wrong day for non-UTC partitioned timetables (#67717)ONE_FAILED in mapped task groups (#67684)airflow dags next-execution --table crash when no next run exists (#67642)GET /auth/login missing a 400 response in the OpenAPI spec (#67571)GET /pools incorrectly documenting a 404 response in the OpenAPI spec (#67570)AirflowSecretsBackendAccessDenied (#67560)structure_data on a malformed asset expression (#67489)SimpleAuthManager redirect to the next URL after login (#67483)materialize_asset on invalid input (#67445)fail_fast handling when reschedule exceeds the MySQL TIMESTAMP limit (#67353)AlreadyRunningBackfill error caused by an invalid date range request (#66874)href values to safe schemes (http, https, mailto, relative) (#66741)BaseStateBackend interface to fix custom backends (#66708)state.user injection in get_user() (#66562)hmac.compare_digest for SimpleAuthManager password comparison (CWE-208) (#66556)SameSite=Lax on the SimpleAuthManager all-admins login cookie (#66502)/auth and /pluginsv2 from plugin URL prefixes (#66501)SimpleAuthManager passwords (#66500)runner_health_check_threshold log formatting (#66486)AIRFLOW_UID to 50000 in the airflow-init chown lines (#66481)my.cnf (#66325)CronMixin not resolving cron presets before validation (#66102)AirflowSDKConfigParser missing the mask_secrets method (#66077)resolve_xcom_backend to rely on the config schema default (#65938)sql_alchemy_conn to airflow db shell (#65575)TriggerDagRunOperator when the triggered DagRun fails (#65390)template_fields differ from trigger attributes (#64715)task_defer with non-JSON next_kwargs in TaskInstance (#64714)context["exception"] in InProcessTestSupervisor (#64568)timeout_with_traceback crashes on Windows and non-main threads (#63664)dag_id and run_id (#63296)docker-compose.yaml (#62280)/health check failing on the empty-path route (#68578)| (#68459)jwt_audience for the public API being read from two different config sections (#67494)[core] execution_api_server_url mapping to [workers] execution_api_server_url (#63949)dag.test() not re-syncing sibling Dags across repeated calls (#66205)order_by parameter when listing Dag runs via the REST API (#68948)DeadlineReference.AVERAGE_RUNTIME deadline calculation so failed runs no longer skew the computed deadline (#68949)InProcessExecutionAPI to start without api_auth.jwt_secret configured (#68982)airflow dags test wait for Human-in-the-loop input instead of looping indefinitely on parked HITL tasks (#69104)FixedKeyMapper (#69326)retry_policy was serialized (#69315)[logging] namespace_levels to language SDK runtimes (#68712)dag_id, run_id, run_type) to the trace sampler so a custom head sampler can differentiate by run kind (#68592)all_map_indices from task_state_store.clear() in the task context (#68880)last_automated_run param to reference_run (#68714)team_name tag to the remaining multi-team metrics (#68601)team_name tag to dag processor metrics for multi-team deployments (#68599)team_name tag to asset metrics for multi-team deployments (#68367)airflow dags command to use bulk clear (#68280)task_state_store table to the airflow db clean mechanism (#68218)ResumableJobMixin for crash recovery (#68213)ResumableJobMixin crash-recovery observability with better logging (#68206)DagRun to task_instance_mutation_hook for run-aware task mutation (#68198)team_name to multi-team metrics (#68108)ResumableJobMixin.get_job_status with context for better job status tracking (#68009)DagRun.get_task_instances / fetch_task_instances state parameter (#67880)default parameter to the task and asset state get() method (#67842)allow_consumer_teams and allow_global_consumers columns to TaskOutletAssetReference (#67730)DagRun tables (#67721)partition_key provenance-only and inherit it onto asset events (#67718)BaseOperator.__init__ signature in operator serialization (#67701)TaskGroup.topological_sort for reverse-declared Dags (#67688)AssetStateAccessor (#67619)TaskGroup.topological_sort with an int-indexed projected sweep (#67288)executor.heartbeat() in a timer to localize scheduler loop slowdowns (#66808)dagrun.first_task_start_delay separately from scheduling delay (#66807)SimpleAuthManager runs in a production-shaped deployment (#66563)RemoteLogIO pattern (#66513)BundleVersion dataclass and version_data persistence to DagVersion (#66491)allow_producer_teams to DagScheduleAssetReference (#66487)create_asset_event endpoint (#66367)USFederalHolidayCalendar lazily to reduce memory usage when loading examples (#66303)trigger_kwargs when loading serialized Dags (#66002)AUTH_ROLE_PUBLIC in the FastAPI API server (#65685)task_instance.dag_version_id and dag_run.created_dag_version_id (#64818)RuntimeTaskInstance in TriggerRunner for start_for_trigger functionality (#64298)team_name tag to executor metrics for multi-team deployments (#68593)SyncCallback) to access Connections and Variables (#65269)team_name tag to deadline metrics for multi-team deployments (#68589)team_name tag to scheduler metrics for multi-team deployments (#68594)zh-TW) translation (#68870)ko) translations (#68600)de) translation gaps (#68356)zh-TW) translation (#68668)sdk.TIRunContext documentation for the Go SDK (#68319)ResumableJobMixin and resumable tasks (#68136)removed upstream state (#67452)dags.rst (#67357)access_control to the Asset object (#66949)on_failure_callback (#66277)on_kill()/cleanup() for triggers (#65671)xcom_pull behaviour without task_ids in the docs (#65406)xcom_pull run_id usage for triggered Dag runs (#63030)apache-airflow-mypy package in the core docs (#68561)hi) UI translation (#68574)zh-TW) UI translation gap (#68563)kwargs should reference a Connection rather than inline credentials (#69105)JUL setup, pinning java_executable, and a config-reload note (#69020)3.19.0 (#66970)3.2.2 (#67681)The default Airflow image that is used with the Chart is now 3.2.2, previously it was 3.2.1.
enableServiceLinks (#67447)The default will become false in Chart 2.0. If you rely on these environment variables,
explicitly set enableServiceLinks: true, or migrate your code to use DNS-based service lookups.
serviceAccountTokenVolume to cleanup cron (#67446)requirePersistence option to worker logGroomerSidecar (#65884)eq (#64032)workers.kubernetes and condition workers ServiceAccount (#66730)tpl rendering for ServiceAccount annotations (#66095)if statements for log groomer retention values (#66012)Dag capitalization in chart wording (#66114):package: PyPI: https://pypi.org/project/apache-airflow-ctl/0.1.5 :books: Docs: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5 :hammer_and_wrench: Release Notes: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5/release_notes.html
rerun_with_latest_version config hierarchy for clear/rerun behavior (#63884)get_dag_runs endpoint (#65604)get_task_instances endpoint (#64845)is_backfillable property to DAG API responses (#64644)--flag options. Optional parameters keep the --flag form. Follows the dev-list lazy consensus on airflowctl parameter style (see https://lists.apache.org/thread/m1qvcvow3l17ytv40vhslh40wn3rntrm) (#66768)pyyaml runtime dependency (#65489)dagrun list crash when --state is omitted (#65608)RELEASE_NOTES.rst in airflowctl PRs (#67128)safe_load function in airflowctl utils to load help texts (#65841)httpx dependency below 1.0 (#65607)airflow-ctl/newsfragments directory (#65507)📦 PyPI: https://pypi.org/project/apache-airflow/3.2.2/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.2.2/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.2.2/release_notes.html 🐳 Docker Image: "docker pull apache/airflow:3.2.2" 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.2.2
The SMTP STARTTLS upgrade performed by airflow.utils.email.send_email now validates the SMTP server's certificate against the system's trusted CA bundle by default. Previously the starttls() call was made without an SSL context, so any certificate was accepted.
Deployments that intentionally point Airflow at an SMTP server with a self-signed or otherwise non-validating certificate and need to preserve the previous behaviour must set email.ssl_context = "none" in airflow.cfg. The "default" value (now also the default when the option is unset) uses :func:ssl.create_default_context. Previously this option applied only to the SMTP_SSL path; it now applies to the STARTTLS path as well. (#65346)
In #64963, the Airflow UI switched from full-match *_pattern REST API query parameters to the new index-friendly *_prefix_pattern parameters on list endpoints. This is a behavioral change for search-as-you-type filters in the UI: matches are prefix-based (LIKE 'term%' via a range scan) instead of substring-based (ILIKE '%term%'), which means the database can use B-tree indexes and search stays fast on large deployments. The REST API itself keeps both forms: existing *_pattern parameters still behave exactly as before.
In #66015, a per-search-bar "Match anywhere" toggle was added so users who relied on the previous substring behavior can opt back into it from the UI. Each search input and each text filter pill now has a small regex-icon toggle next to the value; flipping it on switches that input from *_prefix_pattern to *_pattern. (#66015)
Fix triggerer race condition and deadlock that caused deferred tasks to stall indefinitely
Triggers that call synchronous SDK methods (e.g. get_task_states used by
safe_to_cancel in several Google provider operators) could crash the triggerer's
internal subprocess. The triggerer would then continue to heartbeat normally —
appearing healthy to the scheduler — while silently processing zero triggers, causing
every deferred task to time out. This was first reported in issue #64620; a
partial fix shipped in Airflow 3.2.1 (#64882) but introduced a new deadlock
with the same visible symptom under load.
Both issues are fixed by replacing the lock-based serialization with response multiplexing: each request now carries a unique ID and the response is routed back to the correct caller, so concurrent requests from trigger threads no longer contend or deadlock regardless of how many triggers are running or what SDK methods they call.
New: triggerer subprocess watchdog
Even with the race fixed, a trigger that blocks the event loop (e.g. by calling
time.sleep() or performing blocking I/O directly in async def run()) would
previously leave the triggerer appearing healthy indefinitely.
A new [triggerer] runner_health_check_threshold config option (default: 30 seconds)
adds a watchdog: if the triggerer subprocess goes silent for longer than the threshold,
the parent process stops updating the heartbeat so the scheduler can detect the hang and
reassign triggers rather than waiting for them to individually time out. Set the option
to 0 to disable the watchdog. (#66412)
Tighten [core] allowed_deserialization_classes_regexp to require full-string matches
Patterns in [core] allowed_deserialization_classes_regexp are now matched
against the entire classname using re.fullmatch() instead of re.match().
Previously a pattern such as airflow\.models\.Variable admitted not only
the intended class but also names that started with it
(e.g. airflow.models.Variable_Malicious), because re.match only anchors
at the start of the string.
The default value of this option is empty, so out-of-the-box deployments are
unaffected. Deployments that configured this option with patterns relying on
prefix-match semantics — for example airflow\.models\. to mean "any class
under airflow.models" — must add .* to the pattern
(airflow\.models\..*) to retain the previous behaviour. (#66499)
Custom deadline reference classes must now be registered via the new deadline_references attribute on AirflowPlugin, matching the existing pattern for custom timetables and custom partition mappers. To use a custom DeadlineReference subclass, register it in a plugin's deadline_references list. Custom references that are not registered will raise DeadlineReferenceNotRegistered at deserialization. (#66737)
Callback.handle_event triggerer crash when OpenTelemetry metrics receive dict typed tag values (#67527) (#67529)modulepreload hrefs to the api-server static path (#67548) (#67556)external_executor_id with multiple executors on PostgreSQL (#67388) (#67458)starlette>=1.0.1 for Host-header parsing fix and cadwyn>=6.1.1 for compatibility
(#67326) (#67460)ti_update_state caused by FOR UPDATE locking dag_run (#67246) (#67264)getLatestRunInfo on paused Dags with no active runs (#67249) (#67256)_collect_teams_to_check and requires_access_backfill against malformed request bodies (#66504) (#67182)ValueError when supervisor force-closes stuck sockets after timeout (#67115) (#67162)XCom PATCH/POST to store native values instead of json.dumps output (#64220) (#67116)max_active_runs lost during Dag serialization when value equals schema default (#65310) (#67097)serialize_template_field handling callable value in dict (#63871) (#67092)ArgNotSet repr to use stable string instead of memory address (#65222) (#66897)XCom update payload (#65915) (#66913)removeprefix (#66749) (#66772)SIGSEGV in task execution by using fork + exec (#64874) (#66872)run_after (#65207) (#66863)pod_override serialization in Dag details and executor path (#65407) (#66898)pool_recycle and pool_pre_ping configuration (#65276) (#66866)DagVersion when clearing tasks with run on latest version (#65835) (#66901)DagRun already in target state (#66198) (#66919)LocalExecutor caused by unreleased file descriptor locks (#65121) (#66887)DagCalendarTab background color retrieval and loading overlay handling (#64189) (#66860)lazyMount causing JSON editor infinite loading (#65969) (#66828)ConnectionForm crashing when connection has invalid extra JSON (#66593) (#66831)PermissionError in init_log_folder for mounted filesystems (#63878) (#66733)StaleDataError in verify_integrity (#64503) (#66727)/tmp file leak when API server streams large task logs (#66450) (#66667)XCom prior-dates lookup for duplicate run_id across Dags (#65227) (#66646)/required_actions listing to show mapped task instances (#66433) (#66482)bundle_version when versioning disabled (#66485) (#66518)Next Run timestamp for paused Dags (#66552) (#66568)DagRun state is expired (#66339) (#66347)partition_date on partitioned backfill runs (#65998) (#66409)remote_task_handler_kwargs passing handler params to RemoteLogIO (#65957) (#66440)upstream_failed from failed in normal vision (#66324) (#66365)SearchBar input rewind (#66284) (#66359)logical_date when previous data_interval is zero-length (#66132) (#66263)autoincrement sequence on callback_request downgrade (#65230) (#66189)source_aliases in process_executor_events (#65422) (#66191)dagRuns API to honor start_date_gte filter correctly (#66045) (#66098)UniqueViolation crash on downgrade from 3.2.0 to 3.1.x (#65688) (#66003)ti.hostname is empty (#64285) (#65583)year field unmodifiable (#63885) (#65890)TypeError crashes on /users/list and /roles/list in FAB UI caused by concurrent API schema requests (#63986) (#65892)PoolBar links using wrong query params for task instances filtering (#64182) (#65896)pathlib sys.intern in long-running processes (#65706) (#65855)external_executor_id at queuing time to prevent duplicate execution on scheduler crash (#65594) (#65711)ti.start_date showing deferral-resume time instead of original start time (#63247) (#65491)map_index bounds validation (#64133) (#65479)XCom navigation from Grid (#65192) (#65322)is_url_safe to reject URLs with /// (#65557) (#65737)run_id_pattern pipe OR operator dropping single-term edge cases (#65190) (#65565)structure_data endpoint (#65342) (#65534)partitioned_dag_runs endpoints (#65344) (#65538)PATCH /dags pagination bug and document wildcard dag_id_pattern (#65309)Secure flag when request is HTTPS (#65348) (#65363)relative_fileloc and bundle (#65329) (#65343)requires_access_event_log to GET /eventLogs list endpoint (#67185) (#67211)Named*Logger.name working across structlog releases (#66875) (#67088)Checkbox (#66714) (#66826)ti_id, task_id, etc.) once, not on every log line (#66036) (#66421)TriggerDagRunOperator (#65747) (#66378)isExpanded prop on JSON expand/collapse buttons (#66340) (#66364)try_number to extra links API (#65661) (#66171)DagBag (#65775) (#65966)get_dag_runs endpoint (#65604) (#65746)XCom entries in the REST API and UI (#65418) (#65600)get_task_instances endpoint (#64845) (#65405)ti_summaries and grid runs queries (#64034) (#67014)from_timestamp from Task SDK timezone module (#67321) (#67331)plugins_manager docs (#67101) (#67114)(fr) UI translations to 100% coverage (#67241)airflow-core (#66703) (#66740)create_cron_data_intervals (#66458)zh-TW translations (#66401)core_api (#66211) (#66304)airflow-core/src/airflow/api (#66200) (#66214)BashOperator document (#64129) (#65850)Significant Changes
Workers config options have been moved under workers.celery.* and workers.kubernetes.*
Please update your configuration accordingly:
The previous configuration options are still working but are deprecated and will be removed in a future version.
Default Airflow image is updated to 3.2.0 (#64841)
The default Airflow image that is used with the Chart is now 3.2.0, previously it was 3.1.8.
New Features
Improvements
Bug Fixes
Doc only changes
Misc
📦 PyPI: https://pypi.org/project/apache-airflow/3.2.1/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.2.1/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.2.1/release_notes.html 🐳 Docker Image: "docker pull apache/airflow:3.2.1" 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.2.1
/dags endpoint, as it now requires additional permissions (DagAccessEntity.RUN, DagAccessEntity.HITL_DETAIL, and DagAccessEntity.TASK_INSTANCE). This change was made because the endpoint returns aggregated data from these multiple entities. Please update your custom user roles to include read access for DAG Runs, Task Instances, and HITL Details if those users should still have access to the /dags endpoint. (#64822){} to restore OSS defaults. The tokens field is now optional in the theme configuration. (#64552)DEFAULT_LOGGING_CONFIG to use right kwargs (#65412) (#65424)dispose_orm() not disposing async engine on shutdown (#65274) (#65284)get_team_name_dep creating wasted async sessions when multi_team=False (#65275) (#65282)disable_sqlite_fkeys to migration 0108 (#65288) (#65290)UPDATE to avoid row lock in the common case (#65029) (#65137)dropdowns in connection forms (#65007) (#65085) (#65138)SearchBar value not syncing with defaultValue changes (#65054) (#65140)$AIRFLOW_CONFIG env (#64936) (#65200)Session staying opened between yields (#65179) (#65195)Session leak from StreamingResponse API endpoints (#65162) (#65193)_token cookie exists from older Airflow instance (#64955) (#65177)@task decorator to validate operator arg types at decoration time (#65041) (#65050)is_alive default to None in jobs list CLI (#65065) (#65091)dag_id in get_task_instance (#64957) (#64968) (#65067)debounce on clear to prevent stale search value (#64893) (#64907)CommsDecoder (#64894) (#64946)UPDATEs inside disable_sqlite_fkeys in migration 0097 (#64876) (#64940)TI exists in TIH (#61631) (#64693)SerializedDagModel (#64322) (#64738)TypeError in GET /dags/{dag_id}/tasks when order_by field has None values (#64384) (#64587)DagRun (#64752) (#64853)connections import returning non-zero exit code on failure (#64416) (#64449)target and add rel attributes (#64542) (#64772)DagVersionSelect options not filtered by selected DagRun (#64736) (#64771)start_date in example DAGs to avoid timezone conversion overflow (#63882) (#64758)AirflowPlugin not re-exported, causing mypy errors in plugins (#65132) (#65163)apache-airflow-providers-fab minimum version to prevent connexion import error on Python 3.13 (#65523) (#65524)TriggerCommsDecoder sync req-res cycle (#64882) (#65285)write_to_os support for writing task logs to OpenSearch (#64364) (#65201)airflow_local_settings.py (#64764) (#65003)📦 PyPI: https://pypi.org/project/apache-airflow/3.2.0/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.2.0/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.2.0/release_notes.html 🐳 Docker Image: "docker pull apache/airflow:3.2.0" 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.2.0
The headline feature of Airflow 3.2.0 is asset partitioning — a major evolution of data-aware scheduling. Instead of triggering Dags based on an entire asset, you can now schedule downstream processing based on specific partitions of data. Only the relevant slice of data triggers downstream work, making pipeline orchestration far more efficient and precise.
This matters when working with partitioned data lakes — date-partitioned S3 paths, Hive table partitions, BigQuery table partitions, or any other partitioned data store. Previously, any update to an asset triggered all downstream Dags regardless of which partition changed. Now only the right work gets triggered at the right time.
For detailed usage instructions, see :doc:/authoring-and-scheduling/assets.
Airflow 3.2 introduces multi-team support, allowing organizations to run multiple isolated teams within a single Airflow deployment. Each team can have its own Dags, connections, variables, pools, and executors— enabling true resource and permission isolation without requiring separate Airflow instances per team.
This is particularly valuable for platform teams that serve multiple data engineering or data science teams from shared infrastructure, while maintaining strong boundaries between teams' resources and access.
For detailed usage instructions, see :doc:/core-concepts/multi-team.
.. warning::
Multi-Team Deployments are experimental in 3.2.0 and may change in future versions based on user feedback.
Deadline Alerts now support synchronous callbacks via SyncCallback in addition to the existing
asynchronous AsyncCallback. Synchronous callbacks are executed by the executor (rather than
the triggerer), and can optionally target a specific executor via the executor parameter.
A Dag can also define multiple Deadline Alerts by passing a list to the deadline parameter,
and each alert can use either callback type.
.. warning::
Deadline Alerts are experimental in 3.2.0 and may change in future versions based on
user feedback. Synchronous deadline callbacks (SyncCallback) do not currently
support Connections stored in the Airflow metadata database.
For detailed usage instructions, see :doc:/howto/deadline-alerts.
Grid View Virtualization: The Grid view now uses virtualization -- only visible rows are rendered to the DOM. This dramatically improves performance when viewing Dags with large numbers of task runs, reducing render time and memory usage for complex Dags. (#60241)
XCom Management in the UI: You can now add, edit, and delete XCom values directly from the Airflow UI. This makes it much easier to debug and manage XCom state during development and day-to-day operations without needing CLI commands. (#58921)
HITL Detail History: The Human-in-the-Loop approval interface now includes a full history view, letting operators and reviewers see the complete audit trail of approvals and rejections for any task. (#56760, #55952)
Gantt Chart Improvements:
--only-idle flag for the scheduler CLIThe airflow scheduler command has a new --only-idle flag that only counts runs when the
scheduler is idle. This helps users run the scheduler once and process all triggered Dags and
queued tasks. It requires and complements the --num-runs flag so one can set a small value
instead of guessing how many iterations the scheduler needs.
The grid, graph, gantt, and task-detail views now fetch task-instance
summaries through a single streaming HTTP request
(GET /ui/grid/ti_summaries/{dag_id}?run_ids=...) instead of one request
per run. The server emits one JSON line per run as soon as that run's task
instances are ready, so columns appear progressively rather than all at once.
What changed:
GET /ui/grid/ti_summaries/{dag_id}?run_ids=... is now the sole endpoint
for TI summaries, returning an application/x-ndjson stream where each
line is a serialized GridTISummaries object for one run.GET /ui/grid/ti_summaries/{dag_id}/{run_id}
has been removed.dag_version_id, avoiding redundant deserialization.run_ids.The new json_logs option under the [logging] section makes Airflow
produce all its output as newline-delimited JSON (structured logs) instead of
human-readable formatted logs. This covers the API server (gunicorn/uvicorn),
including access logs, warnings, and unhandled exceptions.
Not all components support this yet — notably airflow celery worker but
any non-JSON output when json_logs is enabled will be treated as a bug. (#63365)
The interfaces and functions located in airflow.traces were
internal code that provided a standard way to manage spans in
internal Airflow code. They were not intended as user-facing code
and were never documented. They are no longer needed so we
remove them in 3.2. (#63452)
Airflow now sources task-facing exceptions (AirflowSkipException, TaskDeferred, etc.) from
airflow.sdk.exceptions. airflow.exceptions still exposes the same exceptions, but they are
proxies that emit DeprecatedImportWarning so Dag authors can migrate before the shim is removed.
What changed:
airflow-core at runtime.airflow.providers.common.compat.sdk centralizes compatibility imports for providers.Behaviour changes:
ValueError (instead of
AirflowException) when poke_interval/ timeout arguments are invalid.airflow.exceptions logs a warning directing users to
the SDK import path.Exceptions now provided by airflow.sdk.exceptions:
AirflowException and AirflowNotFoundExceptionAirflowRescheduleException and AirflowSensorTimeoutAirflowSkipException, AirflowFailException, AirflowTaskTimeout, AirflowTaskTerminatedTaskDeferred, TaskDeferralTimeout, TaskDeferralErrorDagRunTriggerException and DownstreamTasksSkippedAirflowDagCycleException and AirflowInactiveAssetInInletOrOutletExceptionParamValidationError, DuplicateTaskIdFound, TaskAlreadyInTaskGroup, TaskNotFound, XComNotFoundAirflowOptionalProviderFeatureExceptionBackward compatibility:
airflow.exceptions continue to work, though
they log warnings.airflow.providers.common.compat.sdk to keep one import path that works
across supported Airflow versions.Migration:
airflow.sdk.exceptions (or from the provider compat shim).ValueError for invalid sensor arguments if it
previously caught AirflowException.The retry_exponential_backoff parameter now accepts numeric values to specify custom exponential backoff multipliers for task retries. Previously, this parameter only accepted boolean values (True or False), with True using a hardcoded multiplier of 2.0.
New behavior:
2.0, 3.5) directly specify the exponential backoff multiplierretry_exponential_backoff=2.0 doubles the delay between each retry attemptretry_exponential_backoff=0 or False disables exponential backoff (uses fixed retry_delay)Backwards compatibility:
Existing Dags using boolean values continue to work:
retry_exponential_backoff=True → converted to 2.0 (maintains original behavior)retry_exponential_backoff=False → converted to 0.0 (no exponential backoff)API changes:
The REST API schema for retry_exponential_backoff has changed from type: boolean to type: number. API clients must use numeric values (boolean values will be rejected).
Migration:
While boolean values in Python Dags are automatically converted for backwards compatibility, we recommend updating to explicit numeric values for clarity:
retry_exponential_backoff=True → retry_exponential_backoff=2.0retry_exponential_backoff=False → retry_exponential_backoff=0Airflow now sources serde logic from airflow.sdk.serde instead of
airflow.serialization.serde. Serializer modules have moved from airflow.serialization.serializers.*
to airflow.sdk.serde.serializers.*. The old import paths still work but emit DeprecatedImportWarning
to guide migration. The backward compatibility layer will be removed in Airflow 4.
What changed:
airflow-core to task-sdk packageairflow.serialization.serializers.* to airflow.sdk.serde.serializers.*airflow.sdk.serde.serializers.* namespaceCode interface changes:
airflow.sdk.serde.serializers.* instead of airflow.serialization.serializers.*airflow.sdk.serde instead of airflow.serialization.serdeBackward compatibility:
airflow.serialization.serializers.* continue to work with deprecation warningsMigration:
airflow.sdk.serde.serializers.*airflow.sdk.serde.serializers.* namespace (e.g., create task-sdk/src/airflow/sdk/serde/serializers/your_serializer.py)On (experimental) class PriorityWeightStrategy, functions serialize()
and deserialize() were never used anywhere, and have been removed. They
should not be relied on in user code. (#59780)
On class TaskInstance, functions run(), render_templates(),
get_template_context(), and private members related to them have been
removed. The class has been considered internal since 3.0, and should not be
relied on in user code. (#59780, #59835)
DagBagNew behavior:
DagBag now uses Path.relative_to for consistent cross-platform behavior.FileLoadStat now has two additional nullable fields: bundle_path and bundle_name.Backward compatibility:
FileLoadStat will no longer produce paths beginning with / with the meaning of "relative to the dags folder".
This is a breaking change for any custom code that performs string-based path manipulations relying on this behavior.
Users are advised to update such code to use pathlib.Path. (#59785)
--conn-id option from airflow connections listThe redundant --conn-id option has been removed from the airflow connections list CLI command.
Use airflow connections get instead. (#59855)
render_template_as_native_obj overrideOperators can now override the Dag-level render_template_as_native_obj setting,
enabling fine-grained control over whether templates are rendered as native Python
types or strings on a per-task basis. Set render_template_as_native_obj=True or
False on any operator to override the Dag setting, or leave as None (default)
to inherit from the Dag.
The API server now supports gunicorn as an alternative server with rolling worker restarts to prevent memory accumulation in long-running processes.
Key Benefits:
Rolling worker restarts: New workers spawn and pass health checks before old workers are killed, ensuring zero downtime during worker recycling.
Memory sharing: Gunicorn uses preload + fork, so workers share memory via copy-on-write. This significantly reduces total memory usage compared to uvicorn's multiprocess mode where each worker loads everything independently.
Correct FIFO signal handling: Gunicorn's SIGTTOU kills the oldest worker (FIFO), not the newest (LIFO), which is correct for rolling restarts.
Configuration:
.. code-block:: ini
[api]
# Use gunicorn instead of uvicorn
server_type = gunicorn
# Enable rolling worker restarts every 12 hours
worker_refresh_interval = 43200
# Restart workers one at a time
worker_refresh_batch_size = 1
Or via environment variables:
.. code-block:: bash
export AIRFLOW__API__SERVER_TYPE=gunicorn
export AIRFLOW__API__WORKER_REFRESH_INTERVAL=43200
Requirements:
Install the gunicorn extra: pip install 'apache-airflow-core[gunicorn]'
Note on uvicorn (default):
The default uvicorn mode does not support rolling worker restarts because:
If you need worker recycling or memory-efficient multi-worker deployment, use gunicorn. (#60921)
The config max_num_rendered_ti_fields_per_task is renamed to num_dag_runs_to_retain_rendered_fields
(old name still works with deprecation warning).
Retention is now based on the N most recent dag runs rather than N most recent task executions, which may result in fewer records retained for conditional/sparse tasks. (#60951)
requires_access_dag on the DagAccessEntity.Runis_authorized_backfill of the BaseAuthManager interface has been removed. Core will no longer call this method and their
provider counterpart implementation will be marked as deprecated.
Permissions for backfill operations are now checked against the DagAccessEntity.Run permission using the existing
requires_access_dag decorator. In other words, if a user has permission to run a Dag, they can perform backfill operations on it.
Please update your security policies to ensure that users who need to perform backfill operations have the appropriate DagAccessEntity.Run permissions. (Users
having the Backfill permissions without having the DagRun ones will no longer be able to perform backfill operations without any update)
Airflow 3.2.0 adds support for Python 3.14. (#63787)
SerializedDAG loads on task startThe API server no longer loads the full SerializedDAG when starting tasks,
significantly reducing memory usage. (#60803)
MySQL client support has been removed from official Airflow container images. MySQL users building on official images must install the client themselves. (#57146)
The PythonOperator parameter python_callable now also supports async callables in Airflow 3.2,
allowing users to run async def functions without manually managing an event loop. (#60268)
@continuous scheduleThe schedule="@continuous" parameter now works without requiring a start_date, and any Dags with this schedule will begin running immediately when unpaused. (#61405)
PYTHON_LTO build argument (#58337)--queues CLI option for the trigger command (#59239)--show-values and --hide-sensitive flags to CLI connections list and variables list to hide sensitive values by default (#62344)AIRFLOW__SECRETS__BACKEND_KWARG__<KEY> environment variables (#63312)only_new parameter to Dag clear to only clear newly added task instances (#59764)log_timestamp_format config option for customizing component log timestamps (#63321)--action-on-existing-key option to pools import and connections import CLI commands (#62702)--use-migration-files flag for airflow db init (#62234)AllowedKeyMapper for partition key validation in asset partitioning (#61931)ChainMapper for chaining multiple partition mappers (#64094)AgenticOperator (#63081)@task.stub decorator to allow tasks in other languages to be defined in Dags (#56055)TriggerDagRunOperator (#60810)allowed_run_types to whitelist specific Dag run types (#61833)dag_id and dag_run_id in bulk task instance endpoint (#57441)operator_name_pattern, pool_pattern, queue_pattern as task instance search filters (#57571)update_mask support for bulk PATCH APIs (#54597)source parameter to Param (#58615)TaskInstance on RuntimeTaskInstance (#59712)max_trigger_to_select_per_loop config for Triggerer HA setup (#58803)uvicorn_logging_level config option to control API server access logs (#56062)executor.running_dags gauge metric to expose count of running Dags (#52815)GitDagBundle (#59911)GitHook for Dag bundles (#58194)RemoteIO for ObjectStorage (#54813)--dev flag (#57741)auth list-envs command to list CLI environments and auth status (#61426)airflow info command output (#59124)db_clean to explicitly include or exclude Dags (#56663)TaskStreamFilter (#60549)globalCss in custom themes (#61161)run_after date filter on Dag runs page (#62797)AIRFLOW__API__THEME in addition to brand (#64232)non-sensitive-only value as True (#59880)InvalidStatsNameException for pool names with invalid characters by auto-normalizing them when emitting metrics (#59938)AIRFLOW__API__BASE_URL basename is configured (#63141)/mapped to group URLs (#63205)ti_skip_downstream overwriting RUNNING tasks to SKIPPED in HA deployments (#63266)@task decorator failing for tasks that return falsy values like 0 or empty string (#63788)LatestOnlyOperator not working when direct upstream of a dynamically mapped task (#62287)XCom return type in mapped task groups with dynamic mapping (#59104)DagRun span emission crash when context_carrier is None (#64087)next_dagrun fields are None (#63962)relativedelta (#61671)task_instance_mutation_hook receiving run_id=None during TaskInstance creation (#63049)None dag_version access (#62225)MetastoreBackend.expunge_all() corrupting shared session state (#63080)airflowignore negation pattern handling for directory-only patterns (#62860)TYPE_CHECKING-only forward references in TaskFlow decorators (#63053)structlog JSON serialization crash on non-serializable objects (#62656)queued_tasks type mismatch in hybrid executors (CeleryKubernetesExecutor, LocalKubernetesExecutor) (#63744)pathlib.Path objects incorrectly resolved by Jinja templater in Task SDK (#63306)make_partial_model for API Pydantic models (#63716)_execution_api_server_url() ignoring configured value and falling back to edge config (#63192)DetachedInstanceError for airflow tasks render command (#63916)@task definition causing Dag parsing errors (#62174)limit parameter not sent in execute_list server requests (#63048)airflow.configuration causing ImportError on Python 3.14 (#63787)map_index range validation in CLI commands (#62626)FabAuthManager race condition on startup with multiple workers (#62737)FabAuthManager race condition when workers concurrently create permissions, roles, and resources (#63842)JWTValidator not handling GUESS algorithm with JWKS (#63115)FabAuthManager first idle MySQL disconnect in token auth (#62919)JWTBearerTIPathDep import errors in Human-In-The-Loop routes (#63277)log_pos (#63531)null dag_run_conf causing serialization error in BackfillResponse (#63259)savepoints with per-Dag transactions (#63591)deadline.callback_id (#63612)interval causing query failures in deadline_alert (#63494)serialize_dag query failure during deadline migration (#63804)visibility_timeout that kills long-running Celery tasks (#62869)CronPartitionedTimetable (#62441)AssetModel when updating asset partition DagRun — adds mutex lock (#59183)auth_manager load_user causing PendingRollbackError (#61943)joinedload for asset in dags_needing_dagruns() (#60957)NotMapped exception when clearing task instances with downstream/upstream (#58922)partition_key filter in PALK when creating DagRun (#61831)ObjectStoragePath to exclude conn_id from storage options passed to fsspec (#62701)XComObjectStorageBackend (#55805)default_email_on_failure/default_email_on_retry from config (#59912)TaskInstance.get_dagrun returning None in task_instance_mutation_hook (#60726)dag_display_name property bypass for DagStats query (#64256)TaskAlreadyRunningError not raised when starting an already-running task instance (#60855)enable_swagger_ui config not respected in API server (#64376)conf.has_option not respects default provider metadata (#64209)TaskInstance crash when refreshing task weight for non-serialized operators (#64557)XCom edit modal value not repopulating on reopen (#62798)RenderedJsonField collapse behavior (#63831)RenderedJsonField not displaying in table cells (#63245)-1) slots not rendering correctly (#62831)DurationChart labels and disable animation flicker during auto-refresh (#62835)/dagruns page not working (#62848)total_received count in partitioned Dag runs view (#62786)RenderedJsonField flickering when collapsed (#64261)TISummaries not refreshing when gridRuns are invalidated (#64113)DagRun window (#64179)api.page_size config in favor of api.fallback_page_limit (#61067)get_dag_runs API endpoint performance (#63940)filter_authorized_dag_ids (#63184)gc.freeze (#62212)get_task_instances endpoint (#62910)IN clause in asset queries with CTE and JOIN for better SQL performance (#62114)ConnectionResponse serializer safeguard to prevent accidental sensitive field exposure (#63883)dag_id filter on DagRun task instances API query (#62750)expose_stacktrace is disabled (#63028)update_mask fields in PATCH API endpoints against Pydantic models (#62657)order_by parameter to GET /permissions endpoint for pagination consistency (#63418)BaseXcom to airflow.sdk public exports (#63116)TaskSDK conf respect default config from provider metadata (#62696)airflow.sdk.observability.trace (#63554)external_executor_id on PostgreSQL (#63625)DagRun.created_at during migration for faster upgrades (#63825)ExecuteCallback by including dag_id and run_id (#62616)get_connection_form_widgets and get_ui_field_behaviour hook methods (#63711)[workers] config section (#63659)TaskInstance API for external task management (#61568)airflow.datasets, airflow.timetables.datasets, and airflow.utils.dag_parsing_context modules (#62927)PyOpenSSL from core dependencies (#63869)SerializedDAG (#56694)pop(0) to popleft() (#61376).git folder from versions in GitDagBundle to reduce storage size (#57069)airflow.utils.process_utils (#57193)KubernetesPodOperator handling of deleted pods between polls (#56976)ToXXXMapper to StartOfXXXMapper in partition-mapper for clarity (#64160)partition_date (#62866)AIRFLOW__API__THEME config (#64232)DeadlineReferences (#57222)FilterBar with DateRangeFilter for compact UI (#56173)RedisTaskHandler configuration example (#63898)_shared folders (#63468)modules_management docs (#63634)max_active_tasks Dag parameter documentation (#63217)GitHook parameters (#63265)example_bash_decorator (#62948)Minimum supported version of Apache Airflow is now 2.11.0. If you want to deploy an old version of Apache Airflow, please use the last released version of the chart 1.19.0.
workers specific sections have been moved to workers.celery / workers.kubernetes sectionsPlease update your configuration accordingly:
workers.command command is now deprecated in favor of workers.celery.command/workers.kubernetes.command (#60067).workers.securityContexts command is now deprecated in favor of workers.celery.securityContexts/workers.kubernetes.securityContexts (#60396).workers.containerLifecycleHooks command is now deprecated in favor of workers.celery.containerLifecycleHooks/workers.kubernetes.containerLifecycleHooks (#61369).workers.kerberosSidecar section is now deprecated in favor of workers.celery.kerberosSidecar/workers.kubernetes.kerberosSidecar (#61881).workers.kerberosInitContainer section is now deprecated in favor of workers.celery.kerberosInitContainer/workers.kubernetes.kerberosInitContainer (#60751).workers.terminationGracePeriodSeconds command is now deprecated in favor of workers.celery.terminationGracePeriodSeconds/workers.kubernetes.terminationGracePeriodSeconds (#61892).workers.nodeSelector command is now deprecated in favor of workers.celery.nodeSelector/workers.kubernetes.nodeSelector (#61957).workers.podDisruptionBudget section is now deprecated in favor of workers.celery.podDisruptionBudget. Please update your configuration accordingly. (#61414)workers.keda section is now deprecated in favor of workers.celery.keda. Please update your configuration accordingly. (#61820)workers.resources section is now deprecated in favor of workers.celery.resources and workers.kubernetes.resources. Please update your configuration accordingly. (#61890)The previous configuration options are still working, but are deprecated and will be removed in a future version.
To enable feature behaviour set dags.gitSync.recommendedProbeSetting to true. Section itself will be removed in future release as to not break setups during upgrades.
As Git-Sync has dedicated liveness service, the liveness probe behaviour will be changed. To enable feature behaviour set dags.gitSync.recommendedProbeSetting to true.
Please update your configuration accordingly.
container_extra_envs and custom_airflow_environment (#60750)The automatic prefix addition for Kubernetes Executor environment variables and secrets has been removed from both the container_extra_envs and custom_airflow_environment helper functions.
What changed:
Previously, when you added environment variables to component-specific configurations (e.g., .Values.scheduler.env), the chart automatically created an additional environment variable (to specified in the env section) with the AIRFLOW__KUBERNETES_ENVIRONMENT_VARIABLES__ prefix for Kubernetes Executor worker pods. After this change, only the variable specified in env section will be created.
Furthermore, for values specified under .Values.secret section, the AIRFLOW__KUBERNETES_SECRETS__ prefix is no longer automatically added. Secrets are now passed as-is via secretKeyRef without the prefixed copy for worker pods.
Why this change:
client_secret information. Previously, due to prefix, it was recognized as internal Airflow configuration leading to unintended exposure in Airflow UI (under Admin -> Configuration), even when AIRFLOW__API__EXPOSE_CONFIG is set to non-sensitive-only.Migration Required:
If you need to pass environment variables specifically to Kubernetes Executor worker pods, use one of the following approaches:
Option 1: Use .Values.env
.. code-block:: yaml
env:
- name: my_var
value: "my_value"
Environment variables specified under .Values.env are now passed as-is without the automatic prefix (same behaviour as component-specific env).
Option 2: Use .Values.config.kubernetes_environment_variables
.. code-block:: yaml
config:
kubernetes_environment_variables:
my_var: "my_value"
3.1.8 (#63392)The default Airflow image that is used with the Chart is now 3.1.8, previously it was 3.1.7.
podAnnotations and airflowPodAnnotations values (#63019)KUBERNETES_ENVIRONMENT_VARIABLES and KUBERNETES_SECRETS prefixes from chart helpers (#60750)workers.celery.nodeSelector & workers.kubernetes.nodeSelector (#61957)workers.celery.terminationGracePeriodSeconds & workers.kubernetes.terminationGracePeriodSeconds (#61892)workers.celery.resources & workers.kubernetes.resources (#61890)workers.celery.keda section (#61820)workers.celery.podDisruptionBudget (#61414)workers.celery.containerLifecycleHooks & workers.kubernetes.containerLifecycleHooks (#61369)livenessProbe & deprecate readinessProbe & add startupProbe (#62334)securityContext values (#62729)apiServer, statsd, and pgbouncer (#62490)securityContexts and containerLifecycleHook (#60677)spec.replicas when HPA is enabled (#63187)workers.celery.kerberosSidecar & workers.kubernetes.kerberosSidecar sections (#61881)tpl rendering for TLS hosts in ingress templates #62358 (#62548)webserver.defaultUser.enabled=false not honored (#62143)*.iml to .gitignore in all distributions (#63636)📦 PyPI: https://pypi.org/project/apache-airflow-ctl/0.1.3/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.3/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.3/release_notes.html
Thanks to all the contributors who made this possible. Next time, Release notes will be available through public documentation.
--action-on-existing-key to pools import and connections import (#62702)A feature-rich command-line audio/video downloader
tmux release notes.
GitHub command-line tool
Anthropic's agentic coding tool for the terminal, IDE and web.
Rule based proxy utility client for iPhone/iPad.
One tool to manage every AWS service from the command line, and script them.