Combating the onslaught of features
Published March 6, 2026
This video features Sage and Thibaud Colas at Wagtail Space.
Core contributors Sage and Thibaud share their recent work on two upcoming improvements to Wagtail.
Automatically transcribed, so expect mistakes in names and technical terms.
Speaker 1: We're live!
Speaker 2: Dun-da-da!
Speaker 1: I think maybe. I'm not sure.
Speaker 2: I think we might be. I mean it says YouTube at the top of my Zoom window.
Speaker 1: Yay! Have you heard of this thing called the millennial pose stage?
Speaker 2: Not sure if I have.
Speaker 1: Okay. It's something uh in the I guess vlogging social media video space where apparently millennials have this thing when it's like you know the meta of the influencer world.
Speaker 2: Oh, the meta, okay where
Speaker 1: The millennials when they start making a video they pause for like a second or two to make sure that the video has started recording before they actually start with the SPL Whereas the younger generations, they haven't been, you know, grow, they haven't been raised thinking that you have to wait for the camera to start rolling. You can just hit and talk right away.
Speaker 2: Do you have to? I mean, I don't know. Like I know that with some cameras, like it doesn't immediately record. So you might have like the first um split second of the audio not coming through.
Speaker 1: Honestly, like yes, but I tried with my smartphone and it was definitely much faster than my brain. Was expecting it to be.
Speaker 2: Probably isn't as much of a problem these days.
Speaker 1: Yeah, I definitely feel like um there is such a thing as how big of a problem it is, you know, I can't tell you, but Anyway, how are you?
Speaker 2: I'm good, thanks. How are you?
Speaker 1: I'm good too. I'm looking forward to, you know, the break. Time with uh uh not much to do except for Relaxing, resting, Christmasing.
Speaker 2: When are you finishing up?
Speaker 1: Uh next week on Monday. I have one extra day. You're finishing up today, right?
Speaker 2: Yeah. What are you doing on Monday? No one is going to be in.
Speaker 1: I think there'll be a few people. I'm expecting to spend lots of time on our latest rich text improvements. I only get like once a year or two to geek out on rich text uh UX. So always happy to be in that mindset. But yeah, for today, we thought we'd give a review of what we've been working on this week, I suppose. Um block settings, block form layouts, block groups, how do you call them these days?
Speaker 2: Well, we'll see. Let's see. I I made something called a block group and you can figure it through form layout, but for all intents and purposes. You can just call it block settings, I guess.
Speaker 1: Honestly, Sage, like you have done a lot and uh it feels like what you've added support for is way more than most Wagtail sites are to need. Let me see if I can get my my Wagtail demo up and running so we can look at this together. Um I use VS Code today and I'm gonna screen share.
Speaker 2: You not use it every day?
Speaker 1: Well, it's good that you ask. I actually change IDEs a lot these days just to try different takes on the AI integrations.
Speaker 2: But they're all VS Code, right?
Speaker 1: They're not all VS
Speaker 2: Code. It's all VS Code always has been.
Speaker 1: I got uh I got a PyCharm license as well.
Speaker 2: Yeah.
Speaker 1: We had our um Tjango Software Foundation PyCharm campaign a few weeks ago and I thought, oh I ought to give it a proper go with uh their journey. I had like taken a peek in the past, but I think I've I I ought to spend more time than that. Yeah. And even in VS Code, you know, there's so many cool extensions these days to do this or that AI workflow that I feel like it's changing fast. Um yeah, anyway, I won't go over them right now. Uh did we merge your pull request, Sage? We haven't yet. Should we look at that first? Do you have? You haven't?
Speaker 2: I haven't.
Speaker 1: Okay. Sorry, taking a step back. We get to merge this together. How cool is that?
Speaker 2: Oh
Speaker 1: It was more than a week ago that you worked on that.
Speaker 2: Yeah, it's been a while.
Speaker 1: Yeah, it's just Matthew and I catching up with the code review.
Speaker 2: But also because I I usually put out a draft PR as I work on it. So yeah, when I made that PR, it wasn't ready for review.
Speaker 1: Good practice right there. Yeah, the main thing I wanted to double check is just the release notes because it is rare for us to add those in the PR. And I would normally add them manually. So we're just missing the change in the changelog. txt file.
Speaker 2: Yeah.
Speaker 1: And I think uh we can add that. um old school directly once I've hit emerge.
Speaker 2: We're hitting the big green button today.
Speaker 1: Boo.
Speaker 2: Is that how it goes? Did you review it?
Speaker 1: I um I didn't review your tests super carefully.
Speaker 2: Oh
Speaker 1: not all of the tests at least, but um enough to know there's definitely a net improvement. Uh yeah, I I think you know as far as things that I skimmed on, uh you've moved a lot of code to TypeScript, Sage. And there's lots of code in there that is that is TypeScript technically, but not as typed as I normally expect.
Speaker 2: Yeah. Uh what
Speaker 1: do you have to say for yourself?
Speaker 2: Oh yeah, I I wasn't sure between like doing a complete refactoring or just adding the bits that I uh that are necessary to implement this because um I think I would suggest reviewing this on a commit-by-commit basis so you know what's happening. Because there is definitely some code that has already been there and I just, you know, I didn't touch because I want to minimize the risk of breaking stuff. But yeah, um uh I think I initially wrote a bit more TypeScript than uh what you see currently, but then I felt like, well, I didn't originally write this code and If the original author
Speaker 2: would come back to this part and then suddenly it's all typed, it might be a bit difficult to regain that memory of code uh of the code base. So yeah, I I try to minimize that. But for the new stuff I try to type it as much as possible.
Speaker 1: Yeah, this is tricky to find the right balance. I didn't check in um commit history whether you'd done it in a way that there was a move of the files so that the history would be preserved through the blames.
Speaker 2: Yeah, so It's the refactor struck block code to TypeScript. That's uh just a few lines above. Yeah. It's literally
Speaker 1: Yay.
Speaker 2: And if you look at the changes, yeah, just adding the declarations.
Speaker 1: Great. Well, yeah, you know, I um I have been um changing linters as well lately and uh I'm a bit annoyed with it because I don't know if you spend much time with biome as a replacement for Pratier and East Lint. They both kind of expect to be set up for all of your projects and they lean.
Speaker 2: Oh yeah, the VS Code extension tends to be noisy if you don't have the config file.
Speaker 1: Yeah, exactly. And um I'm too lazy to spend the time to configure it per project for the one that I don't want it to run on. Um so basically Biome is telling me about all of the times you've used um any in your TypeScript files. Um I feel like
Speaker 2: if You don't have a biome configuration in your workspace. It shouldn't try to do its thing, but I don't know. I think usually that's less like the convention, I suppose. Like you the pre prettier and ESLint extensions. I don't think they would run if you have if you don't have the configuration. Even though I think the extensions do ship with um its own packaged version if you if you don't have it installed and you can toggle which to use. But yeah.
Speaker 1: I think I think Pretia does Does run without configuration, but I don't actually know 100%. Maybe it's just editor config that it detects not the um I mean it
Speaker 2: can run, but at least it shouldn't
Speaker 1: Yeah, yeah, yeah.
Speaker 2: Yeah, it shouldn't be noisy about it.
Speaker 1: Yeah. Good question. Yes, so we have a changelog entry to add and then we'll get testing your new features. I think I keep it pretty simple. Use your title from the main release notes. Add support for And it knows to complete to your name.
Speaker 2: Oh wow.
Speaker 1: Sage, our block expert.
Speaker 2: I'm in the dataset.
Speaker 1: Add changelog entry for
Speaker 2: know it by heart
Speaker 1: Spend a surprising amount of time um remembering pull request numbers.
Speaker 2: I always go back and forth with the web browsers just to copy the numbers.
Speaker 1: It would be nice if um I had a better pull request.
Speaker 2: Oh no. You need to clean up those tags on your local machine. Oh no
Speaker 1: I'm surprised that um they're showing up today in particular. Do you remember the Git one liner to delete remote tags?
Speaker 2: I don't. I usually just I think you need this you still need to push, yeah. So I usually just delete something
Speaker 1: like that.
Speaker 2: I would I would just use GitHub UI.
Speaker 1: Yeah. We'll get to that um later. Um yeah good catch. I don't know why I still had those and why they show up today in particular. Okay, so we have our local copy with your changes in and uh you have set up a test project for us to be able to
Speaker 2: yep
Speaker 1: try all those new settings more easily Thank you, Sage.
Speaker 2: Can you guess how I set it up?
Speaker 1: Should we take a look at the code?
Speaker 2: I think yeah.
Speaker 1: What do we have in there?
Speaker 2: It's just your basic uh Wagtail start template. But
Speaker 1: it's all on the homepage.
Speaker 2: Yes.
Speaker 1: Oh he adds his blocks in the models. poi. Uh I feel like it's nicer in the single window.
Speaker 2: Oh no, I just realized it for some reason the imports are duplicated.
Speaker 1: Oh now I can guess how you've done this. The level of care for the crafts is getting dangerously low We have Daminola watching the stream today and one of our uh well-established contributors and he must be table flipping right now. How dare you duplicate your imports, Sage?
Speaker 2: What's with all these comments?
Speaker 1: That's a lot of comments for a human to write by hand.
Speaker 2: With the formatting as well.
Speaker 1: How did you prompt it?
Speaker 2: Oh, that's a good question. And it might somewhat be related to the next thing we'll talk about, but I basically put all the new documentation for the feature and then tell it please um write the blocks for my model to test all the possible combinations of of this feature
Speaker 1: That's uh that's interesting. All the possible combinations, that's definitely something that uh I think it's tricky for for fleshy coders like humans. I have a feeling that when I do this No, it's easy to think of the corner cases, but sometimes they're so deep and you know corners of corners of cases that you make a bit of a calculus that okay this one I'll just Blissfully ignore and it comes.
Speaker 2: You can also use the I think you call it the Swiss cheese technique or something.
Speaker 1: Remind us what's the Swiss cheese technique?
Speaker 2: So, you know, instead of all possible combinations, you know how cheese is have holes?
Speaker 1: So
Speaker 2: you make it so that if you were to make something pass through the holes it will eventually be caught at one slice there's no hole that will pass through all of them I don't know if that makes sense. I think it it it's easier to see with with uh with the illustration.
Speaker 1: So the illustration, we have your sequence of blocks and we have a person block.
Speaker 2: Oh, I forgot to update the value of the alt tags in the first one. Uh the first block, not this one. I originally used my photo and then okay. I'm gonna I'm going to put this in a public repo and I'll I'll just use a different one.
Speaker 1: Did you create the content yourself?
Speaker 2: I did, yeah. I I mean I basically just add a few blocks and then upload an image and fill it in. That's it.
Speaker 1: Nice. Okay, so yes, we're looking at um a person block that has quite a complex layout, Sage.
Speaker 2: Yeah.
Speaker 1: What did you do there?
Speaker 2: I think under the hood it's still just a single struck block, if I remember correctly.
Speaker 1: Um should we open the the code side by side?
Speaker 2: Yeah, I think that would be helpful.
Speaker 1: Um lame How do you pronounce your GitHub username, Sage?
Speaker 2: I don't know. I think whatever the first one that comes to your mind, that's the correct one.
Speaker 1: And person block is the strike block with A lot of um a lot of sub blocks, but definitely something that is common in the Wactor world. Uh and it is just like a flat a flat sequence of sub-blocks.
Speaker 2: There is one nested struct block technically within each block. That's the Wagtails uh built-in image block, but it contains the image, the decorative Boolean, and the alt tags. But other than that, it's um internally uh other than that one block, it's just a flat list of blocks.
Speaker 1: And you've added some structure via your new support for block settings, or I guess specifically here, just arbitrary layouts of how those block fields are presented in the page editor. The block group API. So top level, we have a blog group, we have a photo block which is the image block okay then another group Hmm, interesting. How do you decide which attributes to put in what order here? I'm surprised you don't have heading before children.
Speaker 2: That's a good question. Um so if you look at the API, it's very similar to Whitetails Panels API. Um so yeah I try to I mean I guess I also think of maybe in the future we want to support the different types of UI components that are used to render these um for model fields we call them panels. Um
Speaker 1: Yeah.
Speaker 2: Yeah. So we have things like you know tabbed interface or um field throw panel where the fields will be displayed side by side instead of um going down and or just multi-filled panel for grouping the the panels and yeah in this case the children goes first So but yeah if if you use keyword arguments you can put the heading first if you want. So um yeah I just try to follow the existing API for that
Speaker 1: Why not then have um positional arguments for the children?
Speaker 2: Oh it's it this is just the example. If you if you omit the children um and use it as a positional argument, that that works too In this case, I just wanted to be explicit. Or I guess to be more precise, that's how the uh the AI did it. Or maybe also because I wrote it that way in the documentation.
Speaker 1: Yeah, yeah, that's exactly what I'm getting to. Um I feel like exactly how you put it in the docs is definitely gonna influence Which style people decide to write.
Speaker 2: will also contain a list of block names or block groups. And if you don't have the children explicitly, it might be difficult to see okay which blocks go to the children and which blocks go to the settings
Speaker 1: Yeah, okay. So that's this example um right there that you have them side by side.
Speaker 2: Yep And it's nice that children and settlings have the same amount of characters. I love it when that happens.
Speaker 1: Yes. That right there is great design, making sure that you have the exact same character length for things that will be so much easier to look at if aligned
Speaker 2: Yeah, it's a little things.
Speaker 1: Honestly, like you say not important, but I feel like um There's definitely a lot of
Speaker 2: little things that make you feel good about how you write it, even though it doesn't matter in the end.
Speaker 1: Yeah. I think it does matter. You spend a lot of time looking at code and looking at diffs of code and You know, like depending on how the APIs are structured, it influences the diffs that you get a lot one way or the other. Um I don't know if we'll find a good example in here, but I think in particular things that tend to have lots of um yeah white space changes is a good one. Um Maybe in the future we have like more semantic diffing that is less affected by this. But right now we really don't. And I think it does make a good deal of a difference. Anyway, so yeah, much more complex uh
Speaker 1: or I guess granular support for customizations Before we did have these custom form templates. So I suppose if you really wanted, you could do something like what you've just set up without it being in Wacted Core. But those custom form templates, they're really like low level and we don't necessarily want to encourage anyone to override the rendering to such a great degree.
Speaker 2: Yeah, as you can see here, it just looks ugly. Yeah, um I I think the AI just spat out inline styles to at least add some colors. Um and in some cases as you can see here it uses emojis instead of icons. But yeah, um yeah so you can technically already have something like this, but Yeah, it would be nice if we just provide support out of the box so you don't have to worry about writing separate separate templates and then keeping it up to date if Wagtail's mechanism ever changes
Speaker 1: Yeah. That's a very common design choice for us right there is at what uh degree of abstraction to have those APIs to encourage people to add specific patterns And yeah, so um the groups, the collapsible groups, that's our usual panels components, which you've tweaked a bit, I assume, to make it work for more arbitrary combinations. And uh then settings. Ooh. So they're hiding at the top here and when you open them they push down. the other groups and blocks within the
Speaker 2: Yeah, the the children's blocks. Yep. Yeah. Obviously, we still need to um do some work on the styling to indicate whether it's expanded or not. and maybe have a better separation between the settings blocks and the children blocks. So I think that might be one for a follow-up PR. But we need to consult with our designer first.
Speaker 1: Yep. I don't think it needs necessarily a ton, but um Yes, certainly a bit. I expect. So if I expand all this gonna expand the settings as well?
Speaker 2: I made it that way, but I wasn't sure if we should, so we could take it out if we want.
Speaker 1: I think the workflow here. So when you load the page, we don't retain this, right? Yeah. So I think what people tend to do is they go collapse all and then they'll gradually only reveal the things that they care about. I don't think it's that common for people to decide to expand it all because it is overwhelming. So you arrive on the page, whichever default default state it is. you collapse all and you start revealing specifically the thing that you're after um editing wise And I am um hoping that in the future I will be able to do this. from the preview of the page perhaps.
Speaker 1: Click a point and it shows you exactly in the form where you should be looking. But right now you just have to guess based on your understanding of the contents, based on the little summaries as well. Uh nice work, Sage.
Speaker 2: Thank you.
Speaker 1: I think lots of people will find this tremendously helpful. I have a really nice segue into our next topic if you if you'll allow me.
Speaker 2: Yeah.
Speaker 1: Our guide websites. I have been working on. Ooh. What's up with that? I have been working on um better support for um LLMs, AI models. to use the content of the site and guide people towards uh the information thereafter. And something I'd really like to do is uh being able here when I when I craft new content Let's say I'll have a text block here about some new status we add to the pages. I'd actually really like to try and see if I could add more content for the AI models specifically.
Speaker 1: So for this kind of text field, having a setting stoggle here that allows me to configure Oh this field is for AI models only. That could be a really good use of this. And um You know, if I had lots of these different settings, like maybe if I had if on this site I had like oh this this section here is only for version 7. 2 and up as a as a setting as well, I could become really noisy in the UI. Right now it's just a rich text field, so like the amount of Chrome to content, like UI to actual content ratio is really good. But if you add lots of those settings, it does get really tricky to parse like visually
Speaker 2: really
Speaker 1: fast. So yeah, as soon as it's released, I think I'll make use of it for this site, for this feature
Speaker 2: Nice one. Yeah, uh the settings blocks uh will always be collapsed by default. So for the most part it will get out of your way until you actually need it.
Speaker 1: Yeah, I don't know if you've ever come across the Wagtail package called Wagtail Personalization , but I've been working on updating it for um Supports for the oh wrong wrong links. Um latest version of the package. Oh, I'm surprised there's no link to the GitHub in here.
Speaker 2: Oh I hate it when that happens.
Speaker 1: It needs a new release, so I'll um change it to point to the repository uh at that point. Um And uh let me get the right screenshots. Um Yes, this is very similar where each of your like paragraph fields has this extra field next to it to configure where the who the paragraph is displayed for. And I will make it so much so much more like you know seamless in um the new block settings world to not have those fields constantly displayed when the majority of the contents
Speaker 1: might not even have this set at all. Anyway, I digress. Um yeah, lm. txt content for our AI models. or AI overlords. Have you worked so much with the LMs. txt format yet?
Speaker 2: No, not really.
Speaker 1: Okay. Well um It's um I think a way to help um people who use AI uh direct the AI towards the contents of a specific site in its answers. So you know if I go to my um AI model uh and ask it about Django By default, it might be configured to just answer based on its training data. And that can be quite unreliable because you never know when the training was, how long ago So the next step after that was implemented was search support. So based on what you asked it
Speaker 1: with search, I guess maybe we can do a demo. Which AI providers do you use at the moment, Sage?
Speaker 2: I don't really use it, but
Speaker 1: None.
Speaker 2: Um I mean I use what uh GitHub provides um on the covolet extension. So sometimes I switch between um Cloud. Sonnet and um open AI code.
Speaker 1: So you just use it for coding? You don't use any AI for search or like research tasks?
Speaker 2: No. I still use the plain old, you know, just search engine.
Speaker 1: Right, okay. Well let's uh use the Mistral one and uh help Sage with uh uh research for block settings let's say um in the wactail cms how would i be able to change my paragraph block Um well it's just a simpler one so it can have a theme So this will rely on the Mistral AI understanding what Wagteil CMS is.
Speaker 1: And it might only have a very limited understanding of that from its training data. So there is performed the search and found references around the web that talk about Wagtail and decides based on that how to answer the question. But What's really not necessarily problematic, but I guess definitely unideal, is um it decides for itself which data to search, which search searches to run. And um you don't have much control over that and it could literally be finding blog posts from five years ago.
Speaker 2: It even says site ycle. io We haven't been using that domain for a while.
Speaker 1: Exactly, exactly. So it's just like lots of outdated information. So that's the point of having those LM-friendly versions of websites. you can much more easily give the AI access to the latest content of the site. And even more than that, you can try and constrain it to tell it like, okay, please only answer this con this question based on the docs. of that project. I don't think it's worth like us looking at the the answer here, but basically in a coding context without this file, you'd be super likely to get um get uh API choices that reflect the project like two, three years ago. Or you know, if your project didn't didn't even exist two, three years ago, you get lots of hallucinations.
Speaker 1: So I think the Svelte people in particular, they've like adopted this heavily when they've changed their syntax. I don't know if you've seen the Svelte runes syntax.
Speaker 2: Is it with the dollar signs or
Speaker 1: yeah the dollar signs? Uh yeah, that's I uh
Speaker 2: It hurts a bit.
Speaker 1: It hurts a bit. I guess for me it just looks slightly too much like PHP or jQuery. So I have some some bias right there. Like not that I dislike PHP or jQuery, but the PHP or jQuery projects that I was working on back in the days. Like we weren't optimizing for quality in those stacks. Yeah, and anyway, uh when they introduced this new syntax, uh it was really clear that AI models wouldn't just magically pick it up from their site's content. So I think that's why they invested in those files. and then um MCP server, which is another like layer above that, to um encourage AI coding agents to produce um
Speaker 1: up-to-date information So back to Wagtail, I added this to the guide website, which is our user guide for CMS users. Do you use this site much yourself?
Speaker 2: I mean I personally don't because I I yeah I don't really need to find out anything here, but I can see how this is useful for our users.
Speaker 1: But you must be getting questions all the time on how you do this or that in Wagtail.
Speaker 2: Uh-huh I think I usually get questions about developer side of things.
Speaker 1: Oh, okay, yeah, yeah. I would use
Speaker 2: the developer talks a lot.
Speaker 1: Yeah, yeah, yeah. Well Adding those files to these sites is definitely just the first step and I think we'll want to add the same files to the developer docs. It just happens that it's a more complex problem than Meets DI, which is why I started with this site. Uh should we look at the file?
Speaker 2: Yeah.
Speaker 1: LMs dot txt
Speaker 2: Oh
Speaker 1: I know right. Uh this is just marked down by the way um I guess this is the same as uh The logic of why robots. txt is just Txt. For some reason it felt safer to use an existing extension, even though the format inside is more structured than Meets.
Speaker 2: Yeah, but robots. txt doesn't reuse an existing known syntax, right? It's its own thing.
Speaker 1: You think it should be robots. markdown because it's marked down inside?
Speaker 2: Wait, no, robots. txt still should be robots. txt, but LLMs maybe
Speaker 1: Ah okay. So Robot. txt is okay because they shouldn't invent their formats. They can invent a format without changing the extension.
Speaker 2: Yeah.
Speaker 1: And for atoms. txt since they use an existing format, they should use the extension of that format. But
Speaker 2: you know uh I mean technically I guess LLMs don't have to read Markdown. You can just put plain text in here. It's just that LLMs are pretty good at understanding Markdown. So
Speaker 1: So yes, but I'm not sure to be honest, because I expect there is a fair few features of the LMs that do perform much better with the the a better syntax. Maybe I'll show you an example. One of my like testing questions that I've been trying it out trying out to um See how well this setup works is on our document stocks we have this warning at the bottom Deleted documents cannot be recovered. So you could see how this is like very custom markup That doesn't necessarily have a markdown equivalent. So that's the type of thing that I think is really a good example of
Speaker 1: I guess the value in understanding quite precisely how you transcribe that to markdown or plain text. And uh obviously we don't want this to just be removed. Um and in addition to this If there was like an ID attribute in there, it would definitely be possible to have an anchor link directly to this. Which feels like quite a valuable feature if you know your uh your search agent sends you to the most specific parts of the docs. Anyway, let's see what happens. Um Mistrol, this new new chat, and I have already uploaded the file uh in this library here. Um
Speaker 1: Mistrol has this concept of libraries where When you query the same data multiple times, you can have it fetch like a collection of documents. Here the document is uh just one one file which is the the full lms. txt Which is all of the site's contents in Markdown.
Speaker 2: Is that part of the LLMs. txt uh convention or did you link it from the root llms. txt?
Speaker 1: It's not quite clear exactly how um well this is supported. Um if you look at like this attempt to standardize the format, there's actually lots of um just imprecise things in there about exactly how the files are meant to work and there's no docs at all on the AI providers um side on how the files might be parsed if at all so you left to guess basically uh on there it says lms ctx dash full dot txt People have just settled on dash full and um yeah
Speaker 1: here says uh XML-based structure which is you know um I think quite useful to the AI if it understands that there's separate documents in there, how to split them after potentially. Right now I just decided to use those like line separators Saeva in the chat says about the guide website, it's very nice to be able to point users to this guide instead of repeating the same instructions again and again. Yes! But it's exactly why Fart says you might be looking at this sites quite often, uh, but developer docs I guess is the same. Like if I answer a question, I want to tell people here is here is where the answer is. And if the answer isn't there, I'll definitely be working on adding it to the site.
Speaker 1: Not that I don't like people asking me questions. It's really, really great. But you want people to be more autonomous if it's possible.
Speaker 2: Yeah, and if they ask questions that haven't been covered in the documentation, we can add them to the documentation for everyone to benefit from.
Speaker 1: 100% And um I'm really hoping as part of this that uh we take a good hard look at actually how many gaps there are in our dogs You know, we don't do this just for the AI to do the same faster. We actually also do it so that we can improve the docs quite substantially. But um I digress back to how you use it. I uploaded the file in my AI chat and now I can ask Hey, uh please help answer this Ragtail support question. Um Very important to provide some guardrails only answer based on the contents of the wactail
Speaker 1: user Has uploaded. Uh do not speculate based on internet content. And um focus your answer on CMS users needs not developer needs. This is really crucial for a system like Wagtail that the AI knows Is it intended to give you a dev answer? How would you do this if you were a dev versus a CMS user? And um maybe something about tone of voice. Um keep it profish
Speaker 2: Is that the word?
Speaker 1: User request, uh how to I recover a document I just deleted. So if you were to answer that question Sage
Speaker 2: ,
Speaker 1: is it clear to you what a document is in Wagtail
Speaker 2: If we're talking about White Tail, I think so. Yeah, it's a file that you upload. And
Speaker 1: bonus question, do you think it's clear for the person that's asking you this question what a document is in White Tail?
Speaker 2: Maybe not.
Speaker 1: Mm-hmm. I find it interesting to see some AI models that answer this. They clearly think like, oh, Wacted has this thing called document, so I'll answer about that. And not only. And some AI models they decide to also answer for other Types of content in the CMS. Pages and images tend to be what happens
Speaker 2: Oh no.
Speaker 1: What?
Speaker 2: Yeah, deleted documents cannot be recovered.
Speaker 1: So it looks like a quote. Do you think it's exactly how it's written in the do in the docs? You'd think, right? That'd be the expectation.
Speaker 2: I think so.
Speaker 1: Yes, it works! And you'll notice that here again like this markdown formatting thing I coded it so that it would display exactly like this. Which I assume is much better for the AI to understand than one line saying warning, then empty space, then another line saying the text. But um yeah, there's no other way to know for sure at this point in time than just spending the time trying out her different models.
Speaker 2: Yeah, and I think some you know mark down as i the original definition is it's it's very simple right I don't think it even adds something like tables but people add like extensions to markdown and lately well not yeah not recently not lately but uh people have also been adding uh an extension for call-outs which uh would be what your warning thing
Speaker 1: Call out recently people. Like it's just GitHub, no?
Speaker 2: No, not just GitHub.
Speaker 1: There's call-outs in Common Mark?
Speaker 2: No, not in Common Mark. So Um I don't want to get too deep into this, but there's uh the the the GitHub disc uh you know when when GitHub launches a feature, they have a discussion in the in their community space for people to give feedback on And uh when the call outs feature uh see you you cannot even find it in in this
Speaker 1: docs.
Speaker 2: Yeah, they they haven't updated here. So in the discussion for like uh feature feedback thing. There are some very um how how do I frame it?
Speaker 1: Spicy comments.
Speaker 2: Spicy comments, yeah. And people who are really concerned about it um and wanting to make it a proper standard instead of just github 's thing. So instead of having diverging implementations um we can settle on a specific thing because once github uses it everyone will start copying copying it right and at the moment github kind of overrides the block quote syntax and might not be the best thing because you know it has been known for block quotes and warnings are not really block quotes so
Speaker 1: Yeah.
Speaker 2: Yeah. Just uh I digress.
Speaker 1: Anyway. I mean it is important, you know, I think um To me what it comes back down to is HTML what's uh like semantic HTML that gives uh screen reader users for example the opportunity to understand the contents beyond just it being like looking different on the page just with semantics. So, you know, if if there is like a semantic way to express things, um, it does like bring real real value to real people. But only if those semantics are defined in shared standards. Otherwise, it's just impossible to trust that things have been used correctly and that you should like change the behavior of your software according to it.
Speaker 1: So yeah, I think this is um good example. It doesn't always go like this, but as a point of comparison, you can try to ask the same question without access to this. In Wagtail CMS, uh one of our users asks asks a support question. So I don't know which AI model it was that I was trying it on, but it was saying that there is a recycle bin feature. In Wagtail? It was adamant that the recycle bin was a core feature of Wagtail.
Speaker 1: And that you could just go there and you'd see your pages. And yeah, navigate to the recycle bin. So this one as well. So
Speaker 2: you should see an option called recycle bin. Oh.
Speaker 1: Yes.
Speaker 2: It's yeah, I can see how people getting gaslighted by AI thinking I don't see the recyclement option.
Speaker 1: Yeah. In some ways I kind of feel like this is interesting feedback because
Speaker 2: Yeah, maybe we should add the feature.
Speaker 1: Yeah. Cause you know we like documents that's kind of We have lots of metaphors in there that match expectations of a file system. And when you delete something on Windows, which is what most people out there are using, you can recover it always, right? There's always like a two-step process. So who are we as devs? If you wanna go like shift deletes, that's fine, Sage, but then you know the nuance.
Speaker 2: Yeah. Yeah, for your average people if you they just delete it. They expect it to be somewhere that's not yet deleted, maybe in 30 days, or maybe if I explicitly empty out the recycle
Speaker 1: bin. Yeah.
Speaker 2: Especially I guess for people who love recycling.
Speaker 1: Oh, the dig Um yeah, so I don't know if we'll um build this recycle bin anytime soon. Um but I do feel like, you know , interesting for us that the AI comes with those types of answers and definitely worthwhile for us to encourage people to Because you know people are gonna use the AI to answer their Wackel questions no matter what, I think, at this point. So I'd rather give them a way to get like more factual answers Yeah, and I think the next step for for us on this format is also to try and make it work with smaller models.
Speaker 1: I don't quite know like the model that answers our questions here from Mistrol how um heavyweight it is But definitely my goal would be that as a dev you can run something not even on your laptop like just on your phone that has access to the contents and the model in there is clever enough to retrieve the whole website's content and give you the answer from it. Don't figure it too far from it, but yeah, we'll take some time Um
Speaker 2: a um atangent, which is what happens if you ask it, uh does Wagtail have a recycled bin? Will it will it walk back or
Speaker 1: Do you mean here?
Speaker 2: Will yeah yeah will it be insisting? No no don't don't uh don't use something like are you sure? You just uh Hmm, I was thinking yeah. I mean, yeah, yeah, just as simple as that. Oh
Speaker 1: It's a statistical answer machine, Sage. Of course it's gonna say that it does if the sequence of messages here doesn't have any reason for it to doubt itself.
Speaker 2: What happens if you tell it I can't find it? Okay, then it's
Speaker 1: Then the Cedar Tart has been planted. So
Speaker 2: twenty thirty-five. It literally happened to me the other day when I was asking about um some options for writing Sphinx documentation and then the model gave me. Oh you can just use this option and then I ask it, does things have that option? And then the subsequent answer was literally, Sorry, I made it up.
Speaker 1: They're pretty honest these days.
Speaker 2: Yeah, at least they're honest. But still, they shouldn't have lied in the first place. But again, you know, again if you don't understand how this thing works.
Speaker 1: Yeah.
Speaker 2: You can have different expectations.
Speaker 1: Yeah, yeah.
Speaker 2: Which could be dangerous. So
Speaker 1: So the um Yeah, the I think the Not the end state, but for now the goal will be that um it finds this file based on the descriptions here. It decides which of those pages to fetch And then you can answer the question more authoritatively. Um
Speaker 2: Yeah, I think we you know we j we just saw how it can use the documentation exactly as it is, so there is no hallucination. And I can see how this is going to be very useful for people who make use of LLMs to find things in the documentation.
Speaker 1: Yeah. And I hope we can make some tweaks so that it's even more encouraged. Like one thing I I I disliked with the answer we got is there was no direct link to the docs.
Speaker 2: Oh yeah.
Speaker 1: Um so that's why you know you were asking about the format. I'm hoping that um if it's not literally plain text, but there is things like links. it would be able to detect if there is anchor links that it can reuse to tell people take people to a specific point. It's just really tricky right now to know exactly which links it might be able to understand. I don't know if I have um if I have my copy still but um Yesterday I tried it with one of my local AI models and I asked the same question. And it made the mistake when it answered
Speaker 1: to link to the wrong docs. So Basically it answered with this content, but with that URL that is definitely closer to the content than this one at the top I don't know if I want to get into the specifics here, but one of the challenges with those kinds of full files is they can be too big for some models context windows. So it has to retrieve the file and then chunk it into smaller segments and then use it.
Speaker 2: It happens that the chunk for this warning Is uh bundled together with the next thing instead of what it is in.
Speaker 1: Yeah, I have no idea how it decides to chunk those plain texts. And you know, it's not like there's a standard for that. It's just however different developers of those interfaces uh decided to build the chunking. And um I guess I tried hard that's um the white space was as close to how a human would write a markdown doc as possible. But really it's not enough. Uh that it chunks this and that together, I expect. So yeah, I I definitely hope that uh we'll have time for those kinds of like improvements towards smaller models. Um the goal there being, you know, to reduce the energy use of AI.
Speaker 1: Um there's like really clearly established data now that's the smaller the model is surprise surprise the less energy it uses to answer queries um so he really should uh try harder to make our AI integrations work with those much smaller models. Anyway, any questions, Sage?
Speaker 2: I wonder if it would help if instead of having just a vertical uh sorry, horizontal line. We add, I don't know, maybe maybe an HTML comment or something like end of page, start of page.
Speaker 1: Um code has this page called long context prompting tips and uh in there they show an example of prompting with multiple documents altogether Um and uh just to be clear, like as far as I know, this like there's no like formal schema for this stuff you literally just make it up with whichever metadata you have you know it says and other metadata subtags so I think that could be Like an approach, just use XML that doesn't otherwise appear in the in the contents.
Speaker 1: Um but yeah, I think rather than implement something that's anthropic specific, I'd much rather like test first and compare different syntaxes.
Speaker 2: Is XML making a comeback?
Speaker 1: It looks like it is.
Speaker 2: Is twenty twenty-six the year for XML?
Speaker 1: The year for XML. Yeah, yeah, yeah. Yeah, if you want to have fun with um those files, I did not create a package just yet. I could definitely see that happening, but um it is open source. And it is a separate Django app that is meant to be relatively simple to fit into any project And I did write almost all of the code myself, so I can vouch for it to be okay. It's not totally grass-fed. Like there's some AI here and there. But um There's more AI for the tests than for the business logic if that makes sense.
Speaker 2: You write tests.
Speaker 1: It felt uh It felt a bit crucial to be honest for something like this that um has to work across a wide range of content.
Speaker 2: Yeah. Nice. Yeah
Speaker 1: I
Speaker 2: see that you use ginger as well.
Speaker 1: Uh yeah. Um not gonna lie, I really like ginger to start with. And um I don't know how much time you spent with it, but there were a few reasons that really made me wish for it for this specific project. Reason number one, sorry.
Speaker 2: Yeah, what what what are those?
Speaker 1: Yeah. There's lots.
Speaker 2: Sorry, forgotten.
Speaker 1: No, that's okay. Reason number one is really silly, but um in Django templates I really dislike how people choose the. html extension, which means that most things that syntax highlights out there they don't know there's a template in it they expect just HTML uh and this isn't There's a template in there, but it's not HTML, and it felt really weird to me to have a template inside a. txt file to compromise on my syntax highlighting. So I felt like oh let's use a proper template language that actually has a file extension. Umja. So it's pretty minor, but I think it doesn't like make a big difference. in like being able to read the code.
Speaker 1: And reason number two is white space management. I also really dislike in Django templates how little there is white space management. I think From what I recall there's two options. Either you collapse all white space or you keep it as in the source. So for example here, those types of lines at the top in Django templates, they would be preserved and you'd have your markdown file start with three lines worth of white space for all of your loading of template tags. The only option there being to um default load the template tags in your Django settings
Speaker 1: Which I'm quite like the explicit nature otherwise. Um so I don't know if you use Jinjam much, but those like dashes there. Yeah, they allow you to decide how the white space is collapsed basically after that closing bracket until whatever is next. So all of the white space here, all the new lines. are gonna be removed. And um yeah basically if you want to do something like text-based like this I I felt like it was almost a must to have this level of white space management. It's not a must, obviously. I'm sure the AI will process it just fine.
Speaker 2: If you're building the whole LLMs. txt, the full page, uh the full site.
Speaker 1: It adds up and I think it's just like um as a as a human reviewing the content it makes it a fair bit harder to check that it's all like correct I don't really know if it makes much of a difference for the LLM, but when I read this, I find extra white space in random places to be quite distracting And I you know I definitely expect to be using that myself. Like if I don't quite trust the search feature of a site, I'll just go to that and use my like regex-based searching. Anyway, hopefully good reasons. It was much simpler than I expected to get this set up with Jinja.
Speaker 1: It really is just a matter of um Installing the separate extra package configuring um configuring your Django settings to pass the two types of templates and then this one file that uh configures exactly what should be available as far as like extra um processing. So yeah, nice and easy. um hopefully as people if I I end up packaging this into a separate uh library I'll help
Speaker 1: spread the gospel of Jinja and Shepherd Adoption. Um
Speaker 2: fast?
Speaker 1: I think it's quite a bit faster, no, like Obviously, you know, for this content it should be cached anyway when it's actually reaches a user of the site. So it will make no difference at all that it's cached, that it's faster the template rendering, but I think it's like two, three times faster, no? What's the ward on the streets?
Speaker 2: I don't know. I just thought, you know, maybe Django's template uh engine will be rewritten in Rust.
Speaker 1: Yeah, one of them You know about this project, right? Lily , one of the steering council members, she's working on that, I think.
Speaker 2: Yep. Um yeah. Uh I would be interested in seeing how how that would compare w to Xinja. I mean, obviously I think It's gotta be faster, right? But it doesn't have as many features, so I can see how people would still want to use Jinja.
Speaker 1: Yeah If you want to go on a bit of a ginger tangent, I have more to share. Is that okay?
Speaker 2: Of course, yeah.
Speaker 1: So you know in Wagtail we have all those template tags.
Speaker 2: Mm-hmm.
Speaker 1: Uh images in templates. And so our template tags We have this really strange syntax to specify how the images should be rendered I don't know how you feel about this. Like when I say strange syntax, maybe people think of this first. But really even that, like what is going on there? Is that a valid Bits of like Django templates argument syntax with a dash.
Speaker 2: I I would expect that to be inside quotes because you 'd be like strings.
Speaker 1: Because you'd expect between this and there only valid things are like Python style identifiers.
Speaker 2: Yeah. Python is
Speaker 1: Yeah, Python-ish. Like there's no not not any actual requirement to do that, but that's kind of what you'd expect. And you know, we break that here and obviously there as well. And uh it turns out if you want to create your own custom template tag, it's really painful if you wanna recreate this passing for your custom tag, because you know we have lots of code, like not a lot, but like fifty lines of Python to parse this into something useful. And you'll never guess the Ginja version how much simpler it is It's an attribute with quotes. And
Speaker 1: I actually don't feel like it's meaningfully changes the developer ergonomics
Speaker 2: because
Speaker 1: you know Django templates doesn't know how to render tag syntax highlights attributes of template tags that much So in some ways actually feel like this might be better to work with. You have a clearer like arguments passing syntax And uh if you look at the code of this like in our code base, it is just so much simpler because there's none of this fancy argument parsing. I'll give you a before after a sage and then I'll I'll let you go There all the way to
Speaker 1: There. So there's the parsing of our weird syntax. There's also the parsing of how to add a as and a variable name to store this into the context. Guess what? That's a built-in feature in Jinjar there's a template tag for that called set And then you really look at the ginger version and start crying. It's literally
Speaker 2: just
Speaker 1: function calls. There's no passing at all because they are just arguments, positional or keyword on the method.
Speaker 2: Should we all just use ginger then?
Speaker 1: I really have a hard time saying no to that question. Um I'll show you one more thing and then rant over. Our bakery demo project, the flagship of what a Wagtail site is meant to look like. At least a simple Wagtail site. I did a ginger conversion. It is so much I think simpler. So if you look at something like um the base template Django templates. If page. seo title. Page. seo title. Ls page. title. Jinja.
Speaker 2: And with Django templates, I imagine when it's actually rendered, you have all the extra white spaces from those lines.
Speaker 1: Yes.
Speaker 2: Which could also add to the HTML payload. Well I guess with compression it doesn't matter that much, but still
Speaker 1: I would expect like for serious sites you probably have to have some kind of reverse proxy cache that's gonna compress the HTML no matter what But um yeah, I think just you know as a dev looking at the markup, it's definitely nicer to troubleshoot something where the markup is neat. And as a dev looking at the source code, this is also so much clearer. Sarihar says, bonus question for Thibaut, how much will the Django wagtail carbon footprint shrink if Django switches to Ginja templates in the next major version. Uh Saivar, that's a tough question.
Speaker 1: Um I think you could probably benchmark this. You know, have a decent sense of how many sites there are out there. Figure out for each site how much of the CPU is spent um rendering templates. Um probably not much difference just because you know unless people were to downscale their servers to um you know because the server doesn't do as much work you can use a smaller server it wouldn't make much of a difference what do you think sage
Speaker 2: Yeah, and I guess with caching, it really only matters on the first time before the cache is populated.
Speaker 1: Matthew says, I think the current Django template implementation has helpers that will make the image tag as simple as the Jinja 2 one. If only we didn't have the unquoted string. Yeah, yeah, definitely. Definitely if we didn't have the unquoted string. Um I g I guess there is the as syntax as well. Is there a helper for That as syntax. I don't know why we rolled out our own for this. I have assumed there was no like that each Django template tag that has this implements it piece by piece.
Speaker 2: Yeah I guess m maybe if you use like a class-based implementation of the tag so that you have better control over the nodes Maybe it has some helpers there, I don't know.
Speaker 1: But is that so with the catch that I don't know too much how Custom template tags work. Is it is this passing not before you actually create a node?
Speaker 2: Oh maybe maybe, yeah.
Speaker 1: Oh, the as syntax is part of simple tag.
Speaker 2: Ooh.
Speaker 1: Rent over. No, no.
Speaker 2: How do you look for us?
Speaker 1: Yes
Speaker 2: Is it in the I if you look at the right hand side is there a I think there is a documentation for writing custom
Speaker 1: Yeah, yeah, that's what I was doing. Yes. That's what we should document then. Great. Um and then I will have uh yeah why do we use custom syntax for the pasting of the filter rules then
Speaker 2: It's it's been around for many years, right? I d I'm not sure like
Speaker 1: But I'm sure there was a reason.
Speaker 2: Maybe back then it didn't matter too much and then now we start to question our decisions.
Speaker 1: Yeah. I mean I think it does look neat. It's just um When it comes time that you want to customize uh to use the custom tag of your of yours, right now this isn't packaged up that you can reuse this extra parsing logic. Anyway, TLDR, I guess Jin Jack good, but probably if I had spent the time to learn Django templates customizations more. You could get similar results. Matthew says literally just the unquoted filter string. Maybe it's time we should look at moving away from it then.
Speaker 1: I don't know if it's too off it, but yeah, something to mud over. Um This is from someone's request by the way of how do I create my custom template tags. It's not just me going too deep into this. Um and yeah, um as far as the ginger adoption, like there's a few other neat things here and there. You know, I made those requests for new template tags in Jinja, but it doesn't take too much work to call the right methods. It's just then you create bugs. like forgetting to add the page URL right here. You
Speaker 1: only add the site's root URL and the reverse of the rootable page. Like Subpath. So yeah, this is why I say it's you found this issue when I implemented this the first time.
Speaker 2: But I guess it must be nice to just call methods inside your templates.
Speaker 1: I I don't know. I think I think some people would say that this is too nice. And um yeah I I definitely feel like it is nice to have slightly more abstraction than this, but um Yeah, sometimes I guess feel like you can get a get away with it. Um Yeah, hopefully I I think that's a good case for that to be a package someday. I'm just waiting for at least one other person to have a need for it. And then we can encourage other sites where there's a need to adopt those features, generation of those files. Um
Speaker 1: I definitely don't think it's necessarily um good fit for any and all sites out there, but for the ones that are like documentation-based, it does feel like um I will help people get to more factual, authoritative answers.
Speaker 2: Yeah, for things like knowledge base or int intranet where you have um documents that people refer refer to a lot. Well, I mean it's basically documentation, right?
Speaker 1: Yeah. And for sites like our like marketing sites for the projects, I don't really know. Um, I feel like you know some of this stuff, like for example the roadmap, it would be nice if you asked your AI, oh, what's on the roadmap for Wagtail. It didn't just make it up?
Speaker 2: And then people ask you, the AI says you will ship this feature in the next release.
Speaker 1: Yeah. It's a bit of um mine fields. I feel like some people that use AI are well aware that you shouldn't just trust whatever is on there. And some people definitely aren't. And you know, so I think it's to me it's the same trope as um I forget what the the name is, but there is this paradox when you look at uh news newspaper, news media, where you see it being so wrong for the fields that you're well versed in. Do you know do you know one? Yeah, yeah. So you see a piece of news for the field you're in and you feel like it's utter nonsense. And nonetheless, you expect it to be good for the fields that you aren't so aware of.
Speaker 1: And I think it's the same with AI. If you ask it about something that you know about, you feel like, oh rubbish but for something that's outside of your comfort zone you just trust it. Um November fifth That looks close enough. February second that looks close enough as well. Usability accessibility performance developer experience Oh may it has picked up autosave so it does I don't know exactly what search it ran there but It's clearly not just gibberish
Speaker 1: Yeah, I found some of our blog posts and uh inferred the content from it.
Speaker 2: I think if it uses the web, it always gives you the uh well like considerably better results because it's more up to date, right? It's not just spouting whatever it thinks. Is correct uh based on its training data.
Speaker 1: Yeah. It has the right page. Neat?
Speaker 2: Nice.
Speaker 1: Savar says gentlemen amnesia effects. Yes, I think gentlemen amnesia sounds like it's the one that I was thinking of. And Matthew says focus on usability accessibility. Yes, that's just our general description of Wagtail. You're right. Um
Speaker 2: But it mentions autosave.
Speaker 1: It mentions autosave. It knows. Anyway, um Any any other comments, Sage? Any questions you have about LMs. txt? What are you working on next anyway?
Speaker 2: Autosave.
Speaker 1: Right next on our roadmap, the Autosave MVP. We'll have a good long discussion about that someday. Hopefully. Um hopefully it works.
Speaker 2: Yeah. Maybe we'll start the new year with autosave.
Speaker 1: Yeah. Can we have Matthew as a guest on the podcast?
Speaker 2: Of course, why not?
Speaker 1: That'd be great. It's a really big deal of a feature and lots of super interesting design trade-offs in there. Um and on that note, yeah, from my side, more Adams. 60 for the developer docs and few other things here and there. And um Yeah, we'll see you all in the new year.
Speaker 2: Oh. Have a good break.
Speaker 1: Matthew said yes, it's on. Do we get to merge it live on stream as well when you have it ready?
Speaker 2: Oh, that would be fun.
Speaker 1: Great.
Speaker 2: Historical moment for sure.
Speaker 1: Yes, it is. Lots of people want that. You have a good rest of the day. Stay safe on the internet and uh yeah be mindful of where your AI gets its content from because it's not always truthful is it?
Speaker 2: Well maybe with the help of your work, it will be.
Note: We understand that names change, people change, and bodies change. We respect each individual's journey and privacy. If you have any concerns about a video or need us to remove content, please don't hesitate to contact us. We will handle your request with care and promptly address any issues.
Published March 6, 2026
Published February 20, 2026
Published February 6, 2026
Published October 26, 2026
Published July 21, 2026
Published July 14, 2026