The Ingestion Framework is a Python module that wraps the OpenMetadata API and builds workflows and utilities on top of it. Therefore, you need to make sure that you have the complete OpenMetadata stack running: MySQL + ElasticSearch + OpenMetadata Server.To do so, you can either build and run the OpenMetadata Server locally as well, or use the metadata CLI to spin up the Docker containers as explained in the Tooling Status section of this page.
We recommend using pyenv to properly install and manage different Python versions in your system. Note that OpenMetadata requires Python version +3.7. This doc might be helpful to set up the environment virtualization.
Using an M1 Mac? To ensure compatibility with the different dependencies, use Python version 3.9.8 or higher. Note that the code
has not been tested with Python 3.10 due to some libraries not supporting that already.
For the instructions below, there are a couple of commands you’ll need to run first to prepare your environment:
make install_devsudo make install_antlr_climake generate
The backbone of OpenMetadata is the series of JSON schemas defining the Entities and their properties.All different parts of the code rely on those definitions. The first step to start developing new connectors is to properly set up your local environment to interact with the Entities.In the Ingestion Framework, this process is handled with datamodel-code-generator, which is able to read JSON schemas and automatically prepare pydantic models representing the input definitions. Please, make sure to run make generate from the project root to fill the ingestion/src/metadata/generated directory with the required models.Once you have generated the sources, you should be able to run the tests and the metadata CLI. You can test your setup by running make coverage and see if you get any errors.
When working on the Ingestion Framework, you might want to take into consideration the following style-check tooling:
pylint is a Static Code Analysis tool to catch errors, align coding standards and help us follow conventions and apply improvements.
black can be used to both autoformat the code and validate that the codebase is compliant.
isort helps us not lose time trying to find the proper combination of importing from stdlib, requirements, project files…
The main goal is to ensure standardized formatting throughout the codebase.When developing, you can run these tools with make recipes: make lint, make black and make isort. Note that we are excluding the generated sources from the JSON Schema standards.If you want to take this one step further and make sure that you are not committing any malformed changes, you can use pre-commit hooks. This is a powerful tool that allows us to run specific validations at commit time. If those validations fail, the commit won’t proceed. The interesting point is that the tools are going to fix your code for you, so you can freely try to commit again!You can install our hooks via make precommit_install.
pylint & black in the CI validations, so make sure to review your PRs for any warnings you generated.
black & isort in the pre-commit hooks.
If you’re just developing on the Ingestion side, you might not need to run the server from Intellij and the simple docker approach might be good enough. In these scenarios, you can:At least once, build the images fully:
sh docker/run_local_docker.sh
Which will package the server code. Afterward, if the modifications only impact the ingestion code and need to refresh the ingestion container, you can run:
cd docker/developmentdocker compose down -v && docker compose up --build
To run the tests, you’ll need to install some packages via make install_test.You can validate the environment by running make coverage from the root directory. Note that from some tests, having
the OpenMetadata server instance up is required as they interact with the API.
Running the ingestion workflows from PyCharm and debugging them is quite useful. In order to do so, follow these steps:First, make sure that your Python environment is pointing to the local env you are using to develop.Then, you can prepare Run Configurations to execute the ingestion as you would run the CLI:Note that in the example we are preparing a configuration to run and test Superset. In order to understand how to run
ingestions via the CLI, you can refer to each connector’s docs.The important part is that we are not running a script, but rather a module: metadata. Based on this, we can work as
we would usually do with the CLI for any ingestion, profiler, or test workflow.With these settings, you can start adding breakpoints in PyCharm and debug the workflows!
If you try to install the kafka plugin pip install "./ingestion[kafka]" on mac you might see the following error:
fatal error: 'librdkafka/rdkafka.h' file not found #include <librdkafka/rdkafka.h> ^~~~~~~~~~~~~~~~~~~~~~ 1 error generated. error: command '/usr/bin/clang' failed with exit code 1 [end of output] note: This error originates from a subprocess, and is likely not a problem with pip.error: legacy-install-failure× Encountered error while trying to install package.╰─> confluent-kafka
This can be solved by running brew install librdkafka. If the error still persists you might need to update the following environment variables:
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"OpenMetadata Documentation","colors":{"primary":"#6938EF","light":"#6938EF","dark":"#6938EF"},"logo":"https://mintcdn.com/openmetadata/Z_Ib-0g05fLykSep/public/images/icons/omd.svg?fit=max\u0026auto=format\u0026n=Z_Ib-0g05fLykSep\u0026q=85\u0026s=8eb40986afc777e29ae395288a3983e8","favicon":"https://mintcdn.com/openmetadata/Z_Ib-0g05fLykSep/public/images/icons/om-monogram.svg?fit=max\u0026auto=format\u0026n=Z_Ib-0g05fLykSep\u0026q=85\u0026s=8c8208506e2cadb9ef7a7302f79486fb","api":{"mdx":{"auth":{"method":"bearer"},"server":"https://sandbox.open-metadata.org/api"}},"appearance":{"default":"light","strict":true},"navbar":{"links":[{"icon":"Slack","href":"https://slack.open-metadata.org","label":"Community"},{"icon":"Book","href":"https://blog.open-metadata.org/","label":"Blogs"},{"href":"https://getcollate.io/","label":"Free Tier"}]},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/openmetadata","youtube":"https://www.youtube.com/@OpenMetadataChannel","x":"https://x.com/open_metadata"},"links":[{"items":[{"label":"Terms of Service","href":"https://www.getcollate.io/terms"},{"label":"Privacy Policy","href":"https://www.getcollate.io/privacypolicy"},{"label":"Trust Center","href":"https://trustcenter.getcollate.io/"},{"label":"Contact Us","href":"https://www.getcollate.io/contact-sales"}]}]},"seo":{"metatags":{"canonical":"https://docs.open-metadata.org"}},"styling":{"eyebrows":"breadcrumbs","latex":true},"integrations":{"ga4":{"measurementId":"GTM-554C968W"}},"interaction":{"drilldown":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"openmetadata","hasAudioNarration":false,"actualSubdomain":"openmetadata","customDomains":["docs.open-metadata.org"],"gitSource":{"type":"github","owner":"open-metadata","repo":"docs-om","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae233dcba39d6ad9c7482c3","collectionId":"ec8cb132-be9f-49ba-a8e9-eb4ad2e2b284","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae233dcba39d6ad9c7482c3"},"feedback":{"thumbs":true,"issues":true,"edits":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae233dcba39d6ad9c7482c3","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"Connectors","count":1123},{"language":"default","tag":"Connector","count":1030},{"language":"default","tag":"SDK \u0026 APIs","count":960},{"language":"default","tag":"Deployment","count":628},{"language":"default","tag":"Database","count":547},{"language":"default","tag":"Data Assets","count":470},{"language":"default","tag":"Data Governance","count":314},{"language":"default","tag":"Data Quality and Observability","count":282},{"language":"default","tag":"Ingestion","count":228},{"language":"default","tag":"Developers","count":210}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"globals.css","content":"/* latin-ext */\n@font-face {\n font-family: 'DM Sans';\n font-style: italic;\n font-weight: 100 1000;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/dmsans/v17/rP2Fp2ywxg089UriCZa4ET-DNl0.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'DM Sans';\n font-style: italic;\n font-weight: 100 1000;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/dmsans/v17/rP2Fp2ywxg089UriCZa4Hz-D.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* latin-ext */\n@font-face {\n font-family: 'DM Sans';\n font-style: normal;\n font-weight: 100 1000;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/dmsans/v17/rP2Hp2ywxg089UriCZ2IHSeH.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'DM Sans';\n font-style: normal;\n font-weight: 100 1000;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/dmsans/v17/rP2Hp2ywxg089UriCZOIHQ.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n@tailwind base;@tailwind components;@tailwind utilities;:root{--top-nav-height:70px;--main-nav-height:42px;--side-nav-width:288px;--side-nav-collapsed-width:42px;--select-dropdown-default-height:28px;--select-dropdown-default-width:165px;--side-nav-width:min(20%, 300px);--api-side-nav-width:max(14%, 220px);--content-div-width:min(17%, 250px);--default-border-color:#dce3ec;--primary-color:#6938EF;--primary-shadow-color:#5469d433;--primary-background-color:rgba(84, 105, 212, 0.05);--select-background-color:#f4f7ff;--icon-background-color:#f1f3fe;--select-border-color:#e9eefc;--homepage-container-px:130px;--default-text-color:rgb(60, 66, 87);--gray-text-color:rgba(60, 66, 87, 0.7);--white-color:#fff;--top-nav-color:#f7fafc;--code-background-color:#212d63;--code-gray-background-color:rgb(79, 86, 107);--code-light-background-color:#f7fafc;--code-toolbar-color:#212d63;--code-gray-toolbar-color:#3c4257;--code-light-toolbar-color:#ffffff;--code-light-border-color:#e3e8ee;--code-filename-color:#a4cdfe;--code-gray-filename-color:#dadce1;--code-light-filename-color:#f7fafc;--code-block-text-color:#f5fbff;--purple-bg-color:#7147e81a;--green-bg-color:#0084761a;--pink-bg-color:#b02aac1a;--purple-icon-color:#7147e8;--green-icon-color:#008376;--pink-icon-color:#b02aac;--beta-label-color:#0950C5;--beta-label-bg-color:#E4EEFF;--prod-label-color:#81C562;--prod-label-bg-color:#EEFBE7;--stable-label-color:#1890ff;--stable-label-bg-color:#e6f7ff;--connector-icon-bg-color:#F8F8F8;--green-tag-color:#43A047;--green-tag-bg-color:#43A0471A;--orange-tag-color:#FF7C50;--orange-tag-bg-color:#FF7C501A}body{font-family:\"DM Sans\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";color:var(--default-text-color);margin:0;font-weight:400;-webkit-font-smoothing:antialiased}h1,h2,h3,h4,h5,h6{font-weight:600;font-family:\"DM Sans\"}b,strong{font-weight:600}p{line-height:1.5em;margin:8px 0 0;color:#414651}h1{font-size:36px;line-height:44px;color:#224!important;margin-bottom:10px!important}h2{font-size:30px;line-height:38px}h3{font-size:24px;line-height:32px}h4{font-size:20px;line-height:30px}h5{font-size:18px;line-height:28px}body,h6{font-size:16px}h6{line-height:24px}a{color:var(--primary-color);font-weight:500}li::marker{color:var(--primary-color)}ol{list-style:decimal;margin-top:16px;margin-left:16px}ol li::marker{color:var(--default-text-color)}li>ul{margin-top:0;margin-left:16px}pre{border-radius:6px;background-color:var(--code-background-color)}code,pre{-ms-overflow-style:none;scrollbar-width:none}::-webkit-scrollbar,code::-webkit-scrollbar,pre::-webkit-scrollbar{display:none}*{scrollbar-width:none}a.link{color:#6938ef;font-weight:600;text-decoration:none;border:0}a.link:hover{text-decoration:underline}.connector-tab{display:block;width:100%;text-align:start;padding:8px;cursor:pointer;border-radius:4px}.active-connector,.connector-tab:hover{background-color:var(--primary-background-color)}.active-connector{border:.5px solid var(--select-border-color);color:var(--primary-color);font-weight:600}.divider{color:var(--default-border-color)}.icons{height:2rem;width:2rem}.cloud-button{border-radius:1rem;border:1px solid #c280ff;background-color:#c280ff}.search,.search-box{background-color:#f4f4f4}.search-box{height:2.25rem;width:550px;border:1px solid #f4f4f4;border-radius:.5rem;padding:4px 20px;color:#9e9d9d;display:flex;align-items:center}.search{width:90%;height:90%;border:0;outline:0}.overview-container{width:100vw;display:flex;flex-direction:column;justify-content:center;padding:50px 10%;background:#f4f7ff}.container-heading,.overview-heading{font-weight:700;font-size:22px;line-height:42px;margin-bottom:12px}.container-heading{margin-bottom:40px}.blogs-container,.cards-container{display:grid;grid-template-columns:1fr 1fr 1fr;gap:32px}.homepage-containers{padding:0 10%;margin:80px 0 0}#myUL{list-style-type:none;margin:0;padding:0}.nested{display:none}.active{display:block;color:var(--primary-color)}.DownArrow{display:none}.RightArrow{display:block}.highlightedCode{background-color:#1a2652}.page-404{height:calc(100vh - var(--top-nav-height) - var(--main-nav-height))}.content{flex-grow:0;flex-shrink:1}.non-collapsed-content{width:calc(100vw - var(--side-nav-width))}.collapsed-content{width:calc(100vw - var(--side-nav-collapsed-width))}.card-icon-container{padding:8px;width:fit-content;border-radius:10px}.card-purple-icon{background-color:var(--purple-bg-color);border:1px solid #7147e8}.card-green-icon{background-color:var(--green-bg-color);border:1px solid #008376}.card-pink-icon{background-color:var(--pink-bg-color);border:1px solid #b02aac}.nav-bar-container{position:sticky;top:0;z-index:100}.min-width-600{min-width:600px}@media (max-width:1240px){.blogs-container{grid-template-columns:1fr 1fr}}@media (max-width:900px){.cards-container{grid-template-columns:1fr 1fr}.blogs-container{grid-template-columns:1fr}.overview-container{padding:20px 60px;width:100%}.homepage-containers{padding:20px 60px;margin:32px 0 0}}@media (max-width:600px){.cards-container{grid-template-columns:1fr}.non-collapsed-content{display:none}.collapsed-content{width:calc(100% - 41px)}}#header h1,#header p{display:none!important}.mdx-content{margin-top:0!important}.api-page-container{display:grid;grid-template-columns:var(--api-side-nav-width) calc(100vw - var(--api-side-nav-width))}.hash-link{overflow:hidden;width:0;height:0;display:block;visibility:hidden;text-decoration:none;pointer-events:none;margin-top:-300px!important;padding-top:300px}.cookie-modal{position:fixed;bottom:0;background-color:#f8fbfc;z-index:20;padding:1rem;box-shadow:var(--shadow-card);transform:translateY(100%);transition:transform 1.2s ease-in-out,visibility 1.2s ease-in-out;visibility:hidden;border:1px solid #c9c4c4;border-radius:10px}.cookie-modal p{color:#292929;font-weight:300}.cookie-modal-buttons{margin-top:2rem;display:flex;gap:.75rem;justify-content:flex-end}.button{border-radius:1.5rem;padding:.5rem 2rem;font-size:.875rem;cursor:pointer;border:0}.button-accept{background-color:#7147e8;color:#fff}.button-reject{background-color:#fff;color:#7147e8;border:1px solid #7147e8}@media (min-width:640px){.cookie-modal{margin:1.25rem;max-width:36rem}}@media (min-width:1024px){.cookie-modal{max-width:48rem}}.cookie-modal.visible{transform:translateY(0);visibility:visible}.brand-docs-banner{font-weight:500;padding:0 8px;border-radius:12px;margin-top:16px;width:fit-content}.breadcrumb-item:first-child{display:none}.breadcrumb-item:last-of-type a{color:#414651;pointer-events:none;cursor:text;text-decoration:none}#page-loader{position:fixed;top:0;left:0;width:0%;height:3px;background:linear-gradient(90deg,#3b82f6,#8b5cf6);z-index:9999;transition:width .3s ease}#navbar .border-b{border:0}#navbar .nav-tabs{background-color:#fafafa;max-width:max-content;border:1px solid #eaecf5;border-radius:100px;margin:24px auto 4px;column-gap:16px;overflow-x:auto;display:flex;flex-wrap:nowrap;justify-content:flex-start}#navbar .nav-tabs .nav-tabs-item{padding:12px 24px;font-size:16px;white-space:nowrap;flex-shrink:0;color:#414651;font-weight:500}#navbar .nav-tabs .nav-tabs-item:hover{color:#181d27;text-decoration:none}#navbar .nav-tabs .nav-tabs-item .absolute,#navbar .nav-tabs a[href*=\"/how-to-guides/\"],a.mobile-nav-tabs-item[href*=\"/how-to-guides/\"]{display:none!important}#navbar .nav-tabs .nav-tabs-item.text-primary{color:#fff;background-color:#252b37;border-radius:100px;font-weight:600}#navbar .nav-tabs:has(a[href*=\"/how-to-guides/\"].text-primary) a.nav-tabs-item[href*=\"/how-to-guides\"]{color:#fff;background-color:#252b37;border-radius:100px;font-weight:600}#navbar .h-10{height:auto!important}.navbar-link a{background-color:transparent;color:#535862;font-weight:600}.nav-logo{height:40px}.navbar-link a:hover{color:#181d27;background-color:transparent}.products-container h2{color:#224;font-size:22px;font-weight:600}.card,.card>*{transition:all .3s ease}.card{border:0;box-shadow:0 4px 12px -1px rgba(10,13,18,.08)}.card>*{padding:20px}.card h2{color:#181d27;font-size:18px;line-height:20px}.card:hover{box-shadow:0 3px 3px -1.5px #0a0d120a,0 8px 8px -4px #0a0d1208,0 20px 24px -4px #0a0d1214;transform:translateY(-2px)}.card:hover>*{padding:24px;margin:-4px}.connector-page .card [data-component-part=card-content-container]{position:relative}.card [data-component-part=card-icon]:has(>svg){background-color:#e6f1ff;padding:24px;border-radius:100%;display:inline-flex;align-items:center;justify-content:center}body:not(:has(.homepage-container)) .card [data-component-part=card-icon]{width:auto!important;height:auto!important;min-width:32px!important;min-height:32px!important;align-self:flex-start!important}body:not(:has(.homepage-container)) .card [data-component-part=card-icon] img{width:32px!important;height:32px!important;object-fit:contain;flex-shrink:0}.connector-page div[data-component-part=card-icon]{background-color:#f8f9fc;padding:16px;border-radius:100%;display:inline-flex;align-items:center;justify-content:center;width:auto!important;height:auto!important}.connector-page div[data-component-part=card-icon] img,.connector-page div[data-component-part=card-icon] svg{width:32px!important;height:32px!important;object-fit:contain;flex-shrink:0;position:relative;z-index:1}.prod-beta-chip{display:flex;gap:4px;font-size:10px;width:max-content;border-radius:100px;padding:0 6px;font-weight:500;position:absolute;top:12px;right:12px}.prod-beta-chip.prod{color:#067647;background-color:#ecfdf3;border:1px solid #abefc6}.prod-beta-chip.beta{color:#175cd3;background-color:#eff8ff;border:1px solid #b2ddff}.prod-beta-chip img,button[aria-haspopup=menu] p{margin:0}.prod-beta-chip span{margin-top:-7px}#sidebar-content{border:0;top:132px!important;height:calc(100vh - 132px)!important}.sidebar-group-header{display:none}.my-2:has(ul.sidebar-group a[href*=\"/api-reference\"])>.sidebar-group-header{display:flex}.sidebar-group-header h5{color:#224;font-size:14px;font-weight:600}#table-of-contents-content .toc-item a{color:#414651}#table-of-contents-content .toc-item a:hover{color:#414651;border-color:#d5d9eb}#table-of-contents-content .toc-item a.text-primary{color:#6938ef;border-color:#6938ef;font-weight:600}.collate-ai-container h1,.products-container h1,body:not(:has(.homepage-container)) .mdx-content h1{display:flex;flex-direction:column;align-items:flex-start;margin-top:0!important}body:not(:has(.homepage-container)) .mdx-content h1#error-title{align-items:center}.collate-ai-container h1::before,.products-container h1::before,body:not(:has(.homepage-container)) .mdx-content h1::before{content:\"OpenMetadata Documentation\";display:block;background-color:#ebe9fe;color:#6938ef;padding:4px 12px;border-radius:100px;font-size:14px;font-weight:600;line-height:1.5;margin-bottom:16px;width:fit-content;flex-shrink:0}h1.ConnectorName::before{margin-top:-40px;position:absolute;top:-2px;left:0}body:has(.homepage-container) #assistant-entry,body:has(.homepage-container) #search-bar-entry,div:has(>#chat-assistant-sheet) .cursor-col-resize{display:none!important}.search-container{position:relative;margin-top:64px;display:flex;align-items:center;justify-content:center;width:100%;max-width:800px;margin-left:auto;margin-right:auto;padding:0 6px}.homepage-search-input{width:100%;padding:18px 58px 18px 28px;border:2px solid #eaecf5;border-radius:100px;font-size:16px;color:#3c4257;cursor:pointer;transition:all .2s ease;box-sizing:border-box}.homepage-search-input::placeholder{color:#cecfd2;font-size:18px}.homepage-search-input:hover{background-color:#fff}.homepage-search-input:focus{outline:0;background-color:#fff;box-shadow:0 0 0 3px rgba(84,105,212,.1)}.search-shortcut{position:absolute;right:20px;top:50%;transform:translateY(-50%);color:#9ca3af;padding:4px 8px;border-radius:4px;font-size:12px;font-weight:600;pointer-events:none;white-space:nowrap}.navbar-link:last-of-type a{background-color:#6938ef;color:#fff;border-radius:100px;display:flex;justify-content:center}.navbar-link:last-of-type a:hover{background-color:#5f27f8}body:has(.connector-page) #sidebar-content,body:has(.deployment-page-container) #sidebar-content,body:has(.getting-started-container) #sidebar-content,body:has(.how-to-guides-container) #sidebar-content,body:has(.sdk-container) #sidebar-content{display:none}body:has(.connector-page) #content-container,body:has(.deployment-page-container) #content-container,body:has(.getting-started-container) #content-container,body:has(.how-to-guides-container) #content-container,body:has(.sdk-container) #content-container{max-width:1300px!important}.collate-ai-container{margin-top:10px}.prose iframe,article iframe{max-width:600px!important;width:100%!important;margin:0 auto!important;display:block!important;height:auto!important;aspect-ratio:16/9!important;border:0!important}@media (max-width:1024px){.navbar-link:first-of-type{margin-top:20px}.prose iframe,article iframe{max-width:100%!important;width:100%!important;height:auto!important;aspect-ratio:16/9!important}}@media (max-width:768px){.prose iframe,article iframe{max-width:100%!important;width:100%!important;margin:0!important;height:auto!important;aspect-ratio:16/9!important}}.card:not(:has([data-component-part=card-icon])){border:1px solid #eaecf5!important;background-color:#f8f9fc!important;box-shadow:none!important}.card.card:not(:has([data-component-part=card-icon])) h2{color:#6938ef;font-weight:500;font-size:20px;margin-bottom:12px;line-height:30px}.card.card:not(:has([data-component-part=card-icon])):hover h2{text-decoration:underline}.how-to-guides-container ul{list-style:none;padding-left:0}.how-to-guides-container ul li{padding-left:28px;position:relative;margin-bottom:8px}.how-to-guides-container ul li::before,.python-container ul li::before,.sdk-container ul li::before{content:'';position:absolute;left:0;top:6px;width:16px;height:16px;background-color:transparent;background-image:url(/public/images/icons/check-circle.svg);background-size:contain;background-repeat:no-repeat}.sdk-container .card img{min-width:40px!important;width:40px!important;height:40px!important}.code-block,.code-block [data-component-part=code-block-root]{border:0!important;background-color:#3e444f!important;border-radius:16px!important;backdrop-filter:blur(40px)}.code-block code,.code-block pre,.code-block span{color:#e5e7eb!important;background-color:transparent!important}.python-container{background-color:#fafafa;border-radius:12px;padding:6px 20px}.callout [data-component-part=callout-content]{color:#414651!important}@layer utilities{.callout [data-component-part=callout-content] a{color:var(--primary-color)!important}}div:has(>#chat-assistant-sheet){border:0}#chat-assistant-sheet{margin-top:.4rem!important;min-height:90%!important;border:1px solid #eaecf5;border-top-left-radius:24px;border-top-right-radius:24px;box-shadow:0 2px 2px -1px #0a0d120a,0 4px 6px -2px #0a0d1208,0 12px 16px -4px #0a0d1214;background:#0a0d12;color:rgba(255,255,255,.9)}.chat-assistant-sheet-header span{color:rgba(255,255,255,.9)!important}.chat-assistant-sheet-header span.font-medium{font-size:0}.chat-assistant-sheet-header span.font-medium::before{content:\"Ask AI\";font-size:.875rem;font-weight:600}.chat-assistant-sheet-header svg{width:16px;height:16px;color:rgba(255,255,255,.8)}#chat-assistant-textarea{background-color:#373a41;border-radius:100px;color:rgba(255,255,255,.9);padding:12px}#chat-assistant-textarea::placeholder{color:rgba(255,255,255,.6)}.chat-assistant-send-button{width:32px!important;height:32px!important;bottom:6px;background-color:#2970ff}.chat-assistant-send-button:hover{background-color:#004eeb}.chat-assistant-send-button svg{width:16px;height:16px}div:has(>div>#chat-assistant-textarea){border:0!important;background-color:#373a41}#chat-content{margin-top:12px}#chat-content .rounded-2xl.bg-gray-100{background:#22262f!important}#chat-content button{color:rgba(255,255,255,.6)}#chat-content button[aria-label*=Vote]:hover,#chat-content button[aria-label=\"Copy chat response\"]:hover{color:#22262f}#chat-content .whitespace-pre-line,#chat-content li{color:rgba(255,255,255,.7)}#chat-content .rounded-2xl.bg-gray-100 .text-gray-800,#chat-content .rounded-2xl.bg-gray-100 div{color:#ffffffe5!important}#assistant-entry{margin-left:auto;border:2px solid #1570ef;background-color:transparent}#assistant-entry span,#assistant-entry svg{-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;font-weight:600;color:#1570ef}#assistant-entry span,#assistant-entry svg,#assistant-entry:hover{background:linear-gradient(45deg,#175cd3 0,#1570ef 100%)}#assistant-entry:hover span,#assistant-entry:hover svg{background:0 0;-webkit-background-clip:unset;-webkit-text-fill-color:#fff;background-clip:unset;color:#fff}div:has(>#search-bar-entry):has(>#assistant-entry){flex-direction:row-reverse!important}.deployment-page-container ul[data-component-part=tabs-list]{width:100%;display:flex;justify-content:space-between;border:0}.deployment-page-container div[data-active=true],.deployment-page-container div[data-component-part=tab-button]{border:0}.card-layout{display:flex;gap:24px;padding:20px;box-shadow:0 2px 7px 0 rgba(169,169,169,.3);border-radius:12px;margin:6px;overflow:hidden}.card-layout>div:last-child{flex-shrink:0;align-self:start}.card-layout .icon{width:64px;height:64px;margin:0}.card-layout .header{font-size:20px;font-weight:600;color:#224}.card-layout .header-container{display:flex;align-items:center;gap:10px}.card-layout .header-chip{font-size:12px;background-color:#ebe9fe;color:#6938ef;font-weight:500;border-radius:36px;padding:2px 8px}.card-layout p{font-size:15px;color:#414651;font-weight:500;margin:8px 0 0}.card-layout .button-card{white-space:nowrap;background-color:#5925dc;color:#fff;text-decoration:none;padding:6px 8px;border-radius:6px;font-size:14px;font-weight:500}.card-layout .button-card:hover{text-decoration:none;background-color:#4d20be;border-bottom:none}.card-layout .button-link{white-space:nowrap;color:#5925dc;font-size:16px;font-weight:600;text-decoration:none;border-bottom:none;display:flex;gap:8px;align-items:center}.card-layout .button-link img{width:10px;height:10px;margin:0}.deployment-page-container div[data-component-part=card-cta] button{color:#6938ef}.deployment-page-container div[data-component-part=card-content-container]{height:100%}.card-layout.upgrade{background:linear-gradient(90deg,#f7f9ff 0,#fcfaff 100%)}.deployment-page-container .card-group{margin:6px}@media (max-width:768px){.card-layout{flex-direction:column}}@media (max-width:580px){.card-layout .header-container{flex-direction:column;align-items:start;margin-bottom:16px}}.deployment-tabs[role=tablist]{display:grid!important;grid-template-columns:repeat(3,1fr);gap:24px;max-width:1200px;margin:32px auto;padding:12px;border:0!important;background:0 0!important}[role=tabpanel][data-component-part=tab-content]{margin-top:32px}.deployment-tabs [role=tablist]::before{content:none!important}.deployment-tabs [role=tab]{all:unset;cursor:pointer;display:flex!important;flex-direction:column;align-items:flex-start!important;padding:4px 14px!important;background-color:#fff!important;position:relative;box-shadow:0 4px 12px -1px #0a0d1214;border-radius:12px;margin-top:28px;transition:box-shadow .2s ease,transform .2s ease;text-align:left;box-sizing:border-box}.deployment-tabs [role=tab]:hover{outline:2px solid #ccbafe}.deployment-tabs [role=tab][aria-selected=true]{outline:2px solid #6938ef!important}.deployment-tabs [role=tab]::before{background-color:#ebe9fe;color:#6938ef;max-width:max-content;border-top-left-radius:12px;padding:6px 60px 32px 16px;position:absolute;top:-34px;left:0;-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 70' preserveAspectRatio='none'%3E%3Cpath d='M0,12 Q0,0 12,0 L165,0 Q177,0 182,10 L200,70 L0,70 Z'/%3E%3C/svg%3E\") no-repeat;-webkit-mask-size:100% 100%;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 70' preserveAspectRatio='none'%3E%3Cpath d='M0,12 Q0,0 12,0 L165,0 Q177,0 182,10 L200,70 L0,70 Z'/%3E%3C/svg%3E\") no-repeat;mask-size:100% 100%;font-size:14px;font-weight:500;z-index:-1}.deployment-tabs [data-component-part=tab-button]{font-size:18px;font-weight:600;color:#224;display:flex;gap:10px;padding:10px 0!important}.deployment-tabs [role=tab]:nth-child(1)::before{content:\"Best for: PoC, exploration\"}.deployment-tabs [role=tab]:nth-child(2)::before{content:\"Best for: Teams, orgs\"}.deployment-tabs [role=tab]:nth-child(3)::before{content:\"Best for: Existing users\"}.deployment-tabs [role=tab] img{width:50px!important;height:50px!important;order:-1}.deployment-tabs [role=tab] [data-slot=title],.deployment-tabs [role=tab]>span:first-of-type{color:#181d27!important;font-size:20px!important;font-weight:600!important;margin-top:16px;display:block}.deployment-tabs [role=tabpanel]{max-width:1200px;margin:0 auto;padding:20px}@media (max-width:768px){.deployment-tabs [role=tablist]{grid-template-columns:1fr;gap:64px}.deployment-tabs [role=tab]{min-height:auto}}.space-x-2>:not([hidden])~:not([hidden]){margin:0}.update-container{display:flex;flex-direction:column!important;padding-top:0}.update-container>div:first-of-type{width:100%!important;max-width:100%!important;flex-direction:column!important;align-items:flex-start!important;position:sticky!important;top:128px!important;z-index:11;background-color:#fff;padding:36px 0 8px}"},{"filePath":"style.css","content":".homepage-container{max-width:1440px;margin:0 auto;padding:0 10px 40px}.collate-ai-iframe{margin:32px 0 40px}.banner-content{padding:96px 0;background:radial-gradient(46.63% 44.4% at 50% 50%,rgba(201,207,255,.2) 0,rgba(255,255,255,.2) 100%)}.page-header{color:#181d27!important;font-weight:600;font-size:56px;text-align:center;margin-top:24px}#header-highlight{background:linear-gradient(to top,#b224ef 0,#7579ff 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.page-description{text-align:center;color:#717680;font-size:20px;margin-top:20px}.header-description{font-size:18px;margin-top:16px}.chips{display:flex;justify-content:center;gap:24px;margin-top:24px}.chip{padding:8px 12px;border-radius:100px;box-shadow:0 4px 12px -1px rgba(10,13,18,.08);display:flex;gap:12px;align-items:center;font-weight:500;width:max-content}.chip.purple{background:#ebe9fe;color:#6938ef}.chip.purple:hover{background:#e5e2fd}.chip.header{background-color:#f5f3ff;color:#875bf7;margin:0 auto;padding:8px 20px;box-shadow:none;font-size:14px}.deployment-cards{max-width:1200px;margin:16px auto;display:grid;grid-template-columns:repeat(3,1fr);gap:24px;position:relative;padding:20px}.deployment-top{background-color:#fafafa;color:#181d27;max-width:max-content;border-top-left-radius:12px;padding:10px 60px 32px 24px;position:relative;top:28px;-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 70' preserveAspectRatio='none'%3E%3Cpath d='M0,12 Q0,0 12,0 L165,0 Q177,0 182,10 L200,70 L0,70 Z'/%3E%3C/svg%3E\") no-repeat;-webkit-mask-size:100% 100%;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 70' preserveAspectRatio='none'%3E%3Cpath d='M0,12 Q0,0 12,0 L165,0 Q177,0 182,10 L200,70 L0,70 Z'/%3E%3C/svg%3E\") no-repeat;mask-size:100% 100%}.best-enterprise{max-width:max-content;border-radius:32px 80px 0 0;background:#224;padding:9px 44px 10px 45px;display:flex;gap:20px;align-items:center}.best-enterprise .collate-logo{width:84px;height:14px}.best-enterprise .x-icon{width:18px;height:18px}.best-enterprise .om-logo{width:64px;height:25px}.deployment-card{box-shadow:0 4px 12px -1px #0a0d1214;background-color:#fff;border-radius:12px;padding:20px;box-sizing:border-box;position:relative;z-index:24;display:flex;flex-direction:column;height:100%}.deployment-card img{align-self:flex-start;width:60px;height:60px}.deployment-card h3{color:#181d27;margin-top:16px;font-size:20px}.deployment-card p{color:#717680;font-size:18px}.deployment-card .read-more img,.highlight-card .read-more img{width:12px;height:12px}.collate-om{margin:72px auto 24px;max-width:1200px;padding:20px}.collate-content{background-image:url(/public/images/banner-bg.png);background-size:100% 100%;background-position:center;background-repeat:no-repeat;border-radius:0 20px 20px 20px;padding:28px 44px;width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:24px;position:relative;z-index:24}.collate-content .summit-header{font-size:48px;font-weight:400;color:#224;line-height:52px}.collate-content p{color:#5816dc;margin-top:0;margin-left:4px;font-size:28px;font-weight:600}.collate-content .explore-collate{background-color:#fbe200;color:#000;font-size:18px;white-space:nowrap;padding:11px 20px;border-radius:6px;font-weight:600}.collate-content .explore-collate:hover{background-color:#dec908}.collate-content .explore-collate a{color:#000;font-weight:600}.deployment,.guides,.highlights,.quick-links{padding:48px 48px 96px}.connectors{padding:48px 48px 24px}.guide-header{font-weight:500;font-size:40px;color:#181d27;text-align:center;margin-top:24px}.guide-list{display:grid;grid-template-columns:repeat(7,1fr);gap:24px;margin:52px auto 0;max-width:100%}.guide-card,.see-all{text-align:center;font-size:18px;font-weight:500}.guide-card{box-shadow:0 4px 12px -1px rgba(10,13,18,.08);padding:20px;border-radius:20px;display:flex;flex-direction:column;align-items:center;color:#252b37;gap:16px;width:100%;transition:all .3s ease}.guide-card:hover{box-shadow:0 20px 24px -4px #0a0d1214;transform:translateY(-4px);padding:24px;margin:-4px}a.guide-card img{width:80px!important;height:80px!important}.see-all{margin:64px auto 0;box-shadow:0 2px 2px -1px rgba(10,13,18,.04),0 4px 6px -2px rgba(10,13,18,.03),0 12px 16px -4px rgba(10,13,18,.08);width:max-content;padding:12px 24px;background-color:#f4f3ff;border-radius:100px}.see-all a{color:#6938ef!important}.see-all:hover{background-color:#e3e0fc}.highlight-cards{max-width:850px;display:grid;grid-template-columns:repeat(2,1fr);gap:32px;margin:60px auto 0}.highlight-card{box-shadow:0 4px 12px -1px rgba(10,13,18,.08);padding:20px;border-radius:12px;transition:all .3s ease}.highlight-card p{font-size:18px;color:#717680}.highlight-card:hover{box-shadow:0 3px 3px -1.5px rgba(10,13,18,.04),0 8px 8px -4px rgba(10,13,18,.03),0 20px 24px -4px rgba(10,13,18,.08);padding:24px;margin:-4px;transform:translateY(-2px)}.highlight-card .icon{width:48px!important;height:48px!important}.highlight-header{font-size:20px;font-weight:500;color:#181d27;margin-top:12px}.deployment-card .read-more,.read-more{margin-top:20px;display:flex;gap:10px;align-items:center;color:#6938ef;font-weight:600}.deployment-card .read-more{margin-top:auto}.deployment-card:hover .read-more,.highlight-card:hover .read-more{color:#581ef7}.read-more img{margin-top:2px}.deployment-card img{margin-top:6px}.links{margin:40px auto 0;max-width:80%;display:grid;grid-template-columns:repeat(3,1fr);justify-items:center}.link-header{color:#181d27;display:flex;gap:10px;align-items:center;margin-bottom:16px}.link-header h3{font-size:20px;font-weight:500}.link-list{color:#6938ef;font-weight:500;display:flex;flex-direction:column;gap:12px}.link-list a:hover{text-decoration:underline;color:#5730c1}.collate-video{background:linear-gradient(135deg,rgb(224 195 252/50%) 0,rgb(142 197 252/50%) 100%);border-radius:24px;max-width:90%;margin:32px auto 64px;padding:36px 80px}.video-content{display:grid;grid-template-columns:repeat(2,1fr);align-items:center;gap:16px}.video-container{width:100%;max-width:600px;margin:20px auto;padding:0 16px;box-sizing:border-box}.video,.video-container iframe{border-radius:20px;border:3px solid #bed2fb;height:auto}.video-container iframe{width:100%;aspect-ratio:16/9;display:block}.video{max-width:100%;box-shadow:0 2px 2px -1px rgba(10,13,18,.04),0 4px 6px -2px rgba(10,13,18,.03),0 12px 16px -4px rgba(10,13,18,.08)}.video-chip{background-color:rgba(255,255,255,.4);width:max-content;padding:12px 8px;border-radius:24px;color:#6938ef;font-size:12px}.video-description{color:#414651;font-size:18px;max-width:90%}.product-demo{background-color:#7a5af8;padding:8px 14px;color:#fff;border-radius:24px;margin-right:8px;font-size:12px}.video-header{text-align:left;margin-bottom:16px}.external-links{padding:36px 80px}.explore-container{display:grid;grid-template-columns:repeat(3,1fr)}.explore-items{display:flex;gap:20px;grid-column:span 2/span 2}.explore-header{color:#252b37;font-size:24px;font-weight:600;letter-spacing:-2%}.explore-desc{font-size:18px;color:#717680;margin-top:4px}.slack-icon{width:20px;height:27px}.explore-card{background-color:#f4f9ff;box-shadow:0 4px 12px -8px #0026543d;padding:12px 20px;border-radius:12px;color:#535862;font-size:14px;font-weight:400;transition:all .3s ease}.explore-card:hover{box-shadow:0 3px 3px -1.5px rgba(10,13,18,.04),0 8px 8px -4px rgba(10,13,18,.03),0 20px 24px -4px rgba(10,13,18,.08);padding:16px 24px;margin:-4px;transform:translateY(-2px)}.explore-card-header{display:flex;gap:10px}.explore-card-header div{color:#252b37;font-weight:500;font-size:18px}.home-footer{display:flex;justify-content:space-between;padding:36px 80px 0;color:#717680}.home-footer-links{display:flex;gap:20px}.footer-link-name{color:#252b37;font-weight:400}.footer-link-name:hover{color:#181d27;text-decoration:underline}.home-footer-social{display:flex;gap:8px}.social-link{padding:4px 8px;border-radius:4px}.social-link:hover{background-color:#f8f9fc}.connector-page div[data-component-part=card-icon]{background-color:#f8f9fc;padding:21px 20px;border-radius:100%;display:inline-flex;align-items:center;justify-content:center}.connector-page div[data-component-part=card-icon]>*{position:relative;z-index:1}.connector-page .card [data-component-part=card-content-container]{padding:16px}.card-details{display:flex;gap:6px;align-items:center}.card-logo{width:20px;height:20px;margin:0}.products-container{max-width:1150px;margin:0 auto;padding:60px 14px 40px}.products-container h1{font-size:30px!important}.products-container [data-as=p]:first-of-type{display:block;margin-bottom:40px}.product-cards{margin-top:16px;padding-bottom:48px}.product-cards .card [data-component-part=card-content]{margin-top:4px}.products-container .external-links{padding:64px 0 36px}.products-container .home-footer{padding:36px 0 0}@media (max-width:1280px){.guide-list{grid-template-columns:repeat(3,1fr)}.links{max-width:100%}.collate-video,.external-links,.home-footer{padding:32px 56px}}@media (max-width:1024px){.explore-container,.video-content{grid-template-columns:repeat(1,1fr);gap:28px}.explore-container{gap:32px}.home-footer{display:grid;grid-template-columns:repeat(3,1fr);row-gap:20px}.collate-tm{grid-column:span 3/span 3}.home-footer-links{grid-column:span 2/span 2}.home-footer-social{justify-self:flex-end}}@media (max-width:768px){.page-header{font-size:48px}.chips{display:grid;grid-template-columns:repeat(2,1fr);max-width:400px;margin:40px auto 0}.deployment-cards{grid-template-columns:repeat(1,1fr);gap:64px}.collate-content{flex-direction:column;align-items:center;text-align:center;padding:48px 24px}.guide-list,.links{grid-template-columns:repeat(2,1fr)}.links{justify-items:start;row-gap:40px}.video-container{padding:0 12px;margin:16px auto}.external-links,.home-footer{padding:24px}.home-footer-links{flex-direction:column}}@media (max-width:640px){.chips{max-width:auto;justify-items:center}.chips,.guide-list,.highlight-cards,.links{grid-template-columns:repeat(1,1fr)}.collate-video{padding:24px}.explore-items{flex-direction:column}.best-enterprise{padding:9px 36px 10px 24px}}"},{"filePath":"snippets/components/CodePreview.css","content":".split-layout{display:grid;grid-template-columns:1fr 1fr;gap:2rem;margin:2rem 0;align-items:start}@media (max-width:768px){.split-layout{grid-template-columns:1fr;gap:1rem}}.code-content .code-block [data-component-part=code-block-root]{background-color:#0b1e3d!important}.content-panel{display:flex;flex-direction:column;gap:1.5rem;padding-right:1rem}.content-section{padding:.5rem 1rem;border-left:2px solid transparent;border-radius:6px;cursor:pointer;position:relative;box-sizing:border-box;transition:background .25s ease,border-color .25s ease,box-shadow .25s ease}.content-section:hover{background:linear-gradient(90deg,rgba(176,176,176,.08) 0,rgba(176,176,176,.03) 100%);border-left-color:rgba(176,176,176,.5)}.content-section.active{background:linear-gradient(90deg,rgba(176,176,176,.15) 0,rgba(176,176,176,.05) 100%);border-left-color:#b0b0b0;box-shadow:0 2px 8px rgba(176,176,176,.1),inset 0 0 20px rgba(176,176,176,.05);color:#3f4145}.content-section.active::before{content:'';position:absolute;left:0;top:0;bottom:0;width:2px;background:linear-gradient(180deg,silver 0,#b0b0b0 50%,#a0a0a0 100%)}.content-section h4{margin:0 0 .75rem;font-size:1rem;font-weight:600;color:#1a1a1a}.content-section p{margin:.5rem 0;line-height:1.6;color:#4a4a4a}.content-section code{background:rgba(0,0,0,.05);padding:.2em .4em;border-radius:3px;font-size:.9em}.code-panel{position:sticky;top:calc(var(--navbar-height, 64px) + 6rem);height:calc(100vh - var(--navbar-height, 64px) - 6rem);display:flex;flex-direction:column;border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;background:#1e1e1e;box-shadow:0 4px 6px rgba(0,0,0,.1)}.code-panel [data-component-part=code-block-root]{padding:0 1rem}.code-panel .code-block{margin:0}.code-header,.copy-btn{display:flex;align-items:center;font-size:.875rem}.code-header{justify-content:space-between;padding:.4rem 1rem;background:#0b1e3d;border-bottom:1px solid #404040;color:#fff;font-family:'Monaco','Menlo','Ubuntu Mono',monospace}.copy-btn{gap:.5rem;padding:.375rem .75rem;background:0 0;border:1px solid #404040;border-radius:4px;color:#a0a0a0;cursor:pointer;transition:all .2s ease}.copy-btn:hover{background:#404040;border-color:#606060;color:#fff}.copy-btn svg{width:16px;height:16px}.copy-btn .icon-check,.copy-btn[data-copied=true] .icon-copy{display:none}.copy-btn[data-copied=true] .icon-check{display:block;color:#10b981}.code-content{position:relative;flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:auto;background:#0b1e3d;scroll-behavior:smooth;padding:14px 0}.code-content::-webkit-scrollbar{width:8px;height:8px}.code-content::-webkit-scrollbar-track{background:#2d2d2d}.code-content::-webkit-scrollbar-thumb{background:#404040;border-radius:4px}.code-content::-webkit-scrollbar-thumb:hover{background:#606060}.code-content pre,.code-line{position:relative;white-space:pre}.code-content pre{margin:0;padding:0 1rem;background:0 0;color:#d4d4d4;font-family:'Monaco','Menlo','Ubuntu Mono',monospace;font-size:.875rem;line-height:1.6;word-wrap:normal;overflow-wrap:normal}.code-content pre code{background:0 0;padding:0;color:inherit;font-size:inherit;border-radius:0;display:block;white-space:pre}.code-line{display:block;padding-left:1rem;padding-right:1rem;margin-left:-1rem;margin-right:-1rem;transition:all .2s ease;line-height:inherit;border-left:2px solid transparent}.code-line::after{content:'\\a';white-space:pre}.code-line.highlighted{background:rgba(200,200,200,.15)!important;border-left:2px solid #d0d0d0;padding-left:calc(1rem - 2px);min-height:1.5em}.code-line.highlighted::before{content:'';position:absolute;left:0;top:0;bottom:0;width:2px;background:#d0d0d0;z-index:1}.code-line.highlighted+.code-line.highlighted{border-top:none}.code-line.highlighted:not(.code-line.highlighted+.code-line.highlighted){border-top-left-radius:4px}.code-line.highlighted:not(:has(+.code-line.highlighted)){border-bottom-left-radius:4px}.line-number{display:inline-block;min-width:2.5em;padding-right:1em;margin-right:.5em;text-align:right;color:#858585;user-select:none;border-right:1px solid #404040}@media (prefers-color-scheme:dark){.content-section p{color:silver}.content-section code{background:rgba(255,255,255,.1)}.code-panel{border-color:#404040}}@media (max-width:768px){.code-panel{position:relative;top:0;max-height:400px}.split-layout{grid-template-columns:1fr}}.code-content #ask-ai-code-block-button,.code-content [data-testid=copy-code-button]{display:none!important}div[data-fade-overlay=true]{--fade-color-light:transparent!important;--fade-color-dark:transparent!important;display:none!important}:has([data-floating-buttons])>[data-component-part=code-block-root] pre>code{padding-right:0!important}@media (max-width:768px){.code-panel{position:relative;top:0;height:400px}}"},{"filePath":"snippets/components/ConnectorDetailsHeader/ConnectorDetailsHeader.css","content":".container{margin:48px 0!important;display:flex;flex-direction:column;gap:6px}.Heading{display:flex;justify-content:space-between;padding-bottom:8px;border-bottom:1px solid var(--default-border-color)}.ConnectorName{font-size:32px;font-weight:700;margin-bottom:0}.PlatformDetails{display:flex;align-items:center;gap:4px;font-size:14px;color:var(--gray-text-color)}.ImageContainer,.PlatformIcon{padding:4px;background-color:var(--connector-icon-bg-color);border:1px solid var(--default-border-color);border-radius:12px}.ImageContainer{padding:12px;border-radius:28px}.IconContainer{background-color:#f8f9fc;padding:16px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;width:64px;height:64px;flex-shrink:0}.ConnectorIcon{width:32px!important;height:32px!important;object-fit:contain;display:block;margin:0}.FeaturesHeading{font-size:14px;color:var(--gray-text-color)}.SubHeading{display:flex;flex-direction:column;gap:8px}.FeaturesList{display:flex;flex-wrap:wrap;gap:12px}.FeatureTag{padding:4px 10px;font-size:12px;border-radius:14px;width:fit-content;display:flex;align-items:center;gap:4px}.AvailableFeature{color:var(--green-tag-color);border:1px solid var(--green-tag-color);background-color:var(--green-tag-bg-color)}.UnavailableFeature{color:var(--orange-tag-color);border:1px solid var(--orange-tag-color);background-color:var(--orange-tag-bg-color)}.StageBadge{font-size:10px;height:auto;color:var(--green-tag-color)}"},{"filePath":"snippets/v1.13.x/components/ConnectorGrid/Integrations.css","content":".no-scrollbar::-webkit-scrollbar{display:none}.no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.integrations-section{padding:3rem 1rem 9rem;max-width:1300px;margin:0 auto}.integrations-card{background:#fafafa;border-radius:12px;border:1px solid #eaecf5;display:flex;height:610px;overflow:hidden;position:relative;padding:40px 40px 40px 0}.integrations-mobile-header{display:none;width:100%;background:#fff;border-bottom:1px solid #d9daee;padding:32px;font-size:20px;justify-content:center;align-items:center;gap:12px;position:sticky;top:0;z-index:15;cursor:pointer}.arrow{transition:transform .3s ease}.arrow.open{transform:rotate(180deg)}.arrow-down{width:10px;height:10px}.integrations-sidebar{width:220px;border-right:1px solid #eaecf5;display:flex;flex-direction:column;position:sticky;top:0;z-index:5}.sidebar-item{display:block;width:100%;padding:12px 22px;font-size:16px;color:#535862;cursor:pointer;white-space:nowrap;flex-shrink:0;text-align:right;font-weight:500;border-right:2px solid transparent}.sidebar-item:hover{color:#414651;border-right:2px solid #d5d9eb}.sidebar-item.active{border-right:2px solid #6938ef;font-weight:600;color:#6938ef}.integrations-grid{flex:1;padding:20px 32px;overflow-y:auto;display:grid;gap:20px;align-content:flex-start}.integrations-grid.desktop{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.integrations-grid.mobile{display:none}.integration-card{max-height:110px;display:flex;align-items:center;gap:12px;background-color:#fff;box-shadow:0 4px 12px -1px #0a0d1214;border-radius:12px;padding:12px 20px;box-sizing:border-box;transition:all .3s ease}.integration-card span{color:#181d27;font-weight:500;font-size:16px;line-height:120%}.integration-card,a.integration-card span:hover{text-decoration:none}a.integration-card:hover{box-shadow:0 3px 3px -1.5px #0a0d120a,0 8px 8px -4px #0a0d1208,0 20px 24px -4px #0a0d1214;padding:16px 24px;margin:-4px;text-decoration:none;transform:translateY(-2px)}.integration-card img{width:32px;height:32px;object-fit:contain;flex-shrink:0}.load-more{grid-column:span 2;padding:24px;font-size:20px;background:#fff;border:0;cursor:pointer}@media (max-width:1024px){.integrations-card{flex-direction:column;height:auto;padding:0;overflow:auto}.integrations-mobile-header{display:flex}.integrations-sidebar{display:none;width:100%;position:absolute;top:68px;left:0;right:0;border-right:none;border-bottom:1px solid #d9daee;background:#fff;overflow-y:scroll;z-index:20}.integrations-sidebar.open{display:block}.sidebar-item{text-align:center}.sidebar-item.active{border-right:none}.integrations-grid.desktop{display:none}.integrations-grid.mobile{display:grid;grid-template-columns:repeat(2,1fr);padding:24px}}"},{"filePath":"snippets/components/BreakingChanges/BreakingChanges.css","content":".breaking-changes-container{border-bottom:5px solid #b42318;border-radius:20px;background-color:#ef4444;padding:12px 18px 18px;margin:24px 0}.breaking-changes-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;margin-top:4px!important}.breaking-changes-icon{width:24px;height:24px;flex-shrink:0}.breaking-changes-title{font-size:22px;font-weight:700;color:#fff}.breaking-changes-content{background-color:#fef3f2;border-radius:20px;padding:20px 24px;color:#414045}.breaking-changes-content ul{margin:0}.breaking-changes-content li{margin-bottom:12px;line-height:1.6}.breaking-changes-content li:last-child{margin-bottom:0}.breaking-changes-content pre{border-radius:8px;padding:16px 20px;margin:12px 0;overflow-x:auto}.breaking-changes-content code{font-size:14px;line-height:1.7}"},{"filePath":"snippets/components/VersionMatrix/VersionMatrix.css","content":".vm-wrapper{border-radius:16px;overflow-x:auto;border:1px solid #7237f8;max-width:700px;font-family:inherit;display:inline-block;width:100%}.vm-wrapper .vm-table,.vm-wrapper .vm-table>div{margin:0!important;padding:0!important;width:100%!important;max-width:100%!important}.vm-wrapper table{margin:0!important;width:100%!important;min-width:0!important;display:table!important;table-layout:fixed;border-collapse:collapse}.vm-header-row{background:#6938ef}.vm-wrapper .vm-th{padding:14px 20px;text-align:left;color:#fff;font-weight:500;font-size:18px;width:50%}.vm-th:not(:last-child){border-right:1px solid rgba(255,255,255,.4)}.vm-row-even{background:#fff}.vm-row-odd{background:#f5f3ff}.vm-wrapper .vm-td{padding:14px 20px;font-size:16px;border-top:1px solid #e5e7eb;color:#111827;text-align:left}.vm-td:not(:last-child){border-right:1px solid #e5e7eb}.vm-td-updated{font-weight:400}.vm-updated-badge{color:#000;font-weight:400;font-size:14px;display:inline-flex;align-items:center;margin-left:12px;vertical-align:top}.vm-badge-icon{fill:red;vertical-align:middle;margin-right:4px;flex-shrink:0}@media (max-width:480px){.vm-td,.vm-th{padding:10px 12px;font-size:14px}.vm-td{font-size:13px}.vm-updated-badge{font-size:11px;display:flex;margin-left:0;margin-top:4px}.vm-badge-icon{width:12px;height:12px}}"},{"filePath":"snippets/components/CodeLayout/CodeLayout.css","content":".code-layout{display:grid;grid-template-columns:1fr 1fr;gap:2rem;margin:2rem 0;align-items:start;width:100%}.code-layout h4{margin-top:0}.code-layout-code{position:-webkit-sticky;position:sticky;top:132px;align-self:flex-start;max-height:calc(100vh - 132px);overflow-y:auto;z-index:10}@media (max-width:768px){.code-layout{grid-template-columns:1fr;gap:1rem}.code-layout-code{position:static;max-height:none;overflow-y:visible}}"},{"filePath":"snippets/components/ConnectorFilter/ConnectorFilter.css","content":".connector-filter{--connector-filter-accent:#1570ef;position:sticky;top:0;z-index:20;margin:20px 0 28px;padding:16px;border:1px solid var(--default-border-color, #e5e7eb);border-radius:8px;background-color:var(--background-color, #fff);box-shadow:0 2px 8px rgba(15,23,42,.06)}.connector-filter-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px}.connector-filter-field{display:flex;flex-direction:column;gap:6px;flex:1 1 160px;min-width:140px}.connector-filter-search-field{flex:1 1 170px;min-width:140px}.connector-filter-field label{font-size:14px;font-weight:600;color:var(--default-text-color, #374151)}.connector-filter-search{display:flex;align-items:center;gap:8px;height:36px;padding:0 10px;border:1px solid var(--select-border-color, #d1d5db);border-radius:6px;background-color:var(--background-color, #fff);color:var(--gray-text-color, #6b7280)}.connector-filter-search:focus-within{border-color:var(--connector-filter-accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--connector-filter-accent) 20%,transparent)}.connector-filter-search svg{flex-shrink:0}.connector-filter-search input{flex:1;min-width:0;border:0;outline:0;background:0 0;font-size:13px;color:var(--default-text-color, #111827)}.connector-filter-dropdown{position:relative}.connector-filter-trigger{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;height:36px;padding:0 10px;border:1px solid var(--select-border-color, #d1d5db);border-radius:6px;background-color:var(--background-color, #fff);color:var(--default-text-color, #111827);font-size:13px;cursor:pointer;text-align:left}.connector-filter-trigger:hover{border-color:var(--connector-filter-accent)}.connector-filter-trigger[aria-expanded=true]{border-color:var(--connector-filter-accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--connector-filter-accent) 20%,transparent)}.connector-filter-trigger span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.connector-filter-chevron{flex-shrink:0;color:var(--gray-text-color, #6b7280);transition:transform .15s ease}.connector-filter-chevron-open{transform:rotate(180deg);color:var(--connector-filter-accent)}.connector-filter-menu{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:30;max-height:320px;overflow-y:auto;margin:0;padding:6px;list-style:none;border:1px solid var(--default-border-color, #e5e7eb);border-radius:8px;background-color:var(--background-color, #fff);box-shadow:0 8px 24px rgba(15,23,42,.12)}.connector-filter-menu li{list-style:none}.connector-filter-menu li::before,.connector-filter-menu li::marker{content:none}.connector-filter-menu li[role=option]{padding:7px 10px;border-radius:5px;font-size:13px;color:var(--default-text-color, #111827);cursor:pointer}.connector-filter-menu li[role=option]:hover{background-color:var(--primary-background-color, rgba(21, 112, 239, 0.08))}.connector-filter-menu li[role=option].active{background-color:var(--primary-background-color, rgba(21, 112, 239, 0.1));color:var(--connector-filter-accent);font-weight:600}.connector-filter-group-label{padding:6px 10px 4px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--gray-text-color, #9ca3af)}.connector-filter-reset{flex-shrink:0;margin-left:auto;height:36px;padding:0 14px;border:1px solid var(--connector-filter-accent);border-radius:6px;background-color:transparent;color:var(--connector-filter-accent);font-size:13px;font-weight:600;cursor:pointer}.connector-filter-reset:hover{background-color:color-mix(in srgb,var(--connector-filter-accent) 10%,transparent)}"},{"filePath":"snippets/v2.0.x/components/ConnectorGrid/Integrations.css","content":".no-scrollbar::-webkit-scrollbar{display:none}.no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.integrations-section{padding:1.5rem .5rem 4.5rem;max-width:1300px;margin:0 auto}.integrations-card{background:#fafafa;border-radius:12px;border:1px solid #eaecf5;display:flex;height:610px;overflow:hidden;position:relative;padding:40px 40px 40px 0}.integrations-mobile-header{display:none;width:100%;background:#fff;border-bottom:1px solid #d9daee;padding:32px;font-size:20px;justify-content:center;align-items:center;gap:12px;position:sticky;top:0;z-index:15;cursor:pointer}.arrow{transition:transform .3s ease}.arrow.open{transform:rotate(180deg)}.arrow-down{width:10px;height:10px}.integrations-sidebar{width:220px;border-right:1px solid #eaecf5;display:flex;flex-direction:column;position:sticky;top:0;z-index:5}.sidebar-item{display:block;width:100%;padding:12px 22px;font-size:16px;color:#535862;cursor:pointer;white-space:nowrap;flex-shrink:0;text-align:right;font-weight:500;border-right:2px solid transparent}.sidebar-item:hover{color:#414651;border-right:2px solid #d5d9eb}.sidebar-item.active{border-right:2px solid #6938ef;font-weight:600;color:#6938ef}.integrations-grid{flex:1;padding:20px 32px;overflow-y:auto;display:grid;gap:20px;align-content:flex-start}.integrations-grid.desktop{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.integrations-grid.mobile{display:none}.integration-card{max-height:110px;display:flex;align-items:center;gap:12px;background-color:#fff;box-shadow:0 4px 12px -1px #0a0d1214;border-radius:12px;padding:12px 20px;box-sizing:border-box;transition:all .3s ease}.integration-card span{color:#181d27;font-weight:500;font-size:16px;line-height:120%}.integration-card,a.integration-card span:hover{text-decoration:none}a.integration-card:hover{box-shadow:0 3px 3px -1.5px #0a0d120a,0 8px 8px -4px #0a0d1208,0 20px 24px -4px #0a0d1214;padding:16px 24px;margin:-4px;text-decoration:none;transform:translateY(-2px)}.integration-card img{width:32px;height:32px;object-fit:contain;flex-shrink:0}.load-more{grid-column:span 2;padding:24px;font-size:20px;background:#fff;border:0;cursor:pointer}@media (max-width:1024px){.integrations-card{flex-direction:column;height:auto;padding:0;overflow:auto}.integrations-mobile-header{display:flex}.integrations-sidebar{display:none;width:100%;position:absolute;top:68px;left:0;right:0;border-right:none;border-bottom:1px solid #d9daee;background:#fff;overflow-y:scroll;z-index:20}.integrations-sidebar.open{display:block}.sidebar-item{text-align:center}.sidebar-item.active{border-right:none}.integrations-grid.desktop{display:none}.integrations-grid.mobile{display:grid;grid-template-columns:repeat(2,1fr);padding:24px}}"},{"filePath":"snippets/v2.1.x-SNAPSHOT/components/ConnectorGrid/Integrations.css","content":".no-scrollbar::-webkit-scrollbar{display:none}.no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.integrations-section{padding:1.5rem .5rem 4.5rem;max-width:1300px;margin:0 auto}.integrations-card{background:#fafafa;border-radius:12px;border:1px solid #eaecf5;display:flex;height:610px;overflow:hidden;position:relative;padding:40px 40px 40px 0}.integrations-mobile-header{display:none;width:100%;background:#fff;border-bottom:1px solid #d9daee;padding:32px;font-size:20px;justify-content:center;align-items:center;gap:12px;position:sticky;top:0;z-index:15;cursor:pointer}.arrow{transition:transform .3s ease}.arrow.open{transform:rotate(180deg)}.arrow-down{width:10px;height:10px}.integrations-sidebar{width:220px;border-right:1px solid #eaecf5;display:flex;flex-direction:column;position:sticky;top:0;z-index:5}.sidebar-item{display:block;width:100%;padding:12px 22px;font-size:16px;color:#535862;cursor:pointer;white-space:nowrap;flex-shrink:0;text-align:right;font-weight:500;border-right:2px solid transparent}.sidebar-item:hover{color:#414651;border-right:2px solid #d5d9eb}.sidebar-item.active{border-right:2px solid #6938ef;font-weight:600;color:#6938ef}.integrations-grid{flex:1;padding:20px 32px;overflow-y:auto;display:grid;gap:20px;align-content:flex-start}.integrations-grid.desktop{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.integrations-grid.mobile{display:none}.integration-card{max-height:110px;display:flex;align-items:center;gap:12px;background-color:#fff;box-shadow:0 4px 12px -1px #0a0d1214;border-radius:12px;padding:12px 20px;box-sizing:border-box;transition:all .3s ease}.integration-card span{color:#181d27;font-weight:500;font-size:16px;line-height:120%}.integration-card,a.integration-card span:hover{text-decoration:none}a.integration-card:hover{box-shadow:0 3px 3px -1.5px #0a0d120a,0 8px 8px -4px #0a0d1208,0 20px 24px -4px #0a0d1214;padding:16px 24px;margin:-4px;text-decoration:none;transform:translateY(-2px)}.integration-card img{width:32px;height:32px;object-fit:contain;flex-shrink:0}.load-more{grid-column:span 2;padding:24px;font-size:20px;background:#fff;border:0;cursor:pointer}@media (max-width:1024px){.integrations-card{flex-direction:column;height:auto;padding:0;overflow:auto}.integrations-mobile-header{display:flex}.integrations-sidebar{display:none;width:100%;position:absolute;top:68px;left:0;right:0;border-right:none;border-bottom:1px solid #d9daee;background:#fff;overflow-y:scroll;z-index:20}.integrations-sidebar.open{display:block}.sidebar-item{text-align:center}.sidebar-item.active{border-right:none}.integrations-grid.desktop{display:none}.integrations-grid.mobile{display:grid;grid-template-columns:repeat(2,1fr);padding:24px}}"},{"filePath":"snippets/v2.0.x/components/ReleaseCarousel/ReleaseCarousel.css","content":"@keyframes release-carousel-slide-next{0%{opacity:0;transform:translateX(60px)}to{opacity:1;transform:translateX(0)}}@keyframes release-carousel-slide-prev{0%{opacity:0;transform:translateX(-60px)}to{opacity:1;transform:translateX(0)}}.release-banner{max-width:1300px;margin:0 auto;background:linear-gradient(135deg,rgba(105,56,239,.12) 0,rgba(142,198,252,.35) 100%);padding:48px 100px;border-radius:24px}.release-banner-content{display:grid;grid-template-columns:repeat(2,1fr);gap:50px;align-items:center}.release-banner-content h2{color:#181d27;font-weight:500;font-size:32px;margin-bottom:16px}.release-banner-content p,.release-carousel-content [data-as=p]{color:#414651;font-size:18px;margin-bottom:24px}.release-banner-content a{background-color:#fff;box-shadow:0 1px 2px rgba(10,13,18,.06),0 2px 4px rgba(10,13,18,.05);padding:12px 24px;border-radius:99px;font-size:18px;font-weight:500;color:#131313}.release-banner-content a:hover{text-decoration:underline}.release-carousel{position:relative}.release-carousel-viewport{overflow:hidden}.release-carousel-content [data-as=p]{display:block}.release-carousel-content [data-as=p] strong{color:#181d27;font-weight:700}.release-carousel-content a{display:inline-block}.release-carousel-title-row{display:flex;align-items:center;gap:12px;margin-bottom:16px}.release-carousel-content .release-carousel-title-row h2{margin:0}.release-carousel-eyebrow{display:inline-block;flex-shrink:0;background-color:#f4f3ff;color:#6938ef;padding:4px 14px;border-radius:100px;font-size:13px;font-weight:600;letter-spacing:.02em;text-transform:uppercase}.release-carousel-content.slide-next{animation:release-carousel-slide-next .45s ease}.release-carousel-content.slide-prev{animation:release-carousel-slide-prev .45s ease}.release-carousel-image{width:100%;max-width:1200px;display:block;border:3px solid #d9d2fa;border-radius:16px;box-shadow:0 2px 2px -1px #0a0d120a,0 4px 6px -2px #0a0d1208,0 12px 16px -4px #0a0d1214;cursor:zoom-in}.release-carousel-lightbox{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;padding:40px;background-color:rgba(16,24,40,.85)}.release-carousel-lightbox-image{max-width:100%;max-height:100%;display:block;border-radius:12px;box-shadow:0 12px 16px -4px #0a0d1214;cursor:default}.release-carousel-lightbox-close{top:24px;right:24px;border:1px solid rgba(255,255,255,.3);background-color:rgba(255,255,255,.1);color:#fff}.release-carousel-lightbox-close:hover{background-color:rgba(255,255,255,.2)}.release-carousel .carousel-arrow,.release-carousel-lightbox-close{position:absolute;display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;cursor:pointer;transition:background-color .15s ease}.release-carousel .carousel-arrow{top:50%;transform:translateY(-50%);border:1px solid #d9d2fa;background-color:#fff;color:#181d27;box-shadow:0 2px 2px -1px #0a0d120a,0 4px 6px -2px #0a0d1208,0 12px 16px -4px #0a0d1214}.release-carousel .carousel-arrow:hover{background-color:#f4f3ff}.release-carousel .carousel-arrow-prev{left:16px}.release-carousel .carousel-arrow-next{right:16px}.release-carousel .carousel-dots{display:flex;justify-content:center;gap:8px;margin-top:16px}.release-carousel .carousel-dot{width:8px;height:8px;border-radius:50%;border:0;background-color:#d9d2fa;padding:0;cursor:pointer;transition:background-color .15s ease,transform .15s ease}.release-carousel .carousel-dot.active{background-color:#6938ef;transform:scale(1.2)}@media (max-width:1024px){.release-banner-content{grid-template-columns:repeat(1,1fr)}.release-banner-content h2{font-size:28px}.release-carousel .carousel-arrow-prev{left:4px}.release-carousel .carousel-arrow-next{right:4px}}@media (max-width:768px){.release-banner{padding:40px 52px}.release-carousel .carousel-arrow{width:32px;height:32px}}@media (max-width:480px){.release-banner{padding:40px 20px}}"},{"filePath":"snippets/v2.1.x-SNAPSHOT/components/ReleaseCarousel/ReleaseCarousel.css","content":"@keyframes release-carousel-slide-next{0%{opacity:0;transform:translateX(60px)}to{opacity:1;transform:translateX(0)}}@keyframes release-carousel-slide-prev{0%{opacity:0;transform:translateX(-60px)}to{opacity:1;transform:translateX(0)}}.release-banner{max-width:1300px;margin:0 auto;background:linear-gradient(135deg,rgba(105,56,239,.12) 0,rgba(142,198,252,.35) 100%);padding:48px 100px;border-radius:24px}.release-banner-content{display:grid;grid-template-columns:repeat(2,1fr);gap:50px;align-items:center}.release-banner-content h2{color:#181d27;font-weight:500;font-size:32px;margin-bottom:16px}.release-banner-content p,.release-carousel-content [data-as=p]{color:#414651;font-size:18px;margin-bottom:24px}.release-banner-content a{background-color:#fff;box-shadow:0 1px 2px rgba(10,13,18,.06),0 2px 4px rgba(10,13,18,.05);padding:12px 24px;border-radius:99px;font-size:18px;font-weight:500;color:#131313}.release-banner-content a:hover{text-decoration:underline}.release-carousel{position:relative}.release-carousel-viewport{overflow:hidden}.release-carousel-content [data-as=p]{display:block}.release-carousel-content [data-as=p] strong{color:#181d27;font-weight:700}.release-carousel-content a{display:inline-block}.release-carousel-title-row{display:flex;align-items:center;gap:12px;margin-bottom:16px}.release-carousel-content .release-carousel-title-row h2{margin:0}.release-carousel-eyebrow{display:inline-block;flex-shrink:0;background-color:#f4f3ff;color:#6938ef;padding:4px 14px;border-radius:100px;font-size:13px;font-weight:600;letter-spacing:.02em;text-transform:uppercase}.release-carousel-content.slide-next{animation:release-carousel-slide-next .45s ease}.release-carousel-content.slide-prev{animation:release-carousel-slide-prev .45s ease}.release-carousel-image{width:100%;max-width:1200px;display:block;border:3px solid #d9d2fa;border-radius:16px;box-shadow:0 2px 2px -1px #0a0d120a,0 4px 6px -2px #0a0d1208,0 12px 16px -4px #0a0d1214;cursor:zoom-in}.release-carousel-lightbox{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;padding:40px;background-color:rgba(16,24,40,.85)}.release-carousel-lightbox-image{max-width:100%;max-height:100%;display:block;border-radius:12px;box-shadow:0 12px 16px -4px #0a0d1214;cursor:default}.release-carousel-lightbox-close{top:24px;right:24px;border:1px solid rgba(255,255,255,.3);background-color:rgba(255,255,255,.1);color:#fff}.release-carousel-lightbox-close:hover{background-color:rgba(255,255,255,.2)}.release-carousel .carousel-arrow,.release-carousel-lightbox-close{position:absolute;display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;cursor:pointer;transition:background-color .15s ease}.release-carousel .carousel-arrow{top:50%;transform:translateY(-50%);border:1px solid #d9d2fa;background-color:#fff;color:#181d27;box-shadow:0 2px 2px -1px #0a0d120a,0 4px 6px -2px #0a0d1208,0 12px 16px -4px #0a0d1214}.release-carousel .carousel-arrow:hover{background-color:#f4f3ff}.release-carousel .carousel-arrow-prev{left:16px}.release-carousel .carousel-arrow-next{right:16px}.release-carousel .carousel-dots{display:flex;justify-content:center;gap:8px;margin-top:16px}.release-carousel .carousel-dot{width:8px;height:8px;border-radius:50%;border:0;background-color:#d9d2fa;padding:0;cursor:pointer;transition:background-color .15s ease,transform .15s ease}.release-carousel .carousel-dot.active{background-color:#6938ef;transform:scale(1.2)}@media (max-width:1024px){.release-banner-content{grid-template-columns:repeat(1,1fr)}.release-banner-content h2{font-size:28px}.release-carousel .carousel-arrow-prev{left:4px}.release-carousel .carousel-arrow-next{right:4px}}@media (max-width:768px){.release-banner{padding:40px 52px}.release-carousel .carousel-arrow{width:32px;height:32px}}@media (max-width:480px){.release-banner{padding:40px 20px}}"}],"page":{"pagePath":"v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework","slug":"/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework","pageMetadata":{"title":"Ingestion Framework | OpenMetadata Developer Guide","description":"Contribute to ingestion framework by setting up the local dev environment, running tests, and validating workflows.","sidebarTitle":"Ingestion framework","href":"/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Contribute to ingestion framework by setting up the local dev environment, running tests, and validating workflows.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedImage,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`ingestion-framework`,children:`Ingestion Framework`}),`\n`,_jsx(_components.p,{children:`Configure Python and test the Ingestion Framework`}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsx(_components.p,{children:`The Ingestion Framework is a Python module that wraps the OpenMetadata API and builds workflows and utilities on top of it. Therefore, you need to make sure that you have the complete OpenMetadata stack running: MySQL + ElasticSearch + OpenMetadata Server.`}),`\n`,_jsxs(_components.p,{children:[`To do so, you can either build and run the `,_jsx(_components.a,{href:`/v1.13.x/developers/contribute/build-code-and-run-tests/openmetadata-server`,children:`OpenMetadata Server`}),` locally as well, or use the `,_jsx(_components.code,{children:`metadata`}),` CLI to spin up the Docker containers as explained in the `,_jsx(_components.a,{href:`/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework#tooling-status`,children:`Tooling Status`}),` section of this page.`]}),`\n`,_jsx(Heading,{level:`2`,id:`python-setup`,children:`Python Setup`}),`\n`,_jsxs(_components.p,{children:[`We recommend using pyenv to properly install and manage different Python versions in your system. Note that OpenMetadata requires Python version +3.7. This `,_jsx(_components.a,{href:`https://python-docs.readthedocs.io/en/latest/dev/virtualenvs.html`,children:`doc`}),` might be helpful to set up the environment virtualization.`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Using an M1 Mac? To ensure compatibility with the different dependencies, use Python version 3.9.8 or higher. Note that the code\nhas not been tested with Python 3.10 due to some libraries not supporting that already.`})}),`\n`,_jsx(_components.p,{children:`For the instructions below, there are a couple of commands you’ll need to run first to prepare your environment:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`make`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install_dev`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` make`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install_antlr_cli`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`make`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` generate`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`generated-sources`,children:`Generated Sources`}),`\n`,_jsx(_components.p,{children:`The backbone of OpenMetadata is the series of JSON schemas defining the Entities and their properties.`}),`\n`,_jsx(_components.p,{children:`All different parts of the code rely on those definitions. The first step to start developing new connectors is to properly set up your local environment to interact with the Entities.`}),`\n`,_jsxs(_components.p,{children:[`In the Ingestion Framework, this process is handled with `,_jsx(_components.code,{children:`datamodel-code-generator`}),`, which is able to read JSON schemas and automatically prepare `,_jsx(_components.code,{children:`pydantic`}),` models representing the input definitions. Please, make sure to run `,_jsx(_components.code,{children:`make generate`}),` from the project root to fill the `,_jsx(_components.code,{children:`ingestion/src/metadata/generated`}),` directory with the required models.`]}),`\n`,_jsxs(_components.p,{children:[`Once you have generated the sources, you should be able to run the tests and the `,_jsx(_components.code,{children:`metadata`}),` CLI. You can test your setup by running `,_jsx(_components.code,{children:`make coverage`}),` and see if you get any errors.`]}),`\n`,_jsx(Heading,{level:`3`,id:`quality-tools`,children:`Quality tools`}),`\n`,_jsx(_components.p,{children:`When working on the Ingestion Framework, you might want to take into consideration the following style-check tooling:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://pylint.pycqa.org/en/latest/`,children:`pylint`}),` is a Static Code Analysis tool to catch errors, align coding standards and help us follow conventions and apply improvements.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://black.readthedocs.io/en/stable/`,children:`black`}),` can be used to both autoformat the code and validate that the codebase is compliant.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://pycqa.github.io/isort/`,children:`isort`}),` helps us not lose time trying to find the proper combination of importing from `,_jsx(_components.code,{children:`stdlib`}),`, requirements, project files…`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The main goal is to ensure standardized formatting throughout the codebase.`}),`\n`,_jsxs(_components.p,{children:[`When developing, you can run these tools with make recipes: `,_jsx(_components.code,{children:`make lint`}),`, `,_jsx(_components.code,{children:`make black`}),` and `,_jsx(_components.code,{children:`make isort`}),`. Note that we are excluding the generated sources from the JSON Schema standards.`]}),`\n`,_jsxs(_components.p,{children:[`If you want to take this one step further and make sure that you are not committing any malformed changes, you can use `,_jsx(_components.a,{href:`https://pre-commit.com/`,children:`pre-commit hooks`}),`. This is a powerful tool that allows us to run specific validations at commit time. If those validations fail, the commit won’t proceed. The interesting point is that the tools are going to fix your code for you, so you can freely try to commit again!`]}),`\n`,_jsxs(_components.p,{children:[`You can install our hooks via `,_jsx(_components.code,{children:`make precommit_install`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`tooling-status`,children:`Tooling Status`}),`\n`,_jsx(_components.p,{children:`We are currently using:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`pylint`}),` \u0026 `,_jsx(_components.code,{children:`black`}),` in the CI validations, so make sure to review your PRs for any warnings you generated.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`black`}),` \u0026 `,_jsx(_components.code,{children:`isort`}),` in the pre-commit hooks.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`If you’re just developing on the Ingestion side, you might not need to run the server from Intellij and the simple docker approach might be good enough. In these scenarios, you can:`}),`\n`,_jsx(_components.p,{children:`At least once, build the images fully:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sh`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker/run_local_docker.sh`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Which will package the server code. Afterward, if the modifications only impact the ingestion code and need to refresh the ingestion container, you can run:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker/development`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` down`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -v`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` up`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --build`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`running-tests`,children:`Running tests`}),`\n`,_jsxs(_components.p,{children:[`To run the tests, you’ll need to install some packages via `,_jsx(_components.code,{children:`make install_test`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`You can validate the environment by running `,_jsx(_components.code,{children:`make coverage`}),` from the root directory. Note that from some tests, having\nthe OpenMetadata server instance up is required as they interact with the API.`]}),`\n`,_jsx(Heading,{level:`2`,id:`debugging-locally`,children:`Debugging locally`}),`\n`,_jsx(_components.p,{children:`Running the ingestion workflows from PyCharm and debugging them is quite useful. In order to do so, follow these steps:`}),`\n`,_jsx(_components.p,{children:`First, make sure that your Python environment is pointing to the local env you are using to develop.`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-python-interpreter.png?fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=e908fda973dd6d9389f6604ee6db7cac`,alt:`PyCharm env`,\"data-og-width\":`1060`,width:`1060`,\"data-og-height\":`760`,height:`760`,\"data-path\":`public/images/developers/contribute/build-code-and-run-tests/pycharm-python-interpreter.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-python-interpreter.png?w=280\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=71104a59a76bdd8cea8a5b2ab0ca275e 280w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-python-interpreter.png?w=560\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=cc71cc1d3527a7225b2aa85c9702545b 560w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-python-interpreter.png?w=840\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=1858b2067c685840adada67c8ee30567 840w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-python-interpreter.png?w=1100\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=b87df8210e8b26fe4fbced8ba0ede3ff 1100w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-python-interpreter.png?w=1650\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=4d524bd2c9000a36b77432c7b04df06f 1650w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-python-interpreter.png?w=2500\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=cedf6cdb4e0c984b22ead65d9b01919b 2500w`}),`\n`,_jsxs(_components.p,{children:[`Then, you can prepare `,_jsx(_components.code,{children:`Run Configurations`}),` to execute the ingestion as you would run the CLI:`]}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-run-config.png?fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=e70f4315b140cf7719ee9e9795049bec`,alt:`PyCharm run config`,\"data-og-width\":`1049`,width:`1049`,\"data-og-height\":`854`,height:`854`,\"data-path\":`public/images/developers/contribute/build-code-and-run-tests/pycharm-run-config.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-run-config.png?w=280\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=282d79d127a803906676a557e0bea18f 280w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-run-config.png?w=560\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=eaa3bf83f90bc73268d11c759093a0d2 560w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-run-config.png?w=840\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=248f1f3481209e58b5c0dc2b8096dd9b 840w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-run-config.png?w=1100\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=1d12ac054d721d4f8a333f9afa85a741 1100w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-run-config.png?w=1650\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=d13ea4b737231c0e29aeabfba5592c39 1650w, https://mintcdn.com/openmetadata/FFPgqWxUp0cM2_kH/public/images/developers/contribute/build-code-and-run-tests/pycharm-run-config.png?w=2500\u0026fit=max\u0026auto=format\u0026n=FFPgqWxUp0cM2_kH\u0026q=85\u0026s=7df173a076bef216e624ea5b8341b2b9 2500w`}),`\n`,_jsxs(_components.p,{children:[`Note that in the example we are preparing a configuration to run and test Superset. In order to understand how to run\ningestions via the CLI, you can refer to each connector’s `,_jsx(_components.a,{href:`/v1.13.x/connectors/dashboard/superset/yaml`,children:`docs`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The important part is that we are not running a script, but rather a `,_jsx(_components.code,{children:`module`}),`: `,_jsx(_components.code,{children:`metadata`}),`. Based on this, we can work as\nwe would usually do with the CLI for any ingestion, profiler, or test workflow.`]}),`\n`,_jsx(_components.p,{children:`With these settings, you can start adding breakpoints in PyCharm and debug the workflows!`}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(_components.p,{children:[`If you try to install the `,_jsx(_components.code,{children:`kafka`}),` plugin `,_jsx(_components.code,{children:`pip install \"./ingestion[kafka]\"`}),` on mac you might see the following error:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`12`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`12`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`fatal error: 'librdkafka/rdkafka.h' file not found`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` #include \u003clibrdkafka/rdkafka.h>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ^~~~~~~~~~~~~~~~~~~~~~`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` 1 error generated.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` error: command '/usr/bin/clang' failed with exit code 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` [end of output]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` note: This error originates from a subprocess, and is likely not a problem with pip.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`error: legacy-install-failure`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`× Encountered error while trying to install package.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`╰─> confluent-kafka`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`This can be solved by running `,_jsx(_components.code,{children:`brew install librdkafka`}),`. If the error still persists you might need to update the following environment variables:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`export C_INCLUDE_PATH=/opt/homebrew/include`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`export LIBRARY_PATH=/opt/homebrew/lib`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`More information on the later in this `,_jsx(_components.a,{href:`https://github.com/confluentinc/confluent-kafka-python/issues/184`,children:`thread`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Ingestion Framework | OpenMetadata Developer Guide","description":"Contribute to ingestion framework by setting up the local dev environment, running tests, and validating workflows.","sidebarTitle":"Ingestion framework","href":"/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Ingestion Framework","slug":"ingestion-framework","depth":1,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Python Setup","slug":"python-setup","depth":2,"children":[{"title":"Generated Sources","slug":"generated-sources","depth":3,"children":[]},{"title":"Quality tools","slug":"quality-tools","depth":3,"children":[]},{"title":"Tooling Status","slug":"tooling-status","depth":3,"children":[]}]},{"title":"Running tests","slug":"running-tests","depth":2,"children":[]},{"title":"Debugging locally","slug":"debugging-locally","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/openmetadata/193c43da98baa789/loader.js"],"subdomain":"openmetadata","siteName":"OpenMetadata Documentation","title":"Ingestion Framework | OpenMetadata Developer Guide - OpenMetadata Documentation","navMaps":{"firstHrefInVersion":{"v2.0.x":{"href":"/v2.0.x/developers/contribute/build-code-and-run-tests/ingestion-framework","matchLevel":1},"v1.13.x":{"href":"/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework","matchLevel":0},"v2.1.x-SNAPSHOT":{"href":"/v2.1.x-SNAPSHOT/developers/contribute/build-code-and-run-tests/ingestion-framework","matchLevel":1}},"firstHrefInLanguage":{}},"lastModified":"2026-06-10T10:47:07.068Z","originalFileLocation":"v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"light\";if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Contribute to ingestion framework by setting up the local dev environment, running tests, and validating workflows.\">\u003cmeta data-mint-head name=\"application-name\" content=\"OpenMetadata Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Ingestion Framework | OpenMetadata Developer Guide - OpenMetadata Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Contribute to ingestion framework by setting up the local dev environment, running tests, and validating workflows.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OpenMetadata Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://openmetadata.mintlify.app/_mintlify/api/og/v2?division=Build+the+Code+and+Run+Tests\u0026amp;title=Ingestion+Framework+%7C+OpenMetadata+Developer+Guide\u0026amp;description=Contribute+to+ingestion+framework+by+setting+up+the+local+dev+environment%2C+running+tests%2C+and+validating+workflows.\u0026amp;theme=b72ba3b6733cb95c984de390\u0026amp;signature=670c1f4ef5ef610c981747baf2824fbc21bde7a37877241e964b253e6fc44633\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Ingestion Framework | OpenMetadata Developer Guide - OpenMetadata Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Contribute to ingestion framework by setting up the local dev environment, running tests, and validating workflows.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://openmetadata.mintlify.app/_mintlify/api/og/v2?division=Build+the+Code+and+Run+Tests\u0026amp;title=Ingestion+Framework+%7C+OpenMetadata+Developer+Guide\u0026amp;description=Contribute+to+ingestion+framework+by+setting+up+the+local+dev+environment%2C+running+tests%2C+and+validating+workflows.\u0026amp;theme=b72ba3b6733cb95c984de390\u0026amp;signature=670c1f4ef5ef610c981747baf2824fbc21bde7a37877241e964b253e6fc44633\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/openmetadata/6KJlWty2MOEAr7r6/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"OpenMetadata Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6938EF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.open-metadata.org/#organization\",\"name\":\"OpenMetadata Documentation\",\"url\":\"https://docs.open-metadata.org\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/openmetadata/Z_Ib-0g05fLykSep/public/images/icons/omd.svg?fit=max\u0026auto=format\u0026n=Z_Ib-0g05fLykSep\u0026q=85\u0026s=8eb40986afc777e29ae395288a3983e8\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.open-metadata.org#website\",\"name\":\"OpenMetadata Documentation\",\"url\":\"https://docs.open-metadata.org\",\"publisher\":{\"@id\":\"https://docs.open-metadata.org/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework#webpage\",\"url\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework\",\"name\":\"Ingestion Framework | OpenMetadata Developer Guide\",\"description\":\"Contribute to ingestion framework by setting up the local dev environment, running tests, and validating workflows.\",\"dateModified\":\"2026-06-10T10:47:07.068Z\",\"isPartOf\":{\"@id\":\"https://docs.open-metadata.org#website\"},\"breadcrumb\":{\"@id\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Developers\",\"item\":\"https://docs.open-metadata.org/v1.13.x/developers\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Contribute\",\"item\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Build the Code and Run Tests\",\"item\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Ingestion Framework | OpenMetadata Developer Guide\",\"item\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework#article\",\"headline\":\"Ingestion Framework | OpenMetadata Developer Guide\",\"name\":\"Ingestion Framework | OpenMetadata Developer Guide\",\"description\":\"Contribute to ingestion framework by setting up the local dev environment, running tests, and validating workflows.\",\"url\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework\",\"mainEntityOfPage\":{\"@id\":\"https://docs.open-metadata.org/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework#webpage\"},\"dateModified\":\"2026-06-10T10:47:07.068Z\",\"publisher\":{\"@id\":\"https://docs.open-metadata.org/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.open-metadata.org#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"OpenMetadata Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"OpenMetadata Documentation","nav":{"global":null,"versions":[{"version":"v2.0.x","pages":[{"title":"v2.0.x","href":"/v2.0.x/developers/contribute/build-code-and-run-tests/ingestion-framework"}]},{"version":"v1.13.x","tabs":[{"tab":"Home","pages":[{"title":"Home","href":"/v1.13.x"}]},{"tab":"Quickstart","pages":[{"title":"Quickstart","href":"/v1.13.x/quick-start"}]},{"tab":"Deployment","pages":[{"title":"Deployment","href":"/v1.13.x/deployment"}]},{"tab":"Connectors","pages":[{"title":"Connectors","href":"/v1.13.x/connectors"}]},{"tab":"How-to Guides","pages":[{"title":"How-to Guides","href":"/v1.13.x/how-to-guides"}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/v1.13.x/how-to-guides/mcp"}]},{"tab":"Admin Guide","pages":[{"title":"Admin Guide","href":"/v1.13.x/how-to-guides/admin-guide"}]},{"tab":"Guide for Data Users","pages":[{"title":"Guide for Data Users","href":"/v1.13.x/how-to-guides/guide-for-data-users"}]},{"tab":"Data Discovery","pages":[{"title":"Data Discovery","href":"/v1.13.x/how-to-guides/data-discovery"}]},{"tab":"Data Contracts","pages":[{"title":"Data Contracts","href":"/v1.13.x/how-to-guides/data-contracts"}]},{"tab":"Data Collaboration","pages":[{"title":"Data Collaboration","href":"/v1.13.x/how-to-guides/data-collaboration"}]},{"tab":"Data Quality and Observability","pages":[{"title":"Data Quality and Observability","href":"/v1.13.x/how-to-guides/data-quality-observability"}]},{"tab":"Data Lineage","pages":[{"title":"Data Lineage","href":"/v1.13.x/how-to-guides/data-lineage"}]},{"tab":"Data Insights","pages":[{"title":"Data Insights","href":"/v1.13.x/how-to-guides/data-insights"}]},{"tab":"Data Marketplace","pages":[{"title":"Data Marketplace","href":"/v1.13.x/how-to-guides/data-marketplace"}]},{"tab":"Data Governance","pages":[{"title":"Data Governance","href":"/v1.13.x/how-to-guides/data-governance"}]},{"tab":"Releases","pages":[{"title":"Releases","href":"/v1.13.x/releases"}]},{"tab":"Developers","groups":[{"group":"Developers","pages":[{"title":"OpenMetadata Developers | Developer Resources Overview","sidebarTitle":"Overview","href":"/v1.13.x/developers"},{"group":"Architecture","pages":[{"title":"OpenMetadata System Architecture | Developer Guide","sidebarTitle":"Overview","href":"/v1.13.x/developers/architecture"},{"title":"Understand Code Layout","sidebarTitle":"Code layout","href":"/v1.13.x/developers/architecture/code-layout"}]},{"title":"Open Source Community | Official Documentation","sidebarTitle":"Open source community","href":"/v1.13.x/developers/open-source-community"},{"group":"Contribute","pages":[{"title":"How to Contribute Code | Open Source Contribution Guide","sidebarTitle":"Overview","href":"/v1.13.x/developers/contribute"},{"title":"Development Environment Setup | Dev Containers for OpenMetadata","sidebarTitle":"Development Environment Setup","href":"/v1.13.x/developers/contribute/development-environment-setup"},{"group":"Build the Code and Run Tests","pages":[{"title":"Build Code and Run Tests | Official Documentation","sidebarTitle":"Overview","href":"/v1.13.x/developers/contribute/build-code-and-run-tests"},{"title":"Prerequisites | OpenMetadata Developer Setup Requirements","sidebarTitle":"Prerequisites","href":"/v1.13.x/developers/contribute/build-code-and-run-tests/prerequisites"},{"title":"OpenMetadata Server | Developer Guide \u0026 Setup","description":"Build and run metadata server locally with this guide, including environment setup and server configuration tips.","sidebarTitle":"Openmetadata server","href":"/v1.13.x/developers/contribute/build-code-and-run-tests/openmetadata-server"},{"title":"Ingestion Framework | OpenMetadata Developer Guide","sidebarTitle":"Ingestion framework","href":"/v1.13.x/developers/contribute/build-code-and-run-tests/ingestion-framework"},{"title":"Generate TypeScript Types From JSON Schema","description":"Use this guide to generate TypeScript type definitions from JSON Schema to maintain consistency and type safety.","sidebarTitle":"Generate TypeScript types from JSON schema","href":"/v1.13.x/developers/contribute/build-code-and-run-tests/generate-typescript-types-from-json-schema"},{"title":"OpenMetadata UI | Developer Guide \u0026 Setup","sidebarTitle":"Openmetadata ui","href":"/v1.13.x/developers/contribute/build-code-and-run-tests/openmetadata-ui"},{"title":"Playwright Integration Tests | Official Documentation","sidebarTitle":"Playwright integration tests","href":"/v1.13.x/developers/contribute/build-code-and-run-tests/playwright-integration-tests"}]},{"group":"Codebase Deep Dives","pages":[{"title":"Codebase Deep Dives | Technical Architecture Guides","sidebarTitle":"Overview","href":"/v1.13.x/developers/contribute/codebase-deep-dives"},{"title":"Data Quality Module | Technical Architecture","sidebarTitle":"Data Quality","href":"/v1.13.x/developers/contribute/codebase-deep-dives/data-quality"},{"title":"Profiler Module | Architecture \u0026 Metrics System","sidebarTitle":"Profiler","href":"/v1.13.x/developers/contribute/codebase-deep-dives/profiler"},{"title":"Profiler Module | Execution \u0026 Extension","sidebarTitle":"Profiler: Execution \u0026 Extension","href":"/v1.13.x/developers/contribute/codebase-deep-dives/profiler-execution"},{"title":"Sampler Module | Technical Architecture","sidebarTitle":"Sampler","href":"/v1.13.x/developers/contribute/codebase-deep-dives/sampler"},{"title":"Metadata Ingestion | Technical Architecture","sidebarTitle":"Metadata Ingestion","href":"/v1.13.x/developers/contribute/codebase-deep-dives/metadata-ingestion"},{"title":"Usage Ingestion | Technical Architecture","sidebarTitle":"Usage Ingestion","href":"/v1.13.x/developers/contribute/codebase-deep-dives/usage-ingestion"},{"group":"Lineage Ingestion","pages":[{"title":"Lineage Ingestion | Technical Architecture","sidebarTitle":"Overview","href":"/v1.13.x/developers/contribute/codebase-deep-dives/lineage-ingestion"},{"title":"Lineage Ingestion Advanced | Entity Resolution, Publishing \u0026 Configuration","sidebarTitle":"Advanced Topics","href":"/v1.13.x/developers/contribute/codebase-deep-dives/lineage-ingestion/advanced"}]}]},{"group":"Developing a New Connector","pages":[{"title":"Developing a new Connector","sidebarTitle":"Overview","href":"/v1.13.x/developers/contribute/developing-a-new-connector"},{"group":"AI-Assisted Development","pages":[{"title":"AI-Assisted Connector Development","sidebarTitle":"AI-Assisted Development","href":"/v1.13.x/developers/contribute/developing-a-new-connector/ai-assisted-development"},{"title":"Install AI Skills","sidebarTitle":"Install Skills","href":"/v1.13.x/developers/contribute/developing-a-new-connector/ai-assisted-development/install-skills"},{"title":"Scaffold a Connector","sidebarTitle":"Scaffold","href":"/v1.13.x/developers/contribute/developing-a-new-connector/ai-assisted-development/scaffold-connector"},{"title":"Build a Connector with AI","sidebarTitle":"Build with AI","href":"/v1.13.x/developers/contribute/developing-a-new-connector/ai-assisted-development/build-with-ai"}]},{"title":"Define the JSON Schema","sidebarTitle":"Define json schema","href":"/v1.13.x/developers/contribute/developing-a-new-connector/define-json-schema"},{"title":"Develop the Ingestion Code","sidebarTitle":"Develop ingestion code","href":"/v1.13.x/developers/contribute/developing-a-new-connector/develop-ingestion-code"},{"title":"Performance \u0026 Memory Management","sidebarTitle":"Performance \u0026 Memory","href":"/v1.13.x/developers/contribute/developing-a-new-connector/performance-and-memory"},{"title":"Apply UI Changes","sidebarTitle":"Apply ui changes","href":"/v1.13.x/developers/contribute/developing-a-new-connector/apply-ui-changes"},{"title":"Create the Java ClassConverter","sidebarTitle":"Create java class converter","href":"/v1.13.x/developers/contribute/developing-a-new-connector/create-java-class-converter"},{"title":"Test It","sidebarTitle":"Test it","href":"/v1.13.x/developers/contribute/developing-a-new-connector/test-it"},{"title":"Update the Documentation","sidebarTitle":"Update documentation","href":"/v1.13.x/developers/contribute/developing-a-new-connector/update-documentation"}]}]},{"title":"How to Set Up Bots | OpenMetadata Developer Guide","sidebarTitle":"Bots","href":"/v1.13.x/developers/bots"},{"title":"How To Add Language Support | Official Documentation","sidebarTitle":"How to add language support","href":"/v1.13.x/developers/how-to-add-language-support"},{"title":"How to Add a Custom Property to an Entity with API","sidebarTitle":"How to add custom property to an entity","href":"/v1.13.x/developers/custom-properties"}]}]},{"tab":"SDK \u0026 APIs","pages":[{"title":"SDK \u0026 APIs","href":"/v1.13.x/api-reference"}]}]},{"version":"v2.1.x-SNAPSHOT","pages":[{"title":"v2.1.x-SNAPSHOT","href":"/v2.1.x-SNAPSHOT/developers/contribute/build-code-and-run-tests/ingestion-framework"}]}]},"title":"Ingestion Framework | OpenMetadata Developer Guide - OpenMetadata Documentation","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-BNnMwe0F.js","lightbox-handle-r17bVUz3.js"]}