"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[652],{95788:(e,t,r)=>{r.d(t,{Iu:()=>c,yg:()=>b});var n=r(11504);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",g={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,s=e.parentName,c=u(e,["components","mdxType","originalType","parentName"]),l=p(r),m=i,b=l["".concat(s,".").concat(m)]||l[m]||g[m]||o;return r?n.createElement(b,a(a({ref:t},c),{},{components:r})):n.createElement(b,a({ref:t},c))}));function b(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 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)}m.displayName="MDXCreateElement"},83916:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>g,frontMatter:()=>o,metadata:()=>u,toc:()=>p});var n=r(45072),i=(r(11504),r(95788));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/edit/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 g(e){let{components:t,...r}=e;return(0,i.yg)(l,(0,n.c)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,i.yg)("h2",{id:"contributing-to-superset"},"Contributing to Superset"),(0,i.yg)("p",null,"Superset is an ",(0,i.yg)("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.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://lists.apache.org/list.html?dev@superset.apache.org"},"Mailing list")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"http://bit.ly/join-superset-slack"},"Apache Superset Slack community")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://github.com/apache/superset/issues"},"GitHub issues")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://github.com/apache/superset/pulls"},"GitHub pull requests")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://github.com/apache/superset/discussions"},"GitHub discussions")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://superset.apache.org/community"},"Superset Community Calendar"))),(0,i.yg)("p",null,"More references:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://preset.io/blog/tutorial-contributing-code-to-apache-superset/"},"Comprehensive Tutorial for Contributing Code to Apache Superset")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://github.com/apache/superset/blob/master/CONTRIBUTING.md"},"CONTRIBUTING Guide on GitHub")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://github.com/apache/superset/wiki"},"Superset Wiki (code guidelines and additional resources)"))))}g.isMDXComponent=!0}}]);