"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[396],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});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 u(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 s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},l="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,c=u(e,["components","mdxType","originalType","parentName"]),l=p(r),b=i,h=l["".concat(s,".").concat(b)]||l[b]||m[b]||o;return r?n.createElement(h,a(a({ref:t},c),{},{components:r})):n.createElement(h,a({ref:t},c))}));function h(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=b;var u={};for(var s in t)hasOwnProperty.call(t,s)&&(u[s]=t[s]);u.originalType=e,u[l]="string"==typeof e?e:i,a[1]=u;for(var p=2;p<o;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}b.displayName="MDXCreateElement"},16368:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>m,frontMatter:()=>o,metadata:()=>u,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,u={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:"Chart Parameters Reference",permalink:"/docs/miscellaneous/chart-params"},next:{title:"Types of Contributions",permalink:"/docs/contributing/types-of-contributions"}},s={},p=[{value:"Contributing to Superset",id:"contributing-to-superset",level:2}],c={toc:p},l="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(l,(0,n.Z)({},c,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")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/apache/superset/pulls"},"GitHub pull requests")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/apache/superset/discussions"},"GitHub discussions")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://superset.apache.org/community"},"Superset Community Calendar"))),(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")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/apache/superset/wiki"},"Superset Wiki (code guidelines and additional resources)"))))}m.isMDXComponent=!0}}]);