Building a Castle
CC Attribution 3.0 Germany:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal purpose as long as the work is attributed to the author in the manner specified by the author or licensor.
Gheem, Nathan Van
An opinionated distribution of Plone. A talk focused on the decisions and innovations of the Castle CMS Plone distribution. Special attention will be given to Mosaic, tiles, Redis, Elasticsearch and UI/UX.
 Okay, I think we're going to get started. But maybe I would start with a little story. Jens Klein and I were talking about castles a little bit. They just had the castle sprints like a couple of months ago. And it's like at this sort of castle that's been built and added on over the years. Maybe a little bit more plonish type of castle, like not so symmetrical like this. And there's like different types of castles that we're going to talk about. But I've never actually been to a castle. And yet here I am going to talk to you about building a castle of sorts. Anyways, wildcard. Well here, why don't I start with a little bit about myself. I work at wildcard corp. Been doing plon, Python, web solutions, high secure web solutions for like federal agencies for many years now. And I've been working on plon slightly more than I've been working at wildcard. I'm a core contributor. I lead the security team. I've been on the UI team and framework teams in the past. And so this is a little, yeah. And the accordion, okay, that's during the Arnhem anniversary sprint. Ramon plays it, so he was trying to teach me a little bit, which I failed. So what is CastlesCMS? It's, I guess, what we've been saying is it's a distribution of plon. Something that wildcard has been working on for the past six months, I guess. And it's a package of things that we've wanted to do with plon. So it sort of packages everything up that we've done in the past. And it's sort of one nice thing that we can deploy for our customers and sell and market to our customers. It's for large, complex websites. It's not maybe for the small site. It's for lots of content editors and sites that you need. You have a lot of content to manage. And it's built on top of plon. It's just our customizations of plon and then you get Castle. So it's, and I'll kind of talk, I'll talk about what some of those things are and how we did it and what the future is. And so I want to get through a lot of the features, but I always try to set you up here. And so we can get you to understand mostly what is provided with Castle. It is not a fork. It won't ever be a fork of plon. We would, we'll never survive if Castle is ever a fork. We want it sort of, we have to work within the community. And so I'll talk more about future goals of what it's gonna, what's gonna happen with it and how we're going to sort of hopefully use it within the community to continue to innovate with plon. And so within plon, you gotta think of like, there's a lot of different people from all over the world. We all have different opinions of how we want plon to do certain things. And so this Castle is a very opinionated version of plon. A lot of things we do, maybe like Hector would really be angry about and Andreas Jung and, and so it's a way for Wildcard to do like the really opinionated things that we want to do with plon. And maybe if we get enough people convinced like this is the way to do things, we can incorporate that back into the plon. Somewhere to innovate, so try new ideas, to try things that maybe are a little bit controversial. Things that we want to do and maybe aren't so easy to package into add-ons always for plon. And if you have all these various add-ons, you have to be able to integrate the add-ons together. And sometimes that process of having a huge add-on ecosystem is really hard to manage for someone who wants to deploy these advanced features on many, many different things like on a package. More than that, performance is really important to us because we have large sites that can get hit by DDoS attacked and things like that. So we have integrations that really help with performance. Those include like Cloudflare where we, this is really the only CDN we support, but we have like invalidation support and support for configuration with the API of Cloudflare. So I have Elasticsearch support out of the box. So all of your content is indexed by Elasticsearch. And when you go to the search form, it all goes through Elasticsearch. In addition to just regular indexing and searching, we have an asynchronous server implementation of the search API. So you can actually have all your search requests go through a different server than clones so you can handle a lot more. Because these are going to be uncached requests, so you need Dale to have a lot more performance out of your search form out of any other parts of your site. We also heavily leverage Redis. This is for application level caching. Redis is nice because if you cache things in your application level, you can share the cache between multiple threads. And we also leverage things that you would maybe normally write to the ZODB, but are sort of volatile a little bit more. We use Redis instead of the ZODB to store those things. It's like sessions and storing information on what users are doing on the site. We also leverage ZRS for more performance so you can replicate to multiple maybe data centers or just so you have multiple copies of the ZO server so you can handle more requests. And then how do we, so we have some, those are kind of setting the stage of some of the things we're integrating and we're doing. How did we integrate all this? Well, we leveraged ZCA adapters and we kind of overrided a lot of the things in Plone that we needed to. Zope component architecture is really nice for most of those things. So it was easy to do some and also like Z3C that, what was it again now I forgot the name of it. The one that you can un-configure ZCML, un-configure Z3C that un-configure. And then just like a lot of React and HTML JavaScript giving you a UI. So opinionated UI of how things, how Plone should be able to, how you should use Plone. And then when we couldn't use ZCA, we use monkey patching. That's with collect that monkey patcher and just manually patching. So this is an example of patching search results. So it doesn't pay attention to trashed search because we have recycling bin support. Security is really important for us too. So some of the things we implemented with security are integrated to factor off. We have this thing called an application shield. So if you turn it on, you can't access any of the content on the site until you've logged in first, lockout attempt. And so if you enter your password in too many times, it will wrong, it will lock you out. Stripping metadata from files that are uploaded automatically and root user restrictions. So you can only log in with a root user of Zope at the root of Zope. It doesn't allow you to log in, let's say the root admin user in the Plone site itself. So it's just a little bit more secure so you don't have, you know, able, like the super users of phone are unable to log in directly to a site. And so, I'm trying to set the stage and then I'll just, there's going to be a lot of demos and I'll try to explain things to demos. I think people like demos and see things and it looks fun and stuff. This is our toolbar and we kind of, we moved notifications into its own area and we have user actions, site actions and then everything content related to us on the left. And we have no drop downs or drop, we have no like second level drop downs on the left. Everything happens in an overlay if you do actions for context type actions on the left. Adding content is a little different. You get an overlay and you can kind of see interactively what your URL and your folder structure is going to be. So it's a lot easier for users to know what's going on when they're creating content, where it's going to be and it will automatically create folders for you if they don't exist. And you can have it public by default. It has the workflow state there, right there for you. And another nice thing about it's, yeah, so you can customize ID and everything will automatically generate it by default. But you can create and edit immediately or you can create multiple content and then edit it later. So it keeps it and I can create another page or I can go and view and edit it. And then when you're editing, everything is Mosaic. We don't have this default pages, we don't have the display menu. Everything is Mosaic for our users. So they start editing a page immediately, they're in Mosaic. Uploading is similar but you have an upload tab. It's important for our type of clients that when they upload things, they're forced to enter some metadata and this is configurable, which is forced. But you can set constraints on what things they need to enter. And they also have focal point support, so you can't really see super well here. But if you select a location on the image, you can say where the focal point of the image is. So when you display the image in certain places on your site, it will auto crop to that focal point depending on the width and height dimensions you're displaying the image as. I'll show more of that in a bit here. The workflow menu, we have a built in quality check that does some 508 compliance and making sure you have a nice title description. And it's all in one menu, so hopefully it encourages the users to use the commenting when they're actually changing workflow states. Like I said, everything is Mosaic. So this means we have no display menu, no default pages cuz that's really confusing for users to have to create a folder and set a default page for that folder. We have no collections because collections just become listings on pages. And it's just kind of like your typical Mosaic content creating experience here. We kind of updated the content selection widget as well. You'll see it more in some of the other examples. So you have a nicer browser for browsing content on your site. Video tiles, all videos are automatically converted to web compatible formats when they're uploaded and that's done asynchronously so it doesn't affect the processing of the site. We have, the videos are all responsive so they use different sizes for different mobile devices. And also has support for YouTube which I think it will show here. Yes, yes. It does most of them pretty good. It has trouble with, I haven't figured out how to convert it better but it has trouble with MOVs making them look nice when you convert them. Sorry, had to do the New England Clam Charter thing. I think it's the white. Only some people would probably know that joke. And we have mapping with all of our content. So a mapping tile and also all content can have mapping coordinates on it. So you could just select items on your sites or you can add your own markers directly and they'll show up on the map and you can add descriptions and click on them. How many of you are familiar with Green Bay? My hometown, so that's where Kim lives, Kim, New England. Osh gosh. Osh gosh. Yeah, you get the point, right? Focal point images are really cool. It allows you to not have to, your users deal with cropping, all the different sizes and everything or what they'll do is upload multiple images so they're the same thing. You just have them displayed differently in different locations. You just click on where in the image you went to focal point and then it will focus on that area. Our particular tile that we use for it gives you different display types. The display is portrait or square or landscape. And so you can see now it's focusing on the tail but if I go back to the beak, then I'll focus there. Yeah, yeah. And so it's doing it client side. I mean you're setting the focal point and storing it in the database but it's doing it with JavaScript to place the image where it needs to be. And so what you can also do with this and what CASEL does is you can load initial smaller images for like mobile devices and stuff and if you have a larger screen you can scale up depending on what size you need to fit the dimension. Anyways, yeah. We also have some social media tiles. This is just sort of like tweets, timelines, Facebook posts or Facebook pages and I think we have Pinterest and it's just maybe easy stuff but it's nice to have it integrated out of the box. So this is all of the tiles, the JavaScript behind them is integrated with patterns. So everything is a pattern inside those tiles more or less and so how it updates while you're dragging or when you're dropping them is it's re-initializing the HTML pattern inside that. Alright, we also have a preview model where you can quickly see the different sizes. So searching is kind of talked about already. Using an elastic search is really fast. You can scale really well. You can get rid of the full text indexes and clone itself. We also support search result pinning and Google Analytics integration to the point where it will scan Google Analytics data to see which pages are the most popular and sort of give them, bump them up in rankings. And we also bump content that has better rankings with like it has a more of a social media impact. So we have a lot of different configurations to be able to read social media like shares like tweets and Facebook shares and LinkedIn, things like that. And we also have suggestions and to be able to do a lot of the stuff we have a plug-in to elastic search to be able to do the custom rankings. So it's like a Java elastic search plug-in. And also I already mentioned that search, the high-performance search server, or you can have a search form point at a different search server that does not go through clone. And that will only support anonymous content. It has prepackaged queries to elastic search that only return anonymous content. So that won't, so that it doesn't, it isn't used when you're, when you're logged into the site, it's only for anonymous users. We have session management and this is done with Redis, like I had mentioned. So you can see all the logged in users on your site and you can log them out or end their sessions. Really nice thing for some of our clients is the auditing. You can see all the people who have done things on your site and what they did. And so you can sort of like, you know, point fingers and say like you did, has different types of auditing that attracts. This is leveraging an elastic search as well. That's pretty fast. And you can export the results into like a CSV if you want, statistics. Yeah. Yeah. Yeah. So it's like logged in, logged out, content edited, lots of different things, whatever we thought was interesting to track. We have, I think it's pretty nice feature. You can log in as another user. So you can like sort of debug permission issues or whatever, see what's going on with the user. You can't do something, you can actually like try it yourself. So some of the other things that we have are, I talked a little bit about the Google analytic integrations with scanning Google analytic data and having that affect your search results. We also have like screens to give you your analytic data and query it within the CMS. You don't have to go to Google. And S3, some really nice S3 integrations where you can automatically push large files off to S3 so they're not in your database. And we also have archiving content in S3 so you can have a bucket in S3 that will have archive content pushed there and then clone will know where it is and it will just redirect to S3 instead of serving it from your site so you can kind of keep your sites a little bit more lean with old content that you don't feel like updating. So SMS for like two-factor auth we have SMS support and that's using Flavio and it's also for like you can do some registration steps to confirm user accounts with SMS. And then like I said, social media, it will scan certain social media platforms to get data on how popular content is and everything. This is an example, analytics screen. I didn't want to show you the whole thing because it's a client. But you can, there's a bunch of different dimensions that you can pull down, aggregate different, and different things and you can do real-time data or historical data or check out social media data. Some other things we do, we have a recycling bin I think I touched on. We have salary integration. If you don't know what salary is, it's being able to do asynchronous tasks so it's not blocking the UI. So any like large copy operations or like video conversion, if we interact with pushing large files over to AWS, we put that all in asynchronous tasks. We override regular, clone, copy and paste operations and things like that. If we say like, are you copying more than 100 things, well then we'll put this into an asynchronous task instead of just performing it right away. Alias management for doing all your redirects and like business metadata, it's like the JSON-LD data, some businesses need that. So what's missing in it? So like this goes into sort of implementation details because everything is mosaic and I didn't talk much about the details of what that means with layouts and mosaic layouts. This is whole another talk. I didn't want to get into sort of nitty gritty stuff here so much but we don't even really use Thazzo, you could but we don't because it's really nice with the way layouts and everything is a tile. And, Castle, you don't need, so you don't need portlets, you don't need default pages. So it kind of makes things a little more simple because everything on the page that's rendered is just a tile. And the content area, there's a bunch of tiles, all the stuff around it is a bunch of tiles. We replace portlets with tiles. We have little tile group managers to manage those. So it essentially feels like portlets but it's still just the same tile infrastructure. These are things we could think about with Plone itself as well. I don't know if anybody would be happy with getting rid of Thazzo. But maybe they realize they don't need it eventually if you have this sort of different way. You still have the theming editor, you still edit your themes in the same editor and everything but you don't need the rules to transform the content as much. All right, so what's in store for the future then? We want, we're going to open source it. We just have to find, we can't just like throw the code out there. It's just, then it'll just make people mad because they won't be able to install it because everything that we have to install is like our own private stuff for like Ansible scripts and everything that we, we can't open source that stuff. So we need to, we need to get to a point where we can feel good about the documentation and the tooling around installing it to be able to solve it. Maybe we could provide a Docker image that people could test it out on. But if anybody wants to test it, we can make a test instance for you to play with as well. Some things that are, that we know about that are on the roadmap is that I have a client that really wants to be able to have integrated chat. We're thinking about, or we're looking into integrating a rocket chat into it, trying. Kind of hard, but ask Sam about it, Sam Schwartz. We still need Mosaic to be better in some circumstances. It's, it's pretty good and the editors are really good at doing some pretty complicated page designs with it, but it's quirky and it's hard to do well. So it still needs some work. We'd like to continue to try to improve that. We'd love to have built-in A-B testing. This is another very difficult thing, especially with caching to do well. Especially if you wanted to A-B test the homepage. Caching is hard. I can see you branching on specific content on the site, but A-B testing the homepage is very difficult. We want to continue to refine the UI. Of course, it's not. I'm not a designer, so we're still working on it. And then keep working on more rich tiles for it. Maybe long-term, pull-net server, make this all angular. I don't know, like scary stuff, right? That was kind of what I wanted to talk about. And then I want to open up for questions to see what you guys think of it. If you have any questions about details, this is your opportunity now and keep annoying me about when stuff is going to be open-source because maybe that will help me to actually do that stuff. Okay. Sean? Yeah. We still do that. We do that as well. Oh, he's asking about portlets with inheritance, how you can have one portlet in one section and have it be on all the sub-items in that section. We do that as well. It's like the code is like 100 lines. It's not that complicated to do. So you just look up the parents and figure out what to display in context and stuff. We might have a few constraints because it might not be as great as the four multi-adaptors of portlet managers and all this stuff. Yeah. Yeah. Yeah. Yeah. Yeah. Yeah. You can do that. It's fine. Does, yeah. Have you ever thought of generating static help for anonymous? Yes. He asked if I ever thought about generating static HTML and just publishing that on S3 instead of this. So your site would just be served on S3 only and every single time that Hager's edited, you would push the S3. It's hard, right? Because you don't know if you add a folder here where that's being pulled in and hundreds of other spots on your site. So you almost have to be continuously pushing data. It's an interesting idea, though. I guess that's, another idea related to that is if you have a CDN where you can push data to, you could just directly push it to your CDN and then be your static storage. You first. Yeah. Maybe, see the thing is it's pretty tightly coupled right now. So I might split it out maybe and that might help get to the full open sourcing part of it. Yeah. Oh, go ahead, I guess. Maybe out or using. No, I mean we kind of ripped Wildcard that media out, but it's similar to what that does. Yeah, it's not using that. Yeah. So he's asking what we're doing for video. There's a Wildcard that media package. We took a lot of what that was doing and put it into CASEL, but it's not the Wildcard that media package. Something different. Oh, did you have a question? Right. Yes, there's a lot of, there's a lot of things I need. We need a React and core and then like even I rewrote the query string widget in React as well because Christian kind of sucks. I was just really buggy, you know, so it's not so buggy anymore and I did some things with Tiny MC as well. So like, yeah, we need React and core and we need to sort of bring some of these things back. So I guess I would just write to Redis cache if I needed any progress reporting. Otherwise it was after you're finished, we send emails out to the user telling them their task is finished. So I should have had a video for that. So what happens in the UI is if you select a copy of folder that has 500 things in it, they'll say, hey, this is a really large folder. We put it in a task. We'll let you know when it's done. And so then they get an email. David? Yes. Yes, we're using React. The React is, the question is, I saw you were using Angular 2, but we were using React right now. So React is really good at creating small components and Angular is really good at creating a whole application. So for our use case, we were plugging in bits here and there and really just small components. Like a lot of our React code is actually patterns that initialize a React component. So that's why we used React. React is really good. Angular is really good. Angular is, if you're going to create a whole CMS app that's in JavaScript, Angular is a better fit. I think. Maybe I'm wrong. We can fight. But so that's just my comment, I guess. Anything else? No? If he's asking about the asynchronous integration into Plone, if that's too much code or could we integrate that into the Plone? I would like to figure out a good way to integrate it into core that is pluggable. So it's not opinionated like mine is. So anything that happened there would be in all those spots where I monkey patch or whatever to make it happen. Those would need to be replaced in Plone core with generic code where you could just hook in and say, hey, I am able to perform an asynchronous task in this case and then be able to do that. So that's something that would need to be developed out. Not there right now. So I kind of lied. So the question was collections. I got rid of them. You're right. The use case that we have for getting rid of collections. We get rid of it most of the time, but we have a feeds folder where you can actually add a collection type to it. That's actually a feed because that's the one thing that we had where you actually wanted a unique URL as if you had a feed URL. Because I was like, otherwise, how do you do that? So I mean, you can still have it. For most of the UI, we have it hidden. We have Selenium tests. We didn't even. Yeah, I don't think we got rid of all the robot tests. We just do plain Selenium and then we have a CI that will test it for the whole stack. Yeah. Yeah. Yeah. Yeah. It's horrible to debug. Yeah, I know. Yeah. Yeah. Right. Thank you. It's just a story. He's asking about using celery. Is there any reason why? Looking back at it now, I probably wish I hadn't, I guess. I don't think it would be hard to switch it out with anything else. Celery is fine, but it's probably more than I want. We need like the foot. It's simple. Yeah. Yeah. Yeah, I agree. That's probably something that we can change eventually. David. You might be right. There's some people though, if they try something out and all this is promised and like they can't freaking install it or something, they'll be like, oh, this is stupid. This is a lie or something. Yeah. Yeah. Yeah. Is there a question over here? No. Not at all. Sorry. We've done it, but it was like a specific client thing. It was all custom scripts. Yeah. Really hard. Really hard. Miko. I haven't done any tech. He's asking how heavy what the resources. I haven't tested on any like minimal system requirements or anything like that. But yeah, you want decent servers to be able to do this and. Can you like test some more? We don't run it on Travis. I don't know. It runs in a vagrant. Slowly. Yes, I do. I do it all in a vagrant machine. That's how we do it. One vagrant machine. One vagrant machine. Right. Well, any other questions you can ask later after as well? Thank you for your time. Thanks for coming.
 Okay, I think we're going to get started.  But maybe I would start with a little story.  Jens Klein and I were talking about castles a little bit.  They just had the castle sprints like a couple of months ago.  And it's like at this sort of castle that's been built and added on over the years.  Maybe a little bit more plonish type of castle, like not so symmetrical like this.  And there's like different types of castles that we're going to talk about.  But I've never actually been to a castle.  And yet here I am going to talk to you about building a castle of sorts.  Anyways, wildcard.  Well here, why don't I start with a little bit about myself.  I work at wildcard corp.  Been doing plon, Python, web solutions, high secure web solutions for  like federal agencies for many years now.  And I've been working on plon slightly more than I've been working at wildcard.  I'm a core contributor.  I lead the security team.  I've been on the UI team and framework teams in the past.  And so this is a little, yeah.  And the accordion, okay, that's during the Arnhem anniversary sprint.  Ramon plays it, so he was trying to teach me a little bit, which I failed.  So what is CastlesCMS?  It's, I guess, what we've been saying is it's a distribution of plon.  Something that wildcard has been working on for the past six months, I guess.  And it's a package of things that we've wanted to do with plon.  So it sort of packages everything up that we've done in the past.  And it's sort of one nice thing that we can deploy for  our customers and sell and market to our customers.  It's for large, complex websites.  It's not maybe for the small site.  It's for lots of content editors and sites that you need.  You have a lot of content to manage.  And it's built on top of plon.  It's just our customizations of plon and then you get Castle.  So it's, and I'll kind of talk, I'll talk about what some of those things are and  how we did it and what the future is.  And so I want to get through a lot of the features, but  I always try to set you up here.  And so we can get you to understand mostly what is provided with Castle.  It is not a fork.  It won't ever be a fork of plon.  We would, we'll never survive if Castle is ever a fork.  We want it sort of, we have to work within the community.  And so I'll talk more about future goals of what it's gonna,  what's gonna happen with it and how we're going to sort of hopefully use it  within the community to continue to innovate with plon.  And so within plon, you gotta think of like,  there's a lot of different people from all over the world.  We all have different opinions of how we want plon to do certain things.  And so this Castle is a very opinionated version of plon.  A lot of things we do, maybe like Hector would really be angry about and  Andreas Jung and, and so it's a way for Wildcard to do like the really opinionated  things that we want to do with plon.  And maybe if we get enough people convinced like this is the way to do  things, we can incorporate that back into the plon.  Somewhere to innovate, so try new ideas,  to try things that maybe are a little bit controversial.  Things that we want to do and maybe aren't so easy to package into add-ons  always for plon.  And if you have all these various add-ons,  you have to be able to integrate the add-ons together.  And sometimes that process of having a huge add-on ecosystem is really hard to  manage for someone who wants to deploy these advanced features on many,  many different things like on a package.  More than that, performance is really important to us because we have large  sites that can get hit by DDoS attacked and things like that.  So we have integrations that really help with performance.  Those include like Cloudflare where we,  this is really the only CDN we support, but we have like invalidation support and  support for configuration with the API of Cloudflare.  So I have Elasticsearch support out of the box.  So all of your content is indexed by Elasticsearch.  And when you go to the search form, it all goes through Elasticsearch.  In addition to just regular indexing and searching,  we have an asynchronous server implementation of the search API.  So you can actually have all your search requests go through a different server  than clones so you can handle a lot more.  Because these are going to be uncached requests, so  you need Dale to have a lot more performance out of your search form out of  any other parts of your site.  We also heavily leverage Redis.  This is for application level caching.  Redis is nice because if you cache things in your application level,  you can share the cache between multiple threads.  And we also leverage things that you would maybe normally write to the ZODB,  but are sort of volatile a little bit more.  We use Redis instead of the ZODB to store those things.  It's like sessions and  storing information on what users are doing on the site.  We also leverage ZRS for more performance so  you can replicate to multiple maybe data centers or  just so you have multiple copies of the ZO server so  you can handle more requests.  And then how do we, so we have some, those are kind of setting the stage of  some of the things we're integrating and we're doing.  How did we integrate all this?  Well, we leveraged ZCA adapters and  we kind of overrided a lot of the things in Plone that we needed to.  Zope component architecture is really nice for most of those things.  So it was easy to do some and also like Z3C that,  what was it again now I forgot the name of it.  The one that you can un-configure ZCML,  un-configure Z3C that un-configure.  And then just like a lot of React and HTML JavaScript giving you a UI.  So opinionated UI of how things, how Plone should be able to,  how you should use Plone.  And then when we couldn't use ZCA, we use monkey patching.  That's with collect that monkey patcher and just manually patching.  So this is an example of patching search results.  So it doesn't pay attention to trashed search because we have  recycling bin support.  Security is really important for us too.  So some of the things we implemented with security are integrated to factor off.  We have this thing called an application shield.  So if you turn it on, you can't access any of the content on the site until you've  logged in first, lockout attempt.  And so if you enter your password in too many times, it will wrong, it will lock you out.  Stripping metadata from files that are uploaded automatically and root user restrictions.  So you can only log in with a root user of Zope at the root of Zope.  It doesn't allow you to log in, let's say the root admin user in the Plone site itself.  So it's just a little bit more secure so you don't have, you know,  able, like the super users of phone are unable to log in directly to a site.  And so, I'm trying to set the stage and then I'll just,  there's going to be a lot of demos and I'll try to explain things to demos.  I think people like demos and see things and it looks fun and stuff.  This is our toolbar and we kind of, we moved notifications into its own area and  we have user actions, site actions and then everything content related to us on the left.  And we have no drop downs or drop, we have no like second level drop downs on the left.  Everything happens in an overlay if you do actions for context type actions on the left.  Adding content is a little different.  You get an overlay and you can kind of see interactively what your URL and  your folder structure is going to be.  So it's a lot easier for users to know what's going on when they're creating content,  where it's going to be and it will automatically create folders for you if they don't exist.  And you can have it public by default.  It has the workflow state there, right there for you.  And another nice thing about it's, yeah, so you can customize ID and  everything will automatically generate it by default.  But you can create and edit immediately or  you can create multiple content and then edit it later.  So it keeps it and I can create another page or I can go and view and edit it.  And then when you're editing, everything is Mosaic.  We don't have this default pages, we don't have the display menu.  Everything is Mosaic for our users.  So they start editing a page immediately, they're in Mosaic.  Uploading is similar but you have an upload tab.  It's important for our type of clients that when they upload things,  they're forced to enter some metadata and this is configurable, which is forced.  But you can set constraints on what things they need to enter.  And they also have focal point support, so you can't really see super well here.  But if you select a location on the image,  you can say where the focal point of the image is.  So when you display the image in certain places on your site,  it will auto crop to that focal point depending on the width and  height dimensions you're displaying the image as.  I'll show more of that in a bit here.  The workflow menu, we have a built in quality check that does some  508 compliance and making sure you have a nice title description.  And it's all in one menu, so  hopefully it encourages the users to use the commenting when they're  actually changing workflow states.  Like I said, everything is Mosaic.  So this means we have no display menu, no default pages cuz that's really confusing  for users to have to create a folder and set a default page for that folder.  We have no collections because collections just become listings on pages.  And it's just kind of like your typical Mosaic  content creating experience here.  We kind of updated the content selection widget as well.  You'll see it more in some of the other examples.  So you have a nicer browser for browsing content on your site.  Video tiles, all videos are automatically converted to web compatible formats when  they're uploaded and that's done asynchronously so it doesn't affect the  processing of the site.  We have, the videos are all responsive so  they use different sizes for different mobile devices.  And also has support for YouTube which I think it will show here.  Yes, yes.  It does most of them pretty good.  It has trouble with, I haven't figured out how to convert it better but  it has trouble with MOVs making them look nice when you convert them.  Sorry, had to do the New England Clam Charter thing.  I think it's the white.  Only some people would probably know that joke.  And we have mapping with all of our content.  So a mapping tile and also all content can have mapping coordinates on it.  So you could just select items on your sites or you can add your own markers  directly and they'll show up on the map and you can add descriptions and click on them.  How many of you are familiar with Green Bay?  My hometown, so that's where Kim lives, Kim, New England.  Osh gosh.  Osh gosh.  Yeah, you get the point, right?  Focal point images are really cool.  It allows you to not have to, your users deal with cropping, all the different sizes and  everything or what they'll do is upload multiple images so they're the same thing.  You just have them displayed differently in different locations.  You just click on where in the image you went to focal point and then it will focus on that area.  Our particular tile that we use for it gives you different display types.  The display is portrait or square or landscape.  And so you can see now it's focusing on the tail but if I go back to the beak, then I'll  focus there.  Yeah, yeah.  And so it's doing it client side.  I mean you're setting the focal point and storing it in the database but it's doing  it with JavaScript to place the image where it needs to be.  And so what you can also do with this and what CASEL does is you can load initial smaller  images for like mobile devices and stuff and if you have a larger screen you can scale  up depending on what size you need to fit the dimension.  Anyways, yeah.  We also have some social media tiles.  This is just sort of like tweets, timelines, Facebook posts or Facebook pages and I think  we have Pinterest and it's just maybe easy stuff but it's nice to have it integrated  out of the box.  So this is all of the tiles, the JavaScript behind them is integrated with patterns.  So everything is a pattern inside those tiles more or less and so how it updates while you're  dragging or when you're dropping them is it's re-initializing the HTML pattern inside that.  Alright, we also have a preview model where you can quickly see the different sizes.  So searching is kind of talked about already.  Using an elastic search is really fast.  You can scale really well.  You can get rid of the full text indexes and clone itself.  We also support search result pinning and Google Analytics integration to the point where  it will scan Google Analytics data to see which pages are the most popular and sort of give  them, bump them up in rankings.  And we also bump content that has better rankings with like it has a more of a social media  impact.  So we have a lot of different configurations to be able to read social media like shares  like tweets and Facebook shares and LinkedIn, things like that.  And we also have suggestions and to be able to do a lot of the stuff we have a plug-in  to elastic search to be able to do the custom rankings.  So it's like a Java elastic search plug-in.  And also I already mentioned that search, the high-performance search server, or you  can have a search form point at a different search server that does not go through clone.  And that will only support anonymous content.  It has prepackaged queries to elastic search that only return anonymous content.  So that won't, so that it doesn't, it isn't used when you're, when you're logged into  the site, it's only for anonymous users.  We have session management and this is done with Redis, like I had mentioned.  So you can see all the logged in users on your site and you can log them out or end  their sessions.  Really nice thing for some of our clients is the auditing.  You can see all the people who have done things on your site and what they did.  And so you can sort of like, you know, point fingers and say like you did, has different  types of auditing that attracts.  This is leveraging an elastic search as well.  That's pretty fast.  And you can export the results into like a CSV if you want, statistics.  Yeah.  Yeah.  Yeah.  So it's like logged in, logged out, content edited, lots of different things, whatever  we thought was interesting to track.  We have, I think it's pretty nice feature.  You can log in as another user.  So you can like sort of debug permission issues or whatever, see what's going on with  the user.  You can't do something, you can actually like try it yourself.  So some of the other things that we have are, I talked a little bit about the Google analytic  integrations with scanning Google analytic data and having that affect your search results.  We also have like screens to give you your analytic data and query it within the CMS.  You don't have to go to Google.  And S3, some really nice S3 integrations where you can automatically push large files off  to S3 so they're not in your database.  And we also have archiving content in S3 so you can have a bucket in S3 that will have  archive content pushed there and then clone will know where it is and it will just redirect  to S3 instead of serving it from your site so you can kind of keep your sites a little  bit more lean with old content that you don't feel like updating.  So SMS for like two-factor auth we have SMS support and that's using Flavio and it's  also for like you can do some registration steps to confirm user accounts with SMS.  And then like I said, social media, it will scan certain social media platforms to get  data on how popular content is and everything.  This is an example, analytics screen.  I didn't want to show you the whole thing because it's a client.  But you can, there's a bunch of different dimensions that you can pull down, aggregate  different, and different things and you can do real-time data or historical data or check  out social media data.  Some other things we do, we have a recycling bin I think I touched on.  We have salary integration.  If you don't know what salary is, it's being able to do asynchronous tasks so it's not  blocking the UI.  So any like large copy operations or like video conversion, if we interact with pushing  large files over to AWS, we put that all in asynchronous tasks.  We override regular, clone, copy and paste operations and things like that.  If we say like, are you copying more than 100 things, well then we'll put this into  an asynchronous task instead of just performing it right away.  Alias management for doing all your redirects and like business metadata, it's like the  JSON-LD data, some businesses need that.  So what's missing in it?  So like this goes into sort of implementation details because everything is mosaic and I  didn't talk much about the details of what that means with layouts and mosaic layouts.  This is whole another talk.  I didn't want to get into sort of nitty gritty stuff here so much but we don't even really  use Thazzo, you could but we don't because it's really nice with the way layouts and  everything is a tile.  And, Castle, you don't need, so you don't need portlets, you don't need default pages.  So it kind of makes things a little more simple because everything on the page that's rendered  is just a tile.  And the content area, there's a bunch of tiles, all the stuff around it is a bunch of tiles.  We replace portlets with tiles.  We have little tile group managers to manage those.  So it essentially feels like portlets but it's still just the same tile infrastructure.  These are things we could think about with Plone itself as well.  I don't know if anybody would be happy with getting rid of Thazzo.  But maybe they realize they don't need it eventually if you have this sort of different  way.  You still have the theming editor, you still edit your themes in the same editor and everything  but you don't need the rules to transform the content as much.  All right, so what's in store for the future then?  We want, we're going to open source it.  We just have to find, we can't just like throw the code out there.  It's just, then it'll just make people mad because they won't be able to install it because  everything that we have to install is like our own private stuff for like Ansible scripts  and everything that we, we can't open source that stuff.  So we need to, we need to get to a point where we can feel good about the documentation  and the tooling around installing it to be able to solve it.  Maybe we could provide a Docker image that people could test it out on.  But if anybody wants to test it, we can make a test instance for you to play with as well.  Some things that are, that we know about that are on the roadmap is that I have a client  that really wants to be able to have integrated chat.  We're thinking about, or we're looking into integrating a rocket chat into it, trying.  Kind of hard, but ask Sam about it, Sam Schwartz.  We still need Mosaic to be better in some circumstances.  It's, it's pretty good and the editors are really good at doing some pretty complicated  page designs with it, but it's quirky and it's hard to do well.  So it still needs some work.  We'd like to continue to try to improve that.  We'd love to have built-in A-B testing.  This is another very difficult thing, especially with caching to do well.  Especially if you wanted to A-B test the homepage.  Caching is hard.  I can see you branching on specific content on the site, but A-B testing the homepage is  very difficult.  We want to continue to refine the UI.  Of course, it's not.  I'm not a designer, so we're still working on it.  And then keep working on more rich tiles for it.  Maybe long-term, pull-net server, make this all angular.  I don't know, like scary stuff, right?  That was kind of what I wanted to talk about.  And then I want to open up for questions to see what you guys think of it.  If you have any questions about details, this is your opportunity now and keep annoying  me about when stuff is going to be open-source because maybe that will help me to actually  do that stuff.  Okay.  Sean?  Yeah.  We still do that.  We do that as well.  Oh, he's asking about portlets with inheritance, how you can have one portlet in one section  and have it be on all the sub-items in that section.  We do that as well.  It's like the code is like 100 lines.  It's not that complicated to do.  So you just look up the parents and figure out what to display in context and stuff.  We might have a few constraints because it might not be as great as the four multi-adaptors  of portlet managers and all this stuff.  Yeah.  Yeah.  Yeah.  Yeah.  Yeah.  Yeah.  You can do that.  It's fine.  Does, yeah.  Have you ever thought of generating static help for anonymous?  Yes.  He asked if I ever thought about generating static HTML and just publishing that on S3  instead of this.  So your site would just be served on S3 only and every single time that Hager's edited,  you would push the S3.  It's hard, right?  Because you don't know if you add a folder here where that's being pulled in and hundreds  of other spots on your site.  So you almost have to be continuously pushing data.  It's an interesting idea, though.  I guess that's, another idea related to that is if you have a CDN where you can push data to,  you could just directly push it to your CDN and then be your static storage.  You first.  Yeah.  Maybe, see the thing is it's pretty tightly coupled right now.  So I might split it out maybe and that might help get to the full open sourcing part of it.  Yeah.  Oh, go ahead, I guess.  Maybe out or using.  No, I mean we kind of ripped Wildcard that media out, but it's similar to what that does.  Yeah, it's not using that.  Yeah.  So he's asking what we're doing for video.  There's a Wildcard that media package.  We took a lot of what that was doing and put it into CASEL, but it's not the Wildcard that media package.  Something different.  Oh, did you have a question?  Right.  Yes, there's a lot of, there's a lot of things I need.  We need a React and core and then like even I rewrote the query string widget in React as well because  Christian kind of sucks.  I was just really buggy, you know, so it's not so buggy anymore and I did some things with Tiny MC as well.  So like, yeah, we need React and core and we need to sort of bring some of these things back.  So I guess I would just write to Redis cache if I needed any progress reporting.  Otherwise it was after you're finished, we send emails out to the user telling them their task is finished.  So I should have had a video for that.  So what happens in the UI is if you select a copy of folder that has 500 things in it,  they'll say, hey, this is a really large folder.  We put it in a task.  We'll let you know when it's done.  And so then they get an email.  David?  Yes.  Yes, we're using React.  The React is, the question is, I saw you were using Angular 2, but we were using React right now.  So React is really good at creating small components and Angular is really good at creating a whole application.  So for our use case, we were plugging in bits here and there and really just small components.  Like a lot of our React code is actually patterns that initialize a React component.  So that's why we used React.  React is really good.  Angular is really good.  Angular is, if you're going to create a whole CMS app that's in JavaScript, Angular is a better fit.  I think.  Maybe I'm wrong.  We can fight.  But so that's just my comment, I guess.  Anything else?  No?  If he's asking about the asynchronous integration into Plone, if that's too much code or could we integrate that into the Plone?  I would like to figure out a good way to integrate it into core that is pluggable.  So it's not opinionated like mine is.  So anything that happened there would be in all those spots where I monkey patch or whatever to make it happen.  Those would need to be replaced in Plone core with generic code where you could just hook in and say, hey, I am able to perform an asynchronous task in this case and then be able to do that.  So that's something that would need to be developed out.  Not there right now.  So I kind of lied.  So the question was collections.  I got rid of them.  You're right.  The use case that we have for getting rid of collections.  We get rid of it most of the time, but we have a feeds folder where you can actually add a collection type to it.  That's actually a feed because that's the one thing that we had where you actually wanted a unique URL as if you had a feed URL.  Because I was like, otherwise, how do you do that?  So I mean, you can still have it.  For most of the UI, we have it hidden.  We have Selenium tests.  We didn't even.  Yeah, I don't think we got rid of all the robot tests.  We just do plain Selenium and then we have a CI that will test it for the whole stack.  Yeah.  Yeah.  Yeah.  Yeah.  It's horrible to debug.  Yeah, I know.  Yeah.  Yeah.  Right.  Thank you.  It's just a story.  He's asking about using celery.  Is there any reason why?  Looking back at it now, I probably wish I hadn't, I guess.  I don't think it would be hard to switch it out with anything else.  Celery is fine, but it's probably more than I want.  We need like the foot.  It's simple.  Yeah.  Yeah.  Yeah, I agree.  That's probably something that we can change eventually.  David.  You might be right.  There's some people though, if they try something out and all this is promised and like they can't  freaking install it or something, they'll be like, oh, this is stupid.  This is a lie or something.  Yeah.  Yeah.  Yeah.  Is there a question over here?  No.  Not at all.  Sorry.  We've done it, but it was like a specific client thing.  It was all custom scripts.  Yeah.  Really hard.  Really hard.  Miko.  I haven't done any tech.  He's asking how heavy what the resources.  I haven't tested on any like minimal system requirements or anything like that.  But yeah, you want decent servers to be able to do this and.  Can you like test some more?  We don't run it on Travis.  I don't know.  It runs in a vagrant.  Slowly.  Yes, I do.  I do it all in a vagrant machine.  That's how we do it.  One vagrant machine.  One vagrant machine.  Right.  Well, any other questions you can ask later after as well?  Thank you for your time.  Thanks for coming.
Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_0_71.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_72_167.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_168_5435.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_5436_5567.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_5568_6275.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_6276_7043.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_7044_9359.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_9360_9671.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_9672_10439.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_10440_10751.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_10752_10943.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_10944_13271.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_13272_13523.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_13524_14903.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_14904_15155.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_15156_15215.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_15216_16187.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_16188_16547.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_16548_18755.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_18756_19235.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_19236_20171.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_20172_20327.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_20328_21611.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_21612_22415.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_22416_22523.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_22524_22619.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_22620_22679.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_22680_23015.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_23016_23099.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_23100_24407.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_24408_25115.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_25116_25295.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_25296_25367.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_25368_25475.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_25476_25739.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_25740_26231.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_26232_27443.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_27444_29579.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_29580_30491.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_30492_30815.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_30816_36647.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_36648_37823.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_37824_40247.png Day_3__Building_a_Castle__by_Nathan_Van_Gheem_F1g0VNDuujQ_40248_57558.png