All right, thank you very much. Hello, everyone. Thank you for being here today. I'm sorry. I said hi. Hi. Hi. Hello, thank you for being here today at this session about KMM, your Swiss Army Knife for Canon modules on Kubernetes. My name is Quentin. I work for Red Hat, and unfortunately, my co-speaker Hirsch Pathak cannot be here today. He wasn't able to travel. But I will cover his section. And indeed, let's get into it. So today, we're going to talk about Canon modules, specifically on Kubernetes. So we'll start with an introduction about what are Canon modules and why we do need them. We are going to talk about the pain points that we might encounter and how we can solve them with the KMM operator. We'll deep dive into the use case that we're going to look at today, which is enabling inter-GPUs in Kubernetes with KMM. And finally, we will have a great demo that will be all live, so that will hopefully work, where we generate images from text using a GPU in Kubernetes that we enable with KMM. So pretty exciting. At the end, we will have some time, hopefully, if I'm not too slow for Q&A. Right, you might start by wondering what are Canon modules and why we do need them in Kubernetes. We're all familiar with what Kubernetes is. If you have big clusters of machines and you have distributed workloads, then I guess you know what Kubernetes is. But what if we have those kind of devices? So what if we have GPUs, some kind of storage solutions in Kubernetes? What if you're using special NICs, special AI accelerators, or maybe distributed file systems, such as Luster? The common point with all these devices and solutions is that they all need a driver. And in the Linux world, a driver is powered by a Canon module. So what is a Canon module, really? It's a piece of C code that extends the functionality of the kernel without having to reboot the system. So the point of a Canon module is that it is modular and that you can load it and unload it at will. The most common use cases for Canon modules are indeed hardware drivers, virtual file systems. And you can also add additional system calls to your system with Canon modules, in fact. What makes them a bit tricky to use is that they have to be built against a very specific kernel version, technically an ABI. But in most cases, you need to rebuild your Canon module each time your kernel changes. And oh, sorry about that. I have no idea what that is. OK. It's stubborn here, isn't it? All good, all good. And yeah, another feature of Canon modules is that they need to be signed for secure boot systems, which means that you have a list of public keys in your system. And your system, if it is secure boot enabled, will only accept kernel modules that are signed with a private key that matches the database of public keys that you have on your BIOS, on your UEFI. All good, so yeah. Basically, for some drivers and some file systems, we do need drivers. Ideally, those drivers should be present in your kernel and should be contributed upstream. The problem is that it's actually quite long for hardware vendor or for a file system writer to actually contribute that Canon module into upstream. You will go back and forth on the reviews. You have certain standards to match whenever you're contributing code into the kernel. So it ends up being a lengthy process. It's not only about contributing that code upstream. We also need to resort to auto-stricken and module sometimes to do A-B testing or to enable the latest and greatest hardware on systems. So upstream is the best solution, but it takes time. Another pain points that another issue that we might run into when using kernel modules is that they're really built against a very specific kernel version. So if any symbol in the kernel changes in the ABI changes, then we have to rebuild the entire kernel modules. And even though we are guaranteed a stable kernel, then we may at some point hit a CVE that will force us to change the ABI. And the last item I have here is those kernel modules not being part of your distribution or not being part of the upstream kernel, there is an issue of deploying actually those kernel modules on the nodes and keeping those kernel modules up to date with the kernels that we're running. In Kubernetes, that is usually difficult because that means that you have to customize your nodes before they go into operation. So the real question is here, what if there was a cloud native way of bringing those kernel modules on the nodes that are powering our Kubernetes cluster? Instead of relying on autobend management for those kernel modules, we would like to have something that is well integrated into Kubernetes and that allows us to manage the lifecycle of those Kmods. And for that, we actually developed KMM kernel module management. So what is the kernel module management operator? It's something that we wrote to bring a standard consumption model for kernel modules on Kubernetes. Instead of everybody, every hardware vendor out there, every CSI writer reinventing the wheel over and over to deploy those kernel modules, we thought that we should have a common solution here. Kernel module management is a signal project. We work with the signal in Kubernetes. It's an operator that builds, signs, and loads your kernel modules on your Kubernetes nodes. So what the operator does is that it monitors all the kernels running in your cluster and loads the right kernel module versions on the right nodes. It doesn't only load your kernel modules, it can also run your device plug-in. And if you're a hardware vendor, that's, in general, very useful. So how do we make those kernel modules, which are really KO files, simple binary files? How do we make them cloud-native? And how do we integrate them into the workflow of Kubernetes? Well, we actually wrap them inside container images. So within a standard container image, we actually put the KO files in a very well-specified file system tree. And that is how we actually deploy the K-mods on all the nodes. So those K-mod images are really the vehicle that we use to bring those K-mods to the nodes. The good thing about this, because container images are file system, then one image can contain the K-mods for several kernels. So with only one image, you can address several kernel versions at once. And I will go into the details later. In addition to K-mod images, which is something that either the user or the hardware vendor or the CSI vendor packages, the kernel module management project brings the module CRD. So I don't know how many of you are familiar with Kubernetes, but a CRD is pretty much an object in the cluster that you use to configure certain aspects of the cluster. In our case, we map kernel versions running in the cluster with the name of a certain K-mod image. And that is how we say that with that kernel, go those kernel modules. And this is how we actually load certain K-mods on certain nodes. You can actually, I will show you an example module resource later, but you can specify those kernel versions you're compatible with either with literal strings or regular expressions. Like I said, you can accommodate many distros at once. And within that module CRD, you actually specify if you want to build your K-mods for certain kernel versions or not. So this is how really you express the desired state of your kernel modules in the cluster. The reconciliation loop is as follows. KMM determines that a certain node needs some K-mod. It actually checks if the image that we configured for those K-mod exists. If it does not, and we enable in cluster builds, then we are going to build the K-mods and build that image that contains the kernel modules. If the secure boot image, which is the same image, but with signed K-mods instead, if that doesn't exist, then we are going to reuse the image we built and sign the K-mod instead. And finally, we are going to run to load that K-mod and load the firmware files that our kernel module might need. So in a sense, this is what the reconciliation loop looks like. All right, so what I have here is really the simplest module CR that we could have. Like I said, I really stripped it down to have the interesting bits here. The interesting bits, in my opinion, are the kernel mappings. So you can see that within just one module resource, you can actually address many kernels. And let's have a look at them. Do I have, I do have a pointer here. Yeah, this is working. All right, let's have a look at the first item here. This literal thing, I mean, literal field here is pretty much saying that for this Fedora 37 kernel we actually want to download that image, extract it on the node and load the appropriate K-mods that are stored into that image. If we also have any other Fedora 37 kernel, then we're actually going to use another container image here. Container image being the name of a K-mod image that contains all the kernel modules and drivers that we need. Finally, we have a selector here that allows us to target only a subset of nodes if we don't want to load that kernel module on all nodes of our cluster. In the previous example, I omitted how, I omitted the build section of the module. This is what it would look like. This build is something that you can configure for some kernels only or for all kernels in your module resource. What it basically does is that it references a Docker file that the user would have to put. And then, like I said, it works as follows. The operator would have a look at all the kernels available in the cluster. If one of the, if, you know, for each kernel that is in the cluster, if the corresponding image doesn't exist, then it would use that Docker file here, create a pod that will build the Kmod image. And then, you know, that pod would build the Kmod image with all the Kmods inside. And it would then be deployed to all the nodes that need it. We, I also have the same for signing. Signing would be, you know, like I said, signing the KO files to be compatible with secure bot. It's also an optional section within the CRD. And you would specify here all the modules, you know, the KO files that KMM needs to sign. I will not go into the details. What's important to remember here is that the user provides the keys as Kubernetes secrets. And finally, I have here a diagram that shows how the whole thing would work. So let's consider here a cluster with six nodes. Six nodes, I'm sorry. Six nodes, and actually three different kernel versions. We have kernel one, two, three, that's running on nodes zero, one, and three. We have kernel four, five, six, which is running on nodes two and five. And finally, we have kernel seven, eight, nine. And let's consider an example where in our module resource, we actually configure only two mappings. One is for kernel one, two, three, and one is for kernel four, five, six. So this node will be excluded because let's say that we don't know how to build the Kmod for it. Okay, at the very center of this whole diagram, we have the operator. The operator, like I said, is watching various resources in the cluster. One of those resources is the module. The other one is the nodes. So it's building this internal map of what kernels are running in my cluster and what modules do I have configured. We are considering a module that has integrated build and integrated build sections. So we have to read the Docker file to determine how we need to build the Kmods. And once we have done that, we are actually going to create the build or the signing part depending on what we have to do. All right, and once we have done that, then we have built all the kernel modules that we need. We have built the Kmod image, which is the vehicle for those Kmods. Oh, I believe I need to speed up a bit.  So this is how it works. We are going to deploy all those spots here for kernel one, two, three, or same parts for kernel four, five, six. For node four here, we are not going to do anything. And finally, once we have the kernel module loaded on all the nodes, then we can run the device plugin, which is actually going to communicate with the kernel module inside the node and to expose the kernel module or any special resource it powers to the API server, which makes the whole thing consumable by applications. And one thing that is new in version 2.0 of KM that was just released actually yesterday is that whenever we have loaded the Kmod, then the pods that are loading the module are actually disappearing. And on the nodes, we do still have the Kmod loaded, but the loading pods are not there anymore, which saves a lot of resources. I'm not going to go, I don't have time to go into all the features that KM provides, but something really helpful is that we are labeling the nodes whenever, wherever we have loaded the kernel module. So this is, I believe quite useful. We also copy the firmware files from the Kmod image. So the same vehicle for the Kmods, we copy that on the node so that whenever you load your kernel module, you might be able to, your Kmod is able to load the firmware files it needs. And then we have, yeah, like I said, we have a lot of features and I can go into details in the Q&A if needed. Right, right. I think that that's it for the features. I will not talk about the use case from Intel. Intel has been one of the early adopters of KMM for their dedicated GPU products in the data center. And I will explain, you know, like what's their problem statement and how they solve it with KMM. It pretty much boils down to the pain points that I was explaining earlier. So the thing is, there is, so far there was no scalable and you know, standard approach of loading the Kmods on Kubernetes. So whenever they release that great GPU that they, the flex series that they have, there was no standard way of loading the appropriate drivers on Kubernetes. So it's not only really about the GPUs but pretty much any XPU, any accelerator that you have out there. Like I said, the journey to upstream is very long. There is a lag in downstream and I'm not even talking about the Kmod being available on OS distributions because each distribution does what they want with whatever version that they want to include. So it's quite hard to operate for an end user. The goal for them is to shift left, you know, to have things available as early as possible to be ready on day one whenever they actually release the product. And so I think, I believe the key point here is that KMM makes it easier for hardware vendors such as Intel to accelerate the time to market. So you can, you know, as soon as you release the device then you can make the driver available to the users and loaded dynamically on Kubernetes with KMM. Another use case that they have, and this is due to the very architecture of KMM, is that because the operator watches all the kernels that we have in the cluster, it's very easy to rebuild the drivers and the Kmod image whenever we have a new kernel available in the cluster or it's also very easy to deploy a new module resource in the cluster to try a new version of the driver. And thanks to that very feature, they were actually able to deploy an in-house pipeline where they create their module resources and they add new nodes with the new kernels so that they pre-build actually each version, for each new version of their driver they actually pre-build the corresponding Kmod image. And so they don't have really to hand out a module resource with the build instructions enabled as YAML, they can actually just give the module resource with static kernel mappings pointing to images that already exist. And so that makes downloading those images faster and you don't need to build locally, in a sense. Yeah, I think that's it. So let's have a look at the demo now. So hopefully it works. Like I said, it's all live so I'm crossing fingers a little bit here. So for this demo, what we do have is a single-done mini-cube cluster so it's effectively a Kubernetes cluster but only one node. It's really the latest and greatest CPU from Intel but what's interesting for us is this GPU Flex 170 on their dev cloud. So it's really the latest GPU driver for which there is no introversion. So what we are going to do here is that we are going to create a Jupyter pod with all the runtime libraries that we need. So that's OpenVeno, which is an AI toolkit from Intel. In that pod, we also have installed the runtime libraries that you need to be able to use the GPU. And that pod has 20 cores and 64 gigabytes of RAM which is already plenty. In this demo, we are going to build the driver and load it with KMM. And finally, I will show you a notebook, a Jupyter notebook that runs stable diffusion to generate images. The demo code is available on GitHub here if you download the slides, you can click that. Okay, let's have a look. So I'm connected to the machine here. Let's have a look at, is that visible to everybody? Yeah, it's not too small. Okay, we do not have any pod running. So let me create the Jupyter pod. Okay, so don't pay attention to all the other resources. I'm fixing things with Minikube. Okay, so what I'm going to do now is I'm going to connect to the Jupyter notebook. Password is OSS, that's really creative. Okay, it is loading. No thanks, no thanks. And I'm going to open the OSS notebook here. Yes, that's the one. Okay, let's have a look. Let's run the whole thing. So let's run it step by step. So that's the height and the width of the image that we're going to generate. We are going to download a pre-trained model from Huggingface. So this is a model that's already compatible with Intel OpenVINO. Okay, this should download the, ah, all right. All right, we're done here. What we are going to do is we are going to list all the devices that are available to us for inference. I have not loaded anything. I have not loaded my module resource. So it should only show, yeah, it shows nothing. I915 is, oh, sorry. I should probably put the presentation mode. Yeah, it makes things a little bigger. I915 would be the name of the Intel kernel module or the Intel driver for their GPU. We use LSMOD to load, to list all the kernel modules loaded on the node. It returns empty. There is no Intel driver available. Okay, and you know, OpenVINO, the Intel toolkit for AI does return only CPU as an available device. So this is what we expect. Okay, yeah. Like I said, this dropdown has only one option. We are going to compile for CPU then because that's the only thing that we can use. And we are going to try and generate still some images, see how long it takes. Okay, so we are now finally generating the image. You can see that it's very long, actually. We have 20 CPU cores, the latest CPU available. It's still pretty long. It's going to take one and a half minutes to generate the image. I think that's really too long. I would actually kill it and reduce the number of steps here, maybe to 20. You know, the image will be ugly, but at least we will get something. Still it's going to take some 30 seconds, 25 seconds. And we all know that GPUs are made for AI if you try to do it on CPU. Even if it's the fastest CPU, it takes a long time. I still want to show you that it works, but it takes a very long time indeed. So right now we are generating an image of the Tokyo Tower at sunset with stable diffusion. Yeah, pretty good, but quite long to generate, right? And with some artifacts. So this is all blurry here, and that is actually due to the fact that we reduced the number of inference steps to 20 from 50. Okay, so this is pretty disappointing. This is quite slow, so let's actually load the kernel module. So what I'm going to do now, what I'm doing here is I am actually creating the module resource. I wanted to show you all the parts that are running. Okay, so this is the Jupyter part that I was connecting to, and we actually created, oops, sorry. We created exactly that resource, which should be familiar. It pretty much looks like the simplest module that I was showing you earlier. It has only one kernel mapping. This is an Ubuntu machine, so we are matching this very kernel here, and we are telling KMM to build using a certain config map that is available in the cluster, and this contains all the build instructions for our kernel module. So what KMM did is that it read this module as soon as it was created in the cluster, and it tried to fetch that image here that didn't exist, so what it's doing now is that it's actually building it. Let's have a look at the build log. Okay, so you can see that we actually here, if you've already compiled kernel modules, this should look familiar. We actually compiled all the components of the kernel module. We are now adding the firmware into the image. This is a fast machine, so it's only taking a couple of minutes to download everything and prepare the Kmod image. What we are doing now is, yeah, we are just running depth mode, which is an essential step, and yeah, we are preparing basically the Kmod image. We are going to push it to Quay.io, and once we are done, then the image will be available to KMM. So then what KMM is going to do is that it's going to create a worker pod, a certain pod that is going to download that image, extract it in its file system, and then use ModProb to load into the system the modules that it contains. This step here takes maybe some 10 to 20 seconds. Right, right, right, right. So you can see that we actually pushed the image to Quay.io. As soon as the image was available, then we had this worker pod running. Now it's going to download that image, extract it, and terminate already. Okay, so we built the image, pushed it, downloaded it on the worker pod, and hopefully loaded the kernel module. Let's go back to our Jupyter Notebook. We are going to run all the steps again. Actually, I believe I need to restart the, you know what, I will run until here, exactly. So I'm going to restart the kernel of the Jupyter Notebook, and run until that very step here. Okay, and you can see that the output changed here. So instead of empty, we have quite a number of kernel modules, and these are the kernel modules that our worker pod loaded after downloading the image. Okay, so now OpenVINO reports that the GPU is available, which is great. I'm going to go step by step again. Okay, GPU here. We need to recompile the pipeline, which should be pretty fast, right? We need to recompile it for GPU. Okay, this is, like I said, this is pretty fast, and we can now generate the images. So we don't want an image of that quality here. Let's switch back to 50. So you remember that it took maybe some 30 seconds with GPU, so now we are using the GPU, and it's actually much faster, right? It generates an image of a much better, much higher quality in just 12 seconds. And you will be able to judge by yourselves. It is much less blurry. I mean, okay, the Tokyo Tower is maybe a bit oversized compared to all the other buildings in Tokyo, but I think the next one will be a lot more realistic. For this one, we are generating an image of a temple in Japan at full. And let's see, again, it's really much faster compared to CPU in 12 seconds. Only you have an image like this, which is pretty believable if you ask me. I kind of like it. And finally, I mean, we have to have Fuji Sun here. So right now we are generating an image of a lake and Mount Fuji, again, the same settings, the same image size, and 50 steps for inference. And here it is. I think it's pretty good. However, I'm not sure what is this mountain here, but don't ask me. The rest is pretty good, I think. I still have some, I don't really have some minutes. I would show you that if we delete the resource, we can actually unload the kernel module from the node, which is useful if you want to unload a certain version and load a newer version of the driver. But you'll have to trust me on this, it works. All right, going back to the slides. Is this working? I wanted to say a few words about kernel module management on OpenShift. We actually have a special version, I mean, a dedicated version of KMM on OpenShift. It has all the good features of the upstream version plus much better security. It actually supports the security constraints, objects of Red Hat OpenShift, which really makes it an enterprise product. We also solved a fairly difficult problem, which is how do we get all the libraries, the headers, the compilers required to build the Kmod for a certain version. So we actually have that with Driver Toolkit, which is a component of OpenShift. It's a base image for the kernel version that ships with your OpenShift, and it contains everything that you need to build a driver. It's really great. Finally, OpenShift ships with an in-cluster registry, which is an image registry in your cluster, and it's really useful if you want to run in-cluster builds, which you often do. It has, obviously it's compatible with all the other OpenShift enterprise features, that the CA management, the proxy, the registry settings, it's all integrated in the downstream edition of KMM. Wrapping up, KMM is indeed a Kubernetes operator that loads kernel modules on Node. We actually tried to make it the standard consumption model for Kmods on Kubernetes. It can build your Kmod. It can sign them if you want to use secure boot. And with our flexible API, you can actually target multiple apologies. Trying to sync my agenda. I don't know why. The flexible API that we have in the module CRD makes it easy for you to target multiple kernels and even multiple distros at once. So if you're a hardware vendor, you could just craft a module resource and provide it to your customers and that whatever distro they're running, you could make it work. Because we label the nodes whenever certain Kmods are loaded, then it makes it very easy to consume nodes that have the kernel module or the driver loaded. KMM is also available on OpenShift with a dedicated version. It has all those nice enterprise features. And like I said, we released version 2.0.0 yesterday, actually, so it's all ready to use. You can reach us on the Kubernetes Slack on that channel. This link will take you to the nice documentation website that we have and the repo is here. And then also a few links about OpenShift. It's all in the OpenShift docs, obviously. We have a dedicated repo for it. And the two links at the bottom are from Intel and the solution that they built on top of KMM to enable their GPUs. I think that's it for me. That's it. Thank you. Any question? So in the session you said, let's say OpenSource version, not OpenShift. The kernel module, if it's not available, is expected to build in the build phase with the provided config map that has the Docker file. But how do you actually manage the Docker file itself? Is it because, how do you detect a new version of the kernel module is provided, or like, I'm not sure what's actually inside of the Docker file itself. Is it on? Yes, it's on, so I can. Okay, so you're asking, let's say I have a new version of the kernel module that I would like to build. Is that what you're asking? Yeah, you were talking about the Linux kernel version and also the device plugin version, which is, I understood, but kernel module also has a different versioning system as well. So if you want to release or adopt, maybe like a, let's say like a Git pull from the main branch, something like that, it has a different lifecycle. Right, right. So yeah, my question is, the building phase itself has a different dependency. So I was asking about the dependency. Okay, okay, so obviously in that slide right here, this is the simplest kernel module. It has many more fields for you to configure. There is most notably a version field that you can add and that will describe the version of your kernel module and you could increment that. And then, yeah, it's all available on our documentation online, but then what it's going to do is it's going to look for nodes that have a specific version label because you would want certain, some of your nodes to run a certain version of the K-mod and some other nodes to run the newer version, for example. Yeah. And then that version field will be made available at the build step. So in your build script or in your build Dockerfile, you could have an if based on that, if version three, if version four. Yeah. You know what I mean. Yeah. Exactly. Thank you. Also, how do you care about the build cache? Yeah, the build. So you adopted KaniCo, right? The upstream version uses just KaniCo. Plain KaniCo, we mount the Dockerfile in it. Yeah. KaniCo can integrate with like a container, no, I mean like Amazon S3 or object storage use for their image build cache. There are other like a build kit also. It can use the, like any type of, like it can be object storage or it can be a plain file system. Mm-hmm. Yeah. There are many potentials because building a KaniCo module is not a short time job. It can take some time, depending on the device. Depending on the device. Like for the Intel GPU driver, it took a couple minutes, but it can be much longer, I agree. Yeah. And I'm pretty sure in the realistic use case, people want to utilize the, you know, intermediate cache fail layer. Mm-hmm. I think that that makes a lot of sense. I think, yeah, there are many actually caching options in KaniCo. I don't think we leverage any of those at the moment because to be honest, you don't rebuild the KaniModule that often or at least in the use cases that we've seen. Okay. But let's talk about it. You know, we have a monthly community meeting. If you want to join that and if that's really a concern for you, we would be really happy to talk about it. Okay. Absolutely. Thank you. Any other question? Thank you for the presentation. If my memory is right, the two pods are created after you applied this module, YAML, maybe one is a build of pods and maybe other one is a port-fitch load kernel module. If my memory is right, the port-fitch load kernel module was terminated. Yes. My question is, what happens if the node is rebooted? Will the kernel module be loaded automatically or should we need something manually? Thank you for the question. This is actually very different in the V2 that got released. In V1, we were creating a demon set per kernel version that was running in the system. And that would mean that we would load the kernel module and then the pod would keep running until it's terminated. And whenever the node reboots, then the demon set recreates the pod on the node and reloads the kernel module, blah, blah, blah, you get it. In V2, we actually stored the state in some other resource that I've hidden from you in the demo. But the point is we monitor the ready condition of the node. And there is a timestamp associated to that condition and the short answer is we record the last time we loaded the kernel module and if it's longer than the last time you rebooted your node, then we will create a new worker pod that will reload the kernel module. So the short answer is whenever you reboot the node, yes, we will reload the kernel module. Thank you. Thank you. I think that's it. Yes, we are really past the time. Thank you very much for attending this presentation. I will be available at the red ad booth if you have more questions about KMM upstream or downstream. Thank you all very much.


You should have an introduction with somebody. Hi, I'm David. Hi, thank you. Well, yeah, my name is David Zimmerman. I am an internet marketing consultant. I've been doing marketing consulting for websites, focusing on search marketing for probably about 10 years now. Started my own company four years ago. You can tweet me in reliable acorn. Eventually I'll get back to you. Not that anybody's on Twitter anymore, but I am. I have to admit I don't like the title to my talk. It's so negative. I think what happened was when I was pitching this, I was having a rough week. Because sometimes it feels like I get paid to fight developers.  And they don't want to do it. I delivered an audit, comprehensive audit for a company last year, literally last year. They haven't implemented item number one yet. This is what I do. I fight developers for a living. But I don't want to fight you guys today. Like, I think we're on the same team. The websites we're building or marketing for our clients make a difference in their business. We're not just building something, posting it. We want to do something a little bit better. We know if we can deliver a better product to our clients, it could make the difference between success as a business and failure. We know if we give them a good website, they're going to come back again for another bigger website. And this time they'll actually have a budget. We want a better product. And from my perspective, I want you to give them a website that will last them longer. Because the last thing I want to do is come into your website, crack it open, break it. And then you have to come back in and clean up my mess after me. I am no developer. I don't want your web development business. I don't even want the website maintenance business. I want you guys to do that. And I want you guys to not hate me when I come and say, hey, we have to change this. So everything I'm going to talk about today is from the perspective of companies who build websites for clients so that they can be ready for a productive SEO campaign. Every time I talk about SEO, I feel like I have to stop for a moment and define things. This is because every old fool on their LinkedIn profile says they do SEO. Every CMS promises to be SEO friendly. Every web host promises an every SEO boost. So let's stop for a moment and define SEO. It's really simple. SEO, search engine optimization, is about helping people find what you have to offer. In this case, they're using the search engines to do it. But all we're doing is connecting the person who's looking with what the business has to offer. Now, SEO is not a few things. For instance, SEO is not all web marketing. Even my longest-term clients will say, David, you're our SEO. Will you do our Facebook marketing? Well, OK, I can do your Facebook marketing, but that's not SEO. That's different. I can help you with your email marketing, but that's not SEO. Let's make a distinction between different kinds of marketing that do different things. In this case today, I'm talking about organic search marketing, not paid marketing, not all web marketing. I'm talking about a specific way of marketing website through SEO. Second, SEO is not for everybody. SEO does a great job responding to demand. If someone knows your product or service exists and they're looking for it, SEO might be a good solution for you. If your product is so new to market that no one knows that solution exists, if your product is so unique that no one knows to search for it yet, then SEO might not be the marketing solution for you. Let's be realistic about what search can do. If that's you, congratulations. You're awesome. Hire a PR company. You don't necessarily need SEO. You kind of need SEO, but don't think that's going to create demand for something that people don't know to look for yet. SEO is not trying to trick Google. No, it's not. Stop wasting your client's time trying to figure out what this week's secret is. And if you can just get the secret this week, you will dominate number one bologna. There are certain basic things behind SEO that if you do, you're going to outlast the fool who's chasing whatever is cool and hip this week rather than doing the good, best practices that will last. Don't get distracted. Don't waste your client's time chasing after the latest SEO fad or rumor that if you do this with your website and turn around three times real fast, you're ranking number one. No, let's focus on the best practices. And fourth, SEO is not set it and forget it. SEO done well is a long-term campaign and an investment in a website. And it's not just because Google makes 700 algorithm changes a year. Because of the 700 algorithm changes, most people don't notice any of them. It's really because Google likes fresh stuff. And you've got to be maintaining a website and constantly updating it if you want to get there. But there's always more opportunities, right? We can't just do SEO and walk away and call it SEO. Because there's really never ends the number of things we could be doing to help market a website through search. And so let's not pretend that once you do this and you set up a site, I've SEOed it. Congratulations. Bye. That's not SEO. SEO basically comes up to four basic things. First of all, can you measure it? Second of all, can the search engines crawl and index the pages of your site? Third is, what does your website say? And last, who's linking to your site? There you go. That's SEO. That's all we've got to do. Thanks for coming. Have a great afternoon. We're done. But, alas, when we're building websites, we have to consider all four of these items. So let's start at the first one. Now, I know some of you are like, David, I appreciate that SEO was really about measuring. But it's way outside the scope of what people are paying me to do. Your job is not to be their analytics consultant.  I don't even care about analytics. Just don't bother to install it. Right? No. We aren't doing anything unless we're measuring it. And measuring SEO has nothing to do with rank. Well, it has something to do with rank. But I really resent when SEO gets resorted to rank. Anybody can objectively and accurately track rank anyway. Really?  Let's get over rank. Let's go to traffic. But like traffic in and in itself doesn't really matter. We want traffic that becomes business. And if we're not measuring it all the way in, we're not doing a real SEO, well, any marketing campaign for that matter. So the first thing that is painful for me when I inherit a site is that analytics aren't set up. And I'm thinking analytics. I mean, I'm just talking just the free Google Analytics. Like, we shouldn't let a site out of our door without setting up analytics on it. I know your clients, sometimes they don't even care. I know some of your clients won't ever use it. But the fact is they might not want it now. But if you've built a better product for them, they're going to wish they had it later. Do them a favor. Just set it up. It's not hard. I mean, put in Monster Insights. Done. Right? Set it up for them. Bonus points if you can install Tag Manager. Because then, when I'm doing other marketing, I'm not cracking open the template files to insert my codes the next time you try to update, break the site, and you get a call, and they blame you because you built the site and whatever. Let's avoid that. Tag Manager will help. Now, this is a great plugin for Tag Manager. This is one I use best if you hard code Tag Manager in. It's just not ideal, I get it, but it would be better because we don't get full functionality with Tag Manager even with WordPress plugins. So put in Tag Manager, and now it's a bucket. And I, as the marketer, I can add and subtract marketing analytics as I need it. I don't have to bother you. I don't have to break your site. There's all kinds of other things I can do with Tag Manager. If you've taken the time to install it, now you've installed it, I don't have to bug you with a name boring updates. When you've got bigger things to do, you don't hate me. The client benefits. We're all happy, right? Oh, and don't forget Search Console. It's easy. Set it up. You're going to benefit from it, too. Hopefully, you have an arrangement with your clients that when you build the site, you're not just like, there, you have an agreement that you're maintaining it. Analytics Tag Manager or Search Console will help you maintain your client's sites. Second of all, goal. What is this website trying to accomplish? I know sometimes people will call you, they just want to brochure a site. They kind of don't know what they want. They don't have a budget. So you just throw something together. Do your clients justice. Help them think through what they want to accomplish. Are they trying to sell something? Are they trying to get sales leads? Are they trying to inform people what is the purpose and design the site according to what they want to accomplish? Oftentimes, your clients don't know what they want to accomplish. You will build a better product for them if you help them think through that. And you will avoid me having to come and break your beautiful design to help the client accomplish things. Now, I might think this is not an SEO thing. Well, I'm sorry. I'm going to diverge myself for a moment. The Bible says to do this. Yeah. This is probably one of the best books I've ever read on anything web.  Make it obvious. Help the person think through the business, think through what they want to accomplish so that anybody will know exactly what they want you to do on the visit site. Just don't make me think. Read the book if you haven't. But you might say, why is this an SEO issue? This is the latest version of Google's manual review guidelines. If you design websites, you need to read this. In fact, tweet me and I will get you a copy. I went to Kinko as the date was published two months ago and printed it out and read it again. This is the fourth time they've released this. This is as close as we're going to get to understanding the core parts of Google's algorithm. You see, Google right now is driven by machine learning. But in order for the algorithm to be machine learned to decide which websites rank above others, they have to have a data set to pull from. For that data set, Google hires a series of people who manually review search engine results. And they manually read pages to decide, is this page of the highest quality, the lowest quality, or somewhere in between? Wouldn't it be great to know what Google is considering a high quality and a low quality site? Read it, and you will know. When it goes to what it talks about goal, one of the biggest, in order to have a highest quality site according to the manual review guidelines, the best, highest quality sites are the ones that accomplish its own purpose best. A low quality site does not help the user accomplish the purpose of the website. So you, as a designer, need to understand what the purpose of the website is if you want Google to consider the site as a high quality site. This is not that hard of a read, but it's well worth your time. We can't separate, at this point, site design from SEO. So let's make sure when we're designing our sites, the client knows what their goal is, and you design the site as best you can to help accomplish that goal. The first thing that SEO is measuring, the second thing is whether or not Google can crawl and index your site. And this is where we all take a moment and thank God that we're at a WordPress conference where Google has a real easy time with WordPress sites, except if you don't allow them to view your site. This button, you know how much money I've made from audits from well-meaning developers who forgot to uncheck that when they launched the site? Yes. You can prevent me from making money by making sure you are not discouraging search engines from indexing the site. The guideline says it's up to search engines to honor this request. I'll tell you what, Google definitely honors that request. It can be the robots.txt too. I know somebody who accidentally forgot to remove the robots exclusion from the robots.txt to launch the site traffic drops. Oh my gosh, what happened? Oh, oops. I forgot to update the robot. Google listens to that. That's really probably the biggest crawlability problem on the WordPress site because we're still doing server-side language. Google's easily able to understand WordPress. But we have to consider mobile when we're building sites today. This is kind of old news for you, I think most of you. But as of two months ago, Google is at a mobile-first algorithm. So that means when Google is evaluating websites to rank, it is looking at the mobile site first. If you have a poor mobile experience, you will never rank even on a desktop search because Google is coming from a mobile-first perspective. Now, what this means is not just we need responsive websites. What this means is we've got to change the way we think about designing a site. We should build the mobile site first and build up to the desktop site. Usually, we're used to saying, here's the beautiful desktop site and here's the mobile. But if we change the way we think and we take mobile-first and we build up, this will affect a lot of things that will benefit you from a mobile perspective. So start by thinking mobile-first even as you're doing the design. Some of your clients won't get it. Explain it to them. Most traffic from Google, not the vast majority, the majority of traffic from Google is mobile across almost every industry. So don't make mobile an afterthought. Don't take a desktop site, crack it, break it down, and make it mobile. Think mobile-first. Google has a wonderful tool, the mobile-friendly test. Is this page mobile-friendly? Yes or no? Test. Throw this in every URL. This is a URL by URL basis, so you'd have to test what I do when WordPress. I will test an example or two of every page generated by every template file. Just throw it in. Yes or no? Mobile-friendly or not? And if it's not, it'll tell you what the problems are. It's pretty simple. On a more scalable fashion, thankfully, because you've installed Google Search Console, everybody's got, yeah, yeah, yeah. Under search traffic, mobile usability, the accomplished kids got no shoes. I have seven mobile usability errors on my site. That's a little more scalable way of looking at the problem. And it tells you more. On some pages, I have content wider than screen. Some of my clickable elements are too close together. More data. Measure first. Figure out what's better. Second, use these tools to decide whether or not you need to make mobile improvements. While we're talking about mobile, we can't help but talk about speed. As of last month, Google is not only evaluating our mobile site to decide how to even our desktop searches. It is measuring our desktop searches based on the mobile speed of our sites. That's why we should start from a mobile first perspective in design. Because then we are adding stuff for desktop rather than removing stuff for desktop. That will help your sites load faster. According to Google, you get three seconds. That's it. No one's going to, well, not no one. But most people are not going to wait longer than three seconds to view a page. You've got 50 requests in 500 kilobytes per page. Is this the next slide? No, this isn't the next slide. That might mean some things need to be cut. That might not be a bad thing, right? Clients have to have this and have to have that. And this department has to be satisfied. And this division, and God forbid the CEO get involved, we're getting all this up. Let me get back to you in a second. 50 requests, 500 kilobytes per page. That's rough, but it's doable. Because I just took Google's mobile dev certification, which I highly recommend. One of the big points they make in there is that the fastest element loaded is the element you didn't add to your page, right? And sometimes the best thing to do is just say no. Listen, you won't benefit from that extra slider. Ain't nobody waiting for 17 slides of 10,000 pixels. The image is right. Nobody's waiting for you. You can have the most beautiful page, and no one's going to wait to view it. So let's cut things down, make it as fast as possible. Not only for SEO, but for all of our marketing channels, right? Email marketing. Most of email is consumed on your mobile device. If you're called to actions to go to your site, ain't nobody going to wait longer than three seconds for that page to load.  God forbid you paid search, right? It is a worthwhile investment to improve your page speed. Hour by hour, the biggest improvement you can make to any of your marketing efforts is make your site run faster. Google has a wonderful tool, PageSpeed Insights. Again, URL by URL basis. And it will break things down by mobile or desktop speed. Culver's kids got no shoes. Got some work to do on my home page. If we all run our own site, let's admit none of us would. But what I like about this tool is it takes time out of the equation. Time is a function of how good the connections. I got to give gigafiber at home, right? I'm fast. If I judge based on how it feels like things are loading, I'm not getting an objective analysis. This is a score between 0 and 100. I've seen a score of six on time. Yeah. That's where that 17-page slider of 10,000 pixels came from. But it will tell you what you need to do to improve your page. Now, this is a page by page basis. Again, with the WordPress site, I go through a couple examples of every template file and as rendered in review and see how these page speeds go. Thankfully, you've installed Google Analytics. If you go into behavior, site speed suggestions, here is a list of your page speed scores in one nice, friendly place for you to begin to improve. Nice. Now it's a little more scalable program. The nice thing about this process of pulling this report is now my contact page here is the worst. 77 isn't too bad, but I'm just saying it's not too bad because I'm speaking to you guys about page speed. I need to work on it. But I bet you if I improve the 77 on my contact page, I will accidentally improve all the other pages. Just how things work, right? Start at the bottom, work your way up. I was working really hard this week to finish off my re-certification. It expired on Monday, but I wanted to get it all done for you guys. I tell you, Google's Academy has a lot of great stuff. And their mobile site certification, oh man, I am not a real developer. You guys will get so much more out of it than I did. It is well worth your time. They spend so much time talking about page speed improvements and what you can do. Talk about how to use Chrome developer tools to really track where your problems are. Worth your time if you're building sites. So I highly recommend it. Talking about crawlability and index, make sure your site can be updated.  We all know, if we can't update WordPress, we're leaving big security holes. And Google will kick websites out of the index if they believe they've been hacked. And the process of being reinstated is not fun. It is actually, I think it's harder than when you get banned for doing bad SEO. Google has recently started hiring an entire team just to manage reconsideration requests from hacked websites. So please make sure your sites can be updated, right? Maybe that means you don't use WordPress. I say that out loud, I mean, I love WordPress, but it might not be the solution if your client has to have certain things, certain ways and you end up cracking open WordPress to such a point you can't be updated. So that might be a better solution for them. Or maybe they just need to realize that what they're asking is totally not worth it, which is probably most of the time the case. But yeah, can't do SEO on a hacked website. So SEO, measuring, crawling, indexable. It's also about the content. Now, I could talk for many hours about what to write on your site, but we're here, I wanna talk to you as developers. And some of you, the content on the site is kind of way outside the scope of what you do when you deliver a site. So we're not gonna talk about what words to use, blah, blah, blah, blah, blah, but there are some elements on how you design a WordPress site that relate to content that we need to consider. And the first one is just the existence of words, right? I know we all like pretty pictures. I do too. But Google ultimately is about the words. And we have to put words on the page if we expect to get traffic from Google. Google doesn't know what the picture of the lawnmower on your page means. Does it mean you sell lawnmowers? Does it mean you mow lawns? Does it mean that you repair lawnmowers? Does it mean that you are filing a clash action lawsuit against Troy Bilt because of their lawnmower? The picture does not tell 1,000 words. It says whatever the person thinks it means, you need words on the page to reassure your visitors that they have reached the proper page. The Bible says so, so do it. Now, I mean, one of his points he makes is that pages, words alone, I mean, sorry, images alone do not convey the intent of a page. Even if we're not talking about SEO, you need words on your page. Now, what that means for us who are building websites is we need to accommodate for the existence of words on the page. Make sure in your design, there is enough space for no less than 500 words. And it's bare minimum. I do more than 1,000 words on a page, ideally. But the good news is it doesn't have to be one big block of 1,000 words. Break it up, make it look good. You don't have to have one big vomit of 1,000 words. But you need that much content if you wanna be competitive in the Google. So, while we're talking about words, we have to talk about duplicate content. And true confession time, I have used a duplicate content threat against developers, maybe like you, to strike the fear of God in you so you finally do what I'm asking you to do. I'm so sorry, I lied to you, right? There is not a duplicate content penalty. But when Google sees the same content repeated on every archive page by date, the date page, the month page, the year page, every category to which you've added that blog post is also has a complete copy of the blog post. Every tag that you added, now you've multiplied the content a million times on your site. And when now, Google has to decide which of these pages does it wanna serve up? I don't want Google to decide. I want Google, I wanna tell Google which page to do. Because I know I want them to go to the main blog post page. So, this involves how we deploy WordPress, right? There you go, there's the function, the excerpt. Make sure you use that on all your loop pages so that we don't see the entirety of the blog post in every, I mean, don't even get me started. Like, I had to cut this talk down from five hours to 45 minutes because I wanted to talk about everything but I couldn't.  That's the stupidest piece of advice I've ever heard. Thank you. So, like, but I'm not going there.  Now, if you aren't able to change the theme, maybe you're downloading a theme someone's paid for, then you can go into every individual post and use the more tag and it'll only show that on the archive pages. Once you do that a few hundred times in all your blog posts, you'll want a new theme and you'll want the excerpt in your loop. But you can work around the inability of things. While we're talking about content, let's talk about schema. Schema is simply a way to encode things using HTML, some JSON too sometimes, so that Google understands the intent of what this page is about. And there's at least three forms of schema that every website can have. There's the organization schema. Who's behind the site? There's the website schema. Believe it or not, there's a schema to tell Google that this is a website, right? It's not a PDF, it's not a video. It's a website. Just to be clear, Google, this is a website. Hey, it's free, it's easy, add it. Breadcrumb markup. Real easy to add, especially is, ghost. You will have to do a couple changes to your template files in order to include breadcrumb markup using the ghost method. Which is great, but ghost also adds website and organization schema to your site. So it's, everybody likes ghost because they like the little red, green, yellow, whatever, I don't even care about that. I think ghost is good just to use for the schema. There's a couple little extra steps you have to take, but there's really no extra development work just to get some basic schema. Let me get back to you. Google has the structured data tool, which is amazing because what you can do is you can put a website in here, a webpage in there, and it will read all the schema, and if there are any warnings or errors, it'll tell you what this is. The best part about this is you can just copy and paste HTML here. You don't even have to have the page live, and it will tell you if it's valid. Now, there's all kinds of other schemas to put that are worthwhile, a little extra effort, but worthwhile. Local business schema. You've got some numbers and phone numbers, addresses on your site. The local business schema tells Google, this is an address. This is a phone number. This is the name of my company. This is where we are. Little extra work, but you can even throw it in with JSON and it's done. You can do, what's some other schemas that we like to use, article schema. Every blog, it's not that hard within the post file template to go and update the post so Google understands that this is an actual article as opposed to a landing page or something else. And Google actually says they will give you a benefit. They rarely say it, they say there's a benefit for using article markup. Do it, just while you're building it, throw it in there. This tool will help you get there. Review schema. It's a great schema to add. Warning, Google is actively cracking down on people abusing review schema. So if you are selling a service, don't use product schema. If you are selling a product, don't use business review schema. There are also other guidelines that Google explicitly states that you need to follow when adding review schema to your site. You have to have a form on the page that displays the review schema to take in reviews. You have to display all reviews taken in by that form, good or bad. If you don't, you will get a nasty gram. Thankfully, you'll know you got the nasty gram because you've installed Google Search Console and that's where you'll receive it, saying you are in violation and you need to remove it. That's the nicest nasty gram you'll get from Google. Just remove it, you'll be fine. But listen guys, Google, SEO is not about tricking Google. Get over it, let's just do it right. Another scalable way since you've installed Google Search Console is you can go under Search Appearance Structure Data and you can see your site-wide all the schema Google's finding on your site. Every WordPress site known to man has this top line validation error. Who cares, doesn't matter, just ignore it. I've actually tried to solve it. Now it's back for some reason, not worth my time to figure out. But the important thing is in my case, organization schema, local business, breadcrumb article. We've got two different kinds of breadcrumb, awesome. I didn't even know I'd do that. Anyway, point is this is a little more scalable way to make sure your schema is installed properly. Last thing about content, eat. Expertise, authority and trust. We first encountered eat again in the manual review guidelines. If you wanna read about what makes a website have expertise, authority and trust, there you go. Happy to give it to you, just ask, I'll give you a copy. But basically help your clients know what makes their website different. I know you guys pick good clients, good businesses. Help them brag a little bit. They don't wanna brag about themselves, but help them. Incorporate their certifications. Incorporate testimonials and reviews. Incorporate where they went to school. Incorporate the conferences that they participate in. What makes these companies have expertise, authority and trust, build it in to their site. They will benefit from it. So SEO, all we're talking about. Can you measure it? Can Google crawl and index it? What does the content say? Finally, the most important ranking factor is links. What's my time? We're good, okay. So this is where I get to wax eloquent for a moment. Here, what makes Google better than, remember Alta Vista, right? Is that Larry and Sergey had a bad high school experience. As nerds, they were probably pretty conscious of the fact that they weren't the most popular kids in their high school. And they took what they learned about what makes someone popular in high school and they made a search engine with it. What makes the kid in high school most popular? Is it that he says he's popular? No, that's probably actually opposite, right? Before Google, it was the website, you said, ooh, I'm the most popular, I'm the most popular. That made that the best website. But Google, Larry and Sergey said, no, no. It's not what they say about themselves. It's what everybody else says about you, right? Another analogy I like to use is you go into a room and they're full of plumbers. Which is the best plumber? Is it the guy that has plumbing on his hat, on his shirt, on his business card, on his truck? Or is it the guy that everybody says, he's the best plumber, right? This is what links do to help a website rank in Google. This is what made Google different. It makes Google by far market leader. Now, link building could again be a whole really long topic. But we're talking about developing websites and what we do with links. This may be outside your scope because you're probably not responsible for what other websites say about your clients' websites. But how you build your URLs will affect links. Sometimes I'll get a site and there'll be a complete redesign, rebuild, and every URL is different. Great. Now, all the new URLs have no credibility because nobody's going and saying, that's the best webpage on that. When you launch a website, please. Please! Don't forget to install the 301 redirects, right? A 301 redirect says to Google, hey, I know the page was here, it's here now. Thanks. And Google will pass the link credit from the old page to the new page. If you use a 302, no authority gets passed. The user still gets to the page, but the link credit does not. Make sure it's a 301 header redirect. If the page resolves to a 404, all credit evaporates. So, please, when you launch a new website, ideally you keep all the URLs the same. I have worked really hard on some websites just to make sure the URLs don't change. Sometimes you can't avoid it. So just be sure you install 301 redirects for every old page to the new page. Yes, it's paying the butt. Yes, it's really difficult, but it is the number one source of traffic decline after a new website launch I've ever seen. Typically. Sorry, number two, number one is I turned off robots. And that's clearly number one. Number two is no redirects. So, please take time. I'm happy to help you through that. There's some tools that you can use to help, but it needs to be done. Canonical URLs. Again, this is a moment where we all thank God we're working with WordPress. This is really pretty easy with WordPress, but the idea here is that some sites add parameters to URLs in order to, for instance, sort items on the page or sort different pages or render the same page. Point is if one piece of content can be seen from different URLs, we have a canonical problem. We need to do, with the solution for this is a canonical tag that is inserted inside the HTML that says to Google, we know you're on the sort by price page, but the real version of this page is this product category, okay? So you have to take a little extra step to add the canonical tag to the page so Google can decide, again, sorry, we don't want Google to decide which is the right page. We want to tell Google what is the right page. And that's where Yoast is awesome because if you install Yoast, it'll do the canonical tags right for you. I have seen some WordPress sites hacked so badly Yoast for some reason couldn't put the canonical tags on the page, but most of the time Yoast just adds them for you. Again, another benefit of Yoast outside of the red yellow green, who cares? But yeah, so that's SEO. It's really not that complicated, guys. It's measured crawl, content, and links. But remember, this is just the beginning of SEO, right? We are not delivering SEO'd sites to clients just because we built them, even we use all these best practices. There's a lot more to it that we have to engage in, but if you help me by installing some of these things, not only will your client benefit from the marketing efforts more quickly because I'm not spending the first three months going backwards, but you won't hate me for breaking your website by trying to fix these things. Now, I've talked about a lot of the tools here. I was trying to figure out an easy way to give you these tools. I have a little audit on my site. This will just literally send you a list of all these tools if you want to look at it. Even Luke's contributed a tool to this little audit. Yeah, I won't narc him out. I promised I wouldn't narc him out. So that's SEO and developing websites for SEO friendliness. Now is a great time to offer some questions. Criticisms, you want to vent at me for being for that guy who just totally decided, yeah, that's the question. Yeah, right. So the trick with Google search, okay, you're asking about the reliability of data for a Google search console. And I notice I use the old version of Google search console. The new version is getting better every day, but it doesn't have nearly the data. I use the old version still. Google search console's data is really only accurate if you're using the canonical version of your site. So if your site redirects to triple W, that's the version of your URL you should use in Google search console. If you converted your SSL certificate, and now you're running HTTPS, you need to revalidate with the HTTPS version of your page. You've got to do that. Well, we'll get to the secured sites in a second. I'm sure, I'm sure. But the data there is going to be the best data you can get of how Google understands your site. Sometimes it says some weird things, and I try not to panic. Like the 404 errors is one of the best pieces of that. Google is encountering a 404 error on your site. We now know the implications of a 404. Any link juice doesn't get passed. That means our link is harder. Sometimes Google comes up with these crazy 404 errors. Like what the heck, man, where'd you get that? They're actually going way back in their archives from 20 versions of the site ago and saying, I wonder if this page still exists, right? Is that a 301? Fixed. Right? No, 301. 301 it. In case there's, because Google for some reason thinks that page exists, so you want to get Google to the right page, and you want to get any credit of any links that might be to that page. So don't just know index a 404 page, even if it's incorrect. I've found also 404 errors in Google Search Console are often one of the easiest ways to find out your website's been hacked. Right? Go into Search Console, look for Louis Vuitton handbags, and yep, there it is, a little viagra in Cialis sometimes too. Yeah, that's another benefit. Looking for ranking and impressions and clicks, I find very helpful. In fact, that's the only place I trust for rank. But that's because I don't have a lot of confidence in any ranking tool. Ranking, I don't want to get on a soapbox about ranking tools, but there's a reason why Google gives a rank average of 3.6. Because you never rank three, and you never rank four consistently, you're moving around, and the best estimate Google can give you is 3.6. So that's more accurate than authority labs or Moz, because you don't really rank four ever frequently. You're gonna rank an average. It's also based on actual searches. So if no one's searching on a term, Google won't have data for that term. So that's another reason I like to use it, is because that's the realistic check of the CEO who is playing the, what about this word game? And what about that word? And I thought about this word today, and I'm gonna think about this word, and nobody's looking for those words, dude. And just get away from thinking about what about this word game, and do stuff that actually matters, rather than, oh, my buddy ranks for this term. Well, great, good for him. Congratulations, I bet he's not getting anything for it, but whatever, he feels better, great. What else, yeah. All pages, all pages that you wanna rank in Google. Some pages are probably less important than others, right? You don't really care if your privacy policy ranks, but your privacy policy is probably one of your longest pages on your site, right? You need a privacy policy. But yeah, I would know less than 500, please, yeah. Yeah, sorry, you had one, thank you for waiting for me, yeah. Yeah. Right, so it's hard to draw a broad stroke here, and we're starting to see how one hand at Google doesn't know what the other hand is doing, often times, there's all kinds of friction within Google. For instance, Google used to say, add schema using Google Tag Manager. And then recently, Google searched, this structured data testing tool wasn't able to see the structured data you added using Google Tag Manager. And then finally, Google said, nope, don't use Tag Manager to install schema anymore. So it's like such a big company at this point, no one knows who we're talking about. So I wouldn't know what to say about who's right or wrong. In my experience, that weird one that all WordPress sites have, an error, what is it, do you remember? Ignore that, that totally doesn't matter, right? I wouldn't worry about that at all. If you are really, really bored and your client has really, really deep pockets and really wants to pay you to fix that, fine, man, fix it. It won't help, but fix it, it won't help you. I've also noticed that Google tends to be pretty forgiving with schema. I forget which one, but I think an error means, eh, not best practice. A warning means, nah, it's wrong. So it's okay to have an error. If you have a warning, that's what you need to fix. So I think it's a local business schema suggests you have an average price. I don't wanna put a price on my site. And so I get an error saying you need to put price. I'm not putting that on my site, sorry. No, if it's an error, it's fine. If it's the warning, it's the problem because then, but I've seen schema rendered by Google that had warnings too. And that's just because sometimes this tool, whoever developed that tool in their 20% time or whatever, at Google isn't talking to the search quality team and the search engine is able to better understand it than even the tool. So I would use the tools at your disposal to troubleshoot and get as much together as you can. But if for some reason you can't fix a warning, okay, then it's better to have it on there with an error. And sometimes Google's actually able to pick it up. So I wouldn't remove it unless it was incorrect for some reason. Yeah. Yeah. So yeah, I get it. This is the fight I have on a daily basis, right?  But if you're not being paid for the marketing, here's the rope, hang yourself. I mean, I would almost rather them do that than giving them access to change the code and make it worse, right? And I mean, a friendly warning to say that, hey, you know, this could be seriously affecting the way your pages load, which is forget about if it's a Google ranking factor not people's gonna be frustrated. You might know more data about those people but you're gonna have less people waiting to start to load to even see them. So I think a friendly reminder of, hey, add all you want, but remember, we can't add everything. But I think you would be happier knowing that they wouldn't be able to be cracking your code and breaking your site and not bothering you with annoying requests to add this code and what if it's installed wrong and we're gonna do it again and we're not moving that, we're not doing that one anymore. So now remove it and replace it with this one and that's annoying. So let them have tag manager. And yeah, you're giving them a rope and they may hang themselves with it but hopefully the marketing team's smart enough to understand the implications of this and unfortunately, sometimes they're not. Yeah, yeah, yeah. We weren't selling you a tarp first. And I don't know if you can see, but not quite. And they only have one yard. But they were like this, you know, the city and come see our yard in this city but none of the, none of the cities were actually where they were. Yeah. This seems like a really bad idea. It does. It doesn't seem like a good thing. And the guy was like, no, this is what we do. And I was like, I feel like this is what people did 10 years ago and it's probably frowned upon now. And the guy was like, no, no, no, we're doing this. I was like, this is gonna take me a week to do this. He's like, no, no, just do it. It's like. Yeah, sorry, I'm so sorry, you know. Let me apologize on behalf of crappy marketing agencies with really bad out of date playbooks. But duplicate content, and we didn't, like I said, I didn't wanna get into how to write content for websites in this talk and really focusing on development. But yeah, I mean, duplicate content applies to, like the rule I always say is, because naturally when I say, we need to have more words. They say, great, how unique does it have to be? And the answer is, if you have to ask, it's not enough. Right, if you have to ask, it's not enough. And I mean, Google's not dumb, right? They're figuring this out. So yeah, that's a really, really bad idea. At the best case, Google's just gonna say, why do I wanna serve this site up?  At the best case. I was like, I'm excited. Now, as a strategy, adding more content to a site tends to be very, very effective. And if there's only one thing I can do with the site outside of some of these technical things, is keep adding more content to a site, as long as it is able to do it in a scalable, unique way. Yes, that's just cutting corners. That's the strategy of trying to trick Google. Yeah, that's a pretty good one. Yeah, well, Google's not gonna serve it up. No one's gonna find it. Don't worry about it.  What are some other questions? Anybody have any other questions? Yeah, I'm sorry, content in an iframe? Yeah, Google does not like content in iframes. You can't track content in iframes through Google Analytics because Google Analytics can't pass through the iframe for security reasons. So, oftentimes people will try to sneak around the idea you need to add content to a page by putting in an iframe. Now you can do scrollable divs and stuff like that. But even that, Google says don't hide your content like that. So, that's probably not the best idea. Yeah. How is Google doing with JavaScript? Yeah, that's, oh yeah, thank you. How is Google doing with JavaScript? This is the number one fight I have with developers, right? Some developer, so I'm gonna vent on you for a little bit, right? So, do you go to your doctor with your WebMD article and say, but doctor, there's an article in WebMD and I clearly have this. And every developer who said, see David, Google can read JavaScript. This article says so. Loaning, right? It can, to a limited degree, but you have to take so many extra steps to ensure that it does, that it's not the best solution. It's not quite ready for prime time yet.  I don't get it. Yeah, all right, all right, all right. We have a throw down here, a throw down here. But, there was a great, great video. All right, all right. This is what I came for. There's a wonderful video in Google I.O. of this year, like two months ago, Google I.O., where Google basically tells you what you need to do in order for Google to read JavaScript. That's from John Muir, who is head of Google search quality out of Germany, and he's kind of basically saying, don't do it, if you do it, do it this way, but there's so much extra work you gotta do that it's probably best not to. But there are, I'll admit, there's more things in this world than this, yo. And if you don't want to get traffic from Google, that is a great way to build a website. But there's so much extra things you have to do. I would rather build it from a server-side code base and make it easy. I don't want Google to have to do the extra work, and I don't, you know, there's so many ifs and that's such a new technology, things change. I think from that, you'd probably understand the video more than me, but the video basically said you had to revert to older versions of Angular for it to work and stuff like that. So it's like, I'm not a bleeding edge kind of guy. Let's let the technology settle. And in a few years, that might be the better solution and that's totally cool. But right now I wouldn't do it. There's, you know, there's, but you don't have to take my advice, you just gotta pay me. Yeah, right, right. Yeah. You know, I heard that and I heard someone ask a question about that and this is where we get into SEO debates and I'm not gonna get in an SEO debate with a fellow SEO. That talk was super duper. And I say that for someone who can't sit in SEO talks because they make me really, really mad. But that might be the only thing I disagree with him on that. But better than nothing, right? For usability, from a user's perspective, I mean, we're not trying to trick Google here, right? So let's not try to sneak around Google and do this. Technically Google doesn't go through iframes, but Google might in this case, since it's a Google product, understand that it's its own iframe, maybe. But I've understood that it's better, Google would prefer the API method. That was the way I understood it, but if I couldn't use the API, didn't have the budget to it or something like that, then I'd bettered nothing. But I don't claim to be a local expert. I would defer to him if he has experience in that and he thinks it works, go for it. We're all done. I'm gonna be in the happiness bar in a little bit. So hang out with me. I wanna like a glass of water too. Thank you guys for showing up. Thank you.


I'm Steve Benjamin, Mayor of Columbia. We had our first meeting of the Midlands Coronavirus Task Force. It's a task force and obviously given the nature of what we're all dealing with, this is our first meeting but we expect there will be a number of other different ways to meet and communicate. Next meeting may be physical, maybe indoor, maybe outdoor, maybe online, it may be teleconference, but it's important for the for the men and women and children that we represent to know that your elected leaders, your appointed leaders are effectively communicating as we deal with this growing challenge, public health challenge. Today we had a number of different agencies represented in the list as a bit more robust but they included Richling County, the City of Columbia, City of Casey, Fort Jackson, City of Lexington, Lexington County, the City of West Columbia, City of Springdale, City of Forest Acres, Richland 1, Richland 2, Lexington, Richland District 5, Benedict College, University of South Carolina, the Columbia Chamber of Commerce, Prisma Health, United Way, DHEC and the force transitions in several others, a number of other, of course all of our law enforcement leaders represented us from the Sheriff's Department, from the Police Department, from our Richland, Columbia Fire Department. Police, come on up too, it's important. We see we see our people uniform and makes us a lot to feel a lot safer, regardless of the challenge that we're facing. Obviously it's important to recognize that we are all learning so much as we move forward in dealing with coronavirus. So the more that we're able to operate outside of our silos, that we're able to share best practices and make sure that every institution knows what the others are doing, that we're able to rely on trusted sources, that if you need good information, go to one of our respected news agencies for information. Go to the City of Columbia or Richland County or our law enforcement or our healthcare institutions for good information. Do not rely on on social media alone because obviously one of the major challenges we have is just making sure people have good and solid information. Our focus is going to be as you go forward and making sure that our frontline first responders, the men and women who work to serve you each and every single day, have the tools that they need to make sure that we're safe, that we have systems in place to make sure that our public institutions are able to continue working. Effectively we're going to make sure that our healthcare workers obviously have the tools that they need to move forward. We're happy to have the Chamber of Commerce and other business institutions here with us today, recognizing that all businesses with certainly small business is still the economic workhorse of America and we have to make sure that we have some tools in place as we see some significant disruption in business globally that we make sure our businesses here across the Midlands are fortified. We live in a very different world right now as well with a number of gig workers, people who work from job to job, who work in technology, making sure again that we have systems in place. So we are working closely with our state leaders, working closely with the regionally and also through our respective organizations, working very closely with the federal government as well as we seek assistance as we go forward. So there's a lot of work to do. All of your leaders, regardless of region, regardless of where we are and who we are, irrespective of party or our respective roles working together and communicating to make sure that the people of the Midlands have their needs met. I'm going to step aside and we're going to have a very brief comments from our chairman of the Richland County Council, my friend Paul Livingston. Then the city manager of the city of Columbia, Teresa Wilson, we have Dr. John Saunders give us a brief medical update and then any of our other community stakeholders who are still here with us post our meeting are free also to communicate. We'll have some Q&A and we should wrap up pretty pretty quickly. So thank you. Mr. Chairman. Mr. Mayor, I heard you say it very briefly. I got that. And I also will have Dr. Witherspoon representing our educational institutions in the school district speak to. Let me first thank the mayor for his vision to bring us together in the Midlands. A little bit that's significantly important for an opportunity for us to just simply share our resources, talk about what resources are available, an opportunity for us to learn from each other, new ideas from each other. Well, no, preparation is the key. And what this meeting is about is preparation for our Midlands region. I'm excited about that. An opportunity to collaborate, partnership, work with each other, coordinate resources and think of that particular nature. You know, I want to thank my county ministry here as well as county staff for the preparation that we've gone through for the past couple of weeks. I had a little meeting on yesterday. So we want our citizens in Richland County to believe that we understand and know that preparation is the key. And that's what we're done. We're truly prepared. So again, Mr. Mayor, I want to thank you and I know that we're all going to be better off because of collaborative efforts like this one. Thank you so much. I'd like to ask Leonardo to stand with me. I'm Teresa Wilson, city manager. And of course, it's Leonardo Brown, our county administrator. We were also joined earlier by our Lexington County Administrator, Joe Margo and city manager, Tracy Haker from Casey. I think both of us and all of us in the room acknowledge as practitioners of local government and recognizing that we truly are in the business of public service. We have a fundamental responsibility to our employees first, who are going to be helping our citizens and customers in the Midlands. And so we've already all are in a lot step with establishing strategies of education, communication, prevention and preparedness. We are all doing a lot of the same things already and learn from each other today about some additional things that we want to be proactive in doing. But of course, that is pushing the message. And we thank all of you for being here today to put out the accurate information as Mayor Benjamin and Chairman Livingston said through all social media outlets, websites, YouTube channels and government access channels. We will be pushing information regularly. Communications have been sent to all of our employees through email, detailing steps for personal protection and steps to take should employees feel ill. And so that is including us gathering supplies like hand sanitizer, putting up stations for hand sanitizers, making sure that our individuals who were outside of the office, which is a majority of our employees who are working daily with citizens are protected to include our first responders. We've already engaged with both of the directors, Director Burr of Richland County, Director Tinsley with the City of Columbia and Jacqueline Richberg, whose director over 911. The protocols have already been established for first responders. As far as when they respond to calls, the call management system is already in place. If people or citizens are exhibiting signs of the coronavirus symptoms, we will ask additionally for continued planning and contingencies to be put in place for our staffing to ensure that we have a continued business processes and make sure that the work of government continues. Well, albeit it may be that we have to do things differently as the situation continues to present itself, but we are making preparations for employees to be able to work from home if that becomes necessary, as well as essential staffing, making different protocols for them as well as nonessential staff members to cross train. So a lot of things are in place. It's a fluid situation. We just want to assure the public that from a government local government perspective, we are prepared and ready. Thank you. Again, I want to thank Mayor Benjamin for coordinating this meeting and having us all come together and share information. As always, whenever there's something that arises, we do all work together because whether we're talking about Richmond 1, Richmond 2, Richmond 5, we share families and workplaces in line. So it's important that we all work together. With regard to the various school systems, we have put out information internally and externally to our parents, to our staffs, and we generally this time of year we have flu protocols that we follow, and that speaks to the wiping down of surfaces, covering your mouth, all of those things that we know to do during flu season, but certainly at this time taking extra precautions and as has been said, that preparedness, making sure that there may be isolation rooms that are needed in addition to our regular health rooms that we have. Preparing for any e-learning in the event that a school or a district has to be closed that we have, the education can continue differently, whether that's with computers, whether that's with packets, and so forth. So we're having those things in place. We're also monitoring field trips and so forth, whether that information comes from the CDC or DHEC in terms of travel for students, field trips, or staff with professional development. We're keeping an eye on those things as well, and also working with our international teachers that we have that come from various countries, and perhaps some of those trips that may have occurred during the spring break and the like may not happen. But again, we're keeping all of our folks involved and informed as we go through and continuing to make sure that in the event, just like what happened in 15 with the flood, our business services continue to operate and continue to have those systems and processes in place. So we will continue to work certainly with the individuals and entities that are represented here to make sure that we're doing our part as the education systems in this area and what we can to work together and support our families, our students as we go forward. Thank you. We'd like to thank Mayor Benjamin for allowing us to participate in his task force today. The one thing that I would like to point out is at this point in time, there are no confirmed cases of coronavirus in the state of South Carolina. In terms of things that we're looking for for symptoms to be on the watch for, we're looking for fever, we're looking for cough, and we're looking for difficulty breathing. In terms of what we can do to take care of ourselves and try to prevent the spread of this, hygiene in terms of making sure that we're covering our coughs to make sure that if we sneeze into a Kleenex, we throw that away to make sure that we're engaging in good hand washing technique in terms of making sure you wash your hands in warm soapy water for at least 20 seconds. And then if you're going to use the hand sanitizer, make sure that it's at least 60% alcohol. Thank you, sir. And we're going to obviously be opened up for questions. Oh, so usually so many of you are in this very space with us when we're having a storm, some sort of some type of inclement weather event or flood. And I have learned over the years, as many of you have, that these women and men are the very best there is in the public or private sector anywhere in handling these situations. New storms will arise and it is time for the very best and brightest to step up and we'll learn, we'll learn some things and we'll be even better prepared when the next challenge comes. Again, my reiterating what Ms. Wilson had to say, I wouldn't thank the media for being here. We appreciate each and every one of you as a trusted source and helping make sure that the people that we not only represent what we know that we love get good information from trusted sources, encourage people rely on trusted sources, not only on what we read on social media to get your information. It's so important. Obviously, that means the major stations represented here. You can always rely on channel two and certainly the official entities that stand before you here today go there for good information, not only to social media. So I'm going to wrap it up there. Unless someone says something to contribute, I want to thank everyone here and I want to thank all of you. And I'm happy to take any questions that you might have. In terms of concerns, I know a lot of people are considering about this virus. Like, you know, like the governor managed to tell some people to take it easy, like what can you tell people just to make sure that they can ease their fears? Well, I'm not sure if the answer is taken easy. But I think the, I'm sure the governor's admonition is everyone, just do the things that we know we're supposed to do. As Dr. Saunders laid out, listen to your medical professionals, listen to your public health leaders. There are all, there are a number of very simple things that we can all do to make sure that not only we stay healthy, but that those around us that we know and love stay healthy. Very simple things. Let's do that. But this, but this is a reason for great concern. We're talking about a serious virus. We're talking about potential epidemic and pandemic level. So we have to treat it with the gravity that it requires. But also, I think with the ease and calm that allows us to communicate. And obviously, the question is not if the coronavirus will be here in the Midlands, it will be here. The question is when it will be here and whether or not we're organized as a community to properly respond to it, to properly meet the needs of our citizens who may be affected by it. That's our job. And to make sure we're communicating very well. So that's what we're going to do. And we look forward to working very closely with the governor, with our federal officials, and certainly with all of our local officials and making it happen. Yes, sir. Oh, a couple of questions. I guess I'll just slide it to one. And you only get two, so. Fair enough. All right. Same passage break is in two weeks. That's a lot of public events coming up now. You're not putting in any advisories right now, restricting, changing the hours or the planning. That's still on this short. But we don't plan the St. Patrick's Day event, but certainly we help facilitate that having worked very close with the Five Points Merchants Association. We did have some robust discussions. Some of you were able to participate in that downstairs, and which is a very specific question to a few came up about out of state travel. And the other was about large assemblies and how we should handle those going forward. That is a very large assembly of folks. And I think we're probably going to have to kind of just see how things proceed in working with the proper stakeholders to see if things have turned into something rather significant. Maybe it's something that we all need to strongly urge a different path. But right now, no, we don't see any changes in plans. Second? Are you in close contact with public college officials, USC Allen, Benedict? Sure, too. Absolutely. So both the University of South Carolina and Benedict College were both present at the meeting today. Midlands Technical College as well. So yes, we'll be certainly communicating there. Obviously unique situations that we have with young people, particularly young people who are far away from home. They may not have their parents present the cannon for us. So we got some really good advice and counsel from our institutions of higher learning early the day. And we're going to continue staying engaged with them. Mary, do you have a like a five step plan? And you have something that kind of shows the guideline of what will happen in the case of the current bias here in Columbia? Well, right now, sure, in line with what the rest of the nation is doing. Sure. Well, obviously our goal just with any type of situations to have some type of a critical incident response protocol, those are all segmented out between the various different institutions that are happening here. Obviously, some of the dialogue downstairs was how will we react on post if this happens? How did we work with our certainly we got an update from DHEC as the only place now in the state where you can actually get tested and got an update from Prisma. Each of our various institutions we have other plans already developed or plans that are developed. And the goal is just realizing how we can work across our jurisdictional lines to make sure that if something is working really well on post that we don't have to reinvent the wheel in the state of Columbia that they know exactly what we're doing, you know exactly what they're doing. If something is going well at Richmond County, Lexington County has the benefit of that. So it's just constant communication, constant communication. Ms. Wilson, you just look about having Kansas and its hyzer stations for employees from the city. Are there any plans in place for having those stations for people who just want it around downtown? That's a great point. I think we started obviously with city personnel that are particularly engaged with the public on a daily basis for their protection because they're not able to, you know, wash their hands regularly because they're working in our communities, literally whether that's public work, staff, police, fire, water and sewer staff. And that's very important to us to have continued to push that message for them for their own personal health and hygiene. But because they are the central employees that will continue to keep this community running in the event that things become worse as far as the coronavirus. What I think we would probably do is then continue the audit throughout, you know, city center and maybe the hospitality districts and work with those different hospitality district representatives to see if any additional stations are needed for public use. And we can certainly do that. Thank you for what you do. We know that obviously this is probably the major, if not one of the major issues of public concern right now. Please continue doing the great work you're doing sharing the good word. Make sure it's it's something we can all we can find edifying after we read what's on your post and see what's on the news. And let's stay constantly kind of keep holding each other to account. So thank y'all. God bless you. Hey there. Mayor Steve Benjamin here. Thanks for watching this video. Make sure you give it a like right below the video and don't forget to subscribe. Also, while you're here, be sure to check out one of our other videos or follow on our social media platforms. Thanks again. And remember, we are Colombia.