 Well I will go ahead and get started. My name is Corey Huland and this is Mattermost's approach to layered extensibility and open source. Got a bunch of slides here. I'll try to go through them kind of quick and maybe we'll finish early and there's Q&A or something like that. If people want to stand around and talk about Mattermost, more than happy to. And if you there's something you are interested in, don't be afraid to stop me and we can drill down a little bit more. So Mattermost, you know Mattermost is an operating system. Mattermost is an OS. We envisioned Mattermost from the very beginning as a platform. I always like to say the original binary is named platform, the original repository was named platform. It's one of those things where I always like to say like if you think of your collaboration tool like Mattermost as a platform, what other open source application would you build on top of that platform, right? Would it be conversational AI? Would it be business intelligence? Would it be very verticalized data, Salesforce data, HR data, finance data? And so it's really interesting to think about that as a problem. Like when you think about your collaboration tool and building on top of that collaboration tool, like what types of applications or what types of extensions or plugins would you like to see? One of the things I always like to talk about, there's the obvious sort of thing here which is you know embedding applications inside of Mattermost. That makes a lot of sense. Most people understand that right away or embedding you know applications inside Slack. Makes a lot of sense to bring an application and embed it into your chat or collaboration system. One of the things that doesn't get discussed that often though is what about going the other way? What about embedding your collaboration app into other applications, right? And we provide some framework and tooling for that as well, but it's an interesting problem because not a lot of people think about that reverse aspect of it and we kind of try to think about both. Now obviously we love when people embed applications inside Mattermost, but we would love to see people embed Mattermost into other applications as well. So what does that look like in Mattermost? So we'll kind of go through all these different layers. We'll start with kind of the two bottom open source and open data. I know there's a kind of obvious but it's always good to just talk about them and then we'll really kind of jump into what we call the developer toolkit. So the developer toolkit has a whole bunch of layers that will be created that kind of start from easiest to hard and we'll kind of go through each of those and I'll show examples of what you can do with these things. You know, we're open source. So I write this like difficulty four out of four, but it bears repeating. I know at this conference of this audience it's kind of like, well of course it's open source, but open source has all that typical open source good. We have all that typical open source goodness. You know, you can fork it, you can change whatever you want, but I think most people realize after a while that's actually really hard and it takes a lot of energy and effort to do that. I always like to describe it as like, I'm hoping up the hood of my car. I go out there, I open up the hood of my car. I'm not a mechanic. I'm like, yep, that's an engine, beautiful engine. There's a hose, there's a battery. I'm not sure what all that other stuff does. And that's where open source is amazing because you can do that and just dig in, but it's also very intimidating because it's such a large thing to dig into. 100% of what you see our application do is actually, it's done through 100% through a RESTful JSON web service. It's fully documented, so anything you see our application do, you in theory could write your own application to go do that. And not even in theory, people have done that. So here's a great example of just sort of open source goodness. So Matterhorn is a community project. It's a terminal client written for Mattermost in Haskell. So there's a team of people out there who maintain this project. It's really cool. If you want a terminal version of Mattermost, you can go install it and you can just connect straight to Mattermost and start using it from the terminal. This is all community led. It's all done through our RESTful JSON web service. And it's pretty amazing sort of the power of open source or what you can do here. And this is a great example of that now. This is also a lot of work. They basically fully rebuilt the UI in a terminal. It's really cool and amazing, but you can see it's a lot of work, but that's sort of the power of open source. Another thing is open data. So I don't think enough people talk about this, but it bears talking about, right? Mattermost is open data. You own 100% of your own data. And that's a really important or powerful concept, right? So not only do you own 100% of your own data or can own 100% of your own data, we actually do it in a SQL database. The database, the APIs, all that stuff is fully open. There's no magical mystery of how to manipulate that SQL data. It's pretty standard. It makes things like charting, reporting, analyzing data out of that SQL database extremely easy to do if you're so inclined to do it. There's no proprietary data models. There's nothing hidden here. And I think in the open source world, especially we talk a lot about open source, but I don't think we talk enough about open data. And I think this is a very powerful concept in the sense that you control your own data. You get to do with it what you want. So Mattermost developed a toolkit. So now we'll start getting into the more detailed stuff here. And we kind of start from the top layer, from the easiest to the hardest. So we'll kind of go through each of these with examples. So there's incoming, outgoing webhooks. There's slash commands. There's our new application framework or apps framework. We have bots. We have a RESTful API. Then we kind of get into some really powerful stuff with our client-side plugins and our server-side plugins. So I'll kind of go through each of these. I won't go in detail. There's a lot more here, but just enough to scratch the service to help people get interested to show some examples of how we do these different things. And then kind of get into some of the really more powerful stuff. So we first start with webhooks. And the difficulty on this is like a one out of four. We support two different types of webhooks. We support incoming webhooks and we support outgoing webhooks. Incoming webhooks, you can post a message to a channel via URL basically. So it's a simple HTTP post request to a URL. It's designed to be very easy to get data into the channel. The really cool thing is they're Slack compatible. So if you have a Slack webhook that works, more than likely it's just going to work in Mattermost. So it's a really powerful, easy way just to get data into Mattermost, into a channel. And then you have outgoing webhooks, which is kind of the reverse. So we automate a response to a post made by a user. We have trigger words. So if it sees a certain word, it can trigger an outgoing webhook. Once again, it's just a simple HTTP post request to your own web service. And once again, they're Slack compatible. So if you want to get information easily out of your system, and you already have a Slack or something like that running, you already have a webhook for it, you're more than likely you can just hook that up to Mattermost and it just works today. One of the nice things about it. So a really quick example. Here's a couple examples of how we use it internally. The first one is actually a, I think it's like an SNS alert from, you know, one of our corporate machines that's having a high CPU alarm. I think we're running like an LDAP test or something like this. And all this is doing is taking the alert and posting it into a Mattermost channel via webhook. We also have a GitHub webhook here as well as posting it into a channel. And it's just basically pumping data into the system. It's a very quick, easy way to get data into the system. It doesn't really require any kind of programming, any kind of, you know, hard knowledge. Like I said, you know, the cool thing here is if it works in Slack, more than likely it just works in Mattermost. Let me get the slash commands. Slash commands is kind of that same difficulty level. It's kind of pretty easy to do. It doesn't require a whole lot of programming or knowledge. You know, slash commands is an easy way to integrate external applications. So it's similar to outgoing webhooks, but it could be used in a specific channel. It's basically a simple HTTP post request. You can process that post request. The data that comes back for that is structured data. That structured data can go back into the channel, which makes it really nice of being able to execute a certain command, do some either Lambda expression or Lambda function to do something, and then bring that information back into the channel. We have both built-in and custom ones. So we have ones that are built into Mattermost that just work today. We have custom ones that you can actually add yourself. And there's a lot of different ways to add these. Once again, they're also Slack compatible. So if you have a slash command that works in Slack, more than likely it'll work in Mattermost as well. Here's a really simple example of how we use some slash commands. So we actually have a tool called MatterBuild. It's just used for building Mattermost. We actually execute a lot of the build commands from within Mattermost to south. So here's an example of Carlos issuing a command slash MatterBuild. He's cutting, you know, 5.5 release. If you look right below it, that's MatterBuild itself echoing back in the channel, in the channel he's in, which may be his own private channel who knows where that's at. But at the same time, MatterBuild is actually issuing another message into a different channel, the releases channel, and saying like, hey, we're cutting 5.0 as well. So a really simple example of how you could use a slash command to sort of automate some of your build process, whatever it is that you do within your company. Next we have the apps framework. So this is new to us. You know, difficulty is a little bit harder, but it gives us a lot of power in between sort of those simple web hooks, in between our web hooks and slash commands, and our plug-in framework. It kind of fills that nice void right in there. We'll kind of talk about what these different things are. So it makes it a lot easier to build new integrations. It's in beta right now. It's expected to be in GA and Q4. They're great for integrating external services to Mattermost. The really nice thing about apps is you can use any language that you're comfortable with. It doesn't require React and Go. So if you're writing a plug-in, a Mattermost plug-in, it pretty much requires React and Go, or you have to be very savvy to not use React and Go. The really nice thing about apps is that requirement doesn't exist. You can sort of do it in whatever language you want. There's security scopes that allows apps to be installed and only use certain APIs or endpoints. This makes it really nice in being able to differentiate between what a user can do, what an admin can do. We're going to eventually tie this to offscopes as well. It makes it a really powerful feature. The really cool thing is apps work across both mobile devices and desktop as well. Mobile device, desktop, and web. It doesn't require any specific coding for mobile or desktop. An app can be hosted anywhere as long as it's accessible via HTTPS or HTTP, including serverless functions. So if you have a Lambda function that does something or kicks off a build, you should be able to easily integrate that into an app or connect that up to an application. So what is the app framework? The app framework gives you a couple different things and we'll kind of talk about these different things. Some of them make it really powerful to interact with matter most. The first one is just it gives you an API to register interactive UI elements basically. This gives you things like modal windows with fields. It gives you flash commands. It allows you to show a button on a specific channel. It allows you forms or embedded forms. So all those interactive dialogues in a declarative way without having to write code allows you to surface those in matter most. And one of the cool things it allows you to do is then connect it up to your service or your Lambda function, whatever you're using on the back end for that. We also give you an API of events. So you can subscribe to different events like a new user. Our user has joined the channel so you can create different workflows based on those events. We also give you access to a very simple key value store. So that way you don't have to worry about your Lambda function meeting its own storage. You can just store it directly back in a matter most. And last but not least probably one of the really cool features is you automatically get an OAuth token that's registered to call back into the app. So you can call back into our REST API. So once again anything you see our front-end doing we're giving you an OAuth token to call back into our API to do anything from your Lambda function or from the framework to do those types of functions. So it's a really powerful mechanism or gives you a declarative UI coupled with your own ability to run functions anywhere coupled with a session token that allows you to call back into the server. So really powerful concept in terms of filling in a huge void. As a developer what can my apps do with the framework? Well you can create slash commands, you can post messages to channel. If you look to the right you can add buttons to the header. So just like start a zoom meeting or start a jitsi meeting button you can add buttons to some of the drop-down menu. So like here's an example of create your issue or attach to your issue on the right. You have those interactive dialogues I talked about which gives you dynamic fields, better air handling. It also gives you interactive messages. So it allows you to embed forms in a message. So it gives you interactive dialogues and it gives you a form in a message which is a really powerful way to either run surveys or kind of do whatever you want collecting data from the system. And it uses the Matrimos REST API to do all this as well. So what is part of an app or how does it work? An app is an HP endpoint that is registered and will respond to Matrimos server when there is a user interaction installation or installation. So it's basically a JSON manifest file that you upload. It describes sort of declaratively what are some of the UI elements you need. It describes you can actually have embedded images or statically uploaded images in there. And then it also links out to where any of those buttons have interaction to whatever serverless function you want to call to. So it makes it really handy and convenient and easy. It also makes it really nice from a security perspective especially for things like our cloud environment where we can do these things in the cloud and we don't have to worry about security as much because it's basically calling out to some other service versus running within the Matrimos infrastructure. So Matrimos has bots. So sort of on to the next thing. Difficulties a little bit harder here but these give you a lot of power in the ability to sort of read messages and respond to messages. So kind of bots overview. There's kind of two things to do here or two ways to use it. So we have our official and community built drivers for our web service. So just that RESTful JSON WOME server is talking about. We have an official JavaScript library. We have official Go library that we support. We actually use both of those. The JavaScript library is obviously used from our client. The Go library is used from all of our testing framework and all of our internal tooling uses the Go library. There's some community built drivers like the PHP driver and the Python driver. So it's really nice like I said. I think the Matterhorn people probably have a Haskell driver as well. So there's a lot of great community built drivers out there but there's also some official drivers out there. So once again anything you see our front end doing you can do that through any of these drivers. Another thing we provide is a sample bot written in Go. It uses the Go driver to interact with the Matrimos server. It basically shows you how to log in, create a channel, modify a user. It goes through a whole bunch of samples of what a bot might, how a bot might respond. So this is what it looks like. Here's a very simple bot example. So the first function is login as a bot user. You can see on line 99 that's calling the login. Pretty simple. And then basically starting at line 161 we're just going to send a message to a debug channel. And it's really line 168 as simple as it is. If you can see it's just client.createPost. There's a post that's being created or a message basically. A message basically has a channel ID and a message body and that's it. We post that message in the channel. So here's a great way. We create a lot of bots internally to respond to messages, to auto respond to things from different users and different perspectives. So we provide this sample out of the box. It's a great way to get started. It's a great starting point. We have a HuBot example. So there's already one already built out there. It's pretty great. It's actually integrated into our community server. That reminds me we have our community server community.mattermost.com. Feel free to go join it. It's very active. I think I can't remember how many people sit there. More than 5,000 people sit there. A lot of these examples will work there. You know HuBots are really powerful sort of bot framework. We have an integration with that. So anything you can do in HuBot just kind of surfaces automatically in Mattermost. So here's an example of the HuBot chip it. So I say HuBot let's chip it and HuBot responds yes let's chip it. Client side plugins. So difficulty here is pretty hard 4 to 4 but it gives you a lot of power. We'll kind of go through that power. Client side plugins. You can basically customize the user interface. So the entire user interface that you see in Mattermost you can write up a plugin and customize wherever you want it. You can do things like add to the channel hatter, add to the sidebar. You can create more menus. You can register a plugin to register a different post type. So when it detects a different message it can do a special rendering for that type of message. So there's a lot of power and flexibility here. We try to highlight the areas in the UI that we think you'd want to integrate with and we created a toolkit to make that really easy. But at the end of the day we give you a global handler as well. So you can just register your bit of JavaScript code and kind of do whatever you want. You can take over from there and go to town. And we've seen people do some pretty amazing crazy stuff. But the really common integration points we give you really clear API to integrate with and it makes it really powerful. So we can run through some of those examples really quick. So we have a channel header button example. So this adds a button to the top of the channel header. If there's more than one button then you know a drop down is created and they kind of get grouped together. This is great for things like video conferencing integration. Our built-in zoom integration is actually a plugin. So we have a built-in zoom integration. We have built-in jitsy, blue jeans. Actually all of those are written as plugins. And you know whenever we have a vendor or someone comes to us says hey we'd like you know matter most integrate with blah blah. We're like great here's a here's one let's just copy this one and convert it over to some other some other system. So you can see from the code is very simple. It's just you know register channel hide channel sidebar button. You give it an icon. You give it the call back and you give it the tool tip and that's it. And so that little bit of javascript that javascript function we get called back when somebody clicks on that button in the UI. And once again here's an example of the zoom integration. So this is the just the standard zoom integration we have in matter most. It's putting that button on the screen and it's actually doing it via a plugin. We sent some other cool features like overriding post rendering. So you can register a component to custom render the body of a message. This is really great for rich integrations with custom applications. It's more than a simple text or screenshot. The zoom plugin does this. So I'll kind of walk through an example. We've seen a lot of people do this with really cool interactive data. Whether that data is coming from some sort of charting tool or something like that, you can render a real chart that gives you some interaction right in line. So it's really cool. Once again, same thing. It's very simple. If you look at line 22, we're just rendering the post type. Whenever it sees a custom post type of custom zoom, it's going to call that class that has that custom rendering function on the right and that rendering function is going to take over from there and render the post. So we pass you the data. We invoke your custom rendering function and what that ends up looking like, at least for the zoom integration, is whenever you get, someone has started a meeting, that's actually a custom zoom rendering. So if you look at the zoom bot post message, it's a message of custom zoom. And right in there, we actually have the inline zoom meeting personal ID. We have the join meeting button. So you can click that, go straight into zoom. If you actually, and it's interactive in the sense that if somebody ends the zoom call and the zoom call is no longer active, it'll actually show up here as like zoom ended at blah, blah, blah time and the button won't be activated anymore. And so here's a really great simple way, but we've seen some people do really amazing stuff, especially with interactive charts or interactive data or tables within, within MatterMos directly. And so it gives you a lot of power to sort of custom render whatever you want. You can render components in the team sidebar. So we use this actually with a lot of our different integrations. You can register a component to show, basically show a button up on the sidebar. And we'll kind of talk about some of these different ones we do with GitHub, GitLab is an example of this. Once again, if you look at line 22, it's very simple. It's just register bottom team sidebar component. Here's the team sidebar component. You look, there's a class on the right. And when it goes, it reserves your little bit of screen. And it basically calls your custom render function to do whatever you want there. So the way that works in MatterMos is once again, this is our GitHub integration. So our GitHub integration in MatterMos is actually written as a plugin. And if you notice in the red box in the lower left, it actually takes over a little bit of the team sidebar. And it renders all those custom buttons there. And all those custom buttons have their own interaction, their own handle or whatever it is. So you can float over it, you can see a tooltip, you can click on it and go to, you can go to either to a specific channel where that, where that post is, or you can go out to GitHub, whatever it is. We have a GitHub integration does this. I think our GitLab integration does this as well. I think JIRA does this as well. So it's really nice to be able to add all this sort of custom integrations right into the UI. Makes it really powerful. You can rewrite a message client side. So some of these end up being really powerful. So you can register a hook that'll get called before messages formatted into Markdown. We use this in our wall time plugin. Once again, it's very simple. You know, register, you know, see line 15, register message will format hook. We basically post, we give you the data, you can transform that data and give it back to us. And sort of how that manifests is we have this wall time plugin. It's really cool. So let's walk through this example. We have someone who's in Toronto time zone. He posts a message, they post a message, let's meet today at 10 p.m. A user who's logged into MatterMotion in another time zone, let's say Berlin, we'll actually see the message below him. He'll see let's meet today at 10 and the wall time plugin actually augments it with his local time zone. It knows where he sits and it says, like, I'm pretty sure 10 a.m. Toronto time zone is, you know, whatever it is, you know, 4 o'clock, 4 p.m. here. And what's really cool is this is individual for each user. So if there was someone else from a different time zone Pacific looking at this message, they would see it rendering in their time zone as well. So another example is let's meet today at noon. That user looking at it from his time zone perspective would see the bottom message, which is let's meet today at noon augmented with what wall time thinks noon is for you. So it's a really great way to individually deliver messages or to slightly tweak messages going back to individuals. Server side plugins. So this is kind of the other half of the coin here. Client side is anything to do with the front end. And there's a lot more than what I showed you. There's a lot of other integration points. That's just kind of a sample out there what you can do. So that kind of involves anything on the front end taking over the UI, modifying the UI, whatever you want. We also have a bunch of server side plugins. And these can be very powerful as well. And I kind of should walk you through a few examples of these. So server side sub plugins, you know, they're launched, they're tightly integrated services of the matter most. You can actually manage the plugin very similar to how you manage it. You can, you can do things like extend the rest API. So you can register a handler, you can take over, you can add new rest APIs in the matter most server itself to do custom handling right in line. And then there's also a bunch of integration hooks. We have, we give you the ability to intercept messages to detect when someone has joined a channel or left a channel. So it allows you to create a whole bunch of really cool, a really cool workflow style plugins. And we see people doing this all the time. The classic example is, is we have some really large customers who have a workflow that has to be approved before somebody can join a particular channel. So not only is the channel private, but there has to be a specific authorization of somebody saying some higher up saying like, yes, this person can join this channel. And so in this example, you know, somebody would join the channel. It actually pauses the joining and kicks off a workflow, an automated workflow that other person sees the message approves and then eventually the person gets into the channel. So you can kind of intercept or hook into all those different types of messages. And there's a lot of them on the server side as well. We'll kind of walk through some, some simple examples. The first one is the ability to rewrite a message server side. So there's lots of opportunities to hook messages. You can hook it before it enters the database. You can actually reject the message. So we'll talk about things like data loss prevention. You can also send back ephemeral messages in its place, or you can hook the message after it enters the system record after it enters the database. So a really simple example that we have is our auto link plugin. If you notice in the top screenshot, it's, you know, me typing in a link to our, to Jira. And below it just rewrites the message into a URL basically, or to a markdown link. Really powerful, really simple. We use this all over the place in Mattermost. We actually use it to link sort of all of our alphabet soup and acronyms and stuff like that out to our documentation. So somebody comes into our server and you type in something like LHS for left-hand side. It automatically highlights it and links it to the documentation. That way you can click on it and you can just read right there. Oh, I know what this person is talking about. So it has a lot of just practical team applications. But it also has a lot of applications in terms of around things like data loss prevention. So on our community server, you can type this into an example. You can go to our community server, you can type in something that looks like a social security number. And it'll actually rewrite, it'll actually rewrite that piece of data. So it'll basically detect that it thinks it's a social security number. And before it enters the system of record, before it enters the database, it'll actually rewrite the message, remove the social security number before it gets put into the system. So you can see the value of this in terms of security keys, authentication keys, anything that's easily detectable. We can sort of stop it from getting into the system basically. Really powerful concept around that. Auto-link plugins, a really cool plugin. It's actually a generic plugin. Anyone can download and install it. And you can add in all of these. You can extend it yourself if you want to, but it's pretty flexible. And you can just add in a whole bunch of these sort of redirects or rewrites really easy without even coding. So it's great, really cool to see that you can add in your own custom ones, but you can just pre-configure a whole bunch of built-in ones as well. You can also implement an HTTP handler. So this is kind of getting really powerful. So you can basically add another path into the matter of server. Whenever something happens on the front end, you can direct it to call that path. We do this with an example, our welcomebot example. So our welcomebot example is pretty cool in the sense that when you join a channel, they'll say like, hey, I think you're new here. Here's some channels I think you should join. And you can tell it your interests. Like, you know, I'm interested in support. I'm interested in developing a matter most. And when you click that, it actually calls that custom handler. It goes out of the back end, looks it up, and it kind of adds you to those channels. So the welcomebot hasn't been extended, but we have another bot that's really cool. It'll actually kind of try to figure out your interests and based on those interests, it'll make channel suggestions to you and add you to those channels as well. And it kind of does it through this mechanism as well. So it's a really powerful concept of being able to very easily add more endpoints into the server directly. And that's it. Like I said, let me recap real quick. So it's a sensible design. Like I said, there's just a small sampling of the different integrations we have. And these can be anything from web hooks to apps to sort of full custom plugins, very rich. Like our Jira and our GitHub plugin are extremely rich interactive. Our Jira plugin is actually bidirectional. So when data is updated in Jira, it actually gets updated in Mattermost. And you can update the Jira ticket in Mattermost and actually get updated in Jira. So it's really cool. So we have some really powerful ones. And we have some ones that are just plain simple web hooks as well. A lot of our plugins are actually translated. So this is for all of Mattermost, but we have 14.0 people translated 700,000 words in 16 different languages. So a lot of our plugins are actually internationalized, which is really nice. They're translated in different various languages. And we're open source and we're a globally distributed team. So I always like to invite people to join our community server. So it's community.mattermost.com. You can kind of see the latest and greatest. You can interact with the Mattermost staff there. You can interact with the Mattermost community there. You can ask questions, get help, get support, whatever it is. We're hiring. So obligatory, we're hiring message. I always like to kind of give an offer of Mattermost mentorship program. So it kind of takes two forms. One is shepherding. So if you want to sort of get help in figuring out how to contribute to Mattermost, you know, we're always more than willing to spend time helping people do that. We also actually have a mentorship program where it's a little bit more involved. And if you want to spend, you know, a few months with us or whatever, not a huge time commitment, but some time commitment of getting involved and us shepherding people through an actual mentorship program, we do that as well. So if you're interested, don't be afraid to hit me up. Questions and this is how to reach me. So the best way to reach me is just at Corey on our community server. My Twitter or my email, so feel free to reach out to me. That's the best way to reach me. I'll go back to questions. Any questions? No? So many. That's our hope. So app framework is pretty. Yeah, exactly. They both have their uses. And that's how we ended up building it. So app framework is very new. I think there's a service now plugin. Can't remember where there's two or three plugins for it. I think we're or apps on it. We're starting to see a lot of people convert over to it. And that's our hope. And it's a great, what we really envision plugins as is a way for staff to augment the server. And the apps framework is sort of how we view external integrations. Now, there is a lot of power in the plugin framework. There's a lot of cool things that you can do that you cannot do through the apps framework, because it has a declarative UI and those kinds of things. So there's still a lot of really cool stuff that we see people doing with plugins. So we don't think it'll ever go away. But we view it more as if you're a staff member or somebody working on core, it's a way to augment the engine than it is to do an outside integration. So our hopes is that the app framework will take over from there. So, cool. Any other questions? Nope. All right. Well, you can feel free to come up and ask me questions or anyone know about Mattermost. I'm more than helpful. More than happy to help. Well, thank you.