CINXE.COM
GitHub - jghoman/awesome-apache-airflow: Curated list of resources about Apache Airflow
<!DOCTYPE html> <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system" data-a11y-link-underlines="true" > <head> <meta charset="utf-8"> <link rel="dns-prefetch" href="https://github.githubassets.com"> <link rel="dns-prefetch" href="https://avatars.githubusercontent.com"> <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com"> <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/"> <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-74231a1f3bbb.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-8a995f0bacd4.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-f37fb7684b1f.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-9ac301c3ebe5.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-cd826e8636dc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-f91b0f603451.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-83beb16e0ecf.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-6e122dab64fc.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-18119e682df0.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-225433424a87.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-aaa714e5674d.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-0a3c53b9d1c2.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-ea73c9cb5377.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-4fce88777fa8.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-0210be90f4d3.css" /> <script type="application/json" id="client-env">{"locale":"en","featureFlags":["a11y_quote_reply_fix","copilot_immersive_issue_preview","copilot_new_references_ui","copilot_chat_repo_custom_instructions_preview","copilot_no_floating_button","copilot_topics_as_references","copilot_read_shared_conversation","copilot_duplicate_thread","copilot_buffered_streaming","dotcom_chat_client_side_skills","experimentation_azure_variant_endpoint","failbot_handle_non_errors","geojson_azure_maps","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","github_models_gateway_parse_params","github_models_o3_mini_streaming","insert_before_patch","issues_react_remove_placeholders","issues_react_blur_item_picker_on_close","marketing_pages_search_explore_provider","primer_react_css_modules_ga","react_data_router_pull_requests","remove_child_patch","sample_network_conn_type","swp_enterprise_contact_form","site_proxima_australia_update","viewscreen_sandbox","issues_react_create_milestone","issues_react_cache_fix_workaround","lifecycle_label_name_updates","copilot_task_oriented_assistive_prompts","issue_types_prevent_private_type_creation","refresh_image_video_src","react_router_dispose_on_disconnect","codespaces_prebuild_region_target_update","turbo_app_id_restore","copilot_code_review_sign_up_closed"]}</script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-1ad576e595f5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover_js-9da652f58479.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-3abb8f-46b9f4874d95.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_failbot_failbot_ts-75968cfb5298.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-f04cb2a9fc8c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-0dbb79f97f8f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-f690fd9ae3d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-62d275b7ddd9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-78748950cb0c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-8e9f78-a90ac05d2469.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-a1760ffda83d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_markdown-toolbar-element_dist_index_js-ceef33f593fa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-c44a69-efa32db3a345.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-394f8eb34f19.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-25113a65b77f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-2906d7-2a07a295af40.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-be8cb88f481b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_morphdom_dist_morphdom-e-7c534c-a4a1922eb55f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-a03ee12d659a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-b6294cf703b7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_color-convert_index_js-e3180fe3bcb3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-947061-e7a6c4a19f98.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_updatable-content_updatable-content_ts-eb3147a21e96.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_sso_ts-ui_packages-900dde-768abe60b1f8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_sticky-scroll-into-view_ts-3e000c5d31a9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_include-87a4ae-4c160a67a3f8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-e429cff6ceb1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-1f167e0c2aee.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-f6223d90c7ba.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-01e85cd1be94.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_virtualized-list_es_index_js-node_modules_github_template-parts_lib_index_js-94dc7a2157c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-70450e-4b93df70b903.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_ref-selector_ts-3e9d848bab5f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/codespaces-f76fb2dd7b91.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-3eebbd-0763620ad7bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_decorators_js-node_modules_delegated-events_di-e161aa-9d41fb1b6c9e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_github_remote--3c9c82-b71ef90fbdc7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repositories-e6e7c7ff47a3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_catalyst_lib_inde-dbbea9-26cce2010167.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/code-menu-1c0aedc134b1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-602097a4b0db.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-0bc17999cb79.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-f1bca44e0926.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-cf2f2ab8dab4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-62da9f-2df2f32ec596.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-9a233856b02c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-55fea94174bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-57956eade845.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.8157a56b30ae88a1b356.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.8157a56b30ae88a1b356.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <title>GitHub - jghoman/awesome-apache-airflow: Curated list of resources about Apache Airflow</title> <meta name="route-pattern" content="/:user_id/:repository" data-turbo-transient> <meta name="route-controller" content="files" data-turbo-transient> <meta name="route-action" content="disambiguate" data-turbo-transient> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> <meta name="request-id" content="C40A:12561E:2456D13:2BF2A8F:67E8068A" data-pjax-transient="true"/><meta name="html-safe-nonce" content="d69f0218669b7bc323dd785b74f6bf235e176de9bea03357bb4a40bc2751887e" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDNDBBOjEyNTYxRToyNDU2RDEzOjJCRjJBOEY6NjdFODA2OEEiLCJ2aXNpdG9yX2lkIjoiNTgzOTQyMTc3OTE0OTg1MDI1MCIsInJlZ2lvbl9lZGdlIjoic291dGhlYXN0YXNpYSIsInJlZ2lvbl9yZW5kZXIiOiJzb3V0aGVhc3Rhc2lhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="74b6f26e87f7952b6fc93faaa0a4291b7e1ef8530a6a7f423af65c1a632d71ea" data-pjax-transient="true"/> <meta name="hovercard-subject-tag" content="repository:117064386" data-turbo-transient> <meta name="github-keyboard-shortcuts" content="repository,copilot" data-turbo-transient="true" /> <meta name="selected-link" value="repo_source" data-turbo-transient> <link rel="assets" href="https://github.githubassets.com/"> <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I"> <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> <meta name="analytics-location" content="/<user-name>/<repo-name>" data-turbo-transient="true" /> <meta name="user-login" content=""> <meta name="viewport" content="width=device-width"> <meta name="description" content="Curated list of resources about Apache Airflow. Contribute to jghoman/awesome-apache-airflow development by creating an account on GitHub."> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> <meta property="fb:app_id" content="1401488693436528"> <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/jghoman/awesome-apache-airflow" /> <meta name="twitter:image" content="https://opengraph.githubassets.com/fdbee9db277f282050a920b0b9888b2483abeb08ab1bdc4fc572f977d4671149/jghoman/awesome-apache-airflow" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="GitHub - jghoman/awesome-apache-airflow: Curated list of resources about Apache Airflow" /><meta name="twitter:description" content="Curated list of resources about Apache Airflow. Contribute to jghoman/awesome-apache-airflow development by creating an account on GitHub." /> <meta property="og:image" content="https://opengraph.githubassets.com/fdbee9db277f282050a920b0b9888b2483abeb08ab1bdc4fc572f977d4671149/jghoman/awesome-apache-airflow" /><meta property="og:image:alt" content="Curated list of resources about Apache Airflow. Contribute to jghoman/awesome-apache-airflow development by creating an account on GitHub." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="GitHub - jghoman/awesome-apache-airflow: Curated list of resources about Apache Airflow" /><meta property="og:url" content="https://github.com/jghoman/awesome-apache-airflow" /><meta property="og:description" content="Curated list of resources about Apache Airflow. Contribute to jghoman/awesome-apache-airflow development by creating an account on GitHub." /> <meta name="hostname" content="github.com"> <meta name="expected-hostname" content="github.com"> <meta http-equiv="x-pjax-version" content="de97acdfed47f9fb61814ae236bb7343666df83e298b7bdbb2f7cc7574846211" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="e26f9f0ba624ee85cc7ac057d8faa8618a4f25a85eab052c33d018ac0f6b1a46" data-turbo-track="reload"> <meta http-equiv="x-pjax-css-version" content="159e03504eed5183f9787c72780a7d8c1460af30746ab09d728b048c41719efa" data-turbo-track="reload"> <meta http-equiv="x-pjax-js-version" content="f2d91a2ff8587586cba3d4cfc1be461406926757eaf5ec500d81977d36511c4f" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> <meta data-hydrostats="publish"> <meta name="go-import" content="github.com/jghoman/awesome-apache-airflow git https://github.com/jghoman/awesome-apache-airflow.git"> <meta name="octolytics-dimension-user_id" content="95350" /><meta name="octolytics-dimension-user_login" content="jghoman" /><meta name="octolytics-dimension-repository_id" content="117064386" /><meta name="octolytics-dimension-repository_nwo" content="jghoman/awesome-apache-airflow" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="117064386" /><meta name="octolytics-dimension-repository_network_root_nwo" content="jghoman/awesome-apache-airflow" /> <link rel="canonical" href="https://github.com/jghoman/awesome-apache-airflow" data-turbo-transient> <meta name="turbo-body-classes" content="logged-out env-production page-responsive"> <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats"> <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> <meta name="release" content="9cd71f08d9519884edc4f4181a26ffafaf54bfbe"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon"> <meta name="theme-color" content="#1e2327"> <meta name="color-scheme" content="light dark" /> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> </head> <body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div class="position-relative header-wrapper js-header-wrapper "> <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a> <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full"> <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ui-commands_ui-commands_ts-2ea4e93613c0.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-79d6a754ebf9.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.8157a56b30ae88a1b356.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> <div data-target="react-partial.reactRoot"></div> </react-partial> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-4898d1bf4b51.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-730dca81d0a2.js"></script> <header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> <span class="d-none">Toggle navigation</span> </button> <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1"> <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto"> <div class="flex-1"> <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1"> <span class="Button-content"> <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div></span> </span> </button> </div> <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav" href="/" aria-label="Homepage" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Logomark;ref_loc:Header"}"> <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <div class="flex-1 flex-order-2 text-right"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Fjghoman%2Fawesome-apache-airflow" class="HeaderMenu-link HeaderMenu-button d-inline-flex d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/jghoman/awesome-apache-airflow","user_id":null}}" data-hydro-click-hmac="f2d86a55d2d0cb4475cd2afbad38177577a695c83cdd13df6a6b39e3fc414e28" data-analytics-event="{"category":"Marketing nav","action":"click to Sign in","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> </div> <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> <nav class="HeaderMenu-nav" aria-label="Global"> <ul class="d-lg-flex list-style-none"> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Product <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"product","tag":"link","label":"github_copilot_link_product_navbar"}" href="https://github.com/features/copilot"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Write better code with AI </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"security","context":"product","tag":"link","label":"security_link_product_navbar"}" href="https://github.com/features/security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Security</div> Find and fix vulnerabilities </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"actions","context":"product","tag":"link","label":"actions_link_product_navbar"}" href="https://github.com/features/actions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3"> <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path> </svg> <div> <div class="color-fg-default h4">Actions</div> Automate any workflow </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"codespaces","context":"product","tag":"link","label":"codespaces_link_product_navbar"}" href="https://github.com/features/codespaces"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3"> <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> <div> <div class="color-fg-default h4">Codespaces</div> Instant dev environments </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"issues","context":"product","tag":"link","label":"issues_link_product_navbar"}" href="https://github.com/features/issues"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3"> <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path> </svg> <div> <div class="color-fg-default h4">Issues</div> Plan and track work </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"code_review","context":"product","tag":"link","label":"code_review_link_product_navbar"}" href="https://github.com/features/code-review"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3"> <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Review</div> Manage code changes </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"discussions","context":"product","tag":"link","label":"discussions_link_product_navbar"}" href="https://github.com/features/discussions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Discussions</div> Collaborate outside of code </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"code_search","context":"product","tag":"link","label":"code_search_link_product_navbar"}" href="https://github.com/features/code-search"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3"> <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Search</div> Find more, search less </div> </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="product-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="product-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"all_features","context":"product","tag":"link","label":"all_features_link_product_navbar"}" href="https://github.com/features"> All features </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"documentation","context":"product","tag":"link","label":"documentation_link_product_navbar"}" href="https://docs.github.com"> Documentation <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"github_skills","context":"product","tag":"link","label":"github_skills_link_product_navbar"}" href="https://skills.github.com"> GitHub Skills <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"blog","context":"product","tag":"link","label":"blog_link_product_navbar"}" href="https://github.blog"> Blog <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Solutions <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 pb-lg-3 mb-3 mb-lg-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"enterprises","context":"solutions","tag":"link","label":"enterprises_link_solutions_navbar"}" href="https://github.com/enterprise"> Enterprises </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"small_and_medium_teams","context":"solutions","tag":"link","label":"small_and_medium_teams_link_solutions_navbar"}" href="https://github.com/team"> Small and medium teams </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"startups","context":"solutions","tag":"link","label":"startups_link_solutions_navbar"}" href="https://github.com/enterprise/startups"> Startups </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"nonprofits","context":"solutions","tag":"link","label":"nonprofits_link_solutions_navbar"}" href="/solutions/industry/nonprofits"> Nonprofits </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devsecops","context":"solutions","tag":"link","label":"devsecops_link_solutions_navbar"}" href="/solutions/use-case/devsecops"> DevSecOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"solutions","tag":"link","label":"devops_link_solutions_navbar"}" href="/solutions/use-case/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ci_cd","context":"solutions","tag":"link","label":"ci_cd_link_solutions_navbar"}" href="/solutions/use-case/ci-cd"> CI/CD </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_use_cases","context":"solutions","tag":"link","label":"view_all_use_cases_link_solutions_navbar"}" href="/solutions/use-case"> View all use cases </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"healthcare","context":"solutions","tag":"link","label":"healthcare_link_solutions_navbar"}" href="/solutions/industry/healthcare"> Healthcare </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"financial_services","context":"solutions","tag":"link","label":"financial_services_link_solutions_navbar"}" href="/solutions/industry/financial-services"> Financial services </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"manufacturing","context":"solutions","tag":"link","label":"manufacturing_link_solutions_navbar"}" href="/solutions/industry/manufacturing"> Manufacturing </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"government","context":"solutions","tag":"link","label":"government_link_solutions_navbar"}" href="/solutions/industry/government"> Government </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_industries","context":"solutions","tag":"link","label":"view_all_industries_link_solutions_navbar"}" href="/solutions/industry"> View all industries </a></li> </ul> </div> </div> <div class="HeaderMenu-trailing-link rounded-bottom-2 flex-shrink-0 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold"> <a href="/solutions"> View all solutions <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon"> <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path> </svg> </a> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Resources <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span> <ul class="list-style-none f5" aria-labelledby="resources-topics-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ai","context":"resources","tag":"link","label":"ai_link_resources_navbar"}" href="/resources/articles/ai"> AI </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"resources","tag":"link","label":"devops_link_resources_navbar"}" href="/resources/articles/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"security","context":"resources","tag":"link","label":"security_link_resources_navbar"}" href="/resources/articles/security"> Security </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"software_development","context":"resources","tag":"link","label":"software_development_link_resources_navbar"}" href="/resources/articles/software-development"> Software Development </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all","context":"resources","tag":"link","label":"view_all_link_resources_navbar"}" href="/resources/articles"> View all </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="resources-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"learning_pathways","context":"resources","tag":"link","label":"learning_pathways_link_resources_navbar"}" href="https://resources.github.com/learn/pathways"> Learning Pathways <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"events_amp_webinars","context":"resources","tag":"link","label":"events_amp_webinars_link_resources_navbar"}" href="https://resources.github.com"> Events & Webinars <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ebooks_amp_whitepapers","context":"resources","tag":"link","label":"ebooks_amp_whitepapers_link_resources_navbar"}" href="https://github.com/resources/whitepapers"> Ebooks & Whitepapers </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"customer_stories","context":"resources","tag":"link","label":"customer_stories_link_resources_navbar"}" href="https://github.com/customer-stories"> Customer Stories </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"partners","context":"resources","tag":"link","label":"partners_link_resources_navbar"}" href="https://partner.github.com"> Partners <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"executive_insights","context":"resources","tag":"link","label":"executive_insights_link_resources_navbar"}" href="https://github.com/solutions/executive-insights"> Executive Insights </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Open Source <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"github_sponsors","context":"open_source","tag":"link","label":"github_sponsors_link_open_source_navbar"}" href="/sponsors"> <div> <div class="color-fg-default h4">GitHub Sponsors</div> Fund open source developers </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"the_readme_project","context":"open_source","tag":"link","label":"the_readme_project_link_open_source_navbar"}" href="https://github.com/readme"> <div> <div class="color-fg-default h4">The ReadME Project</div> GitHub community articles </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span> <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"topics","context":"open_source","tag":"link","label":"topics_link_open_source_navbar"}" href="https://github.com/topics"> Topics </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"trending","context":"open_source","tag":"link","label":"trending_link_open_source_navbar"}" href="https://github.com/trending"> Trending </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"collections","context":"open_source","tag":"link","label":"collections_link_open_source_navbar"}" href="https://github.com/collections"> Collections </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Enterprise <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"enterprise_platform","context":"enterprise","tag":"link","label":"enterprise_platform_link_enterprise_navbar"}" href="/enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3"> <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path> </svg> <div> <div class="color-fg-default h4">Enterprise platform</div> AI-powered developer platform </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span> <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"advanced_security","context":"enterprise","tag":"link","label":"advanced_security_link_enterprise_navbar"}" href="https://github.com/enterprise/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Advanced Security</div> Enterprise-grade security features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"copilot_for_business","context":"enterprise","tag":"link","label":"copilot_for_business_link_enterprise_navbar"}" href="/features/copilot/copilot-business"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">Copilot for business</div> Enterprise-grade AI features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"premium_support","context":"enterprise","tag":"link","label":"premium_support_link_enterprise_navbar"}" href="/premium-support"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Premium Support</div> Enterprise-grade 24/7 support </div> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{"location":"navbar","action":"pricing","context":"global","tag":"link","label":"pricing_link_global_navbar"}" href="https://github.com/pricing">Pricing</a> </li> </ul> </nav> <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3"> <qbsearch-input class="search-input" data-scope="repo:jghoman/awesome-apache-airflow" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="N_EBe0N0A6qH89qM7e1OllRomSZjBDXmWD0zw-7QglnxYCrms450m-I2wiF7Ndqb6WIa9RhNmry--W5AvMCrdQ" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="jghoman/awesome-apache-airflow" data-current-org="" data-current-owner="jghoman" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" > <button type="button" class="header-search-button placeholder input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none" data-target="qbsearch-input.inputButton" aria-label="Search or jump to…" aria-haspopup="dialog" placeholder="Search or jump to..." data-hotkey=s,/ autocapitalize="off" data-analytics-event="{"location":"navbar","action":"searchbar","context":"global","tag":"input","label":"searchbar_input_global_navbar"}" data-action="click:qbsearch-input#handleExpand" > <div class="mr-2 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </div> <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span> <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg> </div> </button> <input type="hidden" name="type" class="js-site-search-type-field"> <div class="Overlay--hidden " data-modal-dialog-overlay> <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto"> <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1> <div class="Overlay-body Overlay-body--paddingNone"> <div data-view-component="true"> <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container" style="border-radius: 12px;" data-target="qbsearch-input.queryBuilderContainer" hidden > <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get"> <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder"> <div class="FormControl FormControl--fullWidth"> <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only"> Search </label> <div class="QueryBuilder-StyledInput width-fit " data-target="query-builder.styledInput" > <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </span> <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer"> <div aria-hidden="true" class="QueryBuilder-StyledInputContent" data-target="query-builder.styledInputContent" ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-ab10b6ac-9016-444e-a785-5c99ed2b648e" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown focus:query-builder#inputFocus " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> <span class="sr-only" id="query-builder-test-clear">Clear</span> <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" click:query-builder#clear focus:query-builder#clearButtonFocus blur:query-builder#clearButtonBlur " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </template> <template id="code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="file-code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code"> <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path> </svg> </template> <template id="history-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history"> <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path> </svg> </template> <template id="repo-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> </template> <template id="bookmark-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark"> <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="plus-circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> </template> <template id="trash-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash"> <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path> </svg> </template> <template id="team-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people"> <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path> </svg> </template> <template id="project-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project"> <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path> </svg> </template> <template id="pencil-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil"> <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path> </svg> </template> <template id="copilot-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot"> <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="copilot-error-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error"> <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path> </svg> </template> <template id="workflow-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow"> <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="book-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </template> <template id="code-review-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="codespaces-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces"> <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> </template> <template id="comment-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment"> <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="comment-discussion-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </template> <template id="organization-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization"> <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="rocket-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket"> <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </template> <template id="shield-check-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check"> <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="heart-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> </template> <template id="server-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="globe-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path> </svg> </template> <template id="issue-opened-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </template> <template id="device-mobile-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile"> <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path> </svg> </template> <template id="package-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package"> <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path> </svg> </template> <template id="credit-card-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card"> <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path> </svg> </template> <template id="play-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </template> <template id="gift-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift"> <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path> </svg> </template> <template id="code-square-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="device-desktop-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop"> <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path> </svg> </template> <div class="position-relative"> <ul role="listbox" class="ActionListWrap QueryBuilder-ListWrap" aria-label="Suggestions" data-action=" combobox-commit:query-builder#comboboxCommit mousedown:query-builder#resultsMousedown " data-target="query-builder.resultsList" data-persist-list=false id="query-builder-test-results" ></ul> </div> <div class="FormControl-inlineValidation" id="validation-ab10b6ac-9016-444e-a785-5c99ed2b648e" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> </svg> </span> <span></span> </div> </div> <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div> </query-builder></form> <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt"> <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2">Search syntax tips</a> <div class="d-flex flex-1"></div> </div> </div> </div> </div> </modal-dialog></div> </div> <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div> <div class="color-fg-default"> <dialog-helper> <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="feedback-dialog-title"> Provide feedback </h1> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="feedback-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="feedback-dialog-title"> <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="/8uIsmGhHV5A8oM52BkZoqroZtUbTxEb0hKgiNw/4vaG0kHgHtxoXk0fLtcoWSk2UAldNAusPaV7OhPZ7WEPyw==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label> </form></div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback </button> </div> </dialog></dialog-helper> <custom-scopes data-target="qbsearch-input.customScopesManager"> <dialog-helper> <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header Overlay-header--divided"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="custom-scopes-dialog-title"> Saved searches </h1> <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="custom-scopes-dialog-title"> <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="zMCTQnxRHoCty8PnQs0eIdnUbZvqyxsdWMJPE3kZl5I6h+6C4w3AWhGDI8XSKV7hMVGqbHQe+k2U//bsOKVo/w==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> <div class="form-group"> <label for="custom_scope_name">Name</label> <auto-check src="/search/custom_scopes/check_name" required only-validate-on-blur="false"> <input type="text" name="custom_scope_name" id="custom_scope_name" data-target="custom-scopes.customScopesNameField" class="form-control" autocomplete="off" placeholder="github-ruby" required maxlength="50"> <input type="hidden" data-csrf="true" value="Sn71MOqj3stQ1v9wLvkA3QhF/mEcpb/iIs7wEtGBslbYWQC4TQ3YVYfqOIPHC6Ayaxth7yNOT9cT48QNQnDupw==" /> </auto-check> </div> <div class="form-group"> <label for="custom_scope_query">Query</label> <input type="text" name="custom_scope_query" id="custom_scope_query" data-target="custom-scopes.customScopesQueryField" class="form-control" autocomplete="off" placeholder="(repo:mona/a OR repo:mona/b) AND lang:python" required maxlength="500"> </div> <p class="text-small color-fg-muted"> To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>. </p> </form> </div> <div data-target="custom-scopes.manageCustomScopesForm"> <div data-target="custom-scopes.list"></div> </div> </div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search </button> </div> </dialog></dialog-helper> </custom-scopes> </div> </qbsearch-input> <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Fjghoman%2Fawesome-apache-airflow" class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded rounded-lg-0 px-2 py-1" style="margin-left: 12px;" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/jghoman/awesome-apache-airflow","user_id":null}}" data-hydro-click-hmac="f2d86a55d2d0cb4475cd2afbad38177577a695c83cdd13df6a6b39e3fc414e28" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> <a href="/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E&source=header-repo&source_repo=jghoman%2Fawesome-apache-airflow" class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/jghoman/awesome-apache-airflow","user_id":null}}" data-hydro-click-hmac="f2d86a55d2d0cb4475cd2afbad38177577a695c83cdd13df6a6b39e3fc414e28" data-analytics-event="{"category":"Sign up","action":"click to sign up for account","label":"ref_page:/<user-name>/<repo-name>;ref_cta:Sign up;ref_loc:header logged out"}" > Sign up </a> <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Reseting focus</button> </div> </div> </div> </div> </header> <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <button id="icon-button-36d44077-5a94-4e44-b293-a5c470c0cc3e" aria-labelledby="tooltip-aa400ce2-38c4-4eda-aee4-2b69befc74e2" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button><tool-tip id="tooltip-aa400ce2-38c4-4eda-aee4-2b69befc74e2" for="icon-button-36d44077-5a94-4e44-b293-a5c470c0cc3e" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> </div> </div> <div id="start-of-content" class="show-on-focus"></div> <div id="js-flash-container" class="flash-container" data-turbo-replace> <template class="js-flash-template"> <div class="flash flash-full {{ className }}"> <div > <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div aria-atomic="true" role="alert" class="js-flash-alert"> <div>{{ message }}</div> </div> </div> </div> </template> </div> <div class="application-main " data-commit-hovercards-enabled data-discussion-hovercards-enabled data-issue-and-pr-hovercards-enabled data-project-hovercards-enabled > <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class=""> <main id="js-repo-pjax-container" > <div id="repository-container-header" class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace> <div class="d-flex flex-nowrap flex-justify-end mb-3 px-3 px-lg-5" style="gap: 1rem;"> <div class="flex-auto min-width-0 width-fit"> <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> <span class="author flex-self-stretch" itemprop="author"> <a class="url fn" rel="author" data-hovercard-type="user" data-hovercard-url="/users/jghoman/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/jghoman"> jghoman </a> </span> <span class="mx-1 flex-self-stretch color-fg-muted">/</span> <strong itemprop="name" class="mr-2 flex-self-stretch"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/jghoman/awesome-apache-airflow">awesome-apache-airflow</a> </strong> <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span> </div> </div> <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;"> <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;"> <li> <a href="/login?return_to=%2Fjghoman%2Fawesome-apache-airflow" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/jghoman/awesome-apache-airflow","user_id":null}}" data-hydro-click-hmac="a6f8fff97cb3f5af7bd78e31dd3626226244d701db5c3ce51f11bf5c29ac79eb" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-0a191d31-4bff-4a08-966b-b6242bd8e2e2" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </li> <li> <a icon="repo-forked" id="fork-button" href="/login?return_to=%2Fjghoman%2Fawesome-apache-airflow" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"repo details fork button","repository_id":117064386,"auth_type":"LOG_IN","originating_url":"https://github.com/jghoman/awesome-apache-airflow","user_id":null}}" data-hydro-click-hmac="a1aab0fe317e9287947cf7b14e0408f2c58e3e42b214c91c936198dc2911d8aa" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg>Fork <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="498" data-view-component="true" class="Counter">498</span> </a> </li> <li> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Fjghoman%2Fawesome-apache-airflow" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":117064386,"auth_type":"LOG_IN","originating_url":"https://github.com/jghoman/awesome-apache-airflow","user_id":null}}" data-hydro-click-hmac="49827b152a7a953c05db2c1f8130589232b38f1efaacf308579d41c727305eff" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> <span id="repo-stars-counter-star" aria-label="3757 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="3,757" data-view-component="true" class="Counter js-social-count">3.8k</span> </a></div> </li> </ul> </div> </div> <div id="responsive-meta-container" data-turbo-replace> <div class="d-block d-md-none mb-2 px-3 px-md-4 px-lg-5"> <p class="f4 mb-3 "> Curated list of resources about Apache Airflow </p> <div class="mb-3"> <a class="Link--secondary no-underline mr-3" href="/jghoman/awesome-apache-airflow/stargazers"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-1"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <span class="text-bold">3.8k</span> stars </a> <a class="Link--secondary no-underline mr-3" href="/jghoman/awesome-apache-airflow/forks"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-1"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <span class="text-bold">498</span> forks </a> <a class="Link--secondary no-underline mr-3 d-inline-block" href="/jghoman/awesome-apache-airflow/branches"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-branch mr-1"> <path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path> </svg> <span>Branches</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/jghoman/awesome-apache-airflow/tags"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag mr-1"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <span>Tags</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/jghoman/awesome-apache-airflow/activity"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-1"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span>Activity</span> </a> </div> <div class="d-flex flex-wrap gap-2"> <div class="flex-1"> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Fjghoman%2Fawesome-apache-airflow" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":117064386,"auth_type":"LOG_IN","originating_url":"https://github.com/jghoman/awesome-apache-airflow","user_id":null}}" data-hydro-click-hmac="49827b152a7a953c05db2c1f8130589232b38f1efaacf308579d41c727305eff" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> </a></div> </div> <div class="flex-1"> <a href="/login?return_to=%2Fjghoman%2Fawesome-apache-airflow" rel="nofollow" id="files-overview-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/jghoman/awesome-apache-airflow","user_id":null}}" data-hydro-click-hmac="a6f8fff97cb3f5af7bd78e31dd3626226244d701db5c3ce51f11bf5c29ac79eb" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-a2118b06-a4f9-4751-9459-02543bd977ee" for="files-overview-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </div> <span> </span> </div> </div> </div> <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5"> <ul data-view-component="true" class="UnderlineNav-body list-style-none"> <li data-view-component="true" class="d-inline-flex"> <a id="code-tab" href="/jghoman/awesome-apache-airflow" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /jghoman/awesome-apache-airflow" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Code","target":"UNDERLINE_NAV.TAB"}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> <span data-content="Code">Code</span> <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="issues-tab" href="/jghoman/awesome-apache-airflow/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /jghoman/awesome-apache-airflow/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Issues","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> <span data-content="Issues">Issues</span> <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="2" data-view-component="true" class="Counter">2</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="pull-requests-tab" href="/jghoman/awesome-apache-airflow/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /jghoman/awesome-apache-airflow/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Pull requests","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> <span data-content="Pull requests">Pull requests</span> <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="actions-tab" href="/jghoman/awesome-apache-airflow/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /jghoman/awesome-apache-airflow/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Actions","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> <span data-content="Actions">Actions</span> <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="projects-tab" href="/jghoman/awesome-apache-airflow/projects" data-tab-item="i4projects-tab" data-selected-links="repo_projects new_repo_project repo_project /jghoman/awesome-apache-airflow/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Projects","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> <span data-content="Projects">Projects</span> <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="security-tab" href="/jghoman/awesome-apache-airflow/security" data-tab-item="i5security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /jghoman/awesome-apache-airflow/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Security","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span data-content="Security">Security</span> <include-fragment src="/jghoman/awesome-apache-airflow/security/overall-count" accept="text/fragment+html"></include-fragment> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="insights-tab" href="/jghoman/awesome-apache-airflow/pulse" data-tab-item="i6insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /jghoman/awesome-apache-airflow/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Insights","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> <span data-content="Insights">Insights</span> <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> </ul> <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0"> <action-menu data-select-variant="none" data-view-component="true"> <focus-group direction="vertical" mnemonics retain> <button id="action-menu-12c4df97-dbb9-4e10-a3e7-e73ea612b84f-button" popovertarget="action-menu-12c4df97-dbb9-4e10-a3e7-e73ea612b84f-overlay" aria-controls="action-menu-12c4df97-dbb9-4e10-a3e7-e73ea612b84f-list" aria-haspopup="true" aria-labelledby="tooltip-eebc0468-0dbe-41be-a73c-d1809464e501" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual"> <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path> </svg> </button><tool-tip id="tooltip-eebc0468-0dbe-41be-a73c-d1809464e501" for="action-menu-12c4df97-dbb9-4e10-a3e7-e73ea612b84f-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip> <anchored-position data-target="action-menu.overlay" id="action-menu-12c4df97-dbb9-4e10-a3e7-e73ea612b84f-overlay" anchor="action-menu-12c4df97-dbb9-4e10-a3e7-e73ea612b84f-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true"> <div data-view-component="true" class="Overlay Overlay--size-auto"> <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list> <div data-view-component="true"> <ul aria-labelledby="action-menu-12c4df97-dbb9-4e10-a3e7-e73ea612b84f-button" id="action-menu-12c4df97-dbb9-4e10-a3e7-e73ea612b84f-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap"> <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-b0b86af9-2b4c-4cbe-91e5-b63a7b54f553" href="/jghoman/awesome-apache-airflow" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Code </span> </a> </li> <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-7501fb96-1eeb-43d6-9880-2bbdd4b1b3fb" href="/jghoman/awesome-apache-airflow/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Issues </span> </a> </li> <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-e446adb8-ae80-4fc2-9112-35e43f68f106" href="/jghoman/awesome-apache-airflow/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Pull requests </span> </a> </li> <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-6c2287c6-3a69-4587-8a9f-b8fcfd693107" href="/jghoman/awesome-apache-airflow/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Actions </span> </a> </li> <li hidden="hidden" data-menu-item="i4projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-efb045b7-272b-43af-b559-482ede4d0760" href="/jghoman/awesome-apache-airflow/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Projects </span> </a> </li> <li hidden="hidden" data-menu-item="i5security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-39a53de5-e81b-4be3-97e9-f86156ef333a" href="/jghoman/awesome-apache-airflow/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Security </span> </a> </li> <li hidden="hidden" data-menu-item="i6insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-70afd8bb-c5f9-42d1-98f7-67b4e2ef9af1" href="/jghoman/awesome-apache-airflow/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Insights </span> </a> </li> </ul> </div></action-list> </div> </div></anchored-position> </focus-group> </action-menu></div> </nav> </div> <turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class=""> <div id="repo-content-pjax-container" class="repository-content " > <h1 class='sr-only'>jghoman/awesome-apache-airflow</h1> <div class="clearfix container-xl px-md-4 px-lg-5 px-3"> <div> <div style="max-width: 100%" data-view-component="true" class="Layout Layout--flowRow-until-md react-repos-overview-margin Layout--sidebarPosition-end Layout--sidebarPosition-flowRow-end"> <div data-view-component="true" class="Layout-main"> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_es_mjs-dd1d3ea6a436.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryObserver_js-node_modules_tanstack_-defd52-843b41414e0e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_aria-live_aria-live_ts-ui_packages_history_history_ts-ui_packages_promise-with-re-01dc80-134579ff449f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_paths_index_ts-3adbcf6faa83.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ref-selector_RefSelector_tsx-7496afc3784d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_commit-attribution_index_ts-ui_packages_commit-checks-status_index_ts-ui_packages-7094d4-b869a469ca5e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_hydro-analytics_hydro-analytics_ts-ui_packages_verified-fetch_verified-fetch_ts-u-4672d1-96a19eaeffb7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-canonical-object_ts-ui_packages_code-view-shared_hooks-d63960-3a5579c864b4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repos-overview-fa360a7b1b46.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.8157a56b30ae88a1b356.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repos-overview.0ee7cac3ab511a65d9f9.module.css" /> <react-partial partial-name="repos-overview" data-ssr="true" data-attempted-ssr="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"initialPayload":{"allShortcutsEnabled":false,"path":"/","repo":{"id":117064386,"defaultBranch":"master","name":"awesome-apache-airflow","ownerLogin":"jghoman","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2018-01-11T07:14:19.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/95350?v=4","public":true,"private":false,"isOrgOwned":false},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1601766093.0","canEdit":false,"refType":"branch","currentOid":"c8cd9587b2bb1d6c2aee55edf6f64f843514e133"},"tree":{"items":[{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"airflow-logo.png","path":"airflow-logo.png","contentType":"file"},{"name":"check-for-dead-links-config.json","path":"check-for-dead-links-config.json","contentType":"file"},{"name":"check-for-dead-links.sh","path":"check-for-dead-links.sh","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":null,"totalCount":6,"showBranchInfobar":false},"fileTree":null,"fileTreeProcessingTime":null,"foldersToFetch":[],"treeExpanded":false,"symbolsExpanded":false,"isOverview":true,"overview":{"banners":{"shouldRecommendReadme":false,"isPersonalRepo":false,"showUseActionBanner":false,"actionSlug":null,"actionId":null,"showProtectBranchBanner":false,"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_repo","releasePath":"/jghoman/awesome-apache-airflow/releases/new?marketplace=true","showPublishActionBanner":false},"interactionLimitBanner":null,"showInvitationBanner":false,"inviterName":null,"actionsMigrationBannerInfo":{"releaseTags":[],"showImmutableActionsMigrationBanner":false,"initialMigrationStatus":null}},"codeButton":{"contactPath":"/contact","isEnterprise":false,"local":{"protocolInfo":{"httpAvailable":true,"sshAvailable":null,"httpUrl":"https://github.com/jghoman/awesome-apache-airflow.git","showCloneWarning":null,"sshUrl":null,"sshCertificatesRequired":null,"sshCertificatesAvailable":null,"ghCliUrl":"gh repo clone jghoman/awesome-apache-airflow","defaultProtocol":"http","newSshKeyUrl":"/settings/ssh/new","setProtocolPath":"/users/set_protocol"},"platformInfo":{"cloneUrl":"https://desktop.github.com","showVisualStudioCloneButton":false,"visualStudioCloneUrl":"https://windows.github.com","showXcodeCloneButton":false,"xcodeCloneUrl":"xcode://clone?repo=https%3A%2F%2Fgithub.com%2Fjghoman%2Fawesome-apache-airflow","zipballUrl":"/jghoman/awesome-apache-airflow/archive/refs/heads/master.zip"}},"newCodespacePath":"/codespaces/new?hide_repo_select=true\u0026repo=117064386"},"popovers":{"rename":null,"renamedParentRepo":null},"commitCount":"357","overviewFiles":[{"displayName":"README.md","repoName":"awesome-apache-airflow","refName":"master","path":"README.md","preferredFileType":"readme","tabName":"README","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cp dir=\"auto\"\u003e\u003ca href=\"https://airflow.apache.org/\" rel=\"nofollow\"\u003e\u003cimg src=\"https://github.com/jghoman/awesome-apache-airflow/raw/master/airflow-logo.png\" align=\"right\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAwesome Apache Airflow\u003c/h1\u003e\u003ca id=\"user-content-awesome-apache-airflow\" class=\"anchor\" aria-label=\"Permalink: Awesome Apache Airflow\" href=\"#awesome-apache-airflow\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/5474cff62c40607021eee94f9b25788447308793e98fd2b7611b0f72e798bebc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6a67686f6d616e2f617765736f6d652d6170616368652d616972666c6f772e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5474cff62c40607021eee94f9b25788447308793e98fd2b7611b0f72e798bebc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6a67686f6d616e2f617765736f6d652d6170616368652d616972666c6f772e737667\" alt=\"contrib badge\" data-canonical-src=\"https://img.shields.io/github/contributors/jghoman/awesome-apache-airflow.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/3af800ad6c10a75e16976abfcf6131c8dd7e40356fe3274423abf9ff36601019/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6a67686f6d616e2f617765736f6d652d6170616368652d616972666c6f773f7374796c653d706c6173746963\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/3af800ad6c10a75e16976abfcf6131c8dd7e40356fe3274423abf9ff36601019/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6a67686f6d616e2f617765736f6d652d6170616368652d616972666c6f773f7374796c653d706c6173746963\" alt=\"GitHub commit activity\" data-canonical-src=\"https://img.shields.io/github/commit-activity/m/jghoman/awesome-apache-airflow?style=plastic\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis is a curated list of resources about \u003ca href=\"https://airflow.apache.org/\" rel=\"nofollow\"\u003eApache Airflow\u003c/a\u003e. Please feel free to contribute any items that should be included. Items are generally added at the top of each section so that more fresh items are featured more prominently.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContents\u003c/h2\u003e\u003ca id=\"user-content-contents\" class=\"anchor\" aria-label=\"Permalink: Contents\" href=\"#contents\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#vital-links\"\u003eVital links\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#airflow-deployment-solutions\"\u003eAirflow deployment solutions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introductions-and-tutorials\"\u003eIntroductions and tutorials\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#airflow-summit-2020-videos\"\u003eAirflow Summit 2020 Videos\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#best-practices-lessons-learned-and-cool-use-cases\"\u003eBest practices, lessons learned and cool use cases\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#books-blogs-podcasts-and-such\"\u003eBooks, blogs, podcasts, and such\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#slide-deck-presentations-and-online-videos\"\u003eSlide deck presentations and online videos\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#libraries-hooks-utilities\"\u003eLibraries, Hooks, Utilities\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#meetups\"\u003eMeetups\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#commercial-airflow-as-a-service-providers\"\u003eCommercial Airflow-as-a-service providers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#cloud-composer-resources\"\u003eCloud Composer resources\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#non-english-resources\"\u003eNon-English resources\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eVital links\u003c/h2\u003e\u003ca id=\"user-content-vital-links\" class=\"anchor\" aria-label=\"Permalink: Vital links\" href=\"#vital-links\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/apache/airflow/\"\u003eSource code\u003c/a\u003e (latest stable release \u003ca href=\"https://github.com/apache/airflow/tree/1.10.12\"\u003e1.10.12\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://airflow.apache.org/\" rel=\"nofollow\"\u003eDocumentation\u003c/a\u003e (also the official website)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Home\" rel=\"nofollow\"\u003eConfluence page\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://twitter.com/ApacheAirflow\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/e188e27244e8a99fccc319b797488d00521a17fa5a4100dfa8b4f6b3374b5fdc/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f617061636865616972666c6f773f7374796c653d736f6369616c\" alt=\"Twitter Follow\" data-canonical-src=\"https://img.shields.io/twitter/follow/apacheairflow?style=social\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://apache-airflow-slack.herokuapp.com/\" rel=\"nofollow\"\u003eSlack workspace\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAirflow deployment solutions\u003c/h2\u003e\u003ca id=\"user-content-airflow-deployment-solutions\" class=\"anchor\" aria-label=\"Permalink: Airflow deployment solutions\" href=\"#airflow-deployment-solutions\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/KissConsult/Apache-Airflow\"\u003eInstalling Airflow on IBM Cloud\u003c/a\u003e - Quick and easy deployment on IBM Cloud with IBM \u003ca href=\"https://github.com/bitnami/charts\"\u003eBitnami Charts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fullstaq.com/blog/three-ways-to-run-airflow-on-kubernetes/\" rel=\"nofollow\"\u003eThree ways to run Airflow on Kubernetes\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/tim-van-de-keer-bb5a1966\" rel=\"nofollow\"\u003eTim van de Keer\u003c/a\u003e walks through several methods for deploying Airflow on Kubernetes.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://azure.microsoft.com/en-us/blog/bitnami-apache-airflow-multi-tier-now-available-in-azure-marketplace/\" rel=\"nofollow\"\u003eApache Airflow Multi-Tier Free Deployment on Azure\u003c/a\u003e - A free Azure Resource Manager (ARM) template by Bitnami providing a one-click solution for Airflow deployment on Azure for production use-cases.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tekn0ir/airflow-chart\"\u003eKubernetesExecutor Helm Chart\u003c/a\u003e - A lean Helm Chart using the KubernetesExecutor for a more k8s native experience and complementary \u003ca href=\"https://github.com/tekn0ir/airflow-docker\"\u003eKubernetesExecutor Docker Image\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/helm/charts/tree/master/stable/airflow\"\u003eStable Celery Helm Chart\u003c/a\u003e - Curated Helm Chart in the official stable chart repository.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/puckel/docker-airflow\"\u003ePuckel's Docker Image\u003c/a\u003e - \u003ca href=\"https://twitter.com/Puckel_\" rel=\"nofollow\"\u003e@Puckel_\u003c/a\u003e's well-crafted Docker image has become the base for many Airflow installations. It is regularly updated and closely tracks the official Apache releases.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/GoogleCloudPlatform/airflow-operator\"\u003eKubernetes Custom Operator for Deploying Airflow\u003c/a\u003e - Kubernetes Custom controller (also called operator pattern) for deploying Airflow on Kubernetes.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/datagovsg/airflow-pipeline\"\u003eairflow-pipeline\u003c/a\u003e - Airflow Docker container that comes preconfigured for Spark and Hadoop. It can be docker pulled at \u003ccode\u003edatagovsg/airflow-pipeline\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/villasv/aws-airflow-stack\"\u003eaws-airflow-stack\u003c/a\u003e - An AWS based Airflow cluster deployment with CeleryExecutor. Deploys after a few clicks with CloudFormation.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mumoshu/kube-airflow\"\u003ekube-airflow\u003c/a\u003e - This repository contains both an Airflow Docker image (that appears to have been based on Puckel's work) and Kubernetes service definition. \u003ca href=\"https://github.com/mumoshu\"\u003emumoshu\u003c/a\u003e's repository has not been recently updated, but there are numerous forks that may be based on more recent releases.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/rolanddb/airflow-on-kubernetes\"\u003eairflow-on-kubernetes\u003c/a\u003e - A guide on all relevant resources, scripts and projects that relate to running Airflow on Kubernetes.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/EamonKeane/airflow-GKE-k8sExecutor-helm\"\u003eairflow-k8s-executor-on-GKE\u003c/a\u003e - A detailed tutorial to get a scalable, low maintenance airflow kubernetes executor environment deployed on \u003ca href=\"https://cloud.google.com/kubernetes-engine/\" rel=\"nofollow\"\u003eGoogle Kubernetes Engine\u003c/a\u003e with \u003ca href=\"https://helm.sh/\" rel=\"nofollow\"\u003ehelm\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/bahchis/airflow-cookbook\"\u003eairflow-cookbook\u003c/a\u003e - Chef cookbook for deploying Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://agrajmangal.in/blog/big-data/running-airflow-on-top-of-apache-mesos/\" rel=\"nofollow\"\u003eRunning Airflow on top of Apache Mesos\u003c/a\u003e - Blog describing how to configure \u003ca href=\"http://mesos.apache.org/\" rel=\"nofollow\"\u003eMesos\u003c/a\u003e to run all of the Airflow componenents.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@mykolamykhalov/integrating-apache-airflow-with-apache-ambari-ccab2c90173\" rel=\"nofollow\"\u003eIntegrating Apache Airflow with Apache Ambari\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/mykola-mykhalov-9079a8107/\" rel=\"nofollow\"\u003eMykola Mykhalov\u003c/a\u003e walks through using \u003ca href=\"https://ambari.apache.org/\" rel=\"nofollow\"\u003eApache Ambari\u003c/a\u003e to configure and deploy an Airflow instance.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astronomerio/astronomer\"\u003eAstronomer Platform\u003c/a\u003e - Apache Airflow as a Service on Kubernetes. For more information visit \u003ca href=\"https://www.astronomer.io\" rel=\"nofollow\"\u003ehttps://www.astronomer.io\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/bitnami/bitnami-docker-airflow\"\u003eBitnami Airflow Docker image\u003c/a\u003e - A secure and up-to-date docker image for Airflow maintained by Bitnami.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/bitnami/bitnami-docker-airflow-scheduler\"\u003eBitnami Airflow Scheduler Docker image\u003c/a\u003e - A secure and up-to-date docker image for Airflow Scheduler maintained by Bitnami.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/bitnami/bitnami-docker-airflow-worker\"\u003eBitnami Airflow Worker Docker image\u003c/a\u003e - A secure and up-to-date docker image for Airflow Worker maintained by Bitnami. A CeleryExecutor docker-compose deployment is available \u003ca href=\"https://github.com/bitnami/bitnami-docker-airflow-worker/blob/master/docker-compose.yml\"\u003ehere\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/msumit/airflow-pex\"\u003eDistribute \u0026amp; deploy Apache Airflow via Python PEX files\u003c/a\u003e - Example repo with steps to bundle, distribute, \u0026amp; deploy Apache Airflow as PEX files.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.astronomer.io/blog/the-keda-autoscaler/\" rel=\"nofollow\"\u003eIntroducing KEDA for Airflow\u003c/a\u003e - How to use KEDA scaler system to enable autoscaling of celery workers based on data stored in the Airflow metadata database.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/noelmcloughlin/airflow-component#lightweight-federated-apache-airflow-installer\"\u003eAirflow-Component\u003c/a\u003e - Lightweight installer of federated Airflow-Airflow (RabbitMQ) reference architectrure on Compute node(s).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIntroductions and tutorials\u003c/h2\u003e\u003ca id=\"user-content-introductions-and-tutorials\" class=\"anchor\" aria-label=\"Permalink: Introductions and tutorials\" href=\"#introductions-and-tutorials\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/xyeR_uFhnD4\" rel=\"nofollow\"\u003eApache Airflow Monitoring Metrics\u003c/a\u003e - A two-part series by \u003ca href=\"https://maxcotec.com\" rel=\"nofollow\"\u003emaxcotec\u003c/a\u003e on how you can utilize existing Airflow statsd metrics to monitor your airflow deployment on Grafana dashboard via Prometheus. Also learn how to create custom metrics.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/playlist?list=PLzKRcZrsJN_xcKKyKn18K7sWu5TTtdywh\" rel=\"nofollow\"\u003eIntroduction to Airflow\u003c/a\u003e - A web tutorial series by \u003ca href=\"https://maxcotec.com\" rel=\"nofollow\"\u003emaxcotec\u003c/a\u003e for beginners and intermediate users of Apache Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/KimaruThagna/ml-pipelines-airflow\"\u003eETL with Apache Airflow for Data Analysis on Transaction Data\u003c/a\u003e. \u003ca href=\"https://www.linkedin.com/in/kimaru-thagana-4920b5181/\" rel=\"nofollow\"\u003eKimaru Thagana\u003c/a\u003e covers a practical case of doing an ETL process using Apache Airflow using a dummy ecommerce store's transactional, user and product data. The data is served via a flask API.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.delaplex.com/start-building-better-data-pipelines-with-apache-airflow\" rel=\"nofollow\"\u003eStart Building Better Data Pipelines With apache Airflow\u003c/a\u003e 2020-Oct - Naman Gupta covers the basics of Airflow and its concepts.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/soggycactus/airflow-repo-template\"\u003eAirflow Repository Template\u003c/a\u003e - A boilerplate repository for developing locally with Airflow, with linting \u0026amp; tests for valid DAGs and plugins. Just clone and run \u003ccode\u003emake start-airflow\u003c/code\u003e to get started! Add some CI jobs to deploy your code and you're done.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.sicara.com/using-airflow-with-celery-workers-54cb5212d405\" rel=\"nofollow\"\u003eHow Apache Airflow Distributes Jobs on Celery workers\u003c/a\u003e - A short description of the steps taken by a task instance, from scheduling to success, in a distributed architecture.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@tamizhgeek/remote-spark-submit-toyarn-running-on-emr-9804b89d82d2\" rel=\"nofollow\"\u003eRemote spark-submit to YARN running on EMR\u003c/a\u003e - \u003ca href=\"https://github.com/tamizhgeek\"\u003eAzhaguselvan\u003c/a\u003e walks through submitting Spark jobs to existing EMR clusters with Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://agrajmangal.in/blog/big-data/running-airflow-on-top-of-apache-mesos/\" rel=\"nofollow\"\u003eRunning Airflow on top of Apache Mesos\u003c/a\u003e and its follow-up, \u003ca href=\"http://agrajmangal.in/blog/big-data/mesos-airflow-docker/\" rel=\"nofollow\"\u003eMesos, Airflow \u0026amp; Docker\u003c/a\u003e by \u003ca href=\"https://twitter.com/agrajm\" rel=\"nofollow\"\u003eAgraj Mangal\u003c/a\u003e is a quick overview of running Airflow atop Apache Mesos.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://twitter.com/corrcoef\" rel=\"nofollow\"\u003eDustin Stansbury\u003c/a\u003e of \u003ca href=\"https://quizlet.com/\" rel=\"nofollow\"\u003eQuizlet\u003c/a\u003e has written a four-part series that covers what workflow managers do in general, how Quizlet picked Airflow, a tour of Airflow's key concepts, and how Quizlet is now using Airflow in practice:\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@dustinstansbury/beyond-cron-an-introduction-to-workflow-management-systems-19987afcdb5e\" rel=\"nofollow\"\u003eBeyond CRON: an introduction to Workflow Management Systems\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://towardsdatascience.com/why-quizlet-chose-apache-airflow-for-executing-data-workflows-3f97d40e9571\" rel=\"nofollow\"\u003eWhy Quizlet chose Apache Airflow for executing data workflows\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@dustinstansbury/understanding-apache-airflows-key-concepts-a96efed52b1a\" rel=\"nofollow\"\u003eUnderstanding Apache Airflow’s key concepts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@dustinstansbury/how-quizlet-uses-apache-airflow-in-practice-a903cbb5626d\" rel=\"nofollow\"\u003eHow Quizlet uses Apache Airflow in practice\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://databricks.com/blog/2017/07/19/integrating-apache-airflow-with-databricks.html\" rel=\"nofollow\"\u003eIntegrating Apache Airflow with Databricks\u003c/a\u003e - While this tutorial is focused specifically on Databricks' Spark solutions, it does have a reasonable overview of Airflow basics and demonstrates how a third party solution can quickly integrate into Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://turbaszek.medium.com/apache-airflow-2-0-tutorial-41329bbf7211\" rel=\"nofollow\"\u003eApache Airflow 2.0 Tutorial\u003c/a\u003e - This article discusses the basic concepts that stand behind Airflow and discusses the problems it solves.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.godatadriven.com/testing-and-debugging-apache-airflow\" rel=\"nofollow\"\u003eTesting and debugging Apache Airflow\u003c/a\u003e - Article explaining how to apply unit testing, mocking and debugging to Airflow code.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://michal.karzynski.pl/blog/2017/03/19/developing-workflows-with-apache-airflow/\" rel=\"nofollow\"\u003eGet started developing workflows with Apache Airflow\u003c/a\u003e - This brief introductory tutorial covers how to create data pipeline and processing workflow using DAG, operators, Sensor, using Xcoms to communicate between operators.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@junjiejiang94/get-started-with-airflow-google-cloud-platform-docker-a21c46e0f797\" rel=\"nofollow\"\u003eGet started with Airflow + Google Cloud Platform + Docker\u003c/a\u003e - Step-by-step introduction by \u003ca href=\"https://medium.com/@junjiejiang94\" rel=\"nofollow\"\u003eJayce Jiang\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.magrathealabs.com/how-to-develop-data-pipeline-in-airflow-through-tdd-test-driven-development-c3333439f358\" rel=\"nofollow\"\u003eHow to develop data pipeline in Airflow through TDD (test-driven development)\u003c/a\u003e - Learn how to build a sales data pipeline using TDD step-by-step and in the end how to configure a simple CI workflow using Github Actions.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAirflow Summit 2020 videos\u003c/h2\u003e\u003ca id=\"user-content-airflow-summit-2020-videos\" class=\"anchor\" aria-label=\"Permalink: Airflow Summit 2020 videos\" href=\"#airflow-summit-2020-videos\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eThe first \u003ca href=\"https://airflowsummit.org/\" rel=\"nofollow\"\u003eAirflow Summit 2020\u003c/a\u003e was held in July 2020. It was a truly global,\nfully online event that was co-hosted by 9 Airflow Meetups from all over the world (\u003ca href=\"https://www.meetup.com/Melbourne-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003eMelbourne\u003c/a\u003e,\n\u003ca href=\"https://www.meetup.com/Tokyo-Apache-Airflow-incubating-Meetup\" rel=\"nofollow\"\u003eTokyo\u003c/a\u003e,\n\u003ca href=\"https://www.meetup.com/Bangalore-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003eBangalore\u003c/a\u003e,\n\u003ca href=\"https://www.meetup.com/Warsaw-Airflow-Meetup/\" rel=\"nofollow\"\u003eWarsaw\u003c/a\u003e,\n\u003ca href=\"https://www.meetup.com/Amsterdam-Airflow-meetup/\" rel=\"nofollow\"\u003eAmsterdam\u003c/a\u003e,\n\u003ca href=\"https://www.meetup.com/London-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003eLondon\u003c/a\u003e,\n\u003ca href=\"https://www.meetup.com/NYC-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003eNYC\u003c/a\u003e,\n\u003ca href=\"https://www.meetup.com/Bay-Area-Apache-Airflow-Incubating-Meetup/\" rel=\"nofollow\"\u003eBayArea\u003c/a\u003e).\u003c/em\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eIt featured 40+ talks and three workshops. You can check out the talk recordings as a YouTube\n\u003ca href=\"https://www.youtube.com/playlist?list=PLGudixcDaxY3RGLSlWoN_cEEXhIT1OPmj\" rel=\"nofollow\"\u003eAirflow Summit 2020 Playlist\u003c/a\u003e\nor see the individual talks here:\u003c/em\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/GB2f7ZhRCho\" rel=\"nofollow\"\u003eKeynote: Airflow then and now\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/68c8a4183972e7f5e4d1e13cdc7e2338aa20641bcfaae5ad6de7fcff218111b2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f47423266375a685243686f\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/68c8a4183972e7f5e4d1e13cdc7e2338aa20641bcfaae5ad6de7fcff218111b2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f47423266375a685243686f\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/GB2f7ZhRCho\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/u00wmcHe8ow\" rel=\"nofollow\"\u003eScheduler as a service - Apache Airflow at EA Digital Platform\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/ccbda34fcaf892bd3d5212db057a8f63b8d0bed833b003d2a053ed8f4843f97f/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f753030776d634865386f77\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ccbda34fcaf892bd3d5212db057a8f63b8d0bed833b003d2a053ed8f4843f97f/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f753030776d634865386f77\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/u00wmcHe8ow\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/428AiCBMZoQ\" rel=\"nofollow\"\u003eKeynote: How large companies use Airflow for ML and ETL pipelines\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/48eaed6dceec003ee4b3286e11e1bd0c991b4a1ebc951bc1181f1e01175aa893/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f343238416943424d5a6f51\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/48eaed6dceec003ee4b3286e11e1bd0c991b4a1ebc951bc1181f1e01175aa893/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f343238416943424d5a6f51\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/428AiCBMZoQ\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/l_vVxOdvujg\" rel=\"nofollow\"\u003eData DAGs with lineage for fun and for profit\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/1aaa552ca65bacf7b46edbcca706c97d5c19af7a2c3c0f5dbf9f641545cbddb5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6c5f7656784f6476756a67\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/1aaa552ca65bacf7b46edbcca706c97d5c19af7a2c3c0f5dbf9f641545cbddb5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6c5f7656784f6476756a67\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/l_vVxOdvujg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/3VDeKmxHWYA\" rel=\"nofollow\"\u003eAirflow on Kubernetes: Containerizing your workflows\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/ec8191f7672945cfa06d255ca2e36b80218c270b4b0332cbf2c598c5fa5bd0ab/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f335644654b6d7848575941\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ec8191f7672945cfa06d255ca2e36b80218c270b4b0332cbf2c598c5fa5bd0ab/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f335644654b6d7848575941\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/3VDeKmxHWYA\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/kAtaj_s4f-w\" rel=\"nofollow\"\u003eData flow with Airflow @ PayPal\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/efde6542dd17c438ed9973491f6f7d27fc527c18a999b17caada24a71b1531b6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6b4174616a5f7334662d77\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/efde6542dd17c438ed9973491f6f7d27fc527c18a999b17caada24a71b1531b6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6b4174616a5f7334662d77\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/kAtaj_s4f-w\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/Cd4-YtHYT9M\" rel=\"nofollow\"\u003eDemocratised data workflows at scale\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/fdda4e0d22633d21d45f7fcfc2cbb6a69df35576978098336e9162f937165672/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4364342d5974485954394d\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/fdda4e0d22633d21d45f7fcfc2cbb6a69df35576978098336e9162f937165672/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4364342d5974485954394d\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/Cd4-YtHYT9M\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/i79OsoLUx0k\" rel=\"nofollow\"\u003eMigrating Airflow-based Spark jobs to Kubernetes - the native way\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/5ec5632c78c200799418c67bd1441f20049ee15c096c862e7c5e9823ed078a10/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6937394f736f4c5578306b\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5ec5632c78c200799418c67bd1441f20049ee15c096c862e7c5e9823ed078a10/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6937394f736f4c5578306b\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/i79OsoLUx0k\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/YLsGVFB8Pws\" rel=\"nofollow\"\u003eKeynote: Future of Airflow\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/df0638ef0103a323b3c677f3dda000cdf96889efaae999452a1dae63aec2cd26/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f594c734756464238507773\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/df0638ef0103a323b3c677f3dda000cdf96889efaae999452a1dae63aec2cd26/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f594c734756464238507773\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/YLsGVFB8Pws\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/QhnItssm4yU\" rel=\"nofollow\"\u003eRun Airflow DAGs in a secure way\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/c4cb705479bcbc37e40302b928b6faa078f98bb831867c2af6ad80ab5030118c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f51686e497473736d347955\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c4cb705479bcbc37e40302b928b6faa078f98bb831867c2af6ad80ab5030118c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f51686e497473736d347955\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/QhnItssm4yU\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/wxn9ta13Gbo\" rel=\"nofollow\"\u003eKeynote: Making Airflow a sustainable project through D\u0026amp;I\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4496824db38fe9b365ffb425878c5b7a54884d5fa9aa70d8e07a84684d5d9844/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f77786e397461313347626f\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4496824db38fe9b365ffb425878c5b7a54884d5fa9aa70d8e07a84684d5d9844/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f77786e397461313347626f\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/wxn9ta13Gbo\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/ZgTf523XM0g\" rel=\"nofollow\"\u003eAirflow CI/CD: Github to Cloud Composer (safely)\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/cd8975a4ad78cfeb28b14ee3cd5333ded19fab40ea716e001b54091ba2af74b0/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5a675466353233584d3067\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/cd8975a4ad78cfeb28b14ee3cd5333ded19fab40ea716e001b54091ba2af74b0/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5a675466353233584d3067\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/ZgTf523XM0g\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/Mhai7sVU244\" rel=\"nofollow\"\u003eAdvanced Apache Superset for Data Engineers\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/2eacd50f243e1c99d0338c0e91904b12c7abc09eb4b24e8c19ec012d3b8d4916/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4d68616937735655323434\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/2eacd50f243e1c99d0338c0e91904b12c7abc09eb4b24e8c19ec012d3b8d4916/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4d68616937735655323434\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/Mhai7sVU244\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/I4nFCqEnOJc\" rel=\"nofollow\"\u003eDemo: Reducing the lines, a visual DAG editor\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/c328c17b4874eacaa198af086d0f0043d04fc1689ae3b5c509350d310d6a860c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f49346e464371456e4f4a63\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c328c17b4874eacaa198af086d0f0043d04fc1689ae3b5c509350d310d6a860c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f49346e464371456e4f4a63\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/I4nFCqEnOJc\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/II4Ip81T3qc\" rel=\"nofollow\"\u003eAIP-31: Airflow functional DAG definition\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/9d5b205e88cba87b9bee8963e1e4eda704d807c0d9a31fce3710234c3e61afba/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4949344970383154337163\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9d5b205e88cba87b9bee8963e1e4eda704d807c0d9a31fce3710234c3e61afba/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4949344970383154337163\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/II4Ip81T3qc\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/wEq1FGe6oBY\" rel=\"nofollow\"\u003eAutonomous driving with Airflow\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/845b4b7a4008e039f03d1ae310f8be144e83778068156a7b3d6e13b6aefa8b40/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f77457131464765366f4259\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/845b4b7a4008e039f03d1ae310f8be144e83778068156a7b3d6e13b6aefa8b40/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f77457131464765366f4259\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/wEq1FGe6oBY\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/giQReCd7jp8\" rel=\"nofollow\"\u003eFrom cron to Airflow on Kubernetes: A startup story\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/49ec70ab0a69703557bdc3ed9b05e16b298c1b260540a233c7741e190c2a01cc/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f67695152654364376a7038\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/49ec70ab0a69703557bdc3ed9b05e16b298c1b260540a233c7741e190c2a01cc/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f67695152654364376a7038\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/giQReCd7jp8\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/Hc4pYAUL6Qs\" rel=\"nofollow\"\u003eAchieving Airflow Observability\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4859eedddfc3904fe74f5035d2d3e9a340b81300107648e5ccd170b1277b5833/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f486334705941554c365173\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4859eedddfc3904fe74f5035d2d3e9a340b81300107648e5ccd170b1277b5833/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f486334705941554c365173\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/Hc4pYAUL6Qs\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/N_3RQeqySE0\" rel=\"nofollow\"\u003eMachine Learning with Apache Airflow\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/e72fb89cb0b18d0b506d34490dc72c68de6c32b04ba3c700e41658a8f12000c5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4e5f335251657179534530\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/e72fb89cb0b18d0b506d34490dc72c68de6c32b04ba3c700e41658a8f12000c5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4e5f335251657179534530\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/N_3RQeqySE0\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/BH0ut33zp9A\" rel=\"nofollow\"\u003eAirflow: A beast character in the gaming world\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/0994a0a0c104b519c5dd2d26b329f96414375cb32d0941a80c1a99b8c0f6a615/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f424830757433337a703941\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0994a0a0c104b519c5dd2d26b329f96414375cb32d0941a80c1a99b8c0f6a615/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f424830757433337a703941\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/BH0ut33zp9A\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/p66GcO0LbFQ\" rel=\"nofollow\"\u003eEffective Cross-DAG dependency\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/44f7c8d7d5ecef0c3cda8ca15dfc678b730332abfebec24d105e761c4b727371/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f70363647634f304c624651\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/44f7c8d7d5ecef0c3cda8ca15dfc678b730332abfebec24d105e761c4b727371/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f70363647634f304c624651\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/p66GcO0LbFQ\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/KIEMEYM2PEs\" rel=\"nofollow\"\u003eWhat open source taught us about business\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/fba8ce06c0d6edc5008d613d241ae5e35ecfcf0601c4ede7bd543c19537a4ad6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4b49454d45594d32504573\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/fba8ce06c0d6edc5008d613d241ae5e35ecfcf0601c4ede7bd543c19537a4ad6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4b49454d45594d32504573\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/KIEMEYM2PEs\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/SvnTyDiZOzQ\" rel=\"nofollow\"\u003eData engineering hierarchy of needs\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a947afd7f6bcf337180828ea1bb9529c3933940727e613fd94353b5b1effa42c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f53766e547944695a4f7a51\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/a947afd7f6bcf337180828ea1bb9529c3933940727e613fd94353b5b1effa42c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f53766e547944695a4f7a51\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/SvnTyDiZOzQ\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/R4bp3_VyJ70\" rel=\"nofollow\"\u003eBuilding reuseable and trustworthy ELT pipelines (A templated approach)\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/96b3eb368ad0a77121547f19e778466b4f133bd8e4abc613307520233dca739c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f52346270335f56794a3730\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/96b3eb368ad0a77121547f19e778466b4f133bd8e4abc613307520233dca739c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f52346270335f56794a3730\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/R4bp3_VyJ70\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/ANJnYbLwLjE\" rel=\"nofollow\"\u003eTesting Airflow workflows - ensuring your DAGs work before going into production\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/0f6fdec9d8f915cd6dcce746c9f04976d4274e9b31c4043294e3bd9f4c2218a6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f414e4a6e59624c774c6a45\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0f6fdec9d8f915cd6dcce746c9f04976d4274e9b31c4043294e3bd9f4c2218a6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f414e4a6e59624c774c6a45\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/ANJnYbLwLjE\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/RKEmAshcreE\" rel=\"nofollow\"\u003eAdding an executor to Airflow: A contributor overflow exception\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4255f9e1da5f1aec83e1a63e92dc2ecea4cbec105b857ce5c3e83470adc9072a/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f524b456d41736863726545\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4255f9e1da5f1aec83e1a63e92dc2ecea4cbec105b857ce5c3e83470adc9072a/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f524b456d41736863726545\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/RKEmAshcreE\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/1SSlxAcOEso\" rel=\"nofollow\"\u003eMigration to Airflow backport providers\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/95e88950b0d2e212fd99e618866b32c461da382ab8f784b00d215d4c60f5cfc8/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f3153536c7841634f45736f\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/95e88950b0d2e212fd99e618866b32c461da382ab8f784b00d215d4c60f5cfc8/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f3153536c7841634f45736f\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/1SSlxAcOEso\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/kxyCC1sieok\" rel=\"nofollow\"\u003eFrom Zero to Airflow: bootstrapping a ML platform\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/75934babc5b733678db1cf5a1ce7634e251f81d5a603b516039e85261301e800/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6b78794343317369656f6b\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/75934babc5b733678db1cf5a1ce7634e251f81d5a603b516039e85261301e800/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6b78794343317369656f6b\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/kxyCC1sieok\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/vsn5kurjHwQ\" rel=\"nofollow\"\u003eAirflow the perfect match in our analytics pipeline\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/eb5d5393a4f97aa58817f9320c8a161b014d185fa7faca892572d3ef39362158/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f76736e356b75726a487751\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/eb5d5393a4f97aa58817f9320c8a161b014d185fa7faca892572d3ef39362158/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f76736e356b75726a487751\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/vsn5kurjHwQ\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/VApoz5KCguM\" rel=\"nofollow\"\u003eAirflow at Société Générale : An open source orchestration solution in a banking environment\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/971d60af9be4adfd800293337100071f4653ee60b308a142a22c6706976d9202/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5641706f7a354b4367754d\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/971d60af9be4adfd800293337100071f4653ee60b308a142a22c6706976d9202/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5641706f7a354b4367754d\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/VApoz5KCguM\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/KpCPfooD5hM\" rel=\"nofollow\"\u003eAirflow as the next gen of workflow system at Pinterest\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/c5a7e11a72dd5979ac739f2ecefb665a82571a9105c82e368ac0901986f02e9c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4b704350666f6f4435684d\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c5a7e11a72dd5979ac739f2ecefb665a82571a9105c82e368ac0901986f02e9c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4b704350666f6f4435684d\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/KpCPfooD5hM\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/fe59rUezJ5Q\" rel=\"nofollow\"\u003eImproving Airflow's user experience\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a4773ec541e21291c98452d61df89a2e52ec755063eb25a2e8cbcb52cc793d24/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f666535397255657a4a3551\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/a4773ec541e21291c98452d61df89a2e52ec755063eb25a2e8cbcb52cc793d24/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f666535397255657a4a3551\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/fe59rUezJ5Q\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/DHDlD-bMM3c\" rel=\"nofollow\"\u003eTeaching an old DAG new tricks\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/91bb5ee972428eee5458e3a473c933fce0edeeba9a4e3415955e6a81d296ffb2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4448446c442d624d4d3363\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/91bb5ee972428eee5458e3a473c933fce0edeeba9a4e3415955e6a81d296ffb2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4448446c442d624d4d3363\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/DHDlD-bMM3c\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/tO6IBDPNAcY\" rel=\"nofollow\"\u003eAsk me anything with Airflow members\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4ee5d41bffd5e74776bb48c1602ce7858975de0dc21f64b8724d9e59c375323e/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f744f36494244504e416359\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4ee5d41bffd5e74776bb48c1602ce7858975de0dc21f64b8724d9e59c375323e/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f744f36494244504e416359\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/tO6IBDPNAcY\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/GTQU8ff_O_4\" rel=\"nofollow\"\u003eUsing Airflow to speed up development of data intensive tools\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/6cd4de1097cf4b4b5b32dbdbf504e96c4f3d58f309023e53114296fc644dbec0/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f475451553866665f4f5f34\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/6cd4de1097cf4b4b5b32dbdbf504e96c4f3d58f309023e53114296fc644dbec0/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f475451553866665f4f5f34\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/GTQU8ff_O_4\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/tY4F9X5l6dg\" rel=\"nofollow\"\u003ePipelines on pipelines: Agile CI/CD workflows for Airflow DAGs\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/71584c5dd44c2226bbd85f38517918ac7126f14fa62561330d111e493653d102/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f745934463958356c366467\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/71584c5dd44c2226bbd85f38517918ac7126f14fa62561330d111e493653d102/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f745934463958356c366467\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/tY4F9X5l6dg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/wDr3Y7q2XoI\" rel=\"nofollow\"\u003eProduction Docker image for Apache Airflow\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/ea61dc77d9395852a5020c0ba79d2f6c1bd810ed55aac1869a1efca3289c1d7c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7744723359377132586f49\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ea61dc77d9395852a5020c0ba79d2f6c1bd810ed55aac1869a1efca3289c1d7c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7744723359377132586f49\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/wDr3Y7q2XoI\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/_50-JFCsp3I\" rel=\"nofollow\"\u003eAirflow as an elastic ETL tool\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/6bc4fdea0f9a53fb6d7df1a4f9372c84804f89d0e8c74d8e27cce10f2984732f/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5f35302d4a464373703349\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/6bc4fdea0f9a53fb6d7df1a4f9372c84804f89d0e8c74d8e27cce10f2984732f/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5f35302d4a464373703349\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/_50-JFCsp3I\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/q9pdAlcMo48\" rel=\"nofollow\"\u003eHow do we reason about the reliability of our data pipeline in Wrike\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/21711c6bb74adb970a2dc442278d00fd25eca71799aa8a92b0fb2ca598cc1a6c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f71397064416c634d6f3438\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/21711c6bb74adb970a2dc442278d00fd25eca71799aa8a92b0fb2ca598cc1a6c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f71397064416c634d6f3438\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/q9pdAlcMo48\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/aQIZ_Wdy0lA\" rel=\"nofollow\"\u003eAchieving Airflow observability with Databand\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/c24842a3c631794747ce39b39a7945319830cc1f6ac629474921211b64321551/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6151495a5f576479306c41\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c24842a3c631794747ce39b39a7945319830cc1f6ac629474921211b64321551/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6151495a5f576479306c41\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/aQIZ_Wdy0lA\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/yuqXWClbEM8\" rel=\"nofollow\"\u003eFrom S3 to BigQuery - How a first-time Airflow user successfully implemented a data pipeline\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/43115f7e98c9383d8cd9a2b737296b6801bcfcc089dc04b89e0f99c62aef8668/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7975715857436c62454d38\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/43115f7e98c9383d8cd9a2b737296b6801bcfcc089dc04b89e0f99c62aef8668/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7975715857436c62454d38\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/yuqXWClbEM8\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBest practices, lessons learned and cool use cases\u003c/h2\u003e\u003ca id=\"user-content-best-practices-lessons-learned-and-cool-use-cases\" class=\"anchor\" aria-label=\"Permalink: Best practices, lessons learned and cool use cases\" href=\"#best-practices-lessons-learned-and-cool-use-cases\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/apache-airflow/how-to-best-use-duckdb-with-apache-airflow-63a079160d5d\" rel=\"nofollow\"\u003eHow to Best Use DuckDB with Apache Airflow\u003c/a\u003e - Tips on integrating \u003ca href=\"https://duckdb.org/\" rel=\"nofollow\"\u003eDuckDB\u003c/a\u003e into Airflow jobs.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=9pykChPp-X4\u0026amp;t=121s\" rel=\"nofollow\"\u003eAirflow Dag Python Package Management\u003c/a\u003e - Managing python package dependencies across 100+ dags can become painful. It's hard to keep track of which packages are used by which dag, and hard to clean up during DAG removal/upgrade. Learn how KubernetesPodOperator and DockerOperator can fix this.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/a-4yRne3ba4\" rel=\"nofollow\"\u003eAirflow Dag Management \u0026amp; Versioning\u003c/a\u003e - Efficently manage DAGs release process by using Git Submodules\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@chandukavar/testing-in-airflow-part-2-integration-tests-and-end-to-end-pipeline-tests-af0555cd1a82\" rel=\"nofollow\"\u003eTesting in Airflow Part 2\u003c/a\u003e - \u003ca href=\"https://twitter.com/chandukavar\" rel=\"nofollow\"\u003eChandu Kavar\u003c/a\u003e and \u003ca href=\"https://www.linkedin.com/in/sarang-shinde-219a4873/\" rel=\"nofollow\"\u003eSarang Shinde\u003c/a\u003e have explained Integration Tests and End-to-End Pipeline Tests.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://robinhood.engineering/upgrading-scaling-airflow-at-robinhood-5b625dfaa2ee\" rel=\"nofollow\"\u003eUpgrading \u0026amp; Scaling Airflow at Robinhood\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/abhishek-ray-29210145/\" rel=\"nofollow\"\u003eAbishek Ray\u003c/a\u003e describes how Robinhood tackled upgrading its production Airflow while minimizing downtime.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/bluecore-engineering/were-all-using-airflow-wrong-and-how-to-fix-it-a56f14cb0753\" rel=\"nofollow\"\u003eWe're all using Airflow wrong and how to fix it\u003c/a\u003e - \u003ca href=\"https://www.jldlaughlin.com/\" rel=\"nofollow\"\u003eJessica Laughlin\u003c/a\u003e of \u003ca href=\"https://www.bluecore.com/\" rel=\"nofollow\"\u003eBluecore\u003c/a\u003e shares three engineering problems associated with the Airflow design and how to solve them by using the \u003ca href=\"https://github.com/apache/airflow/blob/v1-10-stable/airflow/contrib/operators/kubernetes_pod_operator.py\"\u003eKubernetesPodOperator\u003c/a\u003e in two design patterns.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/dailymotion/getting-started-with-data-lineage-6307b2b429b3\" rel=\"nofollow\"\u003eGetting started with Data Lineage\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/germain-tanguy/\" rel=\"nofollow\"\u003eGermain Tanguy\u003c/a\u003e of \u003ca href=\"https://www.dailymotion.com/\" rel=\"nofollow\"\u003eDailymotion\u003c/a\u003e shares a data lineage prototype integrated to Apache Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/dailymotion/collaboration-between-data-engineers-data-analysts-and-data-scientists-97c00ab1211f\" rel=\"nofollow\"\u003eCollaboration between data engineers, data analysts and data scientists\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/germain-tanguy/\" rel=\"nofollow\"\u003eGermain Tanguy\u003c/a\u003e of \u003ca href=\"https://www.dailymotion.com/\" rel=\"nofollow\"\u003eDailymotion\u003c/a\u003e shares how to efficiently release in production by collaboration with Apache Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.lucidchart.com/techblog/2019/03/22/using-apache-airflows-docker-operator-with-amazons-container-repository/\" rel=\"nofollow\"\u003eUsing Apache Airflow’s Docker Operator with Amazon’s Container Repository\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/bvcampbell3\" rel=\"nofollow\"\u003eBrian Campbell\u003c/a\u003e of \u003ca href=\"https://www.lucidchart.com/\" rel=\"nofollow\"\u003eLucid\u003c/a\u003e has tips for integrating AWS's \u003ca href=\"https://aws.amazon.com/ecr/\" rel=\"nofollow\"\u003eECR\u003c/a\u003e service with Airflow's DockerOperator.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/datareply/airflow-lesser-known-tips-tricks-and-best-practises-cf4d4a90f8f\" rel=\"nofollow\"\u003eAirflow: Lesser Known Tips, Tricks, and Best Practises\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/kaxil/\" rel=\"nofollow\"\u003eKaxil Naik\u003c/a\u003e has explained the lesser-known yet very useful tips and best practises on using Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://codeascraft.com/2018/11/14/boundary-layer%E2%80%89-declarative-airflow-workflows/\" rel=\"nofollow\"\u003eboundary-layer:Declarative Airflow Workflows\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/mchalek\" rel=\"nofollow\"\u003eKevin McHale\u003c/a\u003e has explained open source project boundary-layer which generates airflow dag with declarative workflows.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@chandukavar/testing-in-airflow-part-1-dag-validation-tests-dag-definition-tests-and-unit-tests-2aa94970570c\" rel=\"nofollow\"\u003eTesting in Airflow Part 1\u003c/a\u003e - \u003ca href=\"https://twitter.com/chandukavar\" rel=\"nofollow\"\u003eChandu Kavar\u003c/a\u003e has explained different categories of tests in Airflow. It includes DAG Validation Tests, DAG Definition Tests, and unit tests.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wecode.wepay.com/posts/improving-airflow-ui-security\" rel=\"nofollow\"\u003eImproving Airflow UI Security\u003c/a\u003e - WePay's \u003ca href=\"https://twitter.com/joygao\" rel=\"nofollow\"\u003eJoy Gao\u003c/a\u003e breaks down the need for Role Based Access Controls (RBAC) and how she introduced it to Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.socialcops.com/engineering/apache-airflow-disease-outbreaks-india/\" rel=\"nofollow\"\u003eHow to Create a Workflow in Apache Airflow to Track Disease Outbreaks in India\u003c/a\u003e - \u003ca href=\"https://twitter.com/vortex_ape\" rel=\"nofollow\"\u003eVinayak Mehta\u003c/a\u003e details how \u003ca href=\"https://socialcops.com/\" rel=\"nofollow\"\u003eSocialCops\u003c/a\u003e uses Airflow to scrape India's Ministry of Health and Family Affairs to generate derived data on possible disease outbreaks.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.socialcops.com/technology/engineering/airflow-meta-data-engineering-disha/\" rel=\"nofollow\"\u003eAirflow, Meta Data Engineering, and a Data Platform for the World’s Largest Democracy\u003c/a\u003e - \u003ca href=\"https://twitter.com/vortex_ape\" rel=\"nofollow\"\u003eVinayak Mehta\u003c/a\u003e talks about identifying data engineering patterns (meta data engineering) to automate DAG generation and how that helped \u003ca href=\"https://socialcops.com/\" rel=\"nofollow\"\u003eSocialCops\u003c/a\u003e to power DISHA, a national data platform where Indian MPs and MLAs monitor the progress of 42 national level schemes.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@nehiljain/lessons-learnt-while-airflow-ing-32d3b7fc3fbf\" rel=\"nofollow\"\u003eLessons learnt while Airflow-ing\u003c/a\u003e and \u003ca href=\"https://medium.com/snaptravel/airflow-part-2-lessons-learned-793fa3c0841e\" rel=\"nofollow\"\u003eAirflow Part 2: Lessons learned\u003c/a\u003e - \u003ca href=\"https://twitter.com/nehiljain\" rel=\"nofollow\"\u003eNehil Jain\u003c/a\u003e has written a two-part series that covers the value of workflow schedulers, some best practices and pitfalls he found while working with Airflow. The \u003ca href=\"https://medium.com/snaptravel/airflow-part-2-lessons-learned-793fa3c0841e\" rel=\"nofollow\"\u003esecond article\u003c/a\u003e in particular includes many production tips.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://robinhood.engineering/why-robinhood-uses-airflow-aed13a9a90c8\" rel=\"nofollow\"\u003eWhy Robinhood uses Airflow\u003c/a\u003e - \u003ca href=\"https://twitter.com/vineetik\" rel=\"nofollow\"\u003eVineet Goel\u003c/a\u003e walks through why financial trading platform \u003ca href=\"https://robinhood.com/\" rel=\"nofollow\"\u003eRobinhood\u003c/a\u003e picked Airflow over alternative work schedulers.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/videoamp/what-we-learned-migrating-off-cron-to-airflow-b391841a0da4\" rel=\"nofollow\"\u003eWhat we learned migrating off Cron to Airflow\u003c/a\u003e - \u003ca href=\"https://medium.com/@katiemacias\" rel=\"nofollow\"\u003eKatie Macias\u003c/a\u003e describes \u003ca href=\"https://www.videoamp.com/\" rel=\"nofollow\"\u003eVideoAmp\u003c/a\u003e's Data Engineering's journey from cron to Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.qubole.com/blog/hood-building-air-qubole/\" rel=\"nofollow\"\u003eUnder the Hood: Building AIR at Qubole\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/sreenath-kamath-66a1b970/\" rel=\"nofollow\"\u003eSreenath Kamath\u003c/a\u003e and \u003ca href=\"https://twitter.com/vrajat\" rel=\"nofollow\"\u003eRajat Venkatesh\u003c/a\u003e write about building \u003ca href=\"https://www.qubole.com/\" rel=\"nofollow\"\u003eQubole\u003c/a\u003e's \u003ca href=\"https://www.qubole.com/blog/building-qdsair-infrastructure/\" rel=\"nofollow\"\u003edata discovery, insights and recommendations platform\u003c/a\u003e atop Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/bluecore-engineering/airflow-why-is-nothing-working-f705eb6b7b04\" rel=\"nofollow\"\u003eAirflow: Why is nothing working? - TL;DR Airflow’s SubDagOperator causes deadlocks\u003c/a\u003e by \u003ca href=\"https://twitter.com/thepressofjess\" rel=\"nofollow\"\u003eJessica Laughlin\u003c/a\u003e - Deep dive into troubleshooting a troublesome Airflow DAG with good tips on how to diagnosis problems.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@rako/apache-airflow-as-an-external-scheduler-for-distributed-systems-53b7354d3e48\" rel=\"nofollow\"\u003eApache Airflow as an External scheduler for distributed systems\u003c/a\u003e - \u003ca href=\"https://medium.com/@rako\" rel=\"nofollow\"\u003eArunkumar\u003c/a\u003e suggests using Airflow as a simple external scheduler for a distributed system.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://engineering.siftscience.com/sift-trains-thousands-models-using-apache-airflow/\" rel=\"nofollow\"\u003eHow Sift Trains Thousands of Models using Apache Airflow\u003c/a\u003e - Summary of \u003ca href=\"https://siftscience.com/\" rel=\"nofollow\"\u003eSift Science\u003c/a\u003e's deployment strategy for its machine learning model pipelines.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://engineering.pandora.com/apache-airflow-at-pandora-1d7a844d68ee\" rel=\"nofollow\"\u003eApache Airflow at Pandora\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/acehaidrey/\" rel=\"nofollow\"\u003eAce Haidrey\u003c/a\u003e discusses why Pandora chose Airflow and provides a detailed breakdown of their deployment and the infrastructure behind it.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/stanton-ventures-insights/airflow-lessons-from-the-data-engineering-front-in-chicago-9489e6ad5c3d\" rel=\"nofollow\"\u003eAirflow Lessons from the Data Engineering Front in Chicago\u003c/a\u003e - \u003ca href=\"https://twitter.com/alison985\" rel=\"nofollow\"\u003eAlison Stanton\u003c/a\u003e provides a list of tips to avoid gotchas in Airflow jobs.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/wbaa/datas-inferno-7-circles-of-data-testing-hell-with-airflow-cef4adff58d8\" rel=\"nofollow\"\u003eData’s Inferno: 7 Circles of Data Testing Hell with Airflow\u003c/a\u003e - The Wholesale Banking Advanced Analytics team at ING details how they torture test their Airflow DAGs before deployment.\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/danielvdende/data-testing-with-airflow\"\u003eData Testing with Airflow repository\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://drivy.engineering/data-quality/\" rel=\"nofollow\"\u003eData quality checkers\u003c/a\u003e - \u003ca href=\"https://twitter.com/AntoineAugusti\" rel=\"nofollow\"\u003eAntoine Augusti\u003c/a\u003e describes the framework \u003ca href=\"https://www.drivy.co.uk/\" rel=\"nofollow\"\u003edrivy\u003c/a\u003e has built atop Airflow to test their datasets for completeness, consistency, timeliness, uniquess, validity and accuracy.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wecode.wepay.com/posts/wepays-data-warehouse-bigquery-airflow\" rel=\"nofollow\"\u003eBuilding WePay's data warehouse using BigQuery and Airflow\u003c/a\u003e - The inestimable \u003ca href=\"https://twitter.com/criccomini\" rel=\"nofollow\"\u003eChris Riccomini\u003c/a\u003e describes how \u003ca href=\"https://go.wepay.com/\" rel=\"nofollow\"\u003eWePay\u003c/a\u003e, one of the first adopters of Airflow, integrated into their \u003ca href=\"https://cloud.google.com/compute/\" rel=\"nofollow\"\u003eGoogle Cloud Compute\u003c/a\u003e environment.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.astronomer.io/blog/using-apache-airflow-to-create-data-infrastructure/\" rel=\"nofollow\"\u003eUsing Apache Airflow to Create Data Infrastructure in the Public Sector\u003c/a\u003e - Despite an unfortunately very heavy sales pitch tone, this article blog post describes how \u003ca href=\"http://www.argolabs.org/\" rel=\"nofollow\"\u003eARGO Labs\u003c/a\u003e, a non-profit data organization, utilizes Airflow for ETLing in public sector data.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gtoonstra.github.io/etl-with-airflow/\" rel=\"nofollow\"\u003eETL with airflow\u003c/a\u003e - ETL core principles and several end-to-end docker-based examples including Kimball, Data Vault on Hive and some simpler examples.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cloud.google.com/blog/big-data/2017/07/how-to-aggregate-data-for-bigquery-using-apache-airflow\" rel=\"nofollow\"\u003eHow to aggregate data for BigQuery using Apache Airflow\u003c/a\u003e - Example of how to use Airflow with Google BigQuery to power a Data Studio dashboard.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.twitter.com/engineering/en_us/topics/insights/2018/ml-workflows.html\" rel=\"nofollow\"\u003eProductionizing ML with workflows at Twitter\u003c/a\u003e - In depth post on why and how Twitter use Airflow for ML workflows including including custom operators and a custom UI embedded in in the Airflow web interface.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://eng.lyft.com/running-apache-airflow-at-lyft-6e53bb8fccff\" rel=\"nofollow\"\u003eRunning Apache Airflow At Lyft\u003c/a\u003e - This provides an overview on how Lyft operates Apache Airflow in production(monitoring, customization, etc).\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://azure.microsoft.com/sv-se/blog/deploying-apache-airflow-in-azure-to-build-and-run-data-pipelines/\" rel=\"nofollow\"\u003eDeploying Apache Airflow in Azure to build and run data pipelines\u003c/a\u003e - It talks about running Airflow on Azure.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.godatadriven.com/zen-of-python-and-apache-airflow\" rel=\"nofollow\"\u003eThe Zen of Python and Apache Airflow\u003c/a\u003e - Blog post about how the Zen of Python can be applied to Airflow code.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://eng.lyft.com/securing-apache-airflow-ui-with-dag-level-access-a7bc649a2821\" rel=\"nofollow\"\u003eSecuring Apache Airflow UI WITH DAG Level Access\u003c/a\u003e - Blog post about Airflow DAG level access and how Lyft uses it.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/flatiron-engineering/upgrading-airflow-with-zero-downtime-8df303760c96\" rel=\"nofollow\"\u003eUpgrading Airflow with Zero Downtime\u003c/a\u003e - A detailed article on how to deploy Airflow with zero downtime.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://towardsdatascience.com/building-a-production-level-etl-pipeline-platform-using-apache-airflow-a4cf34203fbd\" rel=\"nofollow\"\u003eBuilding a Production-Level ETL Pipeline Platform Using Apache Airflow\u003c/a\u003e - This post describes how the system management team at Cerner uses Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stwind/airflow-on-kubernetes\"\u003eBare minimal Airflow on Kubernetes (Local, EKS, AKS)\u003c/a\u003e - An article on deploying Airflow on local Kubernetes, AWS EKS and Azure AKS with bare minimal setup.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://tech.scribd.com/blog/2020/breaking-up-the-dag-repo.html\" rel=\"nofollow\"\u003eBreaking up the Airflow DAG monorepo\u003c/a\u003e - This post describes how to support managing Airflow DAGs from multiple git repos through S3.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/databand-ai/improving-performance-of-apache-airflow-scheduler-507f4cb6462a\" rel=\"nofollow\"\u003eImproving Performance of Apache Airflow Scheduler\u003c/a\u003e - A story of an adventure that allowed \u003ca href=\"https://databand.ai/\" rel=\"nofollow\"\u003eDataband\u003c/a\u003e to speed up DAG parsing time 10 times\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/ssense-tech/principled-data-engineering-part-ii-data-governance-30297abb2446\" rel=\"nofollow\"\u003eHow SSENSE is using Apache Airflow to do Data Lineage on AWS\u003c/a\u003e - Exploring the fundamental themes of architecting and governing a data lake on AWS using Apache Arflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://databand.ai/blog/everyday-data-engineering-monitoring-airflow-with-prometheus-statsd-and-grafana/\" rel=\"nofollow\"\u003eMonitoring Airflow with Prometheus, StatsD and Grafana\u003c/a\u003e - A guide on how to setup operational dashboards to production cluster by \u003ca href=\"http://databand.ai\" rel=\"nofollow\"\u003eDataband\u003c/a\u003e and get high level visibility on Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/hurb-engineering/complex-tasks-orchestration-at-hurb-with-apache-airflow-dcb423c4dee6\" rel=\"nofollow\"\u003eComplex tasks orchestration at Hurb with Apache Airflow\u003c/a\u003e - This post shows how \u003ca href=\"https://hurb.com\" rel=\"nofollow\"\u003eHurb\u003c/a\u003e uses Apache Airflow to orchestrate complex tasks and how it leverages DAG dynamic creation to improve development speed.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://community.crate.io/t/cratedb-and-apache-airflow-part-one/901\" rel=\"nofollow\"\u003eAutomating data export from CrateDB to S3 with Apache Airflow\u003c/a\u003e A tutorial on how to automate recurrent queries in \u003ca href=\"https://crate.io/\" rel=\"nofollow\"\u003eCrateDB\u003c/a\u003e with Apache Airflow, such as periodic data export to Amazon S3.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://community.crate.io/t/cratedb-and-apache-airflow-implementation-of-data-retention-policy/913\" rel=\"nofollow\"\u003eImplementation of Data Retention Policy with CrateDB and Apache Airflow\u003c/a\u003e A step by step tutorial on how to implement effective data retention policy with \u003ca href=\"https://crate.io/\" rel=\"nofollow\"\u003eCrateDB\u003c/a\u003e and Apache Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://community.crate.io/t/cratedb-and-apache-airflow-building-a-data-ingestion-pipeline/926\" rel=\"nofollow\"\u003eIngesting NYC Taxi Data From S3 Into CrateDB\u003c/a\u003e - Describes how to build a database ingestion pipeline in Airflow by loading CSV files from S3 into \u003ca href=\"https://crate.io/\" rel=\"nofollow\"\u003eCrateDB\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBooks, blogs, podcasts, and such\u003c/h2\u003e\u003ca id=\"user-content-books-blogs-podcasts-and-such\" class=\"anchor\" aria-label=\"Permalink: Books, blogs, podcasts, and such\" href=\"#books-blogs-podcasts-and-such\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://www.manning.com/books/data-pipelines-with-apache-airflow\" rel=\"nofollow\"\u003eData Pipelines with Apache Airflow\u003c/a\u003e - A Manning book (Early Access September 2019) on Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://soundcloud.com/the-airflow-podcast\" rel=\"nofollow\"\u003eThe Airflow Podcast\u003c/a\u003e - A semiregular podcast discussing all things Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@maximebeauchemin\" rel=\"nofollow\"\u003eMaxime Beauchemin\u003c/a\u003e - Maxime's blog on medium that gives insight into the philosophy behind Apache Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@rchang\" rel=\"nofollow\"\u003eRobert Chang\u003c/a\u003e - Blog posts about data engineering with Apache Airflow, explains why and has examples in code.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://szeevs.medium.com/handling-airflow-logs-with-kubernetes-executor-25c11ea831e4\" rel=\"nofollow\"\u003eHandling Airflow logs with Kubernetes Executor\u003c/a\u003e - A blogpost that outlines how you can set up remote S3 logging when using KubernetesExecutor, without creating complex infrastructure.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://turbaszek.medium.com/airflow-2-0-dag-authoring-redesigned-651edc397178\" rel=\"nofollow\"\u003eAirflow 2.0: DAG Authoring Redesigned\u003c/a\u003e - Blog post about new ways of writing DAGs in Airflow 2.0.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://higrys.medium.com/airflow-2-0-providers-1bd21ba3bd93\" rel=\"nofollow\"\u003eAirflow 2.0 Providers\u003c/a\u003e - Blog post about providers packages in Airflow 2.0.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSlide deck presentations and online videos\u003c/h2\u003e\u003ca id=\"user-content-slide-deck-presentations-and-online-videos\" class=\"anchor\" aria-label=\"Permalink: Slide deck presentations and online videos\" href=\"#slide-deck-presentations-and-online-videos\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e2020-Feb: \u003ca href=\"https://www.youtube.com/watch?IAmWKZDmvek\" rel=\"nofollow\"\u003eApache Airflow @ Umuzi.org\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/301e514f1071b13c1dd1d02fd685dac1c22066026a403cda17185f9d01dbffa4/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f49416d574b5a446d76656b\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/301e514f1071b13c1dd1d02fd685dac1c22066026a403cda17185f9d01dbffa4/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f49416d574b5a446d76656b\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/IAmWKZDmvek\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e - \u003ca href=\"https://twitter.com/sheena_oconnell\" rel=\"nofollow\"\u003eSheena O'Connell\u003c/a\u003e discusses how South Africa-based tech bootcamp \u003ca href=\"https://www.umuzi.org/\" rel=\"nofollow\"\u003eUmuzi\u003c/a\u003e uses Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/playlist?list=PL79i7SgJCJ9hu5GqcA091h6zuewmsvSyy\" rel=\"nofollow\"\u003eApache Airflow YouTube tutorials\u003c/a\u003e - \u003ca href=\"https://twitter.com/marclambertiml\" rel=\"nofollow\"\u003eMarc Lamberti\u003c/a\u003e has created a series of YouTube tutorials covering many aspects of Airflow concepts, configuration and deployment.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?23_1WlxGGM4\" rel=\"nofollow\"\u003eAdvanced Data Engineering Patterns with Apache Airflow\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/674b9b40aea34bf57352b50d5d6059ec52c19f0f7dc4150559d34ad1559463cd/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f32335f31576c7847474d34\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/674b9b40aea34bf57352b50d5d6059ec52c19f0f7dc4150559d34ad1559463cd/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f32335f31576c7847474d34\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/23_1WlxGGM4\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e - Video of \u003ca href=\"https://medium.com/@maximebeauchemin\" rel=\"nofollow\"\u003eMaxime Beauchemin\u003c/a\u003e's talk that briefly introduces Airflow and then goes into more advanced use cases, including self-servive SQL queries, building A/B testing metrics frameworks and machine learning feature extraction all via Airflow. The slides are available separately \u003ca href=\"https://prezi.com/p/adxlaplcwzho/advanced-data-engineering-patterns-with-apache-airflow/\" rel=\"nofollow\"\u003ehere\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.tedmiston.com/momentum-2018-airflow-talk/\" rel=\"nofollow\"\u003eModern Data Pipelines with Apache Airflow\u003c/a\u003e - A talk given by \u003ca href=\"https://twitter.com/kicksopenminds\" rel=\"nofollow\"\u003eTaylor Edmiston\u003c/a\u003e and \u003ca href=\"https://twitter.com/andscoop\" rel=\"nofollow\"\u003eAndy Cooper\u003c/a\u003e from Astronomer.io at Momentum Dev Con 2018 on getting started with Airflow, custom components, example DAGs, and the Astronomer Airflow CLI.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.slideshare.net/r39132/building-better-data-pipelines-using-apache-airflow-94060954\" rel=\"nofollow\"\u003eBuilding Better Data Pipelines using Apache Airflow\u003c/a\u003e - Slides from \u003ca href=\"https://twitter.com/r39132\" rel=\"nofollow\"\u003eSid Anand\u003c/a\u003e's talk at QCon 18 with a thorough overview of Airflow and its architecture.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://paper.dropbox.com/doc/Airflow-Spark-talk-v2.0-5own4Nlz8MhdwKQ8QhIqj?_tk=share_copylink\" rel=\"nofollow\"\u003eAirflow and Spark Streaming at Astronomer\u003c/a\u003e - How Astronomer uses dynamic DAGs to run Spark Streaming jobs with Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.slideshare.net/kaxil/apache-airflow-in-the-cloud-programmatically-orchestrating-workloads-with-python-pydata-london-2018-95391267\" rel=\"nofollow\"\u003eApache Airflow in the Cloud: Programmatically orchestrating workloads with Python\u003c/a\u003e - Slides from \u003ca href=\"https://twitter.com/kaxil\" rel=\"nofollow\"\u003eKaxil Naik\u003c/a\u003e's \u0026amp; \u003ca href=\"https://twitter.com/ss6012\" rel=\"nofollow\"\u003eSatyasheel\u003c/a\u003e talk at PyData London 18 introducing the basics of Airflow and how to orchestrate workloads on Google Cloud Platform (GCP).\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://eventil.com/presentations/j2sK9R\" rel=\"nofollow\"\u003eDeveloping elegant workflows in Python code with Apache Airflow\u003c/a\u003e - \u003ca href=\"https://twitter.com/postrational\" rel=\"nofollow\"\u003eMichał Karzyński\u003c/a\u003e at \u003ca href=\"https://ep2018.europython.eu/\" rel=\"nofollow\"\u003eEuropython\u003c/a\u003e gives a brief introduction to Airflow concepts including the role of workflow managers, DAGs and operators. Link includes both video and slides.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?mjn1LAZ_Y38\" rel=\"nofollow\"\u003eData Pipeline Management\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/fb2d8c2a90d8030f85695382a1b97f32ef51284e94895ddec1e1ae2167c5a331/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6d6a6e314c415a5f593338\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/fb2d8c2a90d8030f85695382a1b97f32ef51284e94895ddec1e1ae2167c5a331/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6d6a6e314c415a5f593338\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/mjn1LAZ_Y38\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/benjamin-goldberg-50247169/\" rel=\"nofollow\"\u003eBen Goldberg\u003c/a\u003e walks the Chicago Kubernetes Meetup through how \u003ca href=\"https://spothero.com/\" rel=\"nofollow\"\u003eSpotHero\u003c/a\u003e uses Airflow. Additionally, Ben has a very \u003ca href=\"https://docs.google.com/presentation/d/1hc12cFs5TmEajLwYNASLwz_C17Q5tyd__6oXzI16A9A/edit#slide=id.g320d39a12c_0_1017\" rel=\"nofollow\"\u003ecomplete slidedeck\u003c/a\u003e of how Airflow plays within Kubernetes.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.slideshare.net/LauraLorenz4/how-i-learned-to-time-travel-or-data-pipelining-and-scheduling-with-airflow\" rel=\"nofollow\"\u003eHow I learned to time travel, or, data pipelining and scheduling with Airflow\u003c/a\u003e - Comprehensive deck by \u003ca href=\"https://twitter.com/lalorenz6\" rel=\"nofollow\"\u003eLaura Lorenz\u003c/a\u003e for why Airflow is necessary and how \u003ca href=\"https://www.industrydive.com/\" rel=\"nofollow\"\u003eIndustry Dive\u003c/a\u003e uses it.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.slideshare.net/r39132/introduction-to-apache-airflow-data-day-seattle-2016\" rel=\"nofollow\"\u003eIntroduction to Apache Airflow - Data Day Seattle 2016\u003c/a\u003e - \u003ca href=\"https://twitter.com/r39132\" rel=\"nofollow\"\u003eSid Anand\u003c/a\u003e gives a thorough introduction to Airflow and how it was used at \u003ca href=\"https://www.agari.com/\" rel=\"nofollow\"\u003eAgari\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://speakerdeck.com/vananth22/operating-data-pipeline-with-airflow-at-slack\" rel=\"nofollow\"\u003eOperating Data Pipeline With Airflow - Airflow Meetup April-2018\u003c/a\u003e - \u003ca href=\"https://twitter.com/ananthdurai\" rel=\"nofollow\"\u003eAnanth Packkildurai\u003c/a\u003e talks about scaling airflow Local Executor and best practices to operate data pipeline at \u003ca href=\"https://slack.com/\" rel=\"nofollow\"\u003eSlack\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wepayinc.app.box.com/s/hf1chwmthuet29ux2a83f5quc8o5q18k\" rel=\"nofollow\"\u003eApache Airflow at WePay\u003c/a\u003e - \u003ca href=\"https://twitter.com/criccomini\" rel=\"nofollow\"\u003eChris Riccomini\u003c/a\u003e discusses why WePay chose Airflow and provides a detailed breakdown of their deployment and the infrastructure behind it.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=neuh_2_zrt8\" rel=\"nofollow\"\u003eElegant data pipelining with Apache Airflow\u003c/a\u003e - Talks from \u003ca href=\"https://twitter.com/bolke2028\" rel=\"nofollow\"\u003eBolke de Bruin\u003c/a\u003e and \u003ca href=\"https://twitter.com/fokkodriesprong\" rel=\"nofollow\"\u003eFokko Driesprong\u003c/a\u003e at PyData Amsterdam 2018 about methodologies that provide clarity in ETL using Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.slideshare.net/taofung/airflow-at-lyft\" rel=\"nofollow\"\u003eAirflow @ Lyft\u003c/a\u003e - Talks from \u003ca href=\"https://github.com/feng-tao\"\u003eTao Feng\u003c/a\u003e at SF big data analytics meetup about how Lyft monitors running Airflow in production.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/bcF24AdG1o4\" rel=\"nofollow\"\u003eManageable data pipelines with Airflow and Kubernetes\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/065ee68f16951877d079d32f014c8ad524c2878bac8db824eff2c8f7390f1946/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6263463234416447316f34\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/065ee68f16951877d079d32f014c8ad524c2878bac8db824eff2c8f7390f1946/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6263463234416447316f34\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/bcF24AdG1o4\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e- Talk by \u003ca href=\"https://github.com/potiuk\"\u003eJarek Potiuk\u003c/a\u003e and \u003ca href=\"https://github.com/sprzedwojski\"\u003eSzymon Przedwojski\u003c/a\u003e. A introductory talk on Airflow from GDG Warsaw DevFest 2018.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?8L1F-6t_6Ao\" rel=\"nofollow\"\u003eMigrating Apache Oozie Workflows to Apache Airflow\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/faeb4e5443bb1db0ff090c4c87d935c98f70934ba1e8032036b386b64a7e5c77/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f384c31462d36745f36416f\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/faeb4e5443bb1db0ff090c4c87d935c98f70934ba1e8032036b386b64a7e5c77/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f384c31462d36745f36416f\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/8L1F-6t_6Ao\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e - Talk from \u003ca href=\"https://github.com/sprzedwojski\"\u003eSzymon Przedwojski\u003c/a\u003e from Airflow Bay Area Meetup June 2018 about Oozie-to-Airflow migration tool.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?MM8tfTrcnfk\" rel=\"nofollow\"\u003eBuilding data lakes with Apache Airflow\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/56a15cea5afbfe0017dae9eb6dfe0be0efee325afc9b73ff62a5cd7ba0e42ea5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4d4d3874665472636e666b\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/56a15cea5afbfe0017dae9eb6dfe0be0efee325afc9b73ff62a5cd7ba0e42ea5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4d4d3874665472636e666b\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/MM8tfTrcnfk\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e - Talk by \u003ca href=\"https://github.com/BasPH\"\u003eBas Harenslak\u003c/a\u003e and \u003ca href=\"https://github.com/jrderuiter\"\u003eJulian de Ruiter\u003c/a\u003e at the Amsterdam Apache Airflow September 2018 meetup about building data lakes with Apache Airflow as the spider in the web managing all data flows.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/Nr4Pp1SNXeU\" rel=\"nofollow\"\u003eFirst Warsaw Apache Airflow Meetup\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/8b539dea99dc34886cc21874bcc2761bf0bb9c114b1fd621e0e1fa1a0eb977f2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4e7234507031534e586555\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/8b539dea99dc34886cc21874bcc2761bf0bb9c114b1fd621e0e1fa1a0eb977f2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4e7234507031534e586555\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/Nr4Pp1SNXeU\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e - Live streamed recording from the first Apache Airflow Meetup in Warsaw in October 2019.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/znowFIBK1lk\" rel=\"nofollow\"\u003eWhat's coming in Apache Airflow 2.0\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/c30b88cd823f1adfc370acedb9fe555b07ec01b5d92aa84bc0043b2f8616404b/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7a6e6f774649424b316c6b\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c30b88cd823f1adfc370acedb9fe555b07ec01b5d92aa84bc0043b2f8616404b/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7a6e6f774649424b316c6b\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/znowFIBK1lk\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e - joint talk by \u003ca href=\"https://github.com/ashb\"\u003eAsh Berlin-Taylor\u003c/a\u003e, \u003ca href=\"https://github.com/kaxil\"\u003eKaxil Naik\u003c/a\u003e, \u003ca href=\"https://github.com/potiuk\"\u003eJarek Potiuk\u003c/a\u003e, \u003ca href=\"https://github.com/mik-laj\"\u003eKamil Breguła\u003c/a\u003e, \u003ca href=\"https://github.com/dimberman\"\u003eDaniel Imbermann\u003c/a\u003e, and \u003ca href=\"https://github.com/turbaszek\"\u003eTomek Urbaszek\u003c/a\u003e at the \u003ca href=\"https://www.meetup.com/NYC-Apache-Airflow-Meetup/events/270483933/\" rel=\"nofollow\"\u003eOnline NYC Meetup, 13th of May 2020\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/4MCTXq-oF68\" rel=\"nofollow\"\u003eAirflow Breeze - Development and Test Environment for Apache Airflow\u003c/a\u003e \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/3f113f4f0b6648ad0798907e63dc49c793a3d27b53fa30e523334e97586b9c00/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f344d435458712d6f463638\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/3f113f4f0b6648ad0798907e63dc49c793a3d27b53fa30e523334e97586b9c00/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f344d435458712d6f463638\" alt=\"Activity badge\" data-canonical-src=\"https://img.shields.io/youtube/views/4MCTXq-oF68\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e - Screencast showing how to use Breeze environment by \u003ca href=\"https://github.com/potiuk\"\u003eJarek Potiuk\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLibraries, Hooks, Utilities\u003c/h2\u003e\u003ca id=\"user-content-libraries-hooks-utilities\" class=\"anchor\" aria-label=\"Permalink: Libraries, Hooks, Utilities\" href=\"#libraries-hooks-utilities\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Tauffer-Consulting/domino\"\u003eDomino\u003c/a\u003e - Domino is an open source Graphical User Interface platform for creating data and Machine Learning workflows (DAGs) with no-code, visually intuitive drag-and-drop actions. It is also a standard for publishing and sharing your Python code so it can be automatically used by anyone, directly in the GUI.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/xnuinside/airflow-helper\"\u003eAirflow-Helper\u003c/a\u003e - setting up Airflow Variables, Connections, and Pools from a YAML configuration file.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ryanchao2012/airfly\"\u003eAirFly\u003c/a\u003e - Auto generate Airflow's dag.py on the fly.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/digitalearthafrica/deafrica-airflow\"\u003eDEAfrica Airflow\u003c/a\u003e - Airflow libraries used by \u003ca href=\"https://digitalearthafrica.org/\" rel=\"nofollow\"\u003eDigital Earth Africa\u003c/a\u003e, an humanitarian effort to utilize satellite imagery of Africa.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/airflow-plugins/\"\u003eAirflow plugins\u003c/a\u003e - Central collection of repositories of various plugins for Airflow, including mailchimp, trello, sftp, GitHub, etc.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/industrydive/fileflow\"\u003efileflow\u003c/a\u003e - Collection of modules to support large data transfers between Airflow operators through either local file system or S3. This addresses a gap where data is too large for XCOMs but too small or inconvenient for loading directly in the operator. Built by \u003ca href=\"https://www.industrydive.com/\" rel=\"nofollow\"\u003eIndustry Dive\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/michaelosthege/fairflow\"\u003efairflow\u003c/a\u003e - Library to abstract away Airflow's Operators with functional pieces that transform the data from one operator to another.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/teamclairvoyant/airflow-maintenance-dags\"\u003eairflow-maintenance-dags\u003c/a\u003e - \u003ca href=\"http://clairvoyantsoft.com/\" rel=\"nofollow\"\u003eClairvoyant\u003c/a\u003e has a repo of Airflow DAGs that operator on Airflow itself, clearing out various bits of the backing metadata store.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gist.github.com/criccomini/2862667822af7fae8b55682faef029a7\"\u003etest_dags\u003c/a\u003e - a more complete solution for DAG integrity tests (\u003ca href=\"https://medium.com/@ingwbaa/datas-inferno-7-circles-of-data-testing-hell-with-airflow-cef4adff58d8\" rel=\"nofollow\"\u003efirst Circle of Data’s Inferno are the first\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ajbosco/dag-factory\"\u003edag-factory\u003c/a\u003e - A library for dynamically generating Apache Airflow DAGs from YAML configuration files.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/godatadriven/whirl\"\u003ewhirl\u003c/a\u003e - Fast iterative local development and testing of Apache Airflow workflows.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/andreax79/airflow-code-editor\"\u003eairflow-code-editor\u003c/a\u003e - A plugin for Apache Airflow that allows you to edit DAGs in browser.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BasPH/pylint-airflow\"\u003ePylint-Airflow\u003c/a\u003e - A Pylint plugin for static code analysis on Airflow code.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/qubole/afctl\"\u003eafctl\u003c/a\u003e - A CLI tool that includes everything required to create, manage and deploy airflow projects faster and smoother.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ms32035/airflow-dag-dependencies\"\u003eDag Dependencies viewer\u003c/a\u003e - A plugin which creates a view to visualize dependencies between the Airflow DAGs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/asandeep/airflow-ecr-plugin\"\u003eAirflow ECR Plugin\u003c/a\u003e - Plugin to refresh AWS ECR login token at regular intervals. This is helpful where DockerOperator needs to pull images hosted on ECR.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Javier162380/AirflowKuberentesDebugger\"\u003eAirflowK8sDebugger\u003c/a\u003e - A library for generate k8s pod yaml templates from an Airflow dag using the KubernetesPodOperator.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/GoogleCloudPlatform/oozie-to-airflow\"\u003eOozie to Airflow\u003c/a\u003e - A tool to easily convert between \u003ca href=\"http://oozie.apache.org/\" rel=\"nofollow\"\u003eApache Oozie\u003c/a\u003e workflows and Apache Airflow workflows.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/angadsingh/airflow-ditto\"\u003eAirflow Ditto\u003c/a\u003e - An extensible framework to do transformations to an Airflow DAG and convert it into another DAG which is flow-isomorphic with the original DAG, to be able to run it on different environments (e.g. on different clouds, or even different container frameworks - Apache Spark on YARN vs Kubernetes). Comes with out-of-the-box support for EMR-to-HDInsight-DAG transforms.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/chriscardillo/gusty\"\u003egusty\u003c/a\u003e - Create a DAG using any number of YAML, Python, Jupyter Notebook, or R Markdown files that represent individual tasks in the DAG. gusty also configures dependencies, DAGs, and TaskGroups, features support for your local operators, and more. A fully containerized demo is available \u003ca href=\"https://github.com/chriscardillo/gusty-demo\"\u003ehere\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meltano.com\" rel=\"nofollow\"\u003eMeltano\u003c/a\u003e - Open source, self-hosted, CLI-first, debuggable, and extensible ELT tool that embraces \u003ca href=\"https://www.singer.io\" rel=\"nofollow\"\u003eSinger\u003c/a\u003e for extraction and loading, leverages \u003ca href=\"https://www.getdbt.com\" rel=\"nofollow\"\u003edbt\u003c/a\u003e for transformation, and \u003ca href=\"https://meltano.com/#orchestration\" rel=\"nofollow\"\u003eintegrates with Airflow for orchestration\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/politools/dag-checks\"\u003eDAG checks\u003c/a\u003e - The dag-checks consist of checks that can help you in maintaining your Apache Airflow instance.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/covid-genomics/airflow-dvc\"\u003eAirflow DVC plugin\u003c/a\u003e - Plugin for open-source version-control system for data science and Machine Learning pipelines - \u003ca href=\"https://dvc.org/\" rel=\"nofollow\"\u003eDVC\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/omerzamir/airflow-vars\"\u003eAirflow Vars\u003c/a\u003e - A CLI for variables management, created for CD-Pipelines in order to allow robust and safe variables management.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/airflow-laminar/airflow-priority\"\u003eairflow-priority\u003c/a\u003e - Priority Tags (P1, P2, etc) for Airflow DAGs with automated alerting to Datadog, New Relic, Slack, Discord, and more\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/airflow-laminar/airflow-config\"\u003eairflow-config\u003c/a\u003e - \u003ca href=\"https://pydantic.dev\" rel=\"nofollow\"\u003ePydantic\u003c/a\u003e / \u003ca href=\"https://hydra.cc\" rel=\"nofollow\"\u003eHydra\u003c/a\u003e based configuration system for DAG and Task arguments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/airflow-laminar/airflow-supervisor\"\u003eairflow-supervisor\u003c/a\u003e - Easy-to-use \u003ca href=\"http://supervisord.org\" rel=\"nofollow\"\u003esupervisor\u003c/a\u003e integration for long running or \"always on\" DAGs\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMeetups\u003c/h2\u003e\u003ca id=\"user-content-meetups\" class=\"anchor\" aria-label=\"Permalink: Meetups\" href=\"#meetups\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/Amsterdam-Airflow-meetup\" rel=\"nofollow\"\u003eAmsterdam Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/Bangalore-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003eBangalore Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/Bay-Area-Apache-Airflow-Incubating-Meetup\" rel=\"nofollow\"\u003eBay Area Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/London-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003eLondon Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/Melbourne-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003eMelbourne Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/NYC-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003eNew York City Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/Paris-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003eParis Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/Portland-Apache-Airflow-Meetup/\" rel=\"nofollow\"\u003ePortland Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/Tokyo-Apache-Airflow-incubating-Meetup/\" rel=\"nofollow\"\u003eTokyo Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meetup.com/Warsaw-Airflow-Meetup\" rel=\"nofollow\"\u003eWarsaw Apache Airflow Meetup\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCommercial Airflow-as-a-service providers\u003c/h2\u003e\u003ca id=\"user-content-commercial-airflow-as-a-service-providers\" class=\"anchor\" aria-label=\"Permalink: Commercial Airflow-as-a-service providers\" href=\"#commercial-airflow-as-a-service-providers\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://cloud.google.com/composer/\" rel=\"nofollow\"\u003eGoogle Cloud Composer\u003c/a\u003e - Google Cloud Composer is a managed service built atop Google Cloud and Airflow.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://docs.qubole.com/en/latest/user-guide/airflow/\" rel=\"nofollow\"\u003eQubole\u003c/a\u003e - Qubole is mainly known as a service-and-support company for Apache Hive, but also provides Airflow as a component of its platform.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.astronomer.io/\" rel=\"nofollow\"\u003eAstronomer.io\u003c/a\u003e - Astronomer provides complete ETL lifecycle solutions and appears to be entirely focused on providing Airflow-based products.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aws.amazon.com/managed-workflows-for-apache-airflow/\" rel=\"nofollow\"\u003eAWS MWAA\u003c/a\u003e - Amazon Managed Workflows for Apache Airflow (MWAA) is a managed orchestration service for Apache Airflow that makes it easier to set up and operate end-to-end data pipelines in the cloud at scale.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCloud Composer resources\u003c/h2\u003e\u003ca id=\"user-content-cloud-composer-resources\" class=\"anchor\" aria-label=\"Permalink: Cloud Composer resources\" href=\"#cloud-composer-resources\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eThis section contains articles that apply to \u003ca href=\"https://cloud.google.com/composer\" rel=\"nofollow\"\u003eCloud Composer\u003c/a\u003e — a service built by Google Cloud based on Apache Airflow. Tricks and solutions are described here that are intended for Cloud Composer, but may be applicable to vanilla Airflow.\u003c/em\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/traveloka-engineering/enabling-autoscaling-in-google-cloud-composer-ac84d3ddd60\" rel=\"nofollow\"\u003eEnabling Autoscaling in Google Cloud Composer\u003c/a\u003e - Supercharge your Cloud Composer deployment while saving up some cost during idle periods.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cloud.google.com/blog/products/data-analytics/scale-your-composer-environment-together-your-business\" rel=\"nofollow\"\u003eScale your Composer environment together with your business\u003c/a\u003e - The Celery Executor architecture and ways to ensure high scheduler performance.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/politools/airflow-pianka-sh\"\u003epianka.sh\u003c/a\u003e - Missing command in the gcloud tool. This tool facilitates some administrative tasks.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/swlh/the-smarter-way-of-scaling-with-composers-airflow-scheduler-on-gke-88619238c77b\" rel=\"nofollow\"\u003eThe Smarter Way of Scaling With Composer’s Airflow Scheduler on GKE\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/roy-berkowitz-19922aa9/\" rel=\"nofollow\"\u003eRoy Berkowitz\u003c/a\u003e discusses more effective use of nodes in the Cloud Composer service.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cloud.google.com/blog/products/data-analytics/easier-management-for-cloud-etl-elt-pipelines\" rel=\"nofollow\"\u003eBetter together: orchestrating your Data Fusion pipelines with Cloud Composer\u003c/a\u003e - \u003ca href=\"https://www.linkedin.com/in/rachael-deacon-smith-82660172\" rel=\"nofollow\"\u003eRachael Deacon-Smith\u003c/a\u003e provides an overview of the operator for Datafusion use case on Cloud Composer.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNon-English resources\u003c/h2\u003e\u003ca id=\"user-content-non-english-resources\" class=\"anchor\" aria-label=\"Permalink: Non-English resources\" href=\"#non-english-resources\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://airflow.apachecn.org\" rel=\"nofollow\"\u003eAirflow Documentation-Chinese\u003c/a\u003e - (🇨🇳Chinese) \u003ca href=\"https://github.com/apachecn\"\u003eApachecn\u003c/a\u003e has translated the Airflow official documentation.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://ncrocfer.github.io/posts/gestion-de-taches-avec-apache-airflow/\" rel=\"nofollow\"\u003eGestion de Tâches avec Apache Airflow\u003c/a\u003e - (🇫🇷French) \u003ca href=\"https://github.com/ncrocfer\"\u003eNicolas Crocfer\u003c/a\u003e - Overview of Airflow, basic concepts and how to write and trigger a DAG.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://qiita.com/hankehly/items/1f02a34740276d1b8f0f\" rel=\"nofollow\"\u003eAirflowはすごいぞ!100行未満で本格的なデータパイプライン\u003c/a\u003e - (🇯🇵Japanese) \u003ca href=\"https://github.com/hankehly\"\u003eHank Ehly\u003c/a\u003e gives a comprehensive introduction to Airflow's main concepts, and demonstrates how to create a data pipeline in less than 100 lines of code.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://sekailab.com/wp/2018/04/05/apache-airflow-multinode-alpine-docker-image/\" rel=\"nofollow\"\u003eapache airflow 複数worker構成のalpine版docker imageを作った\u003c/a\u003e - (🇯🇵Japanese) \u003ca href=\"https://github.com/Drunkar\"\u003eAkio Ohta\u003c/a\u003e walks through his \u003ca href=\"https://hub.docker.com/r/drunkar/airflow-alpine/\" rel=\"nofollow\"\u003eDocker image\u003c/a\u003e for deploying an Alpine-based Airflow system.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://qiita.com/hankehly/items/5e2493cdf2c95ae42449\" rel=\"nofollow\"\u003eAirflowのタスクログをS3に保存する方法\u003c/a\u003e - (🇯🇵Japanese) \u003ca href=\"https://github.com/hankehly\"\u003eHank Ehly\u003c/a\u003e shows step-by-step how to configure sending task logs to AWS S3.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://qiita.com/hankehly/items/f525465bba8b47da0b76\" rel=\"nofollow\"\u003e【徹底解説】Airflow Fluentd Elasticsearch Docker の連携方法\u003c/a\u003e - (🇯🇵Japanese) \u003ca href=\"https://github.com/hankehly\"\u003eHank Ehly\u003c/a\u003e describes how to handle worker task logs with Fluentd, Elasticsearch and Docker.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.solita.fi/blogit/apache-airflow-kaikki-mita-meilla-on-lahtee-dageista/\" rel=\"nofollow\"\u003eApache Airflow – Kaikki Mitä Meillä On, Lähtee Dageista\u003c/a\u003e - (🇫🇮Finnish) \u003ca href=\"https://www.linkedin.com/in/oiivonen/\" rel=\"nofollow\"\u003eOlli Iivonen\u003c/a\u003e's overview of Airflow, concepts and Airflow's usage at \u003ca href=\"https://www.solita.fi/\" rel=\"nofollow\"\u003eSolita\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://speakerdeck.com/gilsondev/airflow-automatizando-seu-fluxo-de-trabalho\" rel=\"nofollow\"\u003eAirflow - Automatizando seu fluxo de trabalho\u003c/a\u003e - (🇧🇷Portuguese) \u003ca href=\"https://github.com/gilsondev\"\u003eGilson Filho\u003c/a\u003e's overview of Airflow, concept and basic use.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://imamdigmi.github.io/post/tutorial-airflow-part-1/\" rel=\"nofollow\"\u003ePanduan Dasar Apache Airflow\u003c/a\u003e - (🇮🇩Indonesian) \u003ca href=\"https://github.com/imamdigmi\"\u003eImam Digmi\u003c/a\u003e - Overview of Airflow, concept, basic use with use case.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.duyet.net/tag/airflow\" rel=\"nofollow\"\u003eAirflow\u003c/a\u003e - (🇻🇳Vietnamese) \u003ca href=\"https://github.com/duyet\"\u003eDuyet Le\u003c/a\u003e - Overview of Airflow, concept, basic use with use case.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.csdn.net/Young2018/article/details/109105370?spm=1001.2014.3001.5501\" rel=\"nofollow\"\u003eMichael Yang's Airflow Chinese Blog Posts\u003c/a\u003e - Michael Yang's Chinese blog posts about data engineering with Apache Airflow, conclude basic tutorials and devops skills.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSample projects\u003c/h2\u003e\u003ca id=\"user-content-sample-projects\" class=\"anchor\" aria-label=\"Permalink: Sample projects\" href=\"#sample-projects\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/GoogleCloudPlatform/public-datasets-pipelines\"\u003eGoogle Cloud Platform Public Datasets Pipelines\u003c/a\u003e - Cloud-native, data pipeline architecture for onboarding datasets to the Google Cloud Public Datasets Program.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gitlab.com/gitlab-data/analytics/-/tree/master/dags\" rel=\"nofollow\"\u003eGitLab Data Team DAGs\u003c/a\u003e - Several DAGs used to build analytics for the GitLab platform.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hankehly/deploy-airflow-on-ecs-fargate\"\u003edeploy-airflow-on-ecs-fargate\u003c/a\u003e - Deploy to Amazon ECS Fargate. Demonstrates various features and configurations, such as autoscaling workers to zero, S3 remote logging and secret management.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLicense\u003c/h2\u003e\u003ca id=\"user-content-license\" class=\"anchor\" aria-label=\"Permalink: License\" href=\"#license\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://creativecommons.org/publicdomain/zero/1.0/\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/d5272b3949a219a6304a1d6478f1fd3015c0533821c885522f6a4f11a9297b0a/687474703a2f2f6d6972726f72732e6372656174697665636f6d6d6f6e732e6f72672f70726573736b69742f627574746f6e732f38387833312f7376672f63632d7a65726f2e737667\" alt=\"CC0\" data-canonical-src=\"http://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo the extent possible under law, \u003ca href=\"https://github.com/jghoman\"\u003eJakob Homan\u003c/a\u003e has waived all copyright and related or neighboring rights to this work.\u003c/p\u003e\n\u003c/article\u003e","loaded":true,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":[{"level":1,"text":"Awesome Apache Airflow","anchor":"awesome-apache-airflow","htmlText":"Awesome Apache Airflow"},{"level":2,"text":"Contents","anchor":"contents","htmlText":"Contents"},{"level":2,"text":"Vital links","anchor":"vital-links","htmlText":"Vital links"},{"level":2,"text":"Airflow deployment solutions","anchor":"airflow-deployment-solutions","htmlText":"Airflow deployment solutions"},{"level":2,"text":"Introductions and tutorials","anchor":"introductions-and-tutorials","htmlText":"Introductions and tutorials"},{"level":2,"text":"Airflow Summit 2020 videos","anchor":"airflow-summit-2020-videos","htmlText":"Airflow Summit 2020 videos"},{"level":2,"text":"Best practices, lessons learned and cool use cases","anchor":"best-practices-lessons-learned-and-cool-use-cases","htmlText":"Best practices, lessons learned and cool use cases"},{"level":2,"text":"Books, blogs, podcasts, and such","anchor":"books-blogs-podcasts-and-such","htmlText":"Books, blogs, podcasts, and such"},{"level":2,"text":"Slide deck presentations and online videos","anchor":"slide-deck-presentations-and-online-videos","htmlText":"Slide deck presentations and online videos"},{"level":2,"text":"Libraries, Hooks, Utilities","anchor":"libraries-hooks-utilities","htmlText":"Libraries, Hooks, Utilities"},{"level":2,"text":"Meetups","anchor":"meetups","htmlText":"Meetups"},{"level":2,"text":"Commercial Airflow-as-a-service providers","anchor":"commercial-airflow-as-a-service-providers","htmlText":"Commercial Airflow-as-a-service providers"},{"level":2,"text":"Cloud Composer resources","anchor":"cloud-composer-resources","htmlText":"Cloud Composer resources"},{"level":2,"text":"Non-English resources","anchor":"non-english-resources","htmlText":"Non-English resources"},{"level":2,"text":"Sample projects","anchor":"sample-projects","htmlText":"Sample projects"},{"level":2,"text":"License","anchor":"license","htmlText":"License"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fjghoman%2Fawesome-apache-airflow"}}],"overviewFilesProcessingTime":0}},"appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-7d7eb7c71814.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-96e76d5fdb2c.js","githubDevUrl":null,"enabled_features":{"copilot_workspace":null,"code_nav_ui_events":false,"overview_shared_code_dropdown_button":false,"react_blob_overlay":false,"accessible_code_button":true,"github_models_repo_integration":false}}}}</script> <div data-target="react-partial.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.iVEunk{margin-top:16px;margin-bottom:16px;}/*!sc*/ .jzuOtQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .bGojzy{margin-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;row-gap:16px;}/*!sc*/ .iNSVHo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-bottom:16px;padding-top:8px;}/*!sc*/ .bVgnfw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:8px;}/*!sc*/ @media screen and (max-width:320px){.bVgnfw{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .CEgMp{position:relative;}/*!sc*/ @media screen and (max-width:380px){.CEgMp .ref-selector-button-text-container{max-width:80px;}}/*!sc*/ @media screen and (max-width:320px){.CEgMp{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.CEgMp .overview-ref-selector{width:100%;}.CEgMp .overview-ref-selector > span{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;}.CEgMp .overview-ref-selector > span > span[data-component="text"]{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .gMOVLe[data-size="medium"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;}/*!sc*/ .gMOVLe[data-size="medium"] svg{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gMOVLe[data-size="medium"] > span{width:inherit;}/*!sc*/ .gUkoLg{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .bZBlpz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .lhTYNA{margin-right:4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ffLUq{font-size:14px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*!sc*/ .bmcJak{min-width:0;}/*!sc*/ .fLXEGX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1079px){.fLXEGX{display:none;}}/*!sc*/ .lmSMZJ[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-left:4px;padding-right:4px;}/*!sc*/ .lmSMZJ[data-size="medium"] span[data-component="leadingVisual"]{margin-right:4px !important;}/*!sc*/ .dqfxud{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1080px){.dqfxud{display:none;}}/*!sc*/ @media screen and (max-width:543px){.dqfxud{display:none;}}/*!sc*/ .fGwBZA[data-size="medium"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .jxTzTd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;gap:8px;}/*!sc*/ .gqqBXN{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:8px;}/*!sc*/ @media screen and (max-width:543px){.gqqBXN{display:none;}}/*!sc*/ .dzXgxt{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1011px){.dzXgxt{display:none;}}/*!sc*/ .iWFGlI{margin-left:8px;margin-right:8px;margin:0;}/*!sc*/ .vcvyP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .YUPas{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1012px){.YUPas{display:none;}}/*!sc*/ .izFOf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:544px){.izFOf{display:none;}}/*!sc*/ .vIPPs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:16px;}/*!sc*/ .fdROMU{width:100%;border-collapse:separate;border-spacing:0;border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;table-layout:fixed;overflow:unset;}/*!sc*/ .jGKpsv{height:0px;line-height:0px;}/*!sc*/ .jGKpsv tr{height:0px;font-size:0px;}/*!sc*/ .jdgHnn{padding:16px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;text-align:left;height:40px;}/*!sc*/ .jdgHnn th{padding-left:16px;background-color:var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa));}/*!sc*/ .bQivRW{width:100%;border-top-left-radius:6px;}/*!sc*/ @media screen and (min-width:544px){.bQivRW{display:none;}}/*!sc*/ .ldkMIO{width:40%;border-top-left-radius:6px;}/*!sc*/ @media screen and (max-width:543px){.ldkMIO{display:none;}}/*!sc*/ .jMbWeI{text-align:right;padding-right:16px;width:136px;border-top-right-radius:6px;}/*!sc*/ .gpqjiB{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;height:40px;}/*!sc*/ .dzCJzi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:273px;padding:8px;}/*!sc*/ @media screen and (min-width:544px){.dzCJzi{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}/*!sc*/ .eNCcrz{text-align:center;vertical-align:center;height:40px;border-top:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));}/*!sc*/ .bHTcCe{border-top:1px solid var(--borderColor-default,var(--color-border-default));cursor:pointer;}/*!sc*/ .csrIcr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;gap:16px;}/*!sc*/ .bUQNHB{border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ @media screen and (max-width:543px){.bUQNHB{margin-left:-16px;margin-right:-16px;max-width:calc(100% + 32px);}}/*!sc*/ @media screen and (min-width:544px){.bUQNHB{max-width:100%;}}/*!sc*/ .jPdcfu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:1px solid;border-bottom-color:var(--borderColor-default,var(--color-border-default,#d0d7de));-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:8px;position:-webkit-sticky;position:sticky;top:0;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));z-index:1;border-top-left-radius:6px;border-top-right-radius:6px;}/*!sc*/ .iphEWz{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-bottom:none;max-width:100%;padding-left:8px;padding-right:8px;}/*!sc*/ .hUCRAk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .cwoBXV[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-subtle,#6e7781));padding-left:8px;padding-right:8px;}/*!sc*/ .QkQOb{padding:32px;overflow:auto;}/*!sc*/ data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"iVEunk,jzuOtQ,bGojzy,iNSVHo,bVgnfw,CEgMp,gMOVLe,gUkoLg,bZBlpz,lhTYNA,ffLUq,bmcJak,fLXEGX,lmSMZJ,dqfxud,fGwBZA,jxTzTd,gqqBXN,dzXgxt,iWFGlI,vcvyP,YUPas,izFOf,vIPPs,fdROMU,jGKpsv,jdgHnn,bQivRW,ldkMIO,jMbWeI,gpqjiB,dzCJzi,eNCcrz,bHTcCe,csrIcr,bUQNHB,jPdcfu,iphEWz,hUCRAk,cwoBXV,QkQOb,"}/*!sc*/ .brGdpi{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);white-space:nowrap;border-width:0;}/*!sc*/ data-styled.g5[id="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0"]{content:"brGdpi,"}/*!sc*/ .hWlpPn{position:relative;display:inline-block;}/*!sc*/ .hWlpPn::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--tooltip-fgColor,var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)));text-align:center;-webkit-text-decoration:none;text-decoration:none;text-shadow:none;text-transform:none;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:var(--tooltip-bgColor,var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f)));border-radius:6px;opacity:0;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .hWlpPn:hover::after,.hWlpPn:active::after,.hWlpPn:focus::after,.hWlpPn:focus-within::after{display:inline-block;-webkit-text-decoration:none;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-no-delay:hover::after,.hWlpPn.tooltipped-no-delay:active::after,.hWlpPn.tooltipped-no-delay:focus::after,.hWlpPn.tooltipped-no-delay:focus-within::after{-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-multiline:hover::after,.hWlpPn.tooltipped-multiline:active::after,.hWlpPn.tooltipped-multiline:focus::after,.hWlpPn.tooltipped-multiline:focus-within::after{display:table-cell;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-se::after,.hWlpPn.tooltipped-sw::after{top:100%;right:50%;margin-top:6px;}/*!sc*/ .hWlpPn.tooltipped-se::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-sw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-n::after,.hWlpPn.tooltipped-ne::after,.hWlpPn.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px;}/*!sc*/ .hWlpPn.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-nw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-n::after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);}/*!sc*/ .hWlpPn.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate;}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-s::after,.hWlpPn.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-w::after,.hWlpPn.tooltipped-multiline.tooltipped-e::after{right:100%;}/*!sc*/ .hWlpPn.tooltipped-align-right-2::after{right:0;margin-right:0;}/*!sc*/ .hWlpPn.tooltipped-align-left-2::after{left:0;margin-left:0;}/*!sc*/ data-styled.g16[id="Tooltip__TooltipBase-sc-17tf59c-0"]{content:"hWlpPn,"}/*!sc*/ .liVpTx{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;max-width:125px;}/*!sc*/ data-styled.g18[id="Truncate__StyledTruncate-sc-23o1d2-0"]{content:"liVpTx,"}/*!sc*/ </style> <!-- --> <!-- --> <div class="Box-sc-g0xbh4-0 iVEunk"><div class="Box-sc-g0xbh4-0 jzuOtQ"><div class="Box-sc-g0xbh4-0 bGojzy"></div></div><div class="Box-sc-g0xbh4-0 iNSVHo"><div class="Box-sc-g0xbh4-0 bVgnfw"><div class="Box-sc-g0xbh4-0 CEgMp"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="Box-sc-g0xbh4-0 gMOVLe prc-Button-ButtonBase-c50BI overview-ref-selector width-full" data-loading="false" data-size="medium" data-variant="default" aria-describedby="branch-picker-repos-header-ref-selector-loading-announcement" id="branch-picker-repos-header-ref-selector"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"><span class="Box-sc-g0xbh4-0 bmcJak prc-Text-Text-0ima0"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 fLXEGX"><a style="--button-color:fg.muted" type="button" href="/jghoman/awesome-apache-airflow/branches" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rclab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Branches</span></span></a><a style="--button-color:fg.muted" type="button" href="/jghoman/awesome-apache-airflow/tags" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rklab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Tags</span></span></a></div><div class="Box-sc-g0xbh4-0 dqfxud"><a style="--button-color:fg.muted" type="button" aria-label="Go to Branches page" href="/jghoman/awesome-apache-airflow/branches" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Relab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></a><a style="--button-color:fg.muted" type="button" aria-label="Go to Tags page" href="/jghoman/awesome-apache-airflow/tags" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Rmlab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></a></div></div><div class="Box-sc-g0xbh4-0 jxTzTd"><div class="Box-sc-g0xbh4-0 gqqBXN"><div class="Box-sc-g0xbh4-0 dzXgxt"><!--$--><div class="Box-sc-g0xbh4-0 iWFGlI"><span class="Box-sc-g0xbh4-0 vcvyP TextInput-wrapper prc-components-TextInputWrapper-i1ofR prc-components-TextInputBaseWrapper-ueK9q" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id=":R2j5ab:" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellcheck="false" placeholder="Go to file" aria-describedby=":R2j5ab: :R2j5abH1:" data-component="input" class="prc-components-Input-Ic-y8" value=""/><span class="TextInput-icon" id=":R2j5abH1:" aria-hidden="true"></span></span></div><!--/$--></div><div class="Box-sc-g0xbh4-0 YUPas"><button type="button" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":Rr5ab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x">Go to file</span></span></button></div><div class="react-directory-add-file-icon"></div><div class="react-directory-remove-file-icon"></div></div><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="primary" aria-describedby=":R55ab:-loading-announcement" id=":R55ab:"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-code hide-sm" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Code</span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="Box-sc-g0xbh4-0 izFOf"><button data-component="IconButton" type="button" aria-label="Open more actions menu" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":R75ab:-loading-announcement" id=":R75ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button></div></div></div><div class="Box-sc-g0xbh4-0 vIPPs"><div data-hpc="true"><button hidden="" data-testid="focus-next-element-button" data-hotkey="j"></button><button hidden="" data-testid="focus-previous-element-button" data-hotkey="k"></button><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="folders-and-files">Folders and files</h2><table aria-labelledby="folders-and-files" class="Box-sc-g0xbh4-0 fdROMU"><thead class="Box-sc-g0xbh4-0 jGKpsv"><tr class="Box-sc-g0xbh4-0 jdgHnn"><th colSpan="2" class="Box-sc-g0xbh4-0 bQivRW"><span class="text-bold">Name</span></th><th colSpan="1" class="Box-sc-g0xbh4-0 ldkMIO"><span class="text-bold">Name</span></th><th class="hide-sm"><div title="Last commit message" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit message</span></div></th><th colSpan="1" class="Box-sc-g0xbh4-0 jMbWeI"><div title="Last commit date" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit date</span></div></th></tr></thead><tbody><tr class="Box-sc-g0xbh4-0 gpqjiB"><td colSpan="3" class="bgColor-muted p-1 rounded-top-2"><div class="Box-sc-g0xbh4-0 dzCJzi"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">History</h2><a href="/jghoman/awesome-apache-airflow/commits/master/" class="prc-Button-ButtonBase-c50BI d-none d-lg-flex LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":Raqj8pab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x"><span class="fgColor-default">357 Commits</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="357 Commits" id="history-icon-button-tooltip" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><a href="/jghoman/awesome-apache-airflow/commits/master/" class="prc-Button-ButtonBase-c50BI LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":R1iqj8pab:-loading-announcement history-icon-button-tooltip"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></td></tr><tr class="react-directory-row undefined" id="folder-row-0"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-1"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CONTRIBUTING.md" aria-label="CONTRIBUTING.md, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CONTRIBUTING.md" aria-label="CONTRIBUTING.md, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-2"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-3"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="airflow-logo.png" aria-label="airflow-logo.png, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/airflow-logo.png">airflow-logo.png</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="airflow-logo.png" aria-label="airflow-logo.png, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/airflow-logo.png">airflow-logo.png</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-4"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="check-for-dead-links-config.json" aria-label="check-for-dead-links-config.json, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/check-for-dead-links-config.json">check-for-dead-links-config.json</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="check-for-dead-links-config.json" aria-label="check-for-dead-links-config.json, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/check-for-dead-links-config.json">check-for-dead-links-config.json</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-5"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="check-for-dead-links.sh" aria-label="check-for-dead-links.sh, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/check-for-dead-links.sh">check-for-dead-links.sh</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="check-for-dead-links.sh" aria-label="check-for-dead-links.sh, (File)" class="Link--primary" href="/jghoman/awesome-apache-airflow/blob/master/check-for-dead-links.sh">check-for-dead-links.sh</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="Box-sc-g0xbh4-0 eNCcrz d-none" data-testid="view-all-files-row"><td colSpan="3" class="Box-sc-g0xbh4-0 bHTcCe"><div><button class="prc-Link-Link-85e08">View all files</button></div></td></tr></tbody></table></div><div class="Box-sc-g0xbh4-0 csrIcr"><div class="Box-sc-g0xbh4-0 bUQNHB"><div itemscope="" itemType="https://schema.org/abstract" class="Box-sc-g0xbh4-0 jPdcfu"><h2 class="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0 brGdpi">Repository files navigation</h2><nav class="Box-sc-g0xbh4-0 iphEWz prc-components-UnderlineWrapper-oOh5J" aria-label="Repository files"><ul class="prc-components-UnderlineItemList-b23Hf" role="list"><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#" aria-current="page"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-book" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg></span><span data-component="text" data-content="README">README</span></a></li></ul></nav><button style="--button-color:fg.subtle" type="button" aria-label="Outline" aria-haspopup="true" aria-expanded="false" tabindex="0" class="Box-sc-g0xbh4-0 cwoBXV prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rr9ab:-loading-announcement" id=":Rr9ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button></div><div class="Box-sc-g0xbh4-0 QkQOb js-snippet-clipboard-copy-unpositioned undefined" data-hpc="true"><article class="markdown-body entry-content container-lg" itemprop="text"><p dir="auto"><a href="https://airflow.apache.org/" rel="nofollow"><img src="https://github.com/jghoman/awesome-apache-airflow/raw/master/airflow-logo.png" align="right" style="max-width: 100%;"></a></p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Awesome Apache Airflow</h1><a id="user-content-awesome-apache-airflow" class="anchor" aria-label="Permalink: Awesome Apache Airflow" href="#awesome-apache-airflow"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5474cff62c40607021eee94f9b25788447308793e98fd2b7611b0f72e798bebc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6a67686f6d616e2f617765736f6d652d6170616368652d616972666c6f772e737667"><img src="https://camo.githubusercontent.com/5474cff62c40607021eee94f9b25788447308793e98fd2b7611b0f72e798bebc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6a67686f6d616e2f617765736f6d652d6170616368652d616972666c6f772e737667" alt="contrib badge" data-canonical-src="https://img.shields.io/github/contributors/jghoman/awesome-apache-airflow.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3af800ad6c10a75e16976abfcf6131c8dd7e40356fe3274423abf9ff36601019/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6a67686f6d616e2f617765736f6d652d6170616368652d616972666c6f773f7374796c653d706c6173746963"><img src="https://camo.githubusercontent.com/3af800ad6c10a75e16976abfcf6131c8dd7e40356fe3274423abf9ff36601019/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f6a67686f6d616e2f617765736f6d652d6170616368652d616972666c6f773f7374796c653d706c6173746963" alt="GitHub commit activity" data-canonical-src="https://img.shields.io/github/commit-activity/m/jghoman/awesome-apache-airflow?style=plastic" style="max-width: 100%;"></a></p> <p dir="auto">This is a curated list of resources about <a href="https://airflow.apache.org/" rel="nofollow">Apache Airflow</a>. Please feel free to contribute any items that should be included. Items are generally added at the top of each section so that more fresh items are featured more prominently.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Contents</h2><a id="user-content-contents" class="anchor" aria-label="Permalink: Contents" href="#contents"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="#vital-links">Vital links</a></li> <li><a href="#airflow-deployment-solutions">Airflow deployment solutions</a></li> <li><a href="#introductions-and-tutorials">Introductions and tutorials</a></li> <li><a href="#airflow-summit-2020-videos">Airflow Summit 2020 Videos</a></li> <li><a href="#best-practices-lessons-learned-and-cool-use-cases">Best practices, lessons learned and cool use cases</a></li> <li><a href="#books-blogs-podcasts-and-such">Books, blogs, podcasts, and such</a></li> <li><a href="#slide-deck-presentations-and-online-videos">Slide deck presentations and online videos</a></li> <li><a href="#libraries-hooks-utilities">Libraries, Hooks, Utilities</a></li> <li><a href="#meetups">Meetups</a></li> <li><a href="#commercial-airflow-as-a-service-providers">Commercial Airflow-as-a-service providers</a></li> <li><a href="#cloud-composer-resources">Cloud Composer resources</a></li> <li><a href="#non-english-resources">Non-English resources</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Vital links</h2><a id="user-content-vital-links" class="anchor" aria-label="Permalink: Vital links" href="#vital-links"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://github.com/apache/airflow/">Source code</a> (latest stable release <a href="https://github.com/apache/airflow/tree/1.10.12">1.10.12</a>)</li> <li><a href="https://airflow.apache.org/" rel="nofollow">Documentation</a> (also the official website)</li> <li><a href="https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Home" rel="nofollow">Confluence page</a></li> <li><a href="https://twitter.com/ApacheAirflow" rel="nofollow"><img src="https://camo.githubusercontent.com/e188e27244e8a99fccc319b797488d00521a17fa5a4100dfa8b4f6b3374b5fdc/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f617061636865616972666c6f773f7374796c653d736f6369616c" alt="Twitter Follow" data-canonical-src="https://img.shields.io/twitter/follow/apacheairflow?style=social" style="max-width: 100%;"></a></li> <li><a href="https://apache-airflow-slack.herokuapp.com/" rel="nofollow">Slack workspace</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Airflow deployment solutions</h2><a id="user-content-airflow-deployment-solutions" class="anchor" aria-label="Permalink: Airflow deployment solutions" href="#airflow-deployment-solutions"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://github.com/KissConsult/Apache-Airflow">Installing Airflow on IBM Cloud</a> - Quick and easy deployment on IBM Cloud with IBM <a href="https://github.com/bitnami/charts">Bitnami Charts</a></li> <li><a href="https://fullstaq.com/blog/three-ways-to-run-airflow-on-kubernetes/" rel="nofollow">Three ways to run Airflow on Kubernetes</a> - <a href="https://www.linkedin.com/in/tim-van-de-keer-bb5a1966" rel="nofollow">Tim van de Keer</a> walks through several methods for deploying Airflow on Kubernetes.</li> <li><a href="https://azure.microsoft.com/en-us/blog/bitnami-apache-airflow-multi-tier-now-available-in-azure-marketplace/" rel="nofollow">Apache Airflow Multi-Tier Free Deployment on Azure</a> - A free Azure Resource Manager (ARM) template by Bitnami providing a one-click solution for Airflow deployment on Azure for production use-cases.</li> <li><a href="https://github.com/tekn0ir/airflow-chart">KubernetesExecutor Helm Chart</a> - A lean Helm Chart using the KubernetesExecutor for a more k8s native experience and complementary <a href="https://github.com/tekn0ir/airflow-docker">KubernetesExecutor Docker Image</a>.</li> <li><a href="https://github.com/helm/charts/tree/master/stable/airflow">Stable Celery Helm Chart</a> - Curated Helm Chart in the official stable chart repository.</li> <li><a href="https://github.com/puckel/docker-airflow">Puckel's Docker Image</a> - <a href="https://twitter.com/Puckel_" rel="nofollow">@Puckel_</a>'s well-crafted Docker image has become the base for many Airflow installations. It is regularly updated and closely tracks the official Apache releases.</li> <li><a href="https://github.com/GoogleCloudPlatform/airflow-operator">Kubernetes Custom Operator for Deploying Airflow</a> - Kubernetes Custom controller (also called operator pattern) for deploying Airflow on Kubernetes.</li> <li><a href="https://github.com/datagovsg/airflow-pipeline">airflow-pipeline</a> - Airflow Docker container that comes preconfigured for Spark and Hadoop. It can be docker pulled at <code>datagovsg/airflow-pipeline</code>.</li> <li><a href="https://github.com/villasv/aws-airflow-stack">aws-airflow-stack</a> - An AWS based Airflow cluster deployment with CeleryExecutor. Deploys after a few clicks with CloudFormation.</li> <li><a href="https://github.com/mumoshu/kube-airflow">kube-airflow</a> - This repository contains both an Airflow Docker image (that appears to have been based on Puckel's work) and Kubernetes service definition. <a href="https://github.com/mumoshu">mumoshu</a>'s repository has not been recently updated, but there are numerous forks that may be based on more recent releases.</li> <li><a href="https://github.com/rolanddb/airflow-on-kubernetes">airflow-on-kubernetes</a> - A guide on all relevant resources, scripts and projects that relate to running Airflow on Kubernetes.</li> <li><a href="https://github.com/EamonKeane/airflow-GKE-k8sExecutor-helm">airflow-k8s-executor-on-GKE</a> - A detailed tutorial to get a scalable, low maintenance airflow kubernetes executor environment deployed on <a href="https://cloud.google.com/kubernetes-engine/" rel="nofollow">Google Kubernetes Engine</a> with <a href="https://helm.sh/" rel="nofollow">helm</a>.</li> <li><a href="https://github.com/bahchis/airflow-cookbook">airflow-cookbook</a> - Chef cookbook for deploying Airflow.</li> <li><a href="http://agrajmangal.in/blog/big-data/running-airflow-on-top-of-apache-mesos/" rel="nofollow">Running Airflow on top of Apache Mesos</a> - Blog describing how to configure <a href="http://mesos.apache.org/" rel="nofollow">Mesos</a> to run all of the Airflow componenents.</li> <li><a href="https://medium.com/@mykolamykhalov/integrating-apache-airflow-with-apache-ambari-ccab2c90173" rel="nofollow">Integrating Apache Airflow with Apache Ambari</a> - <a href="https://www.linkedin.com/in/mykola-mykhalov-9079a8107/" rel="nofollow">Mykola Mykhalov</a> walks through using <a href="https://ambari.apache.org/" rel="nofollow">Apache Ambari</a> to configure and deploy an Airflow instance.</li> <li><a href="https://github.com/astronomerio/astronomer">Astronomer Platform</a> - Apache Airflow as a Service on Kubernetes. For more information visit <a href="https://www.astronomer.io" rel="nofollow">https://www.astronomer.io</a>.</li> <li><a href="https://github.com/bitnami/bitnami-docker-airflow">Bitnami Airflow Docker image</a> - A secure and up-to-date docker image for Airflow maintained by Bitnami.</li> <li><a href="https://github.com/bitnami/bitnami-docker-airflow-scheduler">Bitnami Airflow Scheduler Docker image</a> - A secure and up-to-date docker image for Airflow Scheduler maintained by Bitnami.</li> <li><a href="https://github.com/bitnami/bitnami-docker-airflow-worker">Bitnami Airflow Worker Docker image</a> - A secure and up-to-date docker image for Airflow Worker maintained by Bitnami. A CeleryExecutor docker-compose deployment is available <a href="https://github.com/bitnami/bitnami-docker-airflow-worker/blob/master/docker-compose.yml">here</a>.</li> <li><a href="https://github.com/msumit/airflow-pex">Distribute & deploy Apache Airflow via Python PEX files</a> - Example repo with steps to bundle, distribute, & deploy Apache Airflow as PEX files.</li> <li><a href="https://www.astronomer.io/blog/the-keda-autoscaler/" rel="nofollow">Introducing KEDA for Airflow</a> - How to use KEDA scaler system to enable autoscaling of celery workers based on data stored in the Airflow metadata database.</li> <li><a href="https://github.com/noelmcloughlin/airflow-component#lightweight-federated-apache-airflow-installer">Airflow-Component</a> - Lightweight installer of federated Airflow-Airflow (RabbitMQ) reference architectrure on Compute node(s).</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Introductions and tutorials</h2><a id="user-content-introductions-and-tutorials" class="anchor" aria-label="Permalink: Introductions and tutorials" href="#introductions-and-tutorials"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://youtu.be/xyeR_uFhnD4" rel="nofollow">Apache Airflow Monitoring Metrics</a> - A two-part series by <a href="https://maxcotec.com" rel="nofollow">maxcotec</a> on how you can utilize existing Airflow statsd metrics to monitor your airflow deployment on Grafana dashboard via Prometheus. Also learn how to create custom metrics.</li> <li><a href="https://www.youtube.com/playlist?list=PLzKRcZrsJN_xcKKyKn18K7sWu5TTtdywh" rel="nofollow">Introduction to Airflow</a> - A web tutorial series by <a href="https://maxcotec.com" rel="nofollow">maxcotec</a> for beginners and intermediate users of Apache Airflow.</li> <li><a href="https://github.com/KimaruThagna/ml-pipelines-airflow">ETL with Apache Airflow for Data Analysis on Transaction Data</a>. <a href="https://www.linkedin.com/in/kimaru-thagana-4920b5181/" rel="nofollow">Kimaru Thagana</a> covers a practical case of doing an ETL process using Apache Airflow using a dummy ecommerce store's transactional, user and product data. The data is served via a flask API.</li> <li><a href="https://blog.delaplex.com/start-building-better-data-pipelines-with-apache-airflow" rel="nofollow">Start Building Better Data Pipelines With apache Airflow</a> 2020-Oct - Naman Gupta covers the basics of Airflow and its concepts.</li> <li><a href="https://github.com/soggycactus/airflow-repo-template">Airflow Repository Template</a> - A boilerplate repository for developing locally with Airflow, with linting & tests for valid DAGs and plugins. Just clone and run <code>make start-airflow</code> to get started! Add some CI jobs to deploy your code and you're done.</li> <li><a href="https://blog.sicara.com/using-airflow-with-celery-workers-54cb5212d405" rel="nofollow">How Apache Airflow Distributes Jobs on Celery workers</a> - A short description of the steps taken by a task instance, from scheduling to success, in a distributed architecture.</li> <li><a href="https://medium.com/@tamizhgeek/remote-spark-submit-toyarn-running-on-emr-9804b89d82d2" rel="nofollow">Remote spark-submit to YARN running on EMR</a> - <a href="https://github.com/tamizhgeek">Azhaguselvan</a> walks through submitting Spark jobs to existing EMR clusters with Airflow.</li> <li><a href="http://agrajmangal.in/blog/big-data/running-airflow-on-top-of-apache-mesos/" rel="nofollow">Running Airflow on top of Apache Mesos</a> and its follow-up, <a href="http://agrajmangal.in/blog/big-data/mesos-airflow-docker/" rel="nofollow">Mesos, Airflow & Docker</a> by <a href="https://twitter.com/agrajm" rel="nofollow">Agraj Mangal</a> is a quick overview of running Airflow atop Apache Mesos.</li> <li><a href="https://twitter.com/corrcoef" rel="nofollow">Dustin Stansbury</a> of <a href="https://quizlet.com/" rel="nofollow">Quizlet</a> has written a four-part series that covers what workflow managers do in general, how Quizlet picked Airflow, a tour of Airflow's key concepts, and how Quizlet is now using Airflow in practice: <ul dir="auto"> <li><a href="https://medium.com/@dustinstansbury/beyond-cron-an-introduction-to-workflow-management-systems-19987afcdb5e" rel="nofollow">Beyond CRON: an introduction to Workflow Management Systems</a></li> <li><a href="https://towardsdatascience.com/why-quizlet-chose-apache-airflow-for-executing-data-workflows-3f97d40e9571" rel="nofollow">Why Quizlet chose Apache Airflow for executing data workflows</a></li> <li><a href="https://medium.com/@dustinstansbury/understanding-apache-airflows-key-concepts-a96efed52b1a" rel="nofollow">Understanding Apache Airflow’s key concepts</a></li> <li><a href="https://medium.com/@dustinstansbury/how-quizlet-uses-apache-airflow-in-practice-a903cbb5626d" rel="nofollow">How Quizlet uses Apache Airflow in practice</a></li> </ul> </li> <li><a href="https://databricks.com/blog/2017/07/19/integrating-apache-airflow-with-databricks.html" rel="nofollow">Integrating Apache Airflow with Databricks</a> - While this tutorial is focused specifically on Databricks' Spark solutions, it does have a reasonable overview of Airflow basics and demonstrates how a third party solution can quickly integrate into Airflow.</li> <li><a href="https://turbaszek.medium.com/apache-airflow-2-0-tutorial-41329bbf7211" rel="nofollow">Apache Airflow 2.0 Tutorial</a> - This article discusses the basic concepts that stand behind Airflow and discusses the problems it solves.</li> <li><a href="https://blog.godatadriven.com/testing-and-debugging-apache-airflow" rel="nofollow">Testing and debugging Apache Airflow</a> - Article explaining how to apply unit testing, mocking and debugging to Airflow code.</li> <li><a href="http://michal.karzynski.pl/blog/2017/03/19/developing-workflows-with-apache-airflow/" rel="nofollow">Get started developing workflows with Apache Airflow</a> - This brief introductory tutorial covers how to create data pipeline and processing workflow using DAG, operators, Sensor, using Xcoms to communicate between operators.</li> <li><a href="https://medium.com/@junjiejiang94/get-started-with-airflow-google-cloud-platform-docker-a21c46e0f797" rel="nofollow">Get started with Airflow + Google Cloud Platform + Docker</a> - Step-by-step introduction by <a href="https://medium.com/@junjiejiang94" rel="nofollow">Jayce Jiang</a>.</li> <li><a href="https://blog.magrathealabs.com/how-to-develop-data-pipeline-in-airflow-through-tdd-test-driven-development-c3333439f358" rel="nofollow">How to develop data pipeline in Airflow through TDD (test-driven development)</a> - Learn how to build a sales data pipeline using TDD step-by-step and in the end how to configure a simple CI workflow using Github Actions.</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Airflow Summit 2020 videos</h2><a id="user-content-airflow-summit-2020-videos" class="anchor" aria-label="Permalink: Airflow Summit 2020 videos" href="#airflow-summit-2020-videos"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><em>The first <a href="https://airflowsummit.org/" rel="nofollow">Airflow Summit 2020</a> was held in July 2020. It was a truly global, fully online event that was co-hosted by 9 Airflow Meetups from all over the world (<a href="https://www.meetup.com/Melbourne-Apache-Airflow-Meetup/" rel="nofollow">Melbourne</a>, <a href="https://www.meetup.com/Tokyo-Apache-Airflow-incubating-Meetup" rel="nofollow">Tokyo</a>, <a href="https://www.meetup.com/Bangalore-Apache-Airflow-Meetup/" rel="nofollow">Bangalore</a>, <a href="https://www.meetup.com/Warsaw-Airflow-Meetup/" rel="nofollow">Warsaw</a>, <a href="https://www.meetup.com/Amsterdam-Airflow-meetup/" rel="nofollow">Amsterdam</a>, <a href="https://www.meetup.com/London-Apache-Airflow-Meetup/" rel="nofollow">London</a>, <a href="https://www.meetup.com/NYC-Apache-Airflow-Meetup/" rel="nofollow">NYC</a>, <a href="https://www.meetup.com/Bay-Area-Apache-Airflow-Incubating-Meetup/" rel="nofollow">BayArea</a>).</em></p> <p dir="auto"><em>It featured 40+ talks and three workshops. You can check out the talk recordings as a YouTube <a href="https://www.youtube.com/playlist?list=PLGudixcDaxY3RGLSlWoN_cEEXhIT1OPmj" rel="nofollow">Airflow Summit 2020 Playlist</a> or see the individual talks here:</em></p> <ul dir="auto"> <li><a href="https://youtu.be/GB2f7ZhRCho" rel="nofollow">Keynote: Airflow then and now</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/68c8a4183972e7f5e4d1e13cdc7e2338aa20641bcfaae5ad6de7fcff218111b2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f47423266375a685243686f"><img src="https://camo.githubusercontent.com/68c8a4183972e7f5e4d1e13cdc7e2338aa20641bcfaae5ad6de7fcff218111b2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f47423266375a685243686f" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/GB2f7ZhRCho" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/u00wmcHe8ow" rel="nofollow">Scheduler as a service - Apache Airflow at EA Digital Platform</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ccbda34fcaf892bd3d5212db057a8f63b8d0bed833b003d2a053ed8f4843f97f/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f753030776d634865386f77"><img src="https://camo.githubusercontent.com/ccbda34fcaf892bd3d5212db057a8f63b8d0bed833b003d2a053ed8f4843f97f/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f753030776d634865386f77" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/u00wmcHe8ow" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/428AiCBMZoQ" rel="nofollow">Keynote: How large companies use Airflow for ML and ETL pipelines</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/48eaed6dceec003ee4b3286e11e1bd0c991b4a1ebc951bc1181f1e01175aa893/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f343238416943424d5a6f51"><img src="https://camo.githubusercontent.com/48eaed6dceec003ee4b3286e11e1bd0c991b4a1ebc951bc1181f1e01175aa893/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f343238416943424d5a6f51" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/428AiCBMZoQ" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/l_vVxOdvujg" rel="nofollow">Data DAGs with lineage for fun and for profit</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1aaa552ca65bacf7b46edbcca706c97d5c19af7a2c3c0f5dbf9f641545cbddb5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6c5f7656784f6476756a67"><img src="https://camo.githubusercontent.com/1aaa552ca65bacf7b46edbcca706c97d5c19af7a2c3c0f5dbf9f641545cbddb5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6c5f7656784f6476756a67" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/l_vVxOdvujg" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/3VDeKmxHWYA" rel="nofollow">Airflow on Kubernetes: Containerizing your workflows</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ec8191f7672945cfa06d255ca2e36b80218c270b4b0332cbf2c598c5fa5bd0ab/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f335644654b6d7848575941"><img src="https://camo.githubusercontent.com/ec8191f7672945cfa06d255ca2e36b80218c270b4b0332cbf2c598c5fa5bd0ab/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f335644654b6d7848575941" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/3VDeKmxHWYA" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/kAtaj_s4f-w" rel="nofollow">Data flow with Airflow @ PayPal</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/efde6542dd17c438ed9973491f6f7d27fc527c18a999b17caada24a71b1531b6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6b4174616a5f7334662d77"><img src="https://camo.githubusercontent.com/efde6542dd17c438ed9973491f6f7d27fc527c18a999b17caada24a71b1531b6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6b4174616a5f7334662d77" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/kAtaj_s4f-w" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/Cd4-YtHYT9M" rel="nofollow">Democratised data workflows at scale</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fdda4e0d22633d21d45f7fcfc2cbb6a69df35576978098336e9162f937165672/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4364342d5974485954394d"><img src="https://camo.githubusercontent.com/fdda4e0d22633d21d45f7fcfc2cbb6a69df35576978098336e9162f937165672/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4364342d5974485954394d" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/Cd4-YtHYT9M" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/i79OsoLUx0k" rel="nofollow">Migrating Airflow-based Spark jobs to Kubernetes - the native way</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5ec5632c78c200799418c67bd1441f20049ee15c096c862e7c5e9823ed078a10/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6937394f736f4c5578306b"><img src="https://camo.githubusercontent.com/5ec5632c78c200799418c67bd1441f20049ee15c096c862e7c5e9823ed078a10/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6937394f736f4c5578306b" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/i79OsoLUx0k" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/YLsGVFB8Pws" rel="nofollow">Keynote: Future of Airflow</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/df0638ef0103a323b3c677f3dda000cdf96889efaae999452a1dae63aec2cd26/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f594c734756464238507773"><img src="https://camo.githubusercontent.com/df0638ef0103a323b3c677f3dda000cdf96889efaae999452a1dae63aec2cd26/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f594c734756464238507773" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/YLsGVFB8Pws" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/QhnItssm4yU" rel="nofollow">Run Airflow DAGs in a secure way</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c4cb705479bcbc37e40302b928b6faa078f98bb831867c2af6ad80ab5030118c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f51686e497473736d347955"><img src="https://camo.githubusercontent.com/c4cb705479bcbc37e40302b928b6faa078f98bb831867c2af6ad80ab5030118c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f51686e497473736d347955" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/QhnItssm4yU" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/wxn9ta13Gbo" rel="nofollow">Keynote: Making Airflow a sustainable project through D&I</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4496824db38fe9b365ffb425878c5b7a54884d5fa9aa70d8e07a84684d5d9844/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f77786e397461313347626f"><img src="https://camo.githubusercontent.com/4496824db38fe9b365ffb425878c5b7a54884d5fa9aa70d8e07a84684d5d9844/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f77786e397461313347626f" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/wxn9ta13Gbo" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/ZgTf523XM0g" rel="nofollow">Airflow CI/CD: Github to Cloud Composer (safely)</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cd8975a4ad78cfeb28b14ee3cd5333ded19fab40ea716e001b54091ba2af74b0/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5a675466353233584d3067"><img src="https://camo.githubusercontent.com/cd8975a4ad78cfeb28b14ee3cd5333ded19fab40ea716e001b54091ba2af74b0/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5a675466353233584d3067" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/ZgTf523XM0g" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/Mhai7sVU244" rel="nofollow">Advanced Apache Superset for Data Engineers</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2eacd50f243e1c99d0338c0e91904b12c7abc09eb4b24e8c19ec012d3b8d4916/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4d68616937735655323434"><img src="https://camo.githubusercontent.com/2eacd50f243e1c99d0338c0e91904b12c7abc09eb4b24e8c19ec012d3b8d4916/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4d68616937735655323434" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/Mhai7sVU244" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/I4nFCqEnOJc" rel="nofollow">Demo: Reducing the lines, a visual DAG editor</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c328c17b4874eacaa198af086d0f0043d04fc1689ae3b5c509350d310d6a860c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f49346e464371456e4f4a63"><img src="https://camo.githubusercontent.com/c328c17b4874eacaa198af086d0f0043d04fc1689ae3b5c509350d310d6a860c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f49346e464371456e4f4a63" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/I4nFCqEnOJc" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/II4Ip81T3qc" rel="nofollow">AIP-31: Airflow functional DAG definition</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9d5b205e88cba87b9bee8963e1e4eda704d807c0d9a31fce3710234c3e61afba/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4949344970383154337163"><img src="https://camo.githubusercontent.com/9d5b205e88cba87b9bee8963e1e4eda704d807c0d9a31fce3710234c3e61afba/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4949344970383154337163" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/II4Ip81T3qc" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/wEq1FGe6oBY" rel="nofollow">Autonomous driving with Airflow</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/845b4b7a4008e039f03d1ae310f8be144e83778068156a7b3d6e13b6aefa8b40/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f77457131464765366f4259"><img src="https://camo.githubusercontent.com/845b4b7a4008e039f03d1ae310f8be144e83778068156a7b3d6e13b6aefa8b40/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f77457131464765366f4259" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/wEq1FGe6oBY" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/giQReCd7jp8" rel="nofollow">From cron to Airflow on Kubernetes: A startup story</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/49ec70ab0a69703557bdc3ed9b05e16b298c1b260540a233c7741e190c2a01cc/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f67695152654364376a7038"><img src="https://camo.githubusercontent.com/49ec70ab0a69703557bdc3ed9b05e16b298c1b260540a233c7741e190c2a01cc/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f67695152654364376a7038" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/giQReCd7jp8" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/Hc4pYAUL6Qs" rel="nofollow">Achieving Airflow Observability</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4859eedddfc3904fe74f5035d2d3e9a340b81300107648e5ccd170b1277b5833/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f486334705941554c365173"><img src="https://camo.githubusercontent.com/4859eedddfc3904fe74f5035d2d3e9a340b81300107648e5ccd170b1277b5833/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f486334705941554c365173" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/Hc4pYAUL6Qs" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/N_3RQeqySE0" rel="nofollow">Machine Learning with Apache Airflow</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e72fb89cb0b18d0b506d34490dc72c68de6c32b04ba3c700e41658a8f12000c5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4e5f335251657179534530"><img src="https://camo.githubusercontent.com/e72fb89cb0b18d0b506d34490dc72c68de6c32b04ba3c700e41658a8f12000c5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4e5f335251657179534530" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/N_3RQeqySE0" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/BH0ut33zp9A" rel="nofollow">Airflow: A beast character in the gaming world</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0994a0a0c104b519c5dd2d26b329f96414375cb32d0941a80c1a99b8c0f6a615/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f424830757433337a703941"><img src="https://camo.githubusercontent.com/0994a0a0c104b519c5dd2d26b329f96414375cb32d0941a80c1a99b8c0f6a615/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f424830757433337a703941" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/BH0ut33zp9A" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/p66GcO0LbFQ" rel="nofollow">Effective Cross-DAG dependency</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/44f7c8d7d5ecef0c3cda8ca15dfc678b730332abfebec24d105e761c4b727371/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f70363647634f304c624651"><img src="https://camo.githubusercontent.com/44f7c8d7d5ecef0c3cda8ca15dfc678b730332abfebec24d105e761c4b727371/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f70363647634f304c624651" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/p66GcO0LbFQ" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/KIEMEYM2PEs" rel="nofollow">What open source taught us about business</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fba8ce06c0d6edc5008d613d241ae5e35ecfcf0601c4ede7bd543c19537a4ad6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4b49454d45594d32504573"><img src="https://camo.githubusercontent.com/fba8ce06c0d6edc5008d613d241ae5e35ecfcf0601c4ede7bd543c19537a4ad6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4b49454d45594d32504573" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/KIEMEYM2PEs" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/SvnTyDiZOzQ" rel="nofollow">Data engineering hierarchy of needs</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a947afd7f6bcf337180828ea1bb9529c3933940727e613fd94353b5b1effa42c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f53766e547944695a4f7a51"><img src="https://camo.githubusercontent.com/a947afd7f6bcf337180828ea1bb9529c3933940727e613fd94353b5b1effa42c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f53766e547944695a4f7a51" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/SvnTyDiZOzQ" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/R4bp3_VyJ70" rel="nofollow">Building reuseable and trustworthy ELT pipelines (A templated approach)</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/96b3eb368ad0a77121547f19e778466b4f133bd8e4abc613307520233dca739c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f52346270335f56794a3730"><img src="https://camo.githubusercontent.com/96b3eb368ad0a77121547f19e778466b4f133bd8e4abc613307520233dca739c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f52346270335f56794a3730" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/R4bp3_VyJ70" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/ANJnYbLwLjE" rel="nofollow">Testing Airflow workflows - ensuring your DAGs work before going into production</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0f6fdec9d8f915cd6dcce746c9f04976d4274e9b31c4043294e3bd9f4c2218a6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f414e4a6e59624c774c6a45"><img src="https://camo.githubusercontent.com/0f6fdec9d8f915cd6dcce746c9f04976d4274e9b31c4043294e3bd9f4c2218a6/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f414e4a6e59624c774c6a45" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/ANJnYbLwLjE" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/RKEmAshcreE" rel="nofollow">Adding an executor to Airflow: A contributor overflow exception</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4255f9e1da5f1aec83e1a63e92dc2ecea4cbec105b857ce5c3e83470adc9072a/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f524b456d41736863726545"><img src="https://camo.githubusercontent.com/4255f9e1da5f1aec83e1a63e92dc2ecea4cbec105b857ce5c3e83470adc9072a/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f524b456d41736863726545" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/RKEmAshcreE" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/1SSlxAcOEso" rel="nofollow">Migration to Airflow backport providers</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/95e88950b0d2e212fd99e618866b32c461da382ab8f784b00d215d4c60f5cfc8/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f3153536c7841634f45736f"><img src="https://camo.githubusercontent.com/95e88950b0d2e212fd99e618866b32c461da382ab8f784b00d215d4c60f5cfc8/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f3153536c7841634f45736f" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/1SSlxAcOEso" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/kxyCC1sieok" rel="nofollow">From Zero to Airflow: bootstrapping a ML platform</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/75934babc5b733678db1cf5a1ce7634e251f81d5a603b516039e85261301e800/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6b78794343317369656f6b"><img src="https://camo.githubusercontent.com/75934babc5b733678db1cf5a1ce7634e251f81d5a603b516039e85261301e800/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6b78794343317369656f6b" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/kxyCC1sieok" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/vsn5kurjHwQ" rel="nofollow">Airflow the perfect match in our analytics pipeline</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eb5d5393a4f97aa58817f9320c8a161b014d185fa7faca892572d3ef39362158/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f76736e356b75726a487751"><img src="https://camo.githubusercontent.com/eb5d5393a4f97aa58817f9320c8a161b014d185fa7faca892572d3ef39362158/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f76736e356b75726a487751" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/vsn5kurjHwQ" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/VApoz5KCguM" rel="nofollow">Airflow at Société Générale : An open source orchestration solution in a banking environment</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/971d60af9be4adfd800293337100071f4653ee60b308a142a22c6706976d9202/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5641706f7a354b4367754d"><img src="https://camo.githubusercontent.com/971d60af9be4adfd800293337100071f4653ee60b308a142a22c6706976d9202/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5641706f7a354b4367754d" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/VApoz5KCguM" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/KpCPfooD5hM" rel="nofollow">Airflow as the next gen of workflow system at Pinterest</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c5a7e11a72dd5979ac739f2ecefb665a82571a9105c82e368ac0901986f02e9c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4b704350666f6f4435684d"><img src="https://camo.githubusercontent.com/c5a7e11a72dd5979ac739f2ecefb665a82571a9105c82e368ac0901986f02e9c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4b704350666f6f4435684d" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/KpCPfooD5hM" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/fe59rUezJ5Q" rel="nofollow">Improving Airflow's user experience</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a4773ec541e21291c98452d61df89a2e52ec755063eb25a2e8cbcb52cc793d24/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f666535397255657a4a3551"><img src="https://camo.githubusercontent.com/a4773ec541e21291c98452d61df89a2e52ec755063eb25a2e8cbcb52cc793d24/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f666535397255657a4a3551" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/fe59rUezJ5Q" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/DHDlD-bMM3c" rel="nofollow">Teaching an old DAG new tricks</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/91bb5ee972428eee5458e3a473c933fce0edeeba9a4e3415955e6a81d296ffb2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4448446c442d624d4d3363"><img src="https://camo.githubusercontent.com/91bb5ee972428eee5458e3a473c933fce0edeeba9a4e3415955e6a81d296ffb2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4448446c442d624d4d3363" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/DHDlD-bMM3c" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/tO6IBDPNAcY" rel="nofollow">Ask me anything with Airflow members</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4ee5d41bffd5e74776bb48c1602ce7858975de0dc21f64b8724d9e59c375323e/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f744f36494244504e416359"><img src="https://camo.githubusercontent.com/4ee5d41bffd5e74776bb48c1602ce7858975de0dc21f64b8724d9e59c375323e/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f744f36494244504e416359" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/tO6IBDPNAcY" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/GTQU8ff_O_4" rel="nofollow">Using Airflow to speed up development of data intensive tools</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/6cd4de1097cf4b4b5b32dbdbf504e96c4f3d58f309023e53114296fc644dbec0/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f475451553866665f4f5f34"><img src="https://camo.githubusercontent.com/6cd4de1097cf4b4b5b32dbdbf504e96c4f3d58f309023e53114296fc644dbec0/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f475451553866665f4f5f34" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/GTQU8ff_O_4" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/tY4F9X5l6dg" rel="nofollow">Pipelines on pipelines: Agile CI/CD workflows for Airflow DAGs</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/71584c5dd44c2226bbd85f38517918ac7126f14fa62561330d111e493653d102/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f745934463958356c366467"><img src="https://camo.githubusercontent.com/71584c5dd44c2226bbd85f38517918ac7126f14fa62561330d111e493653d102/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f745934463958356c366467" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/tY4F9X5l6dg" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/wDr3Y7q2XoI" rel="nofollow">Production Docker image for Apache Airflow</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ea61dc77d9395852a5020c0ba79d2f6c1bd810ed55aac1869a1efca3289c1d7c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7744723359377132586f49"><img src="https://camo.githubusercontent.com/ea61dc77d9395852a5020c0ba79d2f6c1bd810ed55aac1869a1efca3289c1d7c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7744723359377132586f49" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/wDr3Y7q2XoI" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/_50-JFCsp3I" rel="nofollow">Airflow as an elastic ETL tool</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/6bc4fdea0f9a53fb6d7df1a4f9372c84804f89d0e8c74d8e27cce10f2984732f/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5f35302d4a464373703349"><img src="https://camo.githubusercontent.com/6bc4fdea0f9a53fb6d7df1a4f9372c84804f89d0e8c74d8e27cce10f2984732f/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f5f35302d4a464373703349" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/_50-JFCsp3I" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/q9pdAlcMo48" rel="nofollow">How do we reason about the reliability of our data pipeline in Wrike</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/21711c6bb74adb970a2dc442278d00fd25eca71799aa8a92b0fb2ca598cc1a6c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f71397064416c634d6f3438"><img src="https://camo.githubusercontent.com/21711c6bb74adb970a2dc442278d00fd25eca71799aa8a92b0fb2ca598cc1a6c/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f71397064416c634d6f3438" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/q9pdAlcMo48" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/aQIZ_Wdy0lA" rel="nofollow">Achieving Airflow observability with Databand</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c24842a3c631794747ce39b39a7945319830cc1f6ac629474921211b64321551/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6151495a5f576479306c41"><img src="https://camo.githubusercontent.com/c24842a3c631794747ce39b39a7945319830cc1f6ac629474921211b64321551/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6151495a5f576479306c41" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/aQIZ_Wdy0lA" style="max-width: 100%;"></a></li> <li><a href="https://youtu.be/yuqXWClbEM8" rel="nofollow">From S3 to BigQuery - How a first-time Airflow user successfully implemented a data pipeline</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/43115f7e98c9383d8cd9a2b737296b6801bcfcc089dc04b89e0f99c62aef8668/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7975715857436c62454d38"><img src="https://camo.githubusercontent.com/43115f7e98c9383d8cd9a2b737296b6801bcfcc089dc04b89e0f99c62aef8668/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7975715857436c62454d38" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/yuqXWClbEM8" style="max-width: 100%;"></a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Best practices, lessons learned and cool use cases</h2><a id="user-content-best-practices-lessons-learned-and-cool-use-cases" class="anchor" aria-label="Permalink: Best practices, lessons learned and cool use cases" href="#best-practices-lessons-learned-and-cool-use-cases"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://medium.com/apache-airflow/how-to-best-use-duckdb-with-apache-airflow-63a079160d5d" rel="nofollow">How to Best Use DuckDB with Apache Airflow</a> - Tips on integrating <a href="https://duckdb.org/" rel="nofollow">DuckDB</a> into Airflow jobs.</li> <li><a href="https://www.youtube.com/watch?v=9pykChPp-X4&t=121s" rel="nofollow">Airflow Dag Python Package Management</a> - Managing python package dependencies across 100+ dags can become painful. It's hard to keep track of which packages are used by which dag, and hard to clean up during DAG removal/upgrade. Learn how KubernetesPodOperator and DockerOperator can fix this.</li> <li><a href="https://youtu.be/a-4yRne3ba4" rel="nofollow">Airflow Dag Management & Versioning</a> - Efficently manage DAGs release process by using Git Submodules</li> <li><a href="https://medium.com/@chandukavar/testing-in-airflow-part-2-integration-tests-and-end-to-end-pipeline-tests-af0555cd1a82" rel="nofollow">Testing in Airflow Part 2</a> - <a href="https://twitter.com/chandukavar" rel="nofollow">Chandu Kavar</a> and <a href="https://www.linkedin.com/in/sarang-shinde-219a4873/" rel="nofollow">Sarang Shinde</a> have explained Integration Tests and End-to-End Pipeline Tests.</li> <li><a href="https://robinhood.engineering/upgrading-scaling-airflow-at-robinhood-5b625dfaa2ee" rel="nofollow">Upgrading & Scaling Airflow at Robinhood</a> - <a href="https://www.linkedin.com/in/abhishek-ray-29210145/" rel="nofollow">Abishek Ray</a> describes how Robinhood tackled upgrading its production Airflow while minimizing downtime.</li> <li><a href="https://medium.com/bluecore-engineering/were-all-using-airflow-wrong-and-how-to-fix-it-a56f14cb0753" rel="nofollow">We're all using Airflow wrong and how to fix it</a> - <a href="https://www.jldlaughlin.com/" rel="nofollow">Jessica Laughlin</a> of <a href="https://www.bluecore.com/" rel="nofollow">Bluecore</a> shares three engineering problems associated with the Airflow design and how to solve them by using the <a href="https://github.com/apache/airflow/blob/v1-10-stable/airflow/contrib/operators/kubernetes_pod_operator.py">KubernetesPodOperator</a> in two design patterns.</li> <li><a href="https://medium.com/dailymotion/getting-started-with-data-lineage-6307b2b429b3" rel="nofollow">Getting started with Data Lineage</a> - <a href="https://www.linkedin.com/in/germain-tanguy/" rel="nofollow">Germain Tanguy</a> of <a href="https://www.dailymotion.com/" rel="nofollow">Dailymotion</a> shares a data lineage prototype integrated to Apache Airflow.</li> <li><a href="https://medium.com/dailymotion/collaboration-between-data-engineers-data-analysts-and-data-scientists-97c00ab1211f" rel="nofollow">Collaboration between data engineers, data analysts and data scientists</a> - <a href="https://www.linkedin.com/in/germain-tanguy/" rel="nofollow">Germain Tanguy</a> of <a href="https://www.dailymotion.com/" rel="nofollow">Dailymotion</a> shares how to efficiently release in production by collaboration with Apache Airflow.</li> <li><a href="https://www.lucidchart.com/techblog/2019/03/22/using-apache-airflows-docker-operator-with-amazons-container-repository/" rel="nofollow">Using Apache Airflow’s Docker Operator with Amazon’s Container Repository</a> - <a href="https://www.linkedin.com/in/bvcampbell3" rel="nofollow">Brian Campbell</a> of <a href="https://www.lucidchart.com/" rel="nofollow">Lucid</a> has tips for integrating AWS's <a href="https://aws.amazon.com/ecr/" rel="nofollow">ECR</a> service with Airflow's DockerOperator.</li> <li><a href="https://medium.com/datareply/airflow-lesser-known-tips-tricks-and-best-practises-cf4d4a90f8f" rel="nofollow">Airflow: Lesser Known Tips, Tricks, and Best Practises</a> - <a href="https://www.linkedin.com/in/kaxil/" rel="nofollow">Kaxil Naik</a> has explained the lesser-known yet very useful tips and best practises on using Airflow.</li> <li><a href="https://codeascraft.com/2018/11/14/boundary-layer%E2%80%89-declarative-airflow-workflows/" rel="nofollow">boundary-layer:Declarative Airflow Workflows</a> - <a href="https://www.linkedin.com/in/mchalek" rel="nofollow">Kevin McHale</a> has explained open source project boundary-layer which generates airflow dag with declarative workflows.</li> <li><a href="https://medium.com/@chandukavar/testing-in-airflow-part-1-dag-validation-tests-dag-definition-tests-and-unit-tests-2aa94970570c" rel="nofollow">Testing in Airflow Part 1</a> - <a href="https://twitter.com/chandukavar" rel="nofollow">Chandu Kavar</a> has explained different categories of tests in Airflow. It includes DAG Validation Tests, DAG Definition Tests, and unit tests.</li> <li><a href="https://wecode.wepay.com/posts/improving-airflow-ui-security" rel="nofollow">Improving Airflow UI Security</a> - WePay's <a href="https://twitter.com/joygao" rel="nofollow">Joy Gao</a> breaks down the need for Role Based Access Controls (RBAC) and how she introduced it to Airflow.</li> <li><a href="https://blog.socialcops.com/engineering/apache-airflow-disease-outbreaks-india/" rel="nofollow">How to Create a Workflow in Apache Airflow to Track Disease Outbreaks in India</a> - <a href="https://twitter.com/vortex_ape" rel="nofollow">Vinayak Mehta</a> details how <a href="https://socialcops.com/" rel="nofollow">SocialCops</a> uses Airflow to scrape India's Ministry of Health and Family Affairs to generate derived data on possible disease outbreaks.</li> <li><a href="https://blog.socialcops.com/technology/engineering/airflow-meta-data-engineering-disha/" rel="nofollow">Airflow, Meta Data Engineering, and a Data Platform for the World’s Largest Democracy</a> - <a href="https://twitter.com/vortex_ape" rel="nofollow">Vinayak Mehta</a> talks about identifying data engineering patterns (meta data engineering) to automate DAG generation and how that helped <a href="https://socialcops.com/" rel="nofollow">SocialCops</a> to power DISHA, a national data platform where Indian MPs and MLAs monitor the progress of 42 national level schemes.</li> <li><a href="https://medium.com/@nehiljain/lessons-learnt-while-airflow-ing-32d3b7fc3fbf" rel="nofollow">Lessons learnt while Airflow-ing</a> and <a href="https://medium.com/snaptravel/airflow-part-2-lessons-learned-793fa3c0841e" rel="nofollow">Airflow Part 2: Lessons learned</a> - <a href="https://twitter.com/nehiljain" rel="nofollow">Nehil Jain</a> has written a two-part series that covers the value of workflow schedulers, some best practices and pitfalls he found while working with Airflow. The <a href="https://medium.com/snaptravel/airflow-part-2-lessons-learned-793fa3c0841e" rel="nofollow">second article</a> in particular includes many production tips.</li> <li><a href="https://robinhood.engineering/why-robinhood-uses-airflow-aed13a9a90c8" rel="nofollow">Why Robinhood uses Airflow</a> - <a href="https://twitter.com/vineetik" rel="nofollow">Vineet Goel</a> walks through why financial trading platform <a href="https://robinhood.com/" rel="nofollow">Robinhood</a> picked Airflow over alternative work schedulers.</li> <li><a href="https://medium.com/videoamp/what-we-learned-migrating-off-cron-to-airflow-b391841a0da4" rel="nofollow">What we learned migrating off Cron to Airflow</a> - <a href="https://medium.com/@katiemacias" rel="nofollow">Katie Macias</a> describes <a href="https://www.videoamp.com/" rel="nofollow">VideoAmp</a>'s Data Engineering's journey from cron to Airflow.</li> <li><a href="https://www.qubole.com/blog/hood-building-air-qubole/" rel="nofollow">Under the Hood: Building AIR at Qubole</a> - <a href="https://www.linkedin.com/in/sreenath-kamath-66a1b970/" rel="nofollow">Sreenath Kamath</a> and <a href="https://twitter.com/vrajat" rel="nofollow">Rajat Venkatesh</a> write about building <a href="https://www.qubole.com/" rel="nofollow">Qubole</a>'s <a href="https://www.qubole.com/blog/building-qdsair-infrastructure/" rel="nofollow">data discovery, insights and recommendations platform</a> atop Airflow.</li> <li><a href="https://medium.com/bluecore-engineering/airflow-why-is-nothing-working-f705eb6b7b04" rel="nofollow">Airflow: Why is nothing working? - TL;DR Airflow’s SubDagOperator causes deadlocks</a> by <a href="https://twitter.com/thepressofjess" rel="nofollow">Jessica Laughlin</a> - Deep dive into troubleshooting a troublesome Airflow DAG with good tips on how to diagnosis problems.</li> <li><a href="https://medium.com/@rako/apache-airflow-as-an-external-scheduler-for-distributed-systems-53b7354d3e48" rel="nofollow">Apache Airflow as an External scheduler for distributed systems</a> - <a href="https://medium.com/@rako" rel="nofollow">Arunkumar</a> suggests using Airflow as a simple external scheduler for a distributed system.</li> <li><a href="https://engineering.siftscience.com/sift-trains-thousands-models-using-apache-airflow/" rel="nofollow">How Sift Trains Thousands of Models using Apache Airflow</a> - Summary of <a href="https://siftscience.com/" rel="nofollow">Sift Science</a>'s deployment strategy for its machine learning model pipelines.</li> <li><a href="https://engineering.pandora.com/apache-airflow-at-pandora-1d7a844d68ee" rel="nofollow">Apache Airflow at Pandora</a> - <a href="https://www.linkedin.com/in/acehaidrey/" rel="nofollow">Ace Haidrey</a> discusses why Pandora chose Airflow and provides a detailed breakdown of their deployment and the infrastructure behind it.</li> <li><a href="https://medium.com/stanton-ventures-insights/airflow-lessons-from-the-data-engineering-front-in-chicago-9489e6ad5c3d" rel="nofollow">Airflow Lessons from the Data Engineering Front in Chicago</a> - <a href="https://twitter.com/alison985" rel="nofollow">Alison Stanton</a> provides a list of tips to avoid gotchas in Airflow jobs.</li> <li><a href="https://medium.com/wbaa/datas-inferno-7-circles-of-data-testing-hell-with-airflow-cef4adff58d8" rel="nofollow">Data’s Inferno: 7 Circles of Data Testing Hell with Airflow</a> - The Wholesale Banking Advanced Analytics team at ING details how they torture test their Airflow DAGs before deployment. <ul dir="auto"> <li><a href="https://github.com/danielvdende/data-testing-with-airflow">Data Testing with Airflow repository</a></li> </ul> </li> <li><a href="https://drivy.engineering/data-quality/" rel="nofollow">Data quality checkers</a> - <a href="https://twitter.com/AntoineAugusti" rel="nofollow">Antoine Augusti</a> describes the framework <a href="https://www.drivy.co.uk/" rel="nofollow">drivy</a> has built atop Airflow to test their datasets for completeness, consistency, timeliness, uniquess, validity and accuracy.</li> <li><a href="https://wecode.wepay.com/posts/wepays-data-warehouse-bigquery-airflow" rel="nofollow">Building WePay's data warehouse using BigQuery and Airflow</a> - The inestimable <a href="https://twitter.com/criccomini" rel="nofollow">Chris Riccomini</a> describes how <a href="https://go.wepay.com/" rel="nofollow">WePay</a>, one of the first adopters of Airflow, integrated into their <a href="https://cloud.google.com/compute/" rel="nofollow">Google Cloud Compute</a> environment.</li> <li><a href="https://www.astronomer.io/blog/using-apache-airflow-to-create-data-infrastructure/" rel="nofollow">Using Apache Airflow to Create Data Infrastructure in the Public Sector</a> - Despite an unfortunately very heavy sales pitch tone, this article blog post describes how <a href="http://www.argolabs.org/" rel="nofollow">ARGO Labs</a>, a non-profit data organization, utilizes Airflow for ETLing in public sector data.</li> <li><a href="https://gtoonstra.github.io/etl-with-airflow/" rel="nofollow">ETL with airflow</a> - ETL core principles and several end-to-end docker-based examples including Kimball, Data Vault on Hive and some simpler examples.</li> <li><a href="https://cloud.google.com/blog/big-data/2017/07/how-to-aggregate-data-for-bigquery-using-apache-airflow" rel="nofollow">How to aggregate data for BigQuery using Apache Airflow</a> - Example of how to use Airflow with Google BigQuery to power a Data Studio dashboard.</li> <li><a href="https://blog.twitter.com/engineering/en_us/topics/insights/2018/ml-workflows.html" rel="nofollow">Productionizing ML with workflows at Twitter</a> - In depth post on why and how Twitter use Airflow for ML workflows including including custom operators and a custom UI embedded in in the Airflow web interface.</li> <li><a href="https://eng.lyft.com/running-apache-airflow-at-lyft-6e53bb8fccff" rel="nofollow">Running Apache Airflow At Lyft</a> - This provides an overview on how Lyft operates Apache Airflow in production(monitoring, customization, etc).</li> <li><a href="https://azure.microsoft.com/sv-se/blog/deploying-apache-airflow-in-azure-to-build-and-run-data-pipelines/" rel="nofollow">Deploying Apache Airflow in Azure to build and run data pipelines</a> - It talks about running Airflow on Azure.</li> <li><a href="https://blog.godatadriven.com/zen-of-python-and-apache-airflow" rel="nofollow">The Zen of Python and Apache Airflow</a> - Blog post about how the Zen of Python can be applied to Airflow code.</li> <li><a href="https://eng.lyft.com/securing-apache-airflow-ui-with-dag-level-access-a7bc649a2821" rel="nofollow">Securing Apache Airflow UI WITH DAG Level Access</a> - Blog post about Airflow DAG level access and how Lyft uses it.</li> <li><a href="https://medium.com/flatiron-engineering/upgrading-airflow-with-zero-downtime-8df303760c96" rel="nofollow">Upgrading Airflow with Zero Downtime</a> - A detailed article on how to deploy Airflow with zero downtime.</li> <li><a href="https://towardsdatascience.com/building-a-production-level-etl-pipeline-platform-using-apache-airflow-a4cf34203fbd" rel="nofollow">Building a Production-Level ETL Pipeline Platform Using Apache Airflow</a> - This post describes how the system management team at Cerner uses Airflow.</li> <li><a href="https://github.com/stwind/airflow-on-kubernetes">Bare minimal Airflow on Kubernetes (Local, EKS, AKS)</a> - An article on deploying Airflow on local Kubernetes, AWS EKS and Azure AKS with bare minimal setup.</li> <li><a href="https://tech.scribd.com/blog/2020/breaking-up-the-dag-repo.html" rel="nofollow">Breaking up the Airflow DAG monorepo</a> - This post describes how to support managing Airflow DAGs from multiple git repos through S3.</li> <li><a href="https://medium.com/databand-ai/improving-performance-of-apache-airflow-scheduler-507f4cb6462a" rel="nofollow">Improving Performance of Apache Airflow Scheduler</a> - A story of an adventure that allowed <a href="https://databand.ai/" rel="nofollow">Databand</a> to speed up DAG parsing time 10 times</li> <li><a href="https://medium.com/ssense-tech/principled-data-engineering-part-ii-data-governance-30297abb2446" rel="nofollow">How SSENSE is using Apache Airflow to do Data Lineage on AWS</a> - Exploring the fundamental themes of architecting and governing a data lake on AWS using Apache Arflow.</li> <li><a href="https://databand.ai/blog/everyday-data-engineering-monitoring-airflow-with-prometheus-statsd-and-grafana/" rel="nofollow">Monitoring Airflow with Prometheus, StatsD and Grafana</a> - A guide on how to setup operational dashboards to production cluster by <a href="http://databand.ai" rel="nofollow">Databand</a> and get high level visibility on Airflow.</li> <li><a href="https://medium.com/hurb-engineering/complex-tasks-orchestration-at-hurb-with-apache-airflow-dcb423c4dee6" rel="nofollow">Complex tasks orchestration at Hurb with Apache Airflow</a> - This post shows how <a href="https://hurb.com" rel="nofollow">Hurb</a> uses Apache Airflow to orchestrate complex tasks and how it leverages DAG dynamic creation to improve development speed.</li> <li><a href="https://community.crate.io/t/cratedb-and-apache-airflow-part-one/901" rel="nofollow">Automating data export from CrateDB to S3 with Apache Airflow</a> A tutorial on how to automate recurrent queries in <a href="https://crate.io/" rel="nofollow">CrateDB</a> with Apache Airflow, such as periodic data export to Amazon S3.</li> <li><a href="https://community.crate.io/t/cratedb-and-apache-airflow-implementation-of-data-retention-policy/913" rel="nofollow">Implementation of Data Retention Policy with CrateDB and Apache Airflow</a> A step by step tutorial on how to implement effective data retention policy with <a href="https://crate.io/" rel="nofollow">CrateDB</a> and Apache Airflow.</li> <li><a href="https://community.crate.io/t/cratedb-and-apache-airflow-building-a-data-ingestion-pipeline/926" rel="nofollow">Ingesting NYC Taxi Data From S3 Into CrateDB</a> - Describes how to build a database ingestion pipeline in Airflow by loading CSV files from S3 into <a href="https://crate.io/" rel="nofollow">CrateDB</a>.</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Books, blogs, podcasts, and such</h2><a id="user-content-books-blogs-podcasts-and-such" class="anchor" aria-label="Permalink: Books, blogs, podcasts, and such" href="#books-blogs-podcasts-and-such"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://www.manning.com/books/data-pipelines-with-apache-airflow" rel="nofollow">Data Pipelines with Apache Airflow</a> - A Manning book (Early Access September 2019) on Airflow.</li> <li><a href="https://soundcloud.com/the-airflow-podcast" rel="nofollow">The Airflow Podcast</a> - A semiregular podcast discussing all things Airflow.</li> <li><a href="https://medium.com/@maximebeauchemin" rel="nofollow">Maxime Beauchemin</a> - Maxime's blog on medium that gives insight into the philosophy behind Apache Airflow.</li> <li><a href="https://medium.com/@rchang" rel="nofollow">Robert Chang</a> - Blog posts about data engineering with Apache Airflow, explains why and has examples in code.</li> <li><a href="https://szeevs.medium.com/handling-airflow-logs-with-kubernetes-executor-25c11ea831e4" rel="nofollow">Handling Airflow logs with Kubernetes Executor</a> - A blogpost that outlines how you can set up remote S3 logging when using KubernetesExecutor, without creating complex infrastructure.</li> <li><a href="https://turbaszek.medium.com/airflow-2-0-dag-authoring-redesigned-651edc397178" rel="nofollow">Airflow 2.0: DAG Authoring Redesigned</a> - Blog post about new ways of writing DAGs in Airflow 2.0.</li> <li><a href="https://higrys.medium.com/airflow-2-0-providers-1bd21ba3bd93" rel="nofollow">Airflow 2.0 Providers</a> - Blog post about providers packages in Airflow 2.0.</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Slide deck presentations and online videos</h2><a id="user-content-slide-deck-presentations-and-online-videos" class="anchor" aria-label="Permalink: Slide deck presentations and online videos" href="#slide-deck-presentations-and-online-videos"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>2020-Feb: <a href="https://www.youtube.com/watch?IAmWKZDmvek" rel="nofollow">Apache Airflow @ Umuzi.org</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/301e514f1071b13c1dd1d02fd685dac1c22066026a403cda17185f9d01dbffa4/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f49416d574b5a446d76656b"><img src="https://camo.githubusercontent.com/301e514f1071b13c1dd1d02fd685dac1c22066026a403cda17185f9d01dbffa4/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f49416d574b5a446d76656b" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/IAmWKZDmvek" style="max-width: 100%;"></a> - <a href="https://twitter.com/sheena_oconnell" rel="nofollow">Sheena O'Connell</a> discusses how South Africa-based tech bootcamp <a href="https://www.umuzi.org/" rel="nofollow">Umuzi</a> uses Airflow.</li> <li><a href="https://www.youtube.com/playlist?list=PL79i7SgJCJ9hu5GqcA091h6zuewmsvSyy" rel="nofollow">Apache Airflow YouTube tutorials</a> - <a href="https://twitter.com/marclambertiml" rel="nofollow">Marc Lamberti</a> has created a series of YouTube tutorials covering many aspects of Airflow concepts, configuration and deployment.</li> <li><a href="https://www.youtube.com/watch?23_1WlxGGM4" rel="nofollow">Advanced Data Engineering Patterns with Apache Airflow</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/674b9b40aea34bf57352b50d5d6059ec52c19f0f7dc4150559d34ad1559463cd/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f32335f31576c7847474d34"><img src="https://camo.githubusercontent.com/674b9b40aea34bf57352b50d5d6059ec52c19f0f7dc4150559d34ad1559463cd/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f32335f31576c7847474d34" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/23_1WlxGGM4" style="max-width: 100%;"></a> - Video of <a href="https://medium.com/@maximebeauchemin" rel="nofollow">Maxime Beauchemin</a>'s talk that briefly introduces Airflow and then goes into more advanced use cases, including self-servive SQL queries, building A/B testing metrics frameworks and machine learning feature extraction all via Airflow. The slides are available separately <a href="https://prezi.com/p/adxlaplcwzho/advanced-data-engineering-patterns-with-apache-airflow/" rel="nofollow">here</a>.</li> <li><a href="https://blog.tedmiston.com/momentum-2018-airflow-talk/" rel="nofollow">Modern Data Pipelines with Apache Airflow</a> - A talk given by <a href="https://twitter.com/kicksopenminds" rel="nofollow">Taylor Edmiston</a> and <a href="https://twitter.com/andscoop" rel="nofollow">Andy Cooper</a> from Astronomer.io at Momentum Dev Con 2018 on getting started with Airflow, custom components, example DAGs, and the Astronomer Airflow CLI.</li> <li><a href="https://www.slideshare.net/r39132/building-better-data-pipelines-using-apache-airflow-94060954" rel="nofollow">Building Better Data Pipelines using Apache Airflow</a> - Slides from <a href="https://twitter.com/r39132" rel="nofollow">Sid Anand</a>'s talk at QCon 18 with a thorough overview of Airflow and its architecture.</li> <li><a href="https://paper.dropbox.com/doc/Airflow-Spark-talk-v2.0-5own4Nlz8MhdwKQ8QhIqj?_tk=share_copylink" rel="nofollow">Airflow and Spark Streaming at Astronomer</a> - How Astronomer uses dynamic DAGs to run Spark Streaming jobs with Airflow.</li> <li><a href="https://www.slideshare.net/kaxil/apache-airflow-in-the-cloud-programmatically-orchestrating-workloads-with-python-pydata-london-2018-95391267" rel="nofollow">Apache Airflow in the Cloud: Programmatically orchestrating workloads with Python</a> - Slides from <a href="https://twitter.com/kaxil" rel="nofollow">Kaxil Naik</a>'s & <a href="https://twitter.com/ss6012" rel="nofollow">Satyasheel</a> talk at PyData London 18 introducing the basics of Airflow and how to orchestrate workloads on Google Cloud Platform (GCP).</li> <li><a href="https://eventil.com/presentations/j2sK9R" rel="nofollow">Developing elegant workflows in Python code with Apache Airflow</a> - <a href="https://twitter.com/postrational" rel="nofollow">Michał Karzyński</a> at <a href="https://ep2018.europython.eu/" rel="nofollow">Europython</a> gives a brief introduction to Airflow concepts including the role of workflow managers, DAGs and operators. Link includes both video and slides.</li> <li><a href="https://www.youtube.com/watch?mjn1LAZ_Y38" rel="nofollow">Data Pipeline Management</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fb2d8c2a90d8030f85695382a1b97f32ef51284e94895ddec1e1ae2167c5a331/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6d6a6e314c415a5f593338"><img src="https://camo.githubusercontent.com/fb2d8c2a90d8030f85695382a1b97f32ef51284e94895ddec1e1ae2167c5a331/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6d6a6e314c415a5f593338" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/mjn1LAZ_Y38" style="max-width: 100%;"></a> - <a href="https://www.linkedin.com/in/benjamin-goldberg-50247169/" rel="nofollow">Ben Goldberg</a> walks the Chicago Kubernetes Meetup through how <a href="https://spothero.com/" rel="nofollow">SpotHero</a> uses Airflow. Additionally, Ben has a very <a href="https://docs.google.com/presentation/d/1hc12cFs5TmEajLwYNASLwz_C17Q5tyd__6oXzI16A9A/edit#slide=id.g320d39a12c_0_1017" rel="nofollow">complete slidedeck</a> of how Airflow plays within Kubernetes.</li> <li><a href="https://www.slideshare.net/LauraLorenz4/how-i-learned-to-time-travel-or-data-pipelining-and-scheduling-with-airflow" rel="nofollow">How I learned to time travel, or, data pipelining and scheduling with Airflow</a> - Comprehensive deck by <a href="https://twitter.com/lalorenz6" rel="nofollow">Laura Lorenz</a> for why Airflow is necessary and how <a href="https://www.industrydive.com/" rel="nofollow">Industry Dive</a> uses it.</li> <li><a href="https://www.slideshare.net/r39132/introduction-to-apache-airflow-data-day-seattle-2016" rel="nofollow">Introduction to Apache Airflow - Data Day Seattle 2016</a> - <a href="https://twitter.com/r39132" rel="nofollow">Sid Anand</a> gives a thorough introduction to Airflow and how it was used at <a href="https://www.agari.com/" rel="nofollow">Agari</a>.</li> <li><a href="https://speakerdeck.com/vananth22/operating-data-pipeline-with-airflow-at-slack" rel="nofollow">Operating Data Pipeline With Airflow - Airflow Meetup April-2018</a> - <a href="https://twitter.com/ananthdurai" rel="nofollow">Ananth Packkildurai</a> talks about scaling airflow Local Executor and best practices to operate data pipeline at <a href="https://slack.com/" rel="nofollow">Slack</a>.</li> <li><a href="https://wepayinc.app.box.com/s/hf1chwmthuet29ux2a83f5quc8o5q18k" rel="nofollow">Apache Airflow at WePay</a> - <a href="https://twitter.com/criccomini" rel="nofollow">Chris Riccomini</a> discusses why WePay chose Airflow and provides a detailed breakdown of their deployment and the infrastructure behind it.</li> <li><a href="https://www.youtube.com/watch?v=neuh_2_zrt8" rel="nofollow">Elegant data pipelining with Apache Airflow</a> - Talks from <a href="https://twitter.com/bolke2028" rel="nofollow">Bolke de Bruin</a> and <a href="https://twitter.com/fokkodriesprong" rel="nofollow">Fokko Driesprong</a> at PyData Amsterdam 2018 about methodologies that provide clarity in ETL using Airflow.</li> <li><a href="https://www.slideshare.net/taofung/airflow-at-lyft" rel="nofollow">Airflow @ Lyft</a> - Talks from <a href="https://github.com/feng-tao">Tao Feng</a> at SF big data analytics meetup about how Lyft monitors running Airflow in production.</li> <li><a href="https://youtu.be/bcF24AdG1o4" rel="nofollow">Manageable data pipelines with Airflow and Kubernetes</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/065ee68f16951877d079d32f014c8ad524c2878bac8db824eff2c8f7390f1946/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6263463234416447316f34"><img src="https://camo.githubusercontent.com/065ee68f16951877d079d32f014c8ad524c2878bac8db824eff2c8f7390f1946/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f6263463234416447316f34" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/bcF24AdG1o4" style="max-width: 100%;"></a>- Talk by <a href="https://github.com/potiuk">Jarek Potiuk</a> and <a href="https://github.com/sprzedwojski">Szymon Przedwojski</a>. A introductory talk on Airflow from GDG Warsaw DevFest 2018.</li> <li><a href="https://www.youtube.com/watch?8L1F-6t_6Ao" rel="nofollow">Migrating Apache Oozie Workflows to Apache Airflow</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/faeb4e5443bb1db0ff090c4c87d935c98f70934ba1e8032036b386b64a7e5c77/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f384c31462d36745f36416f"><img src="https://camo.githubusercontent.com/faeb4e5443bb1db0ff090c4c87d935c98f70934ba1e8032036b386b64a7e5c77/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f384c31462d36745f36416f" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/8L1F-6t_6Ao" style="max-width: 100%;"></a> - Talk from <a href="https://github.com/sprzedwojski">Szymon Przedwojski</a> from Airflow Bay Area Meetup June 2018 about Oozie-to-Airflow migration tool.</li> <li><a href="https://www.youtube.com/watch?MM8tfTrcnfk" rel="nofollow">Building data lakes with Apache Airflow</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/56a15cea5afbfe0017dae9eb6dfe0be0efee325afc9b73ff62a5cd7ba0e42ea5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4d4d3874665472636e666b"><img src="https://camo.githubusercontent.com/56a15cea5afbfe0017dae9eb6dfe0be0efee325afc9b73ff62a5cd7ba0e42ea5/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4d4d3874665472636e666b" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/MM8tfTrcnfk" style="max-width: 100%;"></a> - Talk by <a href="https://github.com/BasPH">Bas Harenslak</a> and <a href="https://github.com/jrderuiter">Julian de Ruiter</a> at the Amsterdam Apache Airflow September 2018 meetup about building data lakes with Apache Airflow as the spider in the web managing all data flows.</li> <li><a href="https://youtu.be/Nr4Pp1SNXeU" rel="nofollow">First Warsaw Apache Airflow Meetup</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8b539dea99dc34886cc21874bcc2761bf0bb9c114b1fd621e0e1fa1a0eb977f2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4e7234507031534e586555"><img src="https://camo.githubusercontent.com/8b539dea99dc34886cc21874bcc2761bf0bb9c114b1fd621e0e1fa1a0eb977f2/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f4e7234507031534e586555" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/Nr4Pp1SNXeU" style="max-width: 100%;"></a> - Live streamed recording from the first Apache Airflow Meetup in Warsaw in October 2019.</li> <li><a href="https://youtu.be/znowFIBK1lk" rel="nofollow">What's coming in Apache Airflow 2.0</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c30b88cd823f1adfc370acedb9fe555b07ec01b5d92aa84bc0043b2f8616404b/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7a6e6f774649424b316c6b"><img src="https://camo.githubusercontent.com/c30b88cd823f1adfc370acedb9fe555b07ec01b5d92aa84bc0043b2f8616404b/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f7a6e6f774649424b316c6b" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/znowFIBK1lk" style="max-width: 100%;"></a> - joint talk by <a href="https://github.com/ashb">Ash Berlin-Taylor</a>, <a href="https://github.com/kaxil">Kaxil Naik</a>, <a href="https://github.com/potiuk">Jarek Potiuk</a>, <a href="https://github.com/mik-laj">Kamil Breguła</a>, <a href="https://github.com/dimberman">Daniel Imbermann</a>, and <a href="https://github.com/turbaszek">Tomek Urbaszek</a> at the <a href="https://www.meetup.com/NYC-Apache-Airflow-Meetup/events/270483933/" rel="nofollow">Online NYC Meetup, 13th of May 2020</a></li> <li><a href="https://youtu.be/4MCTXq-oF68" rel="nofollow">Airflow Breeze - Development and Test Environment for Apache Airflow</a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3f113f4f0b6648ad0798907e63dc49c793a3d27b53fa30e523334e97586b9c00/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f344d435458712d6f463638"><img src="https://camo.githubusercontent.com/3f113f4f0b6648ad0798907e63dc49c793a3d27b53fa30e523334e97586b9c00/68747470733a2f2f696d672e736869656c64732e696f2f796f75747562652f76696577732f344d435458712d6f463638" alt="Activity badge" data-canonical-src="https://img.shields.io/youtube/views/4MCTXq-oF68" style="max-width: 100%;"></a> - Screencast showing how to use Breeze environment by <a href="https://github.com/potiuk">Jarek Potiuk</a>.</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Libraries, Hooks, Utilities</h2><a id="user-content-libraries-hooks-utilities" class="anchor" aria-label="Permalink: Libraries, Hooks, Utilities" href="#libraries-hooks-utilities"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://github.com/Tauffer-Consulting/domino">Domino</a> - Domino is an open source Graphical User Interface platform for creating data and Machine Learning workflows (DAGs) with no-code, visually intuitive drag-and-drop actions. It is also a standard for publishing and sharing your Python code so it can be automatically used by anyone, directly in the GUI.</li> <li><a href="https://github.com/xnuinside/airflow-helper">Airflow-Helper</a> - setting up Airflow Variables, Connections, and Pools from a YAML configuration file.</li> <li><a href="https://github.com/ryanchao2012/airfly">AirFly</a> - Auto generate Airflow's dag.py on the fly.</li> <li><a href="https://github.com/digitalearthafrica/deafrica-airflow">DEAfrica Airflow</a> - Airflow libraries used by <a href="https://digitalearthafrica.org/" rel="nofollow">Digital Earth Africa</a>, an humanitarian effort to utilize satellite imagery of Africa.</li> <li><a href="https://github.com/airflow-plugins/">Airflow plugins</a> - Central collection of repositories of various plugins for Airflow, including mailchimp, trello, sftp, GitHub, etc.</li> <li><a href="https://github.com/industrydive/fileflow">fileflow</a> - Collection of modules to support large data transfers between Airflow operators through either local file system or S3. This addresses a gap where data is too large for XCOMs but too small or inconvenient for loading directly in the operator. Built by <a href="https://www.industrydive.com/" rel="nofollow">Industry Dive</a>.</li> <li><a href="https://github.com/michaelosthege/fairflow">fairflow</a> - Library to abstract away Airflow's Operators with functional pieces that transform the data from one operator to another.</li> <li><a href="https://github.com/teamclairvoyant/airflow-maintenance-dags">airflow-maintenance-dags</a> - <a href="http://clairvoyantsoft.com/" rel="nofollow">Clairvoyant</a> has a repo of Airflow DAGs that operator on Airflow itself, clearing out various bits of the backing metadata store.</li> <li><a href="https://gist.github.com/criccomini/2862667822af7fae8b55682faef029a7">test_dags</a> - a more complete solution for DAG integrity tests (<a href="https://medium.com/@ingwbaa/datas-inferno-7-circles-of-data-testing-hell-with-airflow-cef4adff58d8" rel="nofollow">first Circle of Data’s Inferno are the first</a>.</li> <li><a href="https://github.com/ajbosco/dag-factory">dag-factory</a> - A library for dynamically generating Apache Airflow DAGs from YAML configuration files.</li> <li><a href="https://github.com/godatadriven/whirl">whirl</a> - Fast iterative local development and testing of Apache Airflow workflows.</li> <li><a href="https://github.com/andreax79/airflow-code-editor">airflow-code-editor</a> - A plugin for Apache Airflow that allows you to edit DAGs in browser.</li> <li><a href="https://github.com/BasPH/pylint-airflow">Pylint-Airflow</a> - A Pylint plugin for static code analysis on Airflow code.</li> <li><a href="https://github.com/qubole/afctl">afctl</a> - A CLI tool that includes everything required to create, manage and deploy airflow projects faster and smoother.</li> <li><a href="https://github.com/ms32035/airflow-dag-dependencies">Dag Dependencies viewer</a> - A plugin which creates a view to visualize dependencies between the Airflow DAGs</li> <li><a href="https://github.com/asandeep/airflow-ecr-plugin">Airflow ECR Plugin</a> - Plugin to refresh AWS ECR login token at regular intervals. This is helpful where DockerOperator needs to pull images hosted on ECR.</li> <li><a href="https://github.com/Javier162380/AirflowKuberentesDebugger">AirflowK8sDebugger</a> - A library for generate k8s pod yaml templates from an Airflow dag using the KubernetesPodOperator.</li> <li><a href="https://github.com/GoogleCloudPlatform/oozie-to-airflow">Oozie to Airflow</a> - A tool to easily convert between <a href="http://oozie.apache.org/" rel="nofollow">Apache Oozie</a> workflows and Apache Airflow workflows.</li> <li><a href="https://github.com/angadsingh/airflow-ditto">Airflow Ditto</a> - An extensible framework to do transformations to an Airflow DAG and convert it into another DAG which is flow-isomorphic with the original DAG, to be able to run it on different environments (e.g. on different clouds, or even different container frameworks - Apache Spark on YARN vs Kubernetes). Comes with out-of-the-box support for EMR-to-HDInsight-DAG transforms.</li> <li><a href="https://github.com/chriscardillo/gusty">gusty</a> - Create a DAG using any number of YAML, Python, Jupyter Notebook, or R Markdown files that represent individual tasks in the DAG. gusty also configures dependencies, DAGs, and TaskGroups, features support for your local operators, and more. A fully containerized demo is available <a href="https://github.com/chriscardillo/gusty-demo">here</a>.</li> <li><a href="https://www.meltano.com" rel="nofollow">Meltano</a> - Open source, self-hosted, CLI-first, debuggable, and extensible ELT tool that embraces <a href="https://www.singer.io" rel="nofollow">Singer</a> for extraction and loading, leverages <a href="https://www.getdbt.com" rel="nofollow">dbt</a> for transformation, and <a href="https://meltano.com/#orchestration" rel="nofollow">integrates with Airflow for orchestration</a>.</li> <li><a href="https://github.com/politools/dag-checks">DAG checks</a> - The dag-checks consist of checks that can help you in maintaining your Apache Airflow instance.</li> <li><a href="https://github.com/covid-genomics/airflow-dvc">Airflow DVC plugin</a> - Plugin for open-source version-control system for data science and Machine Learning pipelines - <a href="https://dvc.org/" rel="nofollow">DVC</a>.</li> <li><a href="https://github.com/omerzamir/airflow-vars">Airflow Vars</a> - A CLI for variables management, created for CD-Pipelines in order to allow robust and safe variables management.</li> <li><a href="https://github.com/airflow-laminar/airflow-priority">airflow-priority</a> - Priority Tags (P1, P2, etc) for Airflow DAGs with automated alerting to Datadog, New Relic, Slack, Discord, and more</li> <li><a href="https://github.com/airflow-laminar/airflow-config">airflow-config</a> - <a href="https://pydantic.dev" rel="nofollow">Pydantic</a> / <a href="https://hydra.cc" rel="nofollow">Hydra</a> based configuration system for DAG and Task arguments</li> <li><a href="https://github.com/airflow-laminar/airflow-supervisor">airflow-supervisor</a> - Easy-to-use <a href="http://supervisord.org" rel="nofollow">supervisor</a> integration for long running or "always on" DAGs</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Meetups</h2><a id="user-content-meetups" class="anchor" aria-label="Permalink: Meetups" href="#meetups"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://www.meetup.com/Amsterdam-Airflow-meetup" rel="nofollow">Amsterdam Apache Airflow Meetup</a></li> <li><a href="https://www.meetup.com/Bangalore-Apache-Airflow-Meetup/" rel="nofollow">Bangalore Apache Airflow Meetup</a></li> <li><a href="https://www.meetup.com/Bay-Area-Apache-Airflow-Incubating-Meetup" rel="nofollow">Bay Area Apache Airflow Meetup</a></li> <li><a href="https://www.meetup.com/London-Apache-Airflow-Meetup/" rel="nofollow">London Apache Airflow Meetup</a></li> <li><a href="https://www.meetup.com/Melbourne-Apache-Airflow-Meetup/" rel="nofollow">Melbourne Apache Airflow Meetup</a></li> <li><a href="https://www.meetup.com/NYC-Apache-Airflow-Meetup/" rel="nofollow">New York City Apache Airflow Meetup</a></li> <li><a href="https://www.meetup.com/Paris-Apache-Airflow-Meetup/" rel="nofollow">Paris Apache Airflow Meetup</a></li> <li><a href="https://www.meetup.com/Portland-Apache-Airflow-Meetup/" rel="nofollow">Portland Apache Airflow Meetup</a></li> <li><a href="https://www.meetup.com/Tokyo-Apache-Airflow-incubating-Meetup/" rel="nofollow">Tokyo Apache Airflow Meetup</a></li> <li><a href="https://www.meetup.com/Warsaw-Airflow-Meetup" rel="nofollow">Warsaw Apache Airflow Meetup</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Commercial Airflow-as-a-service providers</h2><a id="user-content-commercial-airflow-as-a-service-providers" class="anchor" aria-label="Permalink: Commercial Airflow-as-a-service providers" href="#commercial-airflow-as-a-service-providers"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://cloud.google.com/composer/" rel="nofollow">Google Cloud Composer</a> - Google Cloud Composer is a managed service built atop Google Cloud and Airflow.</li> <li><a href="http://docs.qubole.com/en/latest/user-guide/airflow/" rel="nofollow">Qubole</a> - Qubole is mainly known as a service-and-support company for Apache Hive, but also provides Airflow as a component of its platform.</li> <li><a href="https://www.astronomer.io/" rel="nofollow">Astronomer.io</a> - Astronomer provides complete ETL lifecycle solutions and appears to be entirely focused on providing Airflow-based products.</li> <li><a href="https://aws.amazon.com/managed-workflows-for-apache-airflow/" rel="nofollow">AWS MWAA</a> - Amazon Managed Workflows for Apache Airflow (MWAA) is a managed orchestration service for Apache Airflow that makes it easier to set up and operate end-to-end data pipelines in the cloud at scale.</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Cloud Composer resources</h2><a id="user-content-cloud-composer-resources" class="anchor" aria-label="Permalink: Cloud Composer resources" href="#cloud-composer-resources"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><em>This section contains articles that apply to <a href="https://cloud.google.com/composer" rel="nofollow">Cloud Composer</a> — a service built by Google Cloud based on Apache Airflow. Tricks and solutions are described here that are intended for Cloud Composer, but may be applicable to vanilla Airflow.</em></p> <ul dir="auto"> <li><a href="https://medium.com/traveloka-engineering/enabling-autoscaling-in-google-cloud-composer-ac84d3ddd60" rel="nofollow">Enabling Autoscaling in Google Cloud Composer</a> - Supercharge your Cloud Composer deployment while saving up some cost during idle periods.</li> <li><a href="https://cloud.google.com/blog/products/data-analytics/scale-your-composer-environment-together-your-business" rel="nofollow">Scale your Composer environment together with your business</a> - The Celery Executor architecture and ways to ensure high scheduler performance.</li> <li><a href="https://github.com/politools/airflow-pianka-sh">pianka.sh</a> - Missing command in the gcloud tool. This tool facilitates some administrative tasks.</li> <li><a href="https://medium.com/swlh/the-smarter-way-of-scaling-with-composers-airflow-scheduler-on-gke-88619238c77b" rel="nofollow">The Smarter Way of Scaling With Composer’s Airflow Scheduler on GKE</a> - <a href="https://www.linkedin.com/in/roy-berkowitz-19922aa9/" rel="nofollow">Roy Berkowitz</a> discusses more effective use of nodes in the Cloud Composer service.</li> <li><a href="https://cloud.google.com/blog/products/data-analytics/easier-management-for-cloud-etl-elt-pipelines" rel="nofollow">Better together: orchestrating your Data Fusion pipelines with Cloud Composer</a> - <a href="https://www.linkedin.com/in/rachael-deacon-smith-82660172" rel="nofollow">Rachael Deacon-Smith</a> provides an overview of the operator for Datafusion use case on Cloud Composer.</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Non-English resources</h2><a id="user-content-non-english-resources" class="anchor" aria-label="Permalink: Non-English resources" href="#non-english-resources"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://airflow.apachecn.org" rel="nofollow">Airflow Documentation-Chinese</a> - (🇨🇳Chinese) <a href="https://github.com/apachecn">Apachecn</a> has translated the Airflow official documentation.</li> <li><a href="http://ncrocfer.github.io/posts/gestion-de-taches-avec-apache-airflow/" rel="nofollow">Gestion de Tâches avec Apache Airflow</a> - (🇫🇷French) <a href="https://github.com/ncrocfer">Nicolas Crocfer</a> - Overview of Airflow, basic concepts and how to write and trigger a DAG.</li> <li><a href="https://qiita.com/hankehly/items/1f02a34740276d1b8f0f" rel="nofollow">Airflowはすごいぞ!100行未満で本格的なデータパイプライン</a> - (🇯🇵Japanese) <a href="https://github.com/hankehly">Hank Ehly</a> gives a comprehensive introduction to Airflow's main concepts, and demonstrates how to create a data pipeline in less than 100 lines of code.</li> <li><a href="https://sekailab.com/wp/2018/04/05/apache-airflow-multinode-alpine-docker-image/" rel="nofollow">apache airflow 複数worker構成のalpine版docker imageを作った</a> - (🇯🇵Japanese) <a href="https://github.com/Drunkar">Akio Ohta</a> walks through his <a href="https://hub.docker.com/r/drunkar/airflow-alpine/" rel="nofollow">Docker image</a> for deploying an Alpine-based Airflow system.</li> <li><a href="https://qiita.com/hankehly/items/5e2493cdf2c95ae42449" rel="nofollow">AirflowのタスクログをS3に保存する方法</a> - (🇯🇵Japanese) <a href="https://github.com/hankehly">Hank Ehly</a> shows step-by-step how to configure sending task logs to AWS S3.</li> <li><a href="https://qiita.com/hankehly/items/f525465bba8b47da0b76" rel="nofollow">【徹底解説】Airflow Fluentd Elasticsearch Docker の連携方法</a> - (🇯🇵Japanese) <a href="https://github.com/hankehly">Hank Ehly</a> describes how to handle worker task logs with Fluentd, Elasticsearch and Docker.</li> <li><a href="https://www.solita.fi/blogit/apache-airflow-kaikki-mita-meilla-on-lahtee-dageista/" rel="nofollow">Apache Airflow – Kaikki Mitä Meillä On, Lähtee Dageista</a> - (🇫🇮Finnish) <a href="https://www.linkedin.com/in/oiivonen/" rel="nofollow">Olli Iivonen</a>'s overview of Airflow, concepts and Airflow's usage at <a href="https://www.solita.fi/" rel="nofollow">Solita</a>.</li> <li><a href="https://speakerdeck.com/gilsondev/airflow-automatizando-seu-fluxo-de-trabalho" rel="nofollow">Airflow - Automatizando seu fluxo de trabalho</a> - (🇧🇷Portuguese) <a href="https://github.com/gilsondev">Gilson Filho</a>'s overview of Airflow, concept and basic use.</li> <li><a href="https://imamdigmi.github.io/post/tutorial-airflow-part-1/" rel="nofollow">Panduan Dasar Apache Airflow</a> - (🇮🇩Indonesian) <a href="https://github.com/imamdigmi">Imam Digmi</a> - Overview of Airflow, concept, basic use with use case.</li> <li><a href="https://blog.duyet.net/tag/airflow" rel="nofollow">Airflow</a> - (🇻🇳Vietnamese) <a href="https://github.com/duyet">Duyet Le</a> - Overview of Airflow, concept, basic use with use case.</li> <li><a href="https://blog.csdn.net/Young2018/article/details/109105370?spm=1001.2014.3001.5501" rel="nofollow">Michael Yang's Airflow Chinese Blog Posts</a> - Michael Yang's Chinese blog posts about data engineering with Apache Airflow, conclude basic tutorials and devops skills.</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Sample projects</h2><a id="user-content-sample-projects" class="anchor" aria-label="Permalink: Sample projects" href="#sample-projects"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://github.com/GoogleCloudPlatform/public-datasets-pipelines">Google Cloud Platform Public Datasets Pipelines</a> - Cloud-native, data pipeline architecture for onboarding datasets to the Google Cloud Public Datasets Program.</li> <li><a href="https://gitlab.com/gitlab-data/analytics/-/tree/master/dags" rel="nofollow">GitLab Data Team DAGs</a> - Several DAGs used to build analytics for the GitLab platform.</li> <li><a href="https://github.com/hankehly/deploy-airflow-on-ecs-fargate">deploy-airflow-on-ecs-fargate</a> - Deploy to Amazon ECS Fargate. Demonstrates various features and configurations, such as autoscaling workers to zero, S3 remote logging and secret management.</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">License</h2><a id="user-content-license" class="anchor" aria-label="Permalink: License" href="#license"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a href="https://creativecommons.org/publicdomain/zero/1.0/" rel="nofollow"><img src="https://camo.githubusercontent.com/d5272b3949a219a6304a1d6478f1fd3015c0533821c885522f6a4f11a9297b0a/687474703a2f2f6d6972726f72732e6372656174697665636f6d6d6f6e732e6f72672f70726573736b69742f627574746f6e732f38387833312f7376672f63632d7a65726f2e737667" alt="CC0" data-canonical-src="http://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg" style="max-width: 100%;"></a></p> <p dir="auto">To the extent possible under law, <a href="https://github.com/jghoman">Jakob Homan</a> has waived all copyright and related or neighboring rights to this work.</p> </article></div></div></div></div></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div> </react-partial> <input type="hidden" data-csrf="true" value="YF2MP9wpgazKgJLDMeYJah0rNQJjKIf3FVzKoidsDr8CcaYV8SSUu79059NAvOMnyHOTCclu1eTdT9hCKdXNsg==" /> </div> <div data-view-component="true" class="Layout-sidebar"> <div class="BorderGrid about-margin" data-pjax> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <div class="hide-sm hide-md"> <h2 class="mb-3 h4">About</h2> <p class="f4 my-3"> Curated list of resources about Apache Airflow </p> <h3 class="sr-only">Topics</h3> <div class="my-3"> <div class="f6"> <a href="/topics/airflow" title="Topic: airflow" data-view-component="true" class="topic-tag topic-tag-link"> airflow </a> <a href="/topics/awesome" title="Topic: awesome" data-view-component="true" class="topic-tag topic-tag-link"> awesome </a> <a href="/topics/awesome-list" title="Topic: awesome-list" data-view-component="true" class="topic-tag topic-tag-link"> awesome-list </a> <a href="/topics/workflow-management" title="Topic: workflow-management" data-view-component="true" class="topic-tag topic-tag-link"> workflow-management </a> <a href="/topics/apache-airflow" title="Topic: apache-airflow" data-view-component="true" class="topic-tag topic-tag-link"> apache-airflow </a> </div> </div> <h3 class="sr-only">Resources</h3> <div class="mt-2"> <a class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:readme"}" href="#readme-ov-file"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book mr-2"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> Readme </a> </div> <include-fragment src="/jghoman/awesome-apache-airflow/hovercards/citation/sidebar_partial?tree_name=master"> </include-fragment> <div class="mt-2"> <a href="/jghoman/awesome-apache-airflow/activity" data-view-component="true" class="Link Link--muted"><svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-2"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span class="color-fg-muted">Activity</span></a> </div> <h3 class="sr-only">Stars</h3> <div class="mt-2"> <a href="/jghoman/awesome-apache-airflow/stargazers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <strong>3.8k</strong> stars</a> </div> <h3 class="sr-only">Watchers</h3> <div class="mt-2"> <a href="/jghoman/awesome-apache-airflow/watchers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-eye mr-2"> <path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"></path> </svg> <strong>161</strong> watching</a> </div> <h3 class="sr-only">Forks</h3> <div class="mt-2"> <a href="/jghoman/awesome-apache-airflow/forks" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <strong>498</strong> forks</a> </div> <div class="mt-2"> <a class="Link--muted" href="/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2Fjghoman%2Fawesome-apache-airflow&report=jghoman+%28user%29"> Report repository </a> </div> </div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame"> <a href="/jghoman/awesome-apache-airflow/releases" data-view-component="true" class="Link--primary no-underline Link">Releases</a></h2> <div class="text-small color-fg-muted">No releases published</div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/users/jghoman/packages?repo_name=awesome-apache-airflow" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center">Packages <span title="0" hidden="hidden" data-view-component="true" class="Counter ml-1">0</span></a></h2> <div class="text-small color-fg-muted" > No packages published <br> </div> </div> </div> <div class="BorderGrid-row" hidden> <div class="BorderGrid-cell"> <include-fragment src="/jghoman/awesome-apache-airflow/used_by_list" accept="text/fragment+html"> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/jghoman/awesome-apache-airflow/graphs/contributors" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center">Contributors <span title="71" data-view-component="true" class="Counter ml-1">71</span></a></h2> <ul class="list-style-none d-flex flex-wrap mb-n2"> <li class="mb-2 mr-2" > <a href="https://github.com/jghoman" class="" data-hovercard-type="user" data-hovercard-url="/users/jghoman/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/95350?s=64&v=4" alt="@jghoman" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/mik-laj" class="" data-hovercard-type="user" data-hovercard-url="/users/mik-laj/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/12058428?s=64&v=4" alt="@mik-laj" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/potiuk" class="" data-hovercard-type="user" data-hovercard-url="/users/potiuk/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/595491?s=64&v=4" alt="@potiuk" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/kaxil" class="" data-hovercard-type="user" data-hovercard-url="/users/kaxil/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/8811558?s=64&v=4" alt="@kaxil" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/tedmiston" class="" data-hovercard-type="user" data-hovercard-url="/users/tedmiston/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/366688?s=64&v=4" alt="@tedmiston" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/feng-tao" class="" data-hovercard-type="user" data-hovercard-url="/users/feng-tao/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/3223098?s=64&v=4" alt="@feng-tao" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/turbaszek" class="" data-hovercard-type="user" data-hovercard-url="/users/turbaszek/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/9528307?s=64&v=4" alt="@turbaszek" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/hankehly" class="" data-hovercard-type="user" data-hovercard-url="/users/hankehly/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/11639738?s=64&v=4" alt="@hankehly" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/marcosmarxm" class="" data-hovercard-type="user" data-hovercard-url="/users/marcosmarxm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/5154322?s=64&v=4" alt="@marcosmarxm" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/eyaltrabelsi" class="" data-hovercard-type="user" data-hovercard-url="/users/eyaltrabelsi/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/19736629?s=64&v=4" alt="@eyaltrabelsi" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/asafmaor" class="" data-hovercard-type="user" data-hovercard-url="/users/asafmaor/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/1312876?s=64&v=4" alt="@asafmaor" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/prabeesh" class="" data-hovercard-type="user" data-hovercard-url="/users/prabeesh/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/1409505?s=64&v=4" alt="@prabeesh" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/germaintanguy" class="" data-hovercard-type="user" data-hovercard-url="/users/germaintanguy/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/1759934?s=64&v=4" alt="@germaintanguy" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/msumit" class="" data-hovercard-type="user" data-hovercard-url="/users/msumit/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/2018407?s=64&v=4" alt="@msumit" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> </ul> <div data-view-component="true" class="mt-3"> <a text="small" href="/jghoman/awesome-apache-airflow/graphs/contributors" data-view-component="true" class="Link--inTextBlock Link">+ 57 contributors</a></div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3">Languages</h2> <div class="mb-2"> <span data-view-component="true" class="Progress"> <span style="background-color:#89e051 !important;;width: 100.0%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> </span></div> <ul class="list-style-none"> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/jghoman/awesome-apache-airflow/search?l=shell" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#89e051;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Shell</span> <span>100.0%</span> </a> </li> </ul> </div> </div> </div> </div> </div></div> </div> </div> </turbo-frame> </main> </div> </div> <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" > <h2 class='sr-only'>Footer</h2> <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap"> <div class="d-flex flex-items-center flex-shrink-0 mx-2"> <a aria-label="Homepage" title="GitHub" class="footer-octicon mr-2" href="https://github.com"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <span> © 2025 GitHub, Inc. </span> </div> <nav aria-label="Footer"> <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3> <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading"> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to Terms","label":"text:terms"}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to privacy","label":"text:privacy"}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to security","label":"text:security"}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to status","label":"text:status"}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to docs","label":"text:docs"}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to contact","label":"text:contact"}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a> </li> <li class="mx-2" > <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"cookies","context":"subfooter","tag":"link","label":"cookies_link_subfooter_footer"}" > Manage cookies </button> </cookie-consent-link> </li> <li class="mx-2"> <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"dont_share_info","context":"subfooter","tag":"link","label":"dont_share_info_link_subfooter_footer"}" > Do not share my personal information </button> </cookie-consent-link> </li> </ul> </nav> </div> </footer> <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999" data-initial-cookie-consent-allowed="" data-cookie-consent-required="false"></ghcc-consent> <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> You can’t perform that action at this time. </div> <template id="site-details-dialog"> <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open> <summary role="button" aria-label="Close dialog"></summary> <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal"> <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div class="octocat-spinner my-6 js-details-dialog-spinner"></div> </details-dialog> </details> </template> <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;"> <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;"> </div> </div> <template id="snippet-clipboard-copy-button"> <div class="zeroclipboard-container position-absolute right-0 top-0"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> <template id="snippet-clipboard-copy-button-unpositioned"> <div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> </div> <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div> <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div> </body> </html>