 All right, other people will be coming in when they come in. Does that go off? Can y'all hear me? Monitors aren't great, so I can't hear if I'm loud enough. I need to be louder? Oh, okay. Okay, he's going like that, and I'm like, is that thing going to be louder? Yeah, forgive me, I'm a little nervous on this one. I give a lot of talks, I'll get to that in a second, but this is the first time I've given this talk, and this is the first time I've given anything this complex. So if you lose me, or I lose you more like, the slides are all online. You can go to mcdwayne.com, which we'll talk about today, actually, and that's where all the slides, everything's the very top link under my session Slides and Such, which I found out today I shouldn't be using as an H1, thanks to Francesca and her lovely talk this morning. Anyway, I like doing stuff outside of tech, web comics and comic books or something I'm passionate about personally. I make a lot of crocheted things. I actually have a web store, but I'm not gonna tell you where that is, and I love karaoke. You came to karaoke last night, thank you. If you didn't, well, come next time, it's amazing. Again, I love Twitter. I didn't say that the first time, but if you go to my website, you'll figure that out. Twitter's my preferred method of communication in the world. I like having public conversations. And in fact, I have this ongoing project this year, and I've talked so much that if someone could get a picture of me in front of this picture and puts this on Twitter, thank you, Mary. Anybody's, please, this would be helping with this project in 2018. This is an ongoing, serious project, folks. And by the end, I'll figure out where all the pictures got put. And by the end, I'll figure out where all the pictures got put, and I will make an animated GIF, I promise. All right, I understand that everybody heard that, but that's more for people in the room, the WordPress TV. I work for a company called Pantheon. And I'm gonna end up talking somewhat about Pantheon today, because, well, I work there. I get free hosting environments, but you can too. I also get free hosting since I work there, but I think you should look into it for the tool set that I'm about to describe. Works there very well. It doesn't necessarily need to work there. We just built a really powerful platform that does multiple environments very easily and does things like get feature branching without a lot of thought. And I like that. But I wanna know who you are. I mean, I've been in WordCamp Montreal a couple days now. I need to slide down this way to get out of that light just a little bit. But who in the room is a developer? Awesome. This talk really isn't aimed at you, but I'm glad you're here. Who here considers themselves a content editor? Awesome. You're my intended audience. And who here considers himself a copywriter? Ooh. I'm gonna talk about that. Who here is like a jack of all trades and they just like glue and stuff together? Oh, then you're gonna love this talk. You're not my intended audience, but you're probably the most out of it. But before we get too far along when I start explaining concepts and drawing charts, I wanna show a quick video and I'll talk through it. There's no sound. So I'm gonna show you if YouTube loads it. Here's my website and here's my staging environment. They look identical because they are. That's the way it should be. And I'm gonna run this little utility I wrote called post it now. And I'm gonna feed it a file. I'm gonna feed it something written in markdown where it can parse the first line into the title and the rest of the body. Give it permalink. Give it an image to put as the hero or featured image. Give it some alt text. It fails if you don't give it alt text. I think that's important personally. I give it some terms. It can only pass in slugs, but I'm happy with that methodology. And it's gonna go ahead and build this onto my dev environment for me without me having to actually ever touch WP admin. And there's the address for where that actually lives. And then it's gonna run some testing. What you just saw there is behavioral testing. We'll go through it and I'll explain what it just did and what it checked for, but it passed the test. That's the important thing. And now it's gonna build it on my test environment. There it is. And now I'm running what's called a visual regression test. The machine is going through pixel from pixel from those two pages dev to test and say did it pass? In this case, it passed. Nothing broken my shipment of it from one place to another. So I say push it live. Yeah, let's go ahead and push it live because this is my actual live environment. I test a lot, so I put a manual stop in. You can configure it to automatically push, but for right now, I'm happy doing it the way it is. And eventually I sped this up a little bit, but some parts I left real time. And there it is in my live environment. And if I redirect to work correctly, when I made this demo, they didn't. I fixed them since and they're on my real live site is this post I just made, everything unfurled, my YouTubes and whatnot. And don't worry if you're in the room right now going what just happened because that's what the rest of this talk is about. For those of you who I have pestered with questions and theories and explanations of what I've been trying to do, that's why I'm super happy to give this talk is I finally get a chance to, without break, explain what I've been doing. This is what we just saw. I took something locally. I could have grabbed it from online. It doesn't really matter where I got it from, but I got content and I got metadata and I shoved it onto a development environment. And then I said, hey, we should test that. I behaviorally tested it and make sure things worked. I was thinking about it into what things actually worked later. Then I pushed it over to a test environment. And I wanted to make sure that the config didn't break between environments. Again, we'll dig into this. And because it all worked, I felt very confident pushing it to my prod environment, my production environment. This shouldn't look foreign to everybody that raised their hand as a developer. This is professional website development from a code perspective. We push it, we test it, we push it again, we test to configure again and we push it to live. Why aren't we doing this with content? And some of you might think like, that was a stupid, silly blog. Why on earth are you doing this? This is really complicated. Well, yeah, in fact, I do run a little silly blog, a travel blog. Everywhere I go, and some of them other random thoughts end up on the site mcduane.com. And it is my home on the internet. I firmly embrace some of the ideals of the indie web. And I believe everyone should too. If you're using WordPress, you're already halfway there. You should own your content. You should own your space on the internet and you should own your own name spaces and ideologies. Mine's in WordPress. Mine lives on Pantheon at the end of the day. But unfortunately, everything I do on the internet comes with a technical debt. It comes with some technical burden and things I just have to do every day. This is one of my favorite web comics in the world, catandgirl.com. Probably, I have a print of this at home. This is one of my favorite things. It's impossible to read. If you get the slides, it's in the speaker notes the link directly to it if you wanna study it. But nothing terrible. It's just like, I gotta do this and I gotta log in and do that. Now I gotta log in and do this and now I gotta fix it this way. Now I gotta add meta. Now I gotta do this. And it's just a hundred little paper cuts. And I said to myself, there's just gotta be a better way to accomplish all this. So like with any project, I wrote down some goals. And I said, here's some things that are important to me and what I'm doing. These might not be important to you. When I realize this next section, some of you might say, I don't agree. That's fine. If you're fine living with the hundred paper cuts a day, I don't have any begrudgia. And again, this is my indie web project. This is my content online. Again, if it's not for you, you can have different opinions. One, I wanna write anywhere I wanna write. I wanna write in the text editor of my choice. The main reasons why are these three. I use Sublime Text and the first is Text Wrangler. More than I use anything else because they work on airplanes. They work when the Wi-Fi goes out on me three times in a session yesterday. It just works. I don't have to think about it. My computer can blow up literally. And if I've done it right, I can just pull it back from GitHub and be right back to where I left off. Inside of this, a conversation I've been having. And if there's one conversation we can have after this, this is the one I would love to have. Is the fact that copy is not content. Copy is a function, a part, an object, an attribute, a something. I don't know that I don't have the right word for it. Part of content. It can be content. Nothing's stopping it. But these are two separate things. And if we go into the world of Gutenberg thinking copy is content, we're gonna have a bad time. We're gonna have a bad time pretty quick. Well, I don't know about you, but last time I typed anything manually into Gutenberg and hit Enter, I got a new block. That tells me it's a content editor, not a copy editor. Wanna hit a new carriage return? I want a new carriage return. That's how copy works. Again, my opinion. And I wanna be able to write completely distraction free. I don't wanna know if I'm connected to the internet. I don't wanna know the pop-ups that suggest proper spelling and grammar and things as I'm typing. I just wanna type and get it out of my head. Editing's for later. We learned this in second grade. First draft is just ideas. Second draft, you edit it down. This also means I can leverage get because everything's just a text file. And now my world gets interesting because I can go get, log my history and find out where I inserted ideas. I use this for my personal writing all the time. And I can tell you where an idea came from. I can put things in my get log and from one place I can tell you the evolution of an idea as it goes through time. There's a lot of other tools I'm gonna talk about. I'm gonna speed up a little bit. But that's the first goal. So that's right locally. Or I wanna write locally. Two, ever since I started using the WPCLI, my function or one of my goals in life is to never, ever, ever have to log into WPC Admin ever again. It's slow and it's useless now. Because we can do things like this. Yes, this is actually how I made this post. And for you who are like, this is a blur. This is literally where this talk came from. I was at WordCamp St. Louis explaining this jumble of curl and said and all of this wonderfulness. And someone said, man, I can just like throw my URL in there. That might work. And I'm like, that's a good idea. So I componentized it up and started working on it. And that was the next section. Well, if I'm gonna do this repeatedly, I better not have to hand edit this thing every time. Or man, I'm gonna start messing up really bad. So let's build something that can do this for me and do it repeatedly, reliably. And do it in a way where I can throw it out to the universe. These are all open GitHub repos. More than welcome to go to pull requests. If you can help me fix it, please do. If you have better ideas, please and develop them. If someone walks out of the room and says, I like those ideas, but man, that's a rough version of that. And I could totally build it better. I encourage you to try. I encourage you not to try, but to do. Here's where I started from. And I really wanna make a lot less mistakes in production. This, believe it or not, drove a lot of what I've done this whole process. You log in, you start typing in live, you hit print or publish, and then while you stand there and stare at it and hope you got everything and wait for someone to comment and say, hey, you misspelled this. And if they're nice, they'll do it in private. And if they're not, they will say nasty things. Oh my goodness, your grammar's wrong. But then again, Chris Lima once said very well in the talk, there's this magical power in WordPress. And actually most CMSs, that when someone says something nasty in a comment, you can hover your mouse over this one section and hit delete. And you have control over that because again, it's your web, it's your content. You have power over that. There's nothing rude about deleting a rude comment. But I don't wanna do this manually because if I do it manually, I lean over a computer and I stare into a screen and my eyes are just not good after a while. And I think I wrote it right the first time anyway. There's these other tools that can do this programmatically for me. They can just, things I would visually inspect for, they can visually inspect for. The behavior I expect that I click around for, they can just do that for me if we tell them what to do, because they're machines. So that was it, that was my goals. I didn't sit down and write this list verbatum. I had a very, very different list, but when I find it down for this talk, this is what it ended up being. These were the things why I chose what I did. And this is what I built. We're not gonna go through everything in detail here. If today you walk out and say, I've never heard of two of these and you started investigating it, then hooray, we won. Ideally, we can start thinking all of these things like everything else on the internet as a giant pile of tools. If we spend all of our life and all of our time and all of our efforts around just WordPress, then we might as well not go to Jamstack Talks. We might as well not even worry about the WPCL, or the WP, I'm sorry, the REST API. We might as well not worry about Gatsby or any of the other amazing JavaScript technologies that are coming along, and let's ignore React because we're ignoring the rest of the known universe when we start ignoring the rest of the tools available to us. Because we don't live on an internet that got us to where we are. We live on an internet that's getting us to where tomorrow is. And I don't know what that looks like. There's devices that haven't been invented yet. If you would've tried to explain Alexa to me in 2002, I would've said that's a neat idea, it'll never work, because Lambda didn't exist. If you tried to explain to me VR, I would say yeah, like in the 1980s movies, it's terrible and it will probably get there one day. And I just ordered an Oculus Go because they're that good. Someone showed me one. And that's the world I want to live in. And all it is is putting the right gear in the right place. And this goes well beyond what I'm showing today. And this goes well beyond what we're doing at this camp. This is the internet and whole. It's just putting the right gear in the right place and tuning it correctly. And if we can step back from what we're doing and say well, this is what I wanna do in the big picture and get out of the framework of I gotta do it in this plugin in this way. Or I have to do it in the Gutenberg proper way. And step back and say, what am I actually trying to accomplish here? Well, we can accomplish anything. That's the magical beauty of open source. We all know what we're doing a little bit to share enough to build amazing, complex, beautiful things. But I am gonna talk about the components that I think are the most exciting. Each of these could be a talk unto itself and a couple of them are. That will be delivered later this year. First is Markdown. Who here already knows Markdown by heart? All right. Who here knows HTML and the basics of HTML by heart? They could sit there and write an H1 and H2, make an underlying, or not on it, but a bold happen, an italics happen, a strike through, all of that. Guess what? You already know Markdown. You just don't know the exact specific implementation of it. It takes 20 minutes to learn. This is what it looks like. You want an H1, you put a hashtag. You want an H2, you put two hashtags. You want an H3, so on and so forth. You wanna make a link? Links are stupid, simple. Square bracket and parentheses. And guess what? Places already use this. Anybody use Reddit? Yeah, you can write in Markdown. Anybody use GitHub, Bitbucket, any of these, OpenStreet, SourceForge? List keeps growing. Another important technology that uses Markdown, well, I'll get to that in a second. There's awesome tools to learn Markdown. There's awesome worksheets and cheat sheets in the Markdown tutorial, which is how I learned it. There's a zillion of these things. The standard hasn't changed a lot in 30 years. It's hardened. It's hardened as much as HTML1 does, it did. WPCLI, and I know some of you were thinking, wasn't this supposed to be a WPCLI talk? None of this works. None of the things I have done today work without the WPCLI. WPCLI allowed me to step away from the admin and stop thinking in a box. WPCLI let me start thinking about what do the core of WP actually do? What do the internals actually function like? Who knows that they can modify any user role capability without a plug-in? Anybody? Yeah, a handful of you. The rest of you, that's the WP roles in CAP. Like, WordPress WPCLI lets you adjust these things properly in the WordPress proper way. I'm using the post functions. To use that on my hosting provider, I wrapped it in their CLI. I use Terminus, we have our own CLI. No reason you have to. If you are doing this on your own remote boxes, you can just remote with WP. I'm not gonna teach you how to do it today, but it's a function of WPCLI. You can aim it at things and say, do this here and that there. That's a fundamental other aspect. If I need to have a here and a there, which means I need multiple environments, I need to have at least local, at least staging, at least prod. If you don't have that, well, you're writing things to live more or less. If you don't test things between you move them to staging and prod, then you're hoping nothing breaks. Moving at least twice, I think, is fundamentally important. Software development's embraced it for a long time. Constant editing, I think it's time to come along. Gutenberg. I debated a while on what image to use here, so I used an old tweet from Bridget. Mullenweg said at WordCamp Europe, most, his favorite feature of Gutenberg coming out was copy, paste, or markdown. That's how powerful this is. WordPress, as of now, uses the same underlying things you can use on Reddit and GitHub and a growing list of places. It's the standard most efficient way to move content around, or I'm sorry, copy around the internet with formatting already attached. HTML is the standard, markdowns the shorthand how to write it without having to do a bunch of brackets. Still some brackets. Unfortunately, this says you gotta copy and paste it. So for right now, it's manual, you gotta copy, paste, then. And again, I never want to log into WP Admin ever again. So I'm not going to ever copy and paste into there. Which means there's this technical limitation where soon, I'm sure, put it in core because it's been in WordPress.com for a while. You can go in and click on a button and it says accept markdown. There's a plugin that does this still, WP Markdown. And it does essentially this, transform on load. Transform as it pushes it in. So as Gutenberg's receiving this information, between the time you pushed it from wherever repository you're pushing it to Gutenberg, on the way in, it transforms into markdown and then Gutenberg knows what to do with it. That's mostly true. There's some technical aspects to that, but that's essentially what's happening. We're transforming on rate. And then Gutenberg says, oh, I know exactly what to do with this, hooray. And Gutenberg's awesome for content editing. It really is. Throw a chunk of copy in there and then move pictures around and put clips around and make things bigger and smaller and drop cap. And it's awesome. I personally don't like it for the actual copywriting experience. That's why I'm doing all this in the first place. Then I get to testing. How many people have ever heard of Word Hat in this room? That's more than I thought. This is based on Be Hat. And you've got to know Be Hat, less people. How's that possible? It's based on Be Hat. Be Hat means behavioral testing. Be Hat is really, really easy to write because it's intended for people that aren't technical to write their own tests. It's called the Gherkin language. It's pretty readable. Can anybody tell me what specifically I'm looking for and what text shouldn't match if I'm searching the page based on this feature? Yes. Specifically, the string, slash, slash, twitter.com. That means something didn't unfurl because all the Twitter links I do don't use www. All the Twitter links that I always pull from Twitter are HTTPS slash, slash, twitter.com slash something. Beautifully, Gutenberg accepts raw URL. Another really powerful benefit of it. If you throw it just a raw URL, it probably knows what to do with it. It probably does. If it's Twitter, if it's Facebook feed, if it's Instagram, there's a giant list. It will say, I know what to do with this. I'll make a block because I know what this is. I'll make a block out of it. So that's how I do Twitter. That's how I do YouTube. That's how I make things. Some behavioral test and say, hey, did this thing actually work the way I wanted it to? Then the other test I run is Backstop. Backstop.js is an open source library. It says pixel to pixel is A the same as B. So you can go look at two images and say, hey, is reference and test identical? And this one answer is obviously no. Imagine if you had an extra period on one of these. Just down there in the second to last paragraph. You might see it, you might not. This will. Pixel to pixel is it the same thing? And you might be thinking, yeah, but that's great for plugins and giant pieces of code and did this update break something? That's what's intended for. But we've just entered to a world of configuration dependent content inside of configuration dependent content. And yeah, the other use cases are great. If someone's turned off a plugin in live and pieces your content dependent on that plugin, it's gonna break. Hopefully they turned it off in tests and you can copy your config over from live to test before you test any of this. Make sure updates don't break and again, great. But who here's ever used the nested block feature of Gutenberg yet? Has it worked as expected every single time? Yeah, I got a this and a no. That's my worry. When we drop this come October or whenever it drops, when Gutenberg drops, this is gonna become a problem that I don't hear a lot of people talking about outside of the high end publishing in space. I just came from WordCamp for publishers in Chicago. They're talking about this. If you're Dow Jones or if you're the New York Times or someone with that caliber and that large of a publication with those million and millions of eyes on you, this matters a great deal. That's why they're scared of Gutenberg. Is this gonna break a workflow that they had in place for a long time in a testing framework that they've developed over time? Backstop gives us a very quick way. Oh, let's take questions at the end. Oh, what's the question real quick? Oh. Yes, Gutenberg is replacing TinyMCE. As a 5.0, TinyMCE will be the classic editor plugin, which you can put in at your leisure. But Gutenberg will be the default experience for all new installs and for every update that doesn't have the classic editor installed. This isn't a call to alarm. I think it's a good thing, but it's something we very well need to be aware of in the industry. Who here has clients that they've trained on content editing already? Now's the time to tell them about Gutenberg. Like today, go call them right now. As soon as this talk's done. I'm not joking. The plugin will be in core. The plugin will be the default experience. The plugin won't exist to plugin anymore. It will be core. That's the plan. Will it actually happen on time? It already is behind schedule. I can't tell you any more details than that. In fact, if anybody could tell me an update on the last production schedule of it, I'd love to hear. It's somewhere in the GitHub requests. Anyway, you have this tool, Backstop.js, at your disposal. And you also have this insanely powerful tool inside of your machine right now that can do just about anything you tell it to do. Because there's probably a library or a tool someone wrote that will make it do anything in the known universe. It's called Bash, the Born Again Shell. There was, predecessor was the Born Shell and they thought it'd be funny to call it the Born Again Shell and Bash stuck. And this has been, a piece of technology has been around for 40-ish years. The modern version's been around for over 30. And if you imagine WordPress is 15 years old and we've gone from, who's ever seen a WordPress 0.1 site? Yeah, it's called B2. Very ugly, very minimal, very blocky. And now we're at, about to release Gutenberg and we're in 2018. Imagine if we had twice as much runway and you could iterate extremely fast, like faster than you ever could with a GUI. That's what Bash is. For those of you who don't know Bash scripting, for those of you who are already on board, like, I'm sorry, this is boring, but Bash will let you do anything. Here I'm just pulling things across the internet. I'm curling this repo that I made, or a little text file I made, says hi working at Montreal, or I'm saying hi, but it says working in Montreal. It can do anything you tell it to do in a row. That's the comments at the top that explain what it's doing and when we get into the actual Bash programming itself. But it's a script, it's a robot. Robots are amazing at doing very complicated things over and over and over and over and over and over again without fail, without mistake. And if it messes up, there's logs. If it does something out of order, you just go and reorder it. It can do anything we tell it. It can do it extremely fast. And it can do extremely complicated things that take me a half hour to fully explain what I mean and what I'm doing with it. It can do it in a way that I can actually componentize up and take pieces and chunks and share to the world. And at the heart, I think this is what we want to be as plugin and theme developers and WordPress developers in general. We're built on the GPL after all, a GNU public license. Freedom zero is the freedom to inspect the code. I want everyone here to be able to inspect my code. If you want to, you can. That's how we should all feel about our code. And this lets me do it. Bash is a very easy way. Bash is also, can let me move from my local into something else. Who here has ever heard of CircleCI or Jenkins and be like, what the heck is that? You can be honest. Awesome, it could help people. CircleCI is a computer you don't own that can run a Bash script. That is it. There's cron with fancy knobs in it and there's things you can hook up to GitHub repos. But that's essentially it. It's a computer you don't personally own somewhere out on the internet. You can tell it to do things in order and the way you tell it to do things in order are little config files and Bash. The better you are at Bash, the better you'll be at every other aspect of computer science. So I got to the end and it built this thing and it's how I've been posting now for about two months. Adding pieces as I go, adding the testing pieces that aren't that fully baked yet, be honest with you, but my use case is very simple. My website, mcduane.com, has a use case of one user. Me, in the future. I know that I mostly use this machine or my phone sometimes on good Wi-Fi networks. So I've tuned for that. That really doesn't come into play here, but I know that these goals, knowing my end user in mind, will help me get to a world where I can do things very quickly or I can write in the editor of my choice or I never have to log into WP Admin ever again. I purposely avoid it because it's way faster if you don't by the way. I wanna make things I can extend and reuse and share and make less mistakes in production, but put that a different way. At first, I just logged in and it was wrote to live. Things broke on my production side all the time and unless someone told me just likely stay that way then I thought, wait a minute, there's gotta be a better way and that's why I use CLIs to post all my blog content to my site and now I test along the way because I'm sure I'm gonna make mistakes. I'll ever CLIs. I like CLIs. Yeah, yeah. Glory Gainer, everyone. I'm Duane, I work at Pantheon, I like stuff and I wanna have a conversation with y'all. So with that, thanks. Questions over there first. Why is performance an issue with WP CLIs sometimes compared to doing it in the database or was the second part or directly via bash and direct manipulation is a performance issue? That's a complex question. First question back is always what version of PHP are you on and what version of WP CLI are you using? If you're on the latest and latest, it's fast in my experience. I also have a tendency to lag with it because I always wrap it inside of another CLI. That's the beautiful part about CLIs, you can wrap them in each other. So I call terminus which is the word Pantheon CLI which then calls WP CLI. So I have to wait on that latency which is a couple seconds. I hate touching a database, just hate it. I don't wanna go, I don't wanna know SQL. I, we live in a world of 20 years of post-SQL at this point of no SQL. Cassandra is 14 this year. It's, I don't wanna go step back in time. I realize I'm saying that in the same time I'm saying learn bash. But WP CLI lets me avoid ever having to know how to write to a database. I can never accidentally overwrite my database. If I wanna copy content from stage to live and I have 15 orders come in, how do I do that with the database without disrupting that live content? WP CLI can build it in over time and it doesn't affect anything going on in a live environment. So the performance penalty compared to all of the other stuff I can get myself into by manipulating the database directly is well worth the time to me. Again, my use case, yes. If you're migrating 10,000 pieces of content, this is gonna be really slow and you probably should just overwrite your database at that point. Probably should never overwrite your live database though. There's other ways to do that. But given that the actual use case is me like giving it a few things and waiting four minutes, I have zero problem with the lag time from again my use case. If it's faster to log in and do it through the admin, something's wrong somewhere. If you're waiting on screen, either that or you have the fastest screen paints in the history of the world. And I don't know, everybody's mild differed on everything. So those are just my thoughts. Yeah, you're right. WP Bakery, I do not know. Oh, the page builders. How does Gutenberg affect the page builders of the world? You have to ask the page builders. I don't use them and I don't know. I know that most of them have already announced they've adopted and are compliant with Gutenberg. What that means will vary from Baker to WP or Beaver Builder to the, I actually don't know the rest off the top of my head. I don't use them. You'll have to ask your particular of choice. Over there, I had a question. Ah, yes. Ah, yes. The tuneability of CLI, that's actually an excellent point. It is, the WP CLI itself is an open standard. 2.0 is about to drop. You can go look at the news on this on GitHub right now. Daniel released it three days ago or the news of it three days ago and performance improvements that him and Alain have been working on it will be baked into there. But I completely forgot about that. Thank you very much. You can config, just like you can config it, you can config anything. Excellent point. Other questions. Wow, I got through that way faster than I thought I was going to. Some of the limitations of WP CLI. Some people would say this use case is actually a non-ideal situation to use it in. Manipulating content with it can't get tricky like I showed. You're doing it by hand. Like feeding it a line separate as a title, separate than a body out of the same dock. You can't do that natively. So I had to build bash around that and certain PHP, piece of PHP. The beautiful part about it is if I do hit an limitation, extending the WP CLI is actually ridiculously easy. It sounds like, oh my goodness, there's all these things I need to build and put in the right places. But WP CLI itself has a function called scaffold. And there's a function you can put in called scaffold block. And this action will build, I'm sorry, not block, build plugin, scaffold plugin, WP CLI scaffold plugin will build WP CLI commands for you. And all you gotta do is drop in the PHP. So if there are limitations, you can simply make it do what you want. The best talk I've seen about WP CLI in the last two years was from Ben at Corner Shop Creative. He gave it at WordCamp Seattle 2017. And it's how their company built a theme called Crate and WP CLI tool called produce that inserts mustache code throughout their theme so they can modify anything and do completely custom coding in a programmatic way that everyone can get on board with very quickly and they know exactly what gets changed, what doesn't. It's a very standardized way to extend the tool to modify to their workflow. I think that's what I missed in all of this. I get very excited about the component pieces to step back and say, I learned so much doing this about the interconnectivity of systems and how everything actually works together. I know so much more about the WP, about the WordPress database schema right now that I did when I started even though my goal is to never actually touch the database. I know so much more about how plugins are written even though I've not produced a plugin whatsoever. I know more about the enqueuing system. These aren't bad things. Were they practical? I did this in my spare time on nights and weekends just thinking about it. Eating up a lot of my brain in the last few days but being able to do all of those things is cool but it also gave me complete and utter freedom of what I wanted to do. How many people work with editorial workflows where they're tying together like five, six different systems but they're doing it by hand? We copy-paste from this system from Google Docs which is the best thing for collaborative editing ever and to this other system that's actually just the approval system for internal tickets on it. Then we pass it to QA. Then we do these other things. There was a great talk at publishers. Slightly different idea but Jody and Tate, I'm sorry, Shada from Web Dev Studios were talking about this tool they built which is reimagining the WP admin as an editorial tool and that's re-skin it, that's rebuild it and react so you never have to leave WordPress to do all of the pieces. Figure out what the actual workflow is and then mold that workflow into WordPress using the WP editor and modify the thing. I disagree in the fact that I think if we treat WP CLI, if we treat WordPress as the be all end all everything and we try to mold everything into it, that's gonna become a headache and chase in our own tail of just trying to modify anything into the WordPress way. Versus we use WordPress for what it really is which is a CMS, a content management system and we build things into it and we pull things out of it. It would be a much smarter way to think about it long term, especially in a world where the editor itself is just about to cause a lot of controversy and you're gonna have to retrain clients and you're gonna have to have a lot of conversations about why it's good and why it's bad. If we step back from that and say, no, it's just a repository that keeps metadata around that we can pull from APIs at runtime, then yeah, it goes a lot faster and we can start thinking about component parts and then things like Gatsby don't seem like threats, they seem like giant benefits to us that if we don't have to think about the front end anymore or we're free to do anything we want or we can start thinking about the front end in completely new radical ways that don't exist yet. All right, there we go. Oh yeah, oh sure. If you go to my slides, mcduane.com, the very first link is the slides for this and the GitHub repos. So go look at the code. If you see something interesting or like I wanna change that, suggest that we change it. There's the pull request system. Go edit it, click the little button or clone it down, make your changes and then push it back up and tell me that you did it and that's how all software gets made on the internet, man, not all of it, but that's how it's used in GitHub. But I'd be happy to like take issues on it. There's a lot of typos and a lot of strong opinions in it. And if you wanna use it in production, I will not support you. It's in the read me. Oh, what's the learning curve for those things? Whew. That's a really hard question because I don't know what the learning curve is of anything because I've already learned it. And that's a weird statement, but it's true. So I was fortunate enough to learn the basics of BHAT as a side effect of what I do for a living is developer relations. So the general theory was there and I understood Gherkin a little bit because it's so darn easy to read. All my features, which is what you call the individual tests in BHAT are up on my GitHub. You can look at them. Word hat is a wrapper around that that has presets that you can just like this line, this line and this line go together and I just put in my, I changed the variable and that's it. And that's all the test writing I had to do. Like, that's the test up here. Yeah, the only thing I modified in that whole thing manually was Twitter. That was it. The rest was just like, the rest is a description. That took me probably a week. But the thing that actually got me over the line is if you go back and watch the video at the beginning you'll see loop and your Taylor loop count demo 2018. I took someone else's work, said, oh, I just need to modify these parts and I reuse the exact same library. But guess what? That is 90 plus percent of software development. Let's stand on the shoulders of giants. I didn't write Linux. I'm never gonna write Linux. I didn't write Mac, but I use it every day. I didn't write Bash. I can extend it all day. But I stand on the shoulders of giants. Word hat took me a little bit longer. I'll be honest with you. I'm sorry, Backstop took me, I'm sorry, Backstop was the one I borrowed someone else's library. Word has the one that I went and installed fresh and had to read like about four tutorials and have a conversation with someone. And I would highly encourage you. If anybody was like, oh, I don't wanna do that because I would be alone and stuck out there, don't. There's a world of people that are willing to help you with this stuff. The support form for this stuff itself jump into the make.wordpress.org slash, or Slack. Make.wordpress.org slash chat. That is the world of people that make WordPress. And there's somewhere out there in the support forums. There's somewhere out there in the world someone will say, hey, you should go look over here. This person can help you. They might not be your first person you ask, might not have the answer, but I've never been told no, no one knows that. It's like, they might know, they might know. I don't know, but they probably know, or you should go read this. And read enough stuff, depends on how complex the thing you wanna do. My use case is pretty simple. Behat took me about two days of thinking about it. Again, at nights and weekends to like get to this point. If I was gonna do anything more serious with it, like I'm trying to figure out how to do a spell checker that also semantically figures out if it's the right word. That's a lot more logic and I'm still not even close to that, but yeah, I'm working on it. What time are we supposed to be out of here? Sorry. 115? Oh, I was gonna say, wow. Well, that puts us a time then, so we can get to our next thing and take a drink of water before the next thing comes up here. So, any other questions? Probably a lot of them. make.wordpress.org. That is the community for WordPress. That is where all of core and marketing and that's the team that I help run and TV and CLI and all of the other parts of the community live. So you can go there and join the community, join the Slack. But there's an awesome Slack that everybody that makes WordPress is in and it's just make.wordpress.org slash chat, slash chat, because we might not chat, CHAT. Make, here I'll just type it. Make. Yeah. Make.wordpress.word slash chat. That, oh no. That's a different thing. That's a different thing altogether. That's a WP shoot. WP shoot is an extension I wrote for WP CLI to explain how WP CLI works that just counts and puts in a loop. So if I stop it, that went through that 862,000 times in the time it took me to go to stop. That's how fast PHP 7 is. But that's not here or there. Anyway, that's it. Thank you.