"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[396],{6585:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>b,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var n=r(83117),i=(r(67294),r(3905));const o={title:"Contributing to Superset",hide_title:!0,sidebar_position:1,version:1},a=void 0,c={unversionedId:"contributing/contributing-page",id:"contributing/contributing-page",title:"Contributing to Superset",description:"Contributing to Superset",source:"@site/docs/contributing/contributing-page.mdx",sourceDirName:"contributing",slug:"/contributing/contributing-page",permalink:"/docs/contributing/contributing-page",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/contributing/contributing-page.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Contributing to Superset",hide_title:!0,sidebar_position:1,version:1},sidebar:"tutorialSidebar",previous:{title:"Migrating from Legacy to Native Filters",permalink:"/docs/miscellaneous/native-filter-migration"},next:{title:"Types of Contributions",permalink:"/docs/contributing/types-of-contributions"}},u={},p=[{value:"Contributing to Superset",id:"contributing-to-superset",level:2}],s={toc:p},l="wrapper";function b(e){let{components:t,...r}=e;return(0,i.kt)(l,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"contributing-to-superset"},"Contributing to Superset"),(0,i.kt)("p",null,"Superset is an ",(0,i.kt)("a",{parentName:"p",href:"https://www.apache.org/theapacheway/index.html"},"Apache Software foundation")," project.\nThe core contributors (or committers) to Superset communicate primarily in the following channels (\nwhich can be joined by anyone):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://lists.apache.org/list.html?dev@superset.apache.org"},"Mailing list")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"http://bit.ly/join-superset-slack"},"Apache Superset Slack community")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/apache/superset/issues"},"GitHub issues and PR's"))),(0,i.kt)("p",null,"More references:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://preset.io/blog/tutorial-contributing-code-to-apache-superset/"},"Comprehensive Tutorial for Contributing Code to Apache Superset")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/apache/superset/blob/master/CONTRIBUTING.md"},"CONTRIBUTING Guide on GitHub"))))}b.isMDXComponent=!0},3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>g});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},l="mdxType",b={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,u=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),l=p(r),m=i,g=l["".concat(u,".").concat(m)]||l[m]||b[m]||o;return r?n.createElement(g,a(a({ref:t},s),{},{components:r})):n.createElement(g,a({ref:t},s))}));function g(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=m;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c[l]="string"==typeof e?e:i,a[1]=c;for(var p=2;p<o;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"}}]);