 All right. Thank you, Vladimir. And thank you so much to everyone for coming along this evening to hear about personalization with Rekombi. Rekombi is a recommendation engine, and it is able to produce recommendations for users on your website. I'm calling this part two because at Drupal South last year, I presented Rekombi in conjunction with Search API. And in that presentation, I was really sort of talking about how we can get content out of Drupal over into Rekombi. But in this one, we've sort of fleshed out the offering. And we've got another couple of modules we would like to show you. The first one will be Rekombi, which has a block that will display the results. And we've also got another new module called JSON Template, which is a templating mechanism for rendering content client-side, depending on various templates that can be defined. So content management is a solved problem. I actually opened my last presentation with this statement. But I think it's good to set the scene. We all know that Drupal is great at content modeling and allowing editors to manage relationships and fields. As well, Drupal obviously excels at the templating sides of things with view modes and layouts, templates, render API, render arrays, and things like this. So we've got a lot of tools for the back end developers. Of course, it's got JSON API and integrations as well. But what we've said here is also true for lots of other CMSs out there. This is basically the accepted sort of groundwork that we'd expect from a CMS. So from my perspective, the question we should be asking ourselves these days is, what are we going to do with this foundation? And for me, that means going down the path of personalization, and in this case, looking at recommendations using Rekombi. So how do we personalize based on this foundation? Well, it is worth just addressing a few weaknesses of Drupal from my perspective. Firstly, I think the sort of authenticated user is privileged over the anonymous user. We have roles and permissions. All the access controls very much tied in to the user. We don't really think so much about anonymous users and the experience that they're having and how we can personalize for them. Also for the scalability, caching in Drupal's around entities and the page. And of course, when you're using CDN or Versproxy, it's that anonymous page that's being cached. There's no real sort of concept of how can we serve up different experiences. And finally, we have the client-side templating. As I touched on before, we've got really good back-end templating tools. But how can we define templates that can be selected by editors, which are then controlling the way JSON and other things are transformed on the client-side? So with these challenges in mind, I'm just going to quickly run through how we're solving a few of these solutions before we jump into things. So we're going to be using Recombie, which is a software as a service. It's a scalable recommendation engine. So we're solving that issue of scalability. We'll be the Recombie module, which I'll be showing provides some editor-friendly blocks for easily placing blocks onto the page to show the recommendations. We have an integration going on in the back-end with Search API Recombie. This is the thing that's pushing the content from Drupal over into the Recombie index, which is stored remotely. And finally, we've got the JSON template module, which is providing some templates, in this case, handlebars templates that can be selected to display the content on the client-side. So let's just jump across and have a look at Recombie and what that looks like. So here we are on the home page of Recombie. As I said, it's a software as a service. It builds itself as using artificial intelligence. And indeed, it uses a lot of different strategies for coming up with recommendations. This is actually a service I've kind of been waiting 10 years for. And when I saw that something like this was available, it really piqued my interest. And so I've gone down the road of exploring it further. Recombie provides recommendations for a number of different domains. So we would have, say, the content domain, which we're all familiar with, Drupal's a publishing system. It also handles e-commerce and products, and products that you've purchased, and these kinds of things. But basically, it can handle any vertical you like, because it's quite adaptable. It's got some nice analytics in the back end, and it's got various APIs that you can use. We'll be using the PHP API that they've got as well as the JavaScript one. Just very quickly, out of interest, if you're interested in the pricing model, it's around $100 US a month to get started. I think that's kind of like a reasonable sort of starting price to get exposed to recommendations. So there's a nice sort of pathway there. So that is Recombie very quickly. How does it work? Well, it uses, as I said, a number of approaches. But one of the main ones would be collaborative filtering. And this is where users are being tracked for a user looks at a certain item. And this is called an interaction. So it's tracking interactions across a variety of users. With collaborative filtering, the recommendations that are coming back are based on the kinds of things people who look a little bit like you have also looked at. So you might be familiar with Amazon. People who purchase this product also bought these products. That is sort of a collaborative filtering based on user behavior kind of approach. But it also uses content-based approach as well. And this is where we have content, say nodes, they can be related to each other on a similarity score. So in that case, we're looking at the properties of the nodes. So two nodes might have similar keywords in the title, same sort of topics or authors. We know that they're going to be more similar. And this is where the Search API Recombie module comes into play because it's pushing that metadata across into the Recombie index to do that similarity. There's a whole lot of other stuff going on as well as popularity, recency. They've got sort of different sort of flavors that they can put on these, the recommendations that are coming back as well. Also, items that you've already seen will not be shown to you. So it really is like an adaptive interface where it models itself according to what you're doing on the site. Very quickly, let's just have a look at some of their APIs. This is a public API where we're tracking a detailed view for a certain user. You can track product views or partial views and other kinds of interactions. Down the bottom there, we can see a request to get the results back. So we're getting the recommend items for a particular user. So we're getting five items back. And when we do that request, we get a response similar to this. The response will have a recommendation ID, which is unique for every different recommendation that comes out, and we'll get an array of recommendations. In this case, we're just seeing one here for one particular article. But you can see we're getting all that metadata coming back. Server side, there is a private API that can be used as well. So the search API recombie module would use this private API to push that content over into the index. So here we can see where we're setting some values for a particular node. Now we're using the private API here because obviously we don't want anonymous people pushing junk into our index. That's a protected thing, but we use the public API for stuff users are doing on the site. So the recombie module that's been recently released, I think we're up to around alpha four now, that's sort of taking care of a lot of this stuff. So the module handles basic configuration, it handles the block and it also handles the tracking. So if you want to download recombie module, there it is to take a look at it. So sort of demo time, we're just gonna go through and have a look at what this all looks like in real life. So let's have a look at the recombie back end. That's a recombie back end. Here I am, I'm logged in with my limited free plan. We've got this database called alpha prod and you can see we've got a few of the statistics here. So we can see what recommendations have been made, how many views there are, which kind of scenarios are most popular. And there's a whole stack of statistics you can explore there. We have the item index, so we can see which items have been pushed across from search API recombie. So that's just a good way to validate that your data is going in. We've also got users and in this case, the users are identified just with a number. And in this case, this is a Google Analytics client ID, but the defaults implementation, the module is just to use a random number and put that into a first party cookie. So these user IDs here are used for tracking. If you had authenticated users, there's no reason why these couldn't represent the users in the Drupal site. A really important concept is that of the scenario. The scenario is really what drives the recommendations. You can think of a scenario as a collection of configuration items that fine tune the results. So let's have a look at what I'm calling a personal scenario. You can define your own scenarios by the way. So for this personal scenario, we're using a certain logic and that's the personal logic. So you can see that we have a number of different logics we could use here. But in this case, we're using personal and this is going to provide recommendations back to the user as a whole. We don't care what item you're looking at currently, we're just concerned with the user. We do have some filters as well. We've put some filters in here just to kind of get some sensible results back. For example, we only wanna see content on the Alpha site. We are indexing a couple of different sites into this one index. We only wanna see titles that are not empty. Just wanna make sure we've actually got some data for that particular item. And in this case, we just wanna see articles. So you can see here, we're able to use these filters to fine tune what's coming back. So basically logic plus filters, it's sort of the main driver of how those recommendations are being done. If we just have a look at the items one, so this is when a user is on an item, what are they seeing? And of course, we've got the current item to set the context. And you can see that we have different logics here now because this is an item one. So we've just configured this to be default, but you could skew it to say, let's show more similar things, or we could skew it to show more popular things. So you can see there's some tweaking in the back end there to fine tune what's coming back. So yeah, defining your scenarios, very important first step because we're gonna be using these scenarios in order to get the results back. So there we go. So we've quickly looked at the Rekombi back end. Now let's look at a site called Alphabet. Alphabet is a demonstration site I've set up so that we can have a look at this. So coming over to Alphabet, you guys may have seen this before at my last talk. It's just a very, very simple Drupal 8 site. The site itself is a bit of a toy website. I've just put up a few very basic bits of content here based around WordPress and Drupal and hosting and SEO and return on investment, whatever. A few little keywords, right? So we just, you know, some basic content to see how this might all play out. So back on the homepage, this is where we can see the just for you content. And these are the recommendations that are coming back based on me as a user. So once again, this is the personal scenario that we've just seen. So let's just click on this where to host your WordPress site in 2019. Very short article. And we've got some recommendations here. You know, we've clicked on WordPress. It's showing some WordPress-y kinds of things. If we just click on another. Developing for WordPress one, let's see what we get. Oh, look at that. We've got developing for Drupal. So you can see that, you know, we've got some item similarity working there based around the content, but also based on the behavior of what people have done in the past. Now, it is a bit of a black box. I can't really sort of say for sure why you are seeing things. It's basically quite a, you know, quite a lot of sort of nuance and different algorithms going on there. But you can see I'm back on the homepage now and it's actually coming up with new content here. It's another WordPress article, but it's swapped out the one that I clicked on because it knows I've already seen that. So it's serving up new content. So that's basically the user recommendations and the item recommendations in a nutshell. You can see how they're working there. Let's just jump in and have a look at the block and how that's been configured. So this is a block implemented by the Recombie module. It is an items to user block and we're using this personal scenario. We wanna get three items back and we also wanna track the user when they click on a particular item. So that's actually gonna put that recommendation ID that we saw into the query string so it can be tracked. And this is an interesting item here. This is the template. So at the moment we're using the image card templates three across, we can swap that out and say use titles. And if we do that, we will see now that we're just getting the titles. So this is the JSON template module kicking in and we're actually using handlebars to render the JSON on the client side and we're swapping the templates in and out. And so basically the main sort of takeaway I want you guys to get here is that this is something an editor can easily pick here in the UI. And really that templating and transformation information is all happening on the client side. So there we go. That's very, very quick. I know I'm rushing through this pretty quickly I've got 20 minutes to knock it off. Okay, so that was the public scenario block that we just saw in action. Let's have a look at the tracker block. So if we come into the different blocks we do have a tracker in here. You may think it's a little bit weird to have a tracker as a block. The main reason that we've got this is we've got these different visibility plugins here that are really nice for controlling when something will work. So for example, we may want to control the roles that are being tracked. I'm an administrator at the moment. I probably should not be tracking myself but if we wanted to exclude myself and just have anonymous people tracked we could do it here. We could also track on different content types of course. So basically these visibility plugins are very handy for fine tuning where we're doing the tracking. And we want to do that because we want to maximize the quality of the data we're getting back when we're tracking people. So yep, that is the tracker block and that's been implemented in Rekombi as well. Okay, so we're moving along. So behind the scenes, let's look at some of the other stuff that's going on here. We've mentioned the search API Rekombi module. This operates hand in hand with Rekombi. It pushes the data across into Rekombi and we do this for two reasons. One, for the item similarities and two, so we actually have all that metadata there that's coming back in the JSON payload that we saw. It's not mandatory to have this but it's certainly highly recommended because if you don't have it, your payloads, your responses coming back are just gonna have IDs in them, not gonna have anything. Let's have a look at what that looks like. So for those of you familiar with search API there's not gonna be any surprises here. We will set up a server, got a Rekombi server and in this case, the back end is Rekombi. It's not solar, it's not database, it's Rekombi. So we actually have a custom backend here that works in a search API server. And then if you have a look at the content, it's just like how you would normally index stuff up. There's no surprises here. We've got the title going across and the summary and the content type and a few other things. So we do have a few special field types here like Rekombi set. So there are a few little extra goodies in here, especially around the image as well. But basically this is operating essentially the same as search API you'd expect. And you've actually seen a couple presentations on Algolia the last couple of months at the Meetup and it's a very sort of similar concept. So that's how search API Rekombi is working. And then moving along to JSON template. So this is a new module we've built just been released in the last couple of days. It's got a plugin system or it is a plugin system for managing client-side templates. We have two different plugins. We've got JSON template, which is essentially like the string of the template that's going to work on the JSON. And we've got something called a transformer. That's the engine which is doing the transformation. So the JSON template module ships with one transformer that's called handlebars. So that's what we're using. We like that as a really simple templating engine client-side. So we've implemented a handlebars transformer. Now each theme or themas are able to find the templates in a modular theme. So you saw there in Rekombi that we actually had the default Rekombi titles. That is a template that is shipped with the Rekombi module. So it will work out of the box. You are going to get that nice little list of items with a UL and LI, just the titles. But if as an editor, if as a site builder or a themeer, you want to go to the next level and show your cards, you can implement your own fancy one with cards with going three across. You can implement that as a plugin in your theme. And the main aim here is so that editors and site builders can choose their template when they're building the site out. So the solution here is being built around trying to get a good editor experience but also making things nice for themas. What does this look like? Okay, just quickly, here, this is some stuff, some YAML that's in our theme. And you can see we've got a Rekombi basic list in our Rekombi image cards thirds. That's the one we were looking at, the image cards thirds. We just give it a title or description. We tell it where the handlebars template is and we say, hey, please use the handlebars transformer and please show this on the Rekombi module so you can define where that template is going to display. And you guys don't really need to see this but this is an example of a handlebars template. You can see that we're iterating through each recommendation and we're just pumping out some HTML and picking out the values. This is quite a simple approach. Themas should be able to get their heads around. These handlebar templates pretty easily and it's relatively easy to implement it like that. And then it's just gonna pop up magically as a selection item when you're doing Rekombi. All right, conclusion. Try to design a system that was gonna be simple but really there's just an awful lot going on here. We've seen the scenarios the tracking, the indexing, the querying, the displaying and transforming. But a really, really important step here is also the planning and design. So the discovery process upfront leading to good IA and UX and then moving on to a good content model and finally the content to serve up to people's recommendations. All of this has sort of got to be working in unison and this really means you've got to think about your taxonomies, your similarity and how things are going to relate together. And then each of the modules I've just shown you today are able to solve these problems. So it's quite a few pieces in the puzzle but it does all fit together. I think the dealing with that complexity is certainly worth it. A system like Rekombi is able to surface relevant content. I really think it's going to add a new dimension to the way you design sites. So for example, you may have a site where the hierarchy is not working, the relationships are not working and the search is not working. Rekombi through the recommendations is able to provide another means by which users can discover content and that's based on user behavior. So rather than the mastermind solution architect that's putting the site together. So I think by having recommendations like this it's really providing another whole way of discovering and engaging with content. And of course we want to keep the user engaged, have lower balance rates and longer time on the site and ultimately make the site worth more. So that's it in a nutshell. Thanks a lot for listening and it's time for questions if we've got a bit of time left. Thank you. I have a question, Mari, in regards to Rekombi. How does it fit, for example, we had a presentation a couple of months ago in regards to Algolia. So Algolia is a multi-site search and we understand the recommendations but if you would have a choice between Algolia and Rekombi or any other search API, why would you choose Rekombi? Well, Rekombi now actually supports search and that is a new feature that they have. It's one I haven't explored myself and it's one we haven't implemented but we are only using search API to push the content around. So when a node changes, let's get it over into Rekombi. If you wanna rebuild the index, let's get it over into Rekombi. If you wanna define your fields however you want, let's use search API. So search API is amazing because it allows you to do all of that stuff and the model that search API has just fits perfectly for our use case of trying to get updated content over into Rekombi. So it's not really for search per se, we're just using it to get the index over and then once the index is in Rekombi, you're getting recommendations out. So what I showed tonight was really not around search at all, it was around getting recommendations back based on the user or the item that you're looking at. But if you come here and go to Rekombi, it's actually an interesting thing. I've still got to look into it but they're offering search here as well. So they're obviously getting into that area. So that would be really interesting because they're not just doing items similarity or keyword matching, they're going to be looking at user behavior as a whole which is another whole powerful dimension which would be layered on top. So I can't really comment Vladimir because I haven't compared the two. I think the use cases are different but this search is available here now so it would be something worth exploring. Thanks for that. I have a question from Mark from Rekombi been wedded for Cambridge Analytica. Sorry, has Rekombi been? Vetted for Cambridge Analytica. Well, I don't know how has it been vetted for Cambridge Analytica? One of the look, I think people can be concerned about tracking and from my perspective, the real evils around tracking, well, there's many of course, that there's probably two. One is identifying a person's identity, their personal information with what you're tracking and the other is would be using third party cookies which then share that information to third parties. The solution I've shown here doesn't either. At no time is the Murray-Wittman name or email address associated with what's been tracked and at no time is that information being shared because we're using first party cookies. So from that perspective, I'm totally happy from a non-evil perspective. If you wanted to design a nasty system, you could have third party cookies or device fingerprinting, generate client IDs on that and potentially track across thousands of websites which is essentially double click and Google and Facebook, Pixel and whatever, that's what they all do. But I think those days are coming to an end with browsers clamping down on third party cookies. So I think first party cookie solutions are gonna be the way to go and sites that the behavioral patterns of users on an individual site is something a site is gonna wanna track and make the use of without being evil. So I can put my hand on my heart and say, this really is offering a better user experience without selling that the user's short of sharing their data. Maria, it's Chris here. Are you saying that Recombi's communication is entirely through your site or are they delivering the content directly to the user's browser by the public API? Yeah, so what we've done is payload here. So the Search API Recombi module pushes the content over into Recombi. So Recombi does have your whole, well not your whole index, but it's got all the juicy bits of your index there. When we make a request to that public API, so this is some get request that we're doing and we're getting the recommendations back for this particular scenario. And then we are transforming that straight away on the client. So we never actually need to hit Drupal again to get that data back out. So that's why it's a scalable solution. The index is in Recombi. It comes back, we transform it with JavaScript on the client and we never have to talk to Drupal's JSON API or anything like that. So does that answer your question? Yeah, I think it does. And you could sit this alongside another Search API integration. Yeah, that's right. Yeah, yeah, yeah. So if we come back here to managing fields for search and we're just back in Search API here. I mean, there's not much going on on this site, but we do have the old fashioned database search still just sitting there, right? So this is a MySQL server and this is a Recombi server. So they both can go there. So every time you update a node, you get two indexes getting updated, you know, this one and this one, right? So, yeah, you know, you've got stuff going on. So when this index gets updated, the Recombi backend does a private call to Recombi and pushes that payload over as JSON or whatever over into Recombi that way. Last one. John is asking how does Recombi store data and comply with the laws like GDPR? Well, that's a good one. I would be going to... You'd have to ask them, basically. I'm sure this, they've got a, you know, it's not a really answering the question, but they've got data centers now in Australia that you can set up. And I think, you know, they're basically based in the US and the States. I guess they are, I forget the GDPR phrase, but, you know, whatever, an information supplier or whatever, so they would need to conform to that. And I'm pretty sure they would. The big question, though, is for you as the site, you would have to... You would also have to consider the GDPR and how you're tracking that. There's probably very high chance that your users will be coming from the EU. So, yeah, if that is a problem, you have to work out how you're handling the GDPR. Just as a little side note, there are, I think there are seven reasons you can use for complying with the GDPR. A consent form is one, but there is another head of power that you can use which is providing your users with a better experience, basically. So, I think if your privacy policy mentions that, theoretically, you could get away with doing what we've done here, just using first-party cookies and tracking it that way. Now, I don't mean to give legal advice, but, yeah, it's a really tricky area. And, yeah, it's one you'd have to talk to your layer about ultimately. But, yeah, so, yeah, responsibilities on you and them, I'm pretty sure they would be covering that, but, yeah, that would be a question you would ask them, I would say. All right, and thank you very much. Thanks, everyone, for the questions as well.