Join us for The Changelog, taking you through the month’s Directus updates including product updates, new content and community contribution highlights. This month's show includes a community showcase of a note taking system from Josh, Carmen taking you the first episode of Sharp Focus, Kevin with the new guest Author program and more...
Speaker 0: All right. Hello. Hello everyone. Hopefully you can all hear me and if you can I would love to know where you are joining us from today? 1, to say that
Speaker 1: you can hear me and, 2, because I'm nosy and
Speaker 0: I wanna know where everyone is. Last time everyone was all over and it was really great to hear. Personally, I am joining from London where we had the first snow of the fall this morning. It was quite rainy snow like it wasn't magical magical but it counted and that's what matters so that is where I am from. Excellent, Carmen, thank
Speaker 1: you so much for telling me you can hear me, I appreciate it. Vienna, Austria, we've got Sweden, USA, Finland, amazing, welcome. I hope you're all having such an amazing day. Devon, Germany, very cool, Netherlands as well. We have some very fun and also educational, material coming up for you for the rest of this show.
If you've got any questions throughout, we've got
Speaker 0: the chat open, and there's a couple of people from our team in it as well. So please do let us know if you have any questions. But we are starting off, the November change log with a product update from Bryant. So I'm gonna send you over to him.
Speaker 2: Thanks, Beth. Bryant here for Directus, and here's a quick rundown of the core changes that have happened since the last changelog. Version 11.2.0 brought TUS resumable file upload protocol support to the Supabase, Azure, Cloudinary, and GCS storage adapters. And we already had tough support for the AWS s three compatible and local asset storage adapters. Which basically means, you are now fully covered when uploading large files, like videos to Directus.
In version 11 dot 1 dot 2, we introduced a migration for Directus comments. There's now a dedicated directus underscore comments collection, which will make it much much easier for you to use comments in your front end projects via the API. We previously stored comments in the directus underscore activity collection, which admittedly was a bit messy because of all the other activity logs we stored alongside those comments. So this welcome change brings new API endpoints for comments, but the existing endpoints are still 100% totally functional. One note though, primary keys are now UUIDs instead of integers.
So that could impact any custom type checking implementations you set up. The Directus SDK's internal comment endpoints have also been updated to reflect this change. And I know you're all for avoiding errors, so just ensure your Directus version is compatible with the latest SDK when you're using those comment functions. And there's just one more change with version 11.1.2. We've made some improvements to content versioning.
Internally, we stored every change to a content version separately in the directus_revisions collection. And then we merge those together when promoting a version. In this release, we've added a new delta field to directus_versions collection, and that combines all the revisions into a single field. So all that to say, this means you'll be able to prune your revisions, which are the individual changes to a piece of content, without losing your versions. And with that, back over to you, Beth.
Speaker 0: I'm going to demonstrate each of the new extensions in Director's Labs this month. As a reminder, Director's Labs is our team's experimental organization on GitHub. Typically, these extensions aren't maintained the same way that the main directors project is, but we have now committed to maintaining 4 of them. They are the spreadsheet layout, the Gantt chart layout, the Command Palette module, and the calculated fields bundle. You can see all these extensions, including which extensions are maintained, over on the extensions repo.
Onto the demos. Directors AI is a collection of extensions that allows you to leverage the best AI tools from within Directors Automate. Today, we have 2 announcements, a brand new extension and an improvement. Let's start with a brand new extension, the AI web scraper. This allows you to scrape web pages and receive structured data back.
We're using FireCrawl to perform the scraping, so you'll need an API key from them. You put a web page or a link to a PDF. Here, we're using directors. Io. If we go into the actions before scraping, here you can get the scraper to perform actions on the web page and add additional metadata about the action.
For example, which element to click on or how far to scroll. For the data to extract, here's where you tell it what data you wanted to extract, and it will use AI to extract it. In the property description, we're going to put permission, string as data type, and we're going to enable making it a requirement. Optionally, there are additional formats, so you can also specify how you want the pages content to be presented back to you. They've also just had their launch week and we've implemented their brand new features such as the country, language, and mobile options.
The other announcement is an improvement to the AI writer. The biggest change here is that before you could only use OpenAI's models and now we're extending the option to use multiple AI providers such as Anthropic, as well as different AI models. Other than that, everything else works as it did before, and this expansion was done thanks to an issue that was opened on the Directors Labs Extensions repo. So please do keep bringing your feedback for these. That's what's new for Directors AI We often hear from people that they love Directors insights, but want more ways to visualise their data.
So we've added 4 new panels, which you can install now via the marketplace. 1st, we have the tree map chart. Select a collection, optionally a filter, which field you want to use for the labels and the value, and any aggregation you would like to perform. For example, here we are summing the value of all deals per company, so each company has its own cell at the size of all values related to that company. Next, we have funnel chart.
Now, the funnel chart works exactly the same way, but visualises data differently. So depending on your needs might be more appropriate for you. For example, here we have a typical sales funnel. Funnel charts excel when people, or entities, follow a linear path and you want to see how many convert between stages. Next is the scatterplot.
If you've never seen one before, this is a very typical two axis chart where values are plotted as dots. You can optionally add axis labels and hover over any of the dots to see the values. Finally, we have the timeline chart. This is a sibling to the Gantt chart layout that we recently released last month. We have less space to work with in a panel, so it's a simplified version, but it can be really powerful to include for project management.
This relies on having 2 date fields, a start and an end, and then a label for the axes on the left and some display text for the item itself. We hope you enjoy our new panels. We certainly think that people are going to get a lot of use out of them. Extension authors often want to extend the functionality of our built in interfaces, And a few months ago, we released the WYSIWYG and block editor as boilerplates to build on top of. Today, we are releasing our first layout boilerplate, the table layout.
This was already the basis for our spreadsheet layout extension, and now you can build on top of it and extend it too. You can find this in our Director's Labs extension repo, And we hope that this supercharges your extension building.
Speaker 3: Hello there. Today, we are announcing our brand new and improved guest author program. The directors community is filled with people who use directors in so many different ways, so many different languages, frameworks, use cases, and this program is all about bringing those experiences to the tutorial section in our new documentation to help new directors users and existing directors users be as successful as possible. So we invite you to apply to be part of our brand new guest author program. Previously, our guest author program worked where you submitted your own ideas.
In this program, once accepted, we have identified a huge number of tutorials that we think would be hugely impact for our users, and we invite you to write them and get paid doing it. We will support you through that whole process reviewing content and making sure what you create, is the best it can possibly be. So if you are an experienced technical writer and you know how to use directors, this program is for you. It's about educating others about how to be successful and make the most of directors. We are going to open applications a few times a year.
This first open application starts today, and it will be open through the end of November, to kick off shortly after. So we really look forward to seeing your applications and the amazing tutorials that you can write to help others.
Speaker 0: Alright. Hopefully, I am back. I'm super excited about those announcements. I did put in the chat the links for applications to become a guest author and also the Derick's Labs extensions, URL as well, so do check those out if you haven't already seen them. I'm super interested in hearing about what you are excited about from those announcements or if you're using any extensions.
We've got a couple
Speaker 1: of minutes in the chat to, have a talk with you about them So if you have seen any that you're like, this is gonna be particularly useful to me, we'd love some instant feedback on what is getting you excited, what you might be using them for. I know and I think I said this last month to you about the Gantt chart, but anything project management, super exciting. Like, just to be able to see a timeline, like a crisp timeline is super exciting for me. Also, the funnel, we love to see it. So, yeah, if you do have any thoughts, keep them coming in the chat whilst we are talking through them.
Speaker 0: And if not, we have the Discord throughout the month, if you've got any questions about anything at all. I'm gonna
Speaker 1: give it a couple more seconds. If you are typing, type quickly, before I move us on.
Speaker 0: But, yeah, just, as we said in there, lots of feedback coming in through, which is super helpful in working out the directions as well. So that is all good, and we're excited to keep things coming and keep telling you about them in the change log. Alright. I am going to Ben says, I'd really like some more documentation on using real time stuff in Next. Js.
Carmen, I believe you are in the chat
Speaker 1: as well, so that, hopefully, you are able to give some insight on what is upcoming. Josh says I
Speaker 0: found your software, and I'm using cool. Excellent. Very excited to see it. So I'm gonna move us on to the next segment, which is slightly cringey. So you have been warned.
We had a lot of fun putting this together, and it's time for a completely new segment in
Speaker 1: the change log. We do try and keep things, new and fresh, so we haven't done this before. This is a segment called Automate My Life, and we really hope you enjoy it.
Speaker 0: Hello, and welcome to Automate My Life. In this show, we help regular people using Directus.
Speaker 3: And today, we are in sunny London with our 1st person in need, Sean. He has lots of problems. We can't help with most of them, but we certainly can help with 1. Over to Sean. So I'm here with Sean who has called in the Automate My Life team with a problem.
Sean, what can we help you with? Hi, Keir. Thanks for coming. I have a problem. Tell me more.
Look at this plant. What do you notice about it? Sean, this plant is dead. That is the problem. Okay.
Yep. See, I have plants and they are not dead. But then no matter what I do, they become dead. Despite your best effort. Despite my best and sometimes your mediocre efforts as well.
Okay. I understand. Well, I think this is something we might be able to help with over in the workshop. Marvelous. Automate my life, director's team.
Over to Beth.
Speaker 0: Okay, folks. You've heard what Sean's problem is. We've brought you here as the best of the best to work out a solution for Sean. The future of his plants relies on you. What have you got?
Speaker 4: Hey, Sean. Welcome to the Directus workshopping team. We're all about automating our lives every day. I have a similar problem. My wife my partner, has a pepper garden.
She's an avid gardener. She loves to garden. This year, she actually picked up a little pH temperature monitor or soil tester, to give you the soil quality and quantity and make sure that she could amend the soil properly for those kinds of things. But as I'm thinking about this now, I'd actually like to work with her, and we'll get a I I think next year, I'm actually going to do this particular project. But in the meantime, we'll talk about some of the ways we could solve this problem.
There are both DIY options and aftermarket options. I think I'll opt for the DIY, and that will be using something along the lines of an e s ESP 32 Wi Fi Sensor. There's a nice Directus blog that kind of goes through a use case for this, but we're gonna talk a little bit more in detail about some specific sensors and capabilities that we'll need to do for this. So there's an ESP 32. This has built in Wi Fi.
The ability to integrate that with your sensors and plug that into your sensors, so we can collect data, soil temp moisture contents, and, temperatures. So the key thing is to making sure that your plants grow successfully. Now, in order to make this all work together to get you alerts and notifications, I'm gonna hand you off to my main automation guru, mister Bryant Gillespie.
Speaker 2: Sorry, Jonathan. I, had these thinking glasses on to consider this problem. I just want to say this is an amazing use case for Directus Flows. We are going to be able to send automated notifications whenever these values are out of bounds. So here's what I'm thinking.
Whenever a new item is created in the logging collection we trigger a flow. That flow does some magic and it will run some conditional operations to determine whether those values for moisture, for pH, for temperature are within the bounds that we set. If they are within those bounds, nothing happens. You're a okay Sean. As soon as those values step out of bounds like they're on the court, boom, you get a message via SMS through the Twilio API.
And that's a wrap. Now to kick it over to my main man, AvDV, our head of insights.
Speaker 5: Hey, Sean. If you're anything like me and you've got a lot of plants, I can imagine all these sensors are gonna be bringing in a ton of data into your into your director's project. So what better way to use insights or our dashboards to build up, targeted, insights which give you a summary of all the information in one page. We have, time series charts that you can start to track the pH, the moisture and the temperature over time. And with built in filters as well, you can you can filter by room, by particular plant, or even by the season if you want to track, the growth or the moisture over the seasons.
There's a ton more use cases that we could build in, but those are just good. Some 3 quick summaries of what you could build with the Director's insights.
Speaker 0: Wow. This all sounds great. I'm gonna leave you in the workshop to make this real. So Sean, we built you a soil monitor. There's sensors in here that every hour monitor the status of the planet.
And if it's in need, we'll let you know via text messages exactly what's wrong.
Speaker 3: Wow. That's amazing. I'll never kill again. Thanks, directors. Thank you so much.
What a wonderful first episode of Automate My Life. Thank you for taking part. If you have an idea for a future episode, you can probably keep it to yourself. This is probably a one and done. Thank you, and bye for now.
And that's something we can help you with. I certainly hope so.
Speaker 6: I think we can handle discus team.
Speaker 3: What's the new company again? Director. Director.
Speaker 1: Wow. That was quite something, I hope you enjoyed. And I'm also very glad that the bloopers reel did in fact stay in because it was a lot of fun to record. There were some great ones. So, next up is sorry.
I've gotta compose myself. It was so cringey. I could still feel it, like, in my cheeks. So next up, we have what I always say is my favorite part
Speaker 0: of the change log, and that is the community showcase. This month, we have Josh talking through the note taking system he built, so I'm gonna send you over to him.
Speaker 6: Hi there. I'm Joshua Behmendurfer, a software developer and IT manager at a Christian nonprofit. I have a tendency to build odd solutions like this one to solve mildly frustrating problems. Today, I'm showing off an offline first portable note taking system that integrates with Directus. It uses the Tiletec's awesome hackberry pi 0 for the hardware.
This little doohickey with a physical keyboard, And Directus to store and retrieve data. Here's how it works. 1st, in Directus, I'm going to create a new collection called to do with a manual primary key which we'll set to the current date from the note taking system. Then we'll add a single simple markdown field that we'll use for our task list. And you can do more complicated stuff.
I'm just going with the markdown field. Then I'm going to add a, assign to field that references a contact so that I can show how, relationships work with the note taking system. And then we should be good to go. Alright. Now let's take a look at how to create and edit notes on the device.
I'm gonna use my Android phone here because it's pretty hard to take a recording of the Hackberry without my fingers getting in the way. I've got my editor open with a new text file. This file contains commands that interface with the Directus API. Let's skip the current date so that we can refer to it when creating today's to do and then get the ID of my contact entry so that the to do could be assigned to me. I'm using the Directus search and field parameters to find just my contact ID.
Alright. Now we've got that ID. Let's make a view to do for today. We could use the, dollar sign to refer to the output of previous commands. Like, you were setting the ID to the current date.
And then I'm going to assign that contact to my that, to do to myself. We're on it. Now let's add some tasks for some things I need to do today. Well, let's see. We could take out the trash.
I should probably do that. We should do the laundry. That definitely needs to get done. What else? I should probably record this video.
Alright. And then when I hit control r, these changes sync to Directus. And then they're also saved locally in this file for offline editing. I can make changes and they will get synced to my Directus instance. So let's take a look at what has been saved.
As you can see, the tasks, assignment, and date are all here. I built this system because I forget things pretty easily and I'm always remembering them at the wrong time. So, to try and capture those fleeting memories, I tried to take notes on the go. Especially at Berk when I'm needing to walk between different people's offices and just catch up with all sorts of things people are saying while I'm, away from my desk. So, I started out with all sorts of notebooks and even designed several variations of reusable note cards, but I could never find the right note card at the right time and digitizing them constantly to make them searchable turned out to be quite a chore.
To make the switch to digital notes, I started with Obsidian. It worked pretty well, but I never had the flexibility in data structures and the querying capabilities that I wanted. The text editing experience and syncing proved finicky at times as well. It was close to what I wanted, but not quite right. I solved the structured data organization problem using Directus.
The Data Studio makes it a breeze to set up all the collections and fields I need to organize my data the way I want to and it backs it with the full power of a SQLite database. Anything it doesn't support out of the box, I'm a software developer, I can build on to it. But, I had two main issues with the vanilla Directus setup. Number 1, it doesn't work offline and I was always forgetting to hit the save button in my notes And trying to switch between other apps on my phone and direct us while in the middle of a bunch of other things just put too much friction in the note taking process. So, when I saw the Hackberry Pi come up for sale, it seemed like the perfect crazy gadget for taking notes.
My, fat thumbs make typing on a touchscreen a pain, so a device with a physical keyboard was perfect. And, it's still small enough to fit in my shirt pocket. I snagged one once they were in stock and while waiting for it to ship from Germany I threw together some simple software to communicate with Directus. This system uses the micro text editor, which is a convenient, easy to use command line text editor that also happens to be extensible with Lua. And I combine it with an indentation based syntax for encoding JSON as the small scripts do things up to direct us.
It's not pretty and it does have all sorts of interesting ways of crashing but it works very well for my use case. When I need to take notes, I press the hotkey on the Hackberry, the note I want to edit comes up, then I just type and sync to Directus once I'm back online. I doubt this exact system will be of much use for anyone else but it just goes to show the creative things you can do with Directus to Scratch, personal or work related itches. There's all sorts of wonderful ways you can wire things up. Thank you for your time.
Goodbye.
Speaker 0: Alright. Thank you so much to you, Joshua, for taking the time to, record the video and share
Speaker 1: with us as we always love to see what people are doing with directors. I see
Speaker 0: that a couple of people have got a video blur, we are on it and we're trying to fix it and see what
Speaker 1: we can do. Hopefully it comes back to normal. I don't think it's been that way the whole time so fingers crossed it's just
Speaker 0: a bit of a rough patch and it will be fine again going forward. I'm gonna send you over to Carmen who has the first video of Sharp Focus and I'm gonna allow her to talk through exactly what that series is and the rest of the series is also out now on director's TV. So I'll find the link for you in the chat as well. Alright. Over to Carmen.
Speaker 7: Hello, everybody, and welcome to Sharp Focus, the show where we shine a lens on how Directus helps you transform your images and truly make them shine. My name is Carmen, and I will be your guide over the next 5 episodes where we'll learn how images can be transformed, how they work under the hood, how they can be manipulated, how they can be resized to be more performant, how you can use advanced transformations, and how you can use presets to take all of the above and apply it in one fell swoop. Now as it turns out, Directus offers a bevy of options for working with images out of the box powered by the sharp API from Node JS. And we're going to be taking a look at how to do that in a way that's going to be super fun and super approachable. So won't you join me in grabbing our cameras and let's dive right into finding out how Directus works with images.
So here we are in my very own Directus project running locally dedicated to my photography. Right now, we are in the file library module where you can see that I have a folder over here on the left sidebar. This folder contains photos from my latest trip to my home country Chile. Now, I'm going to use Directus to work with these images for different applications, thumbnails, that sort of thing. But, as you can see, a lot of these images are of varying sizes and qualities.
But that's okay. We can use to transform these images to create some consistency and even add some cool effects, which we'll be doing in this series. But first, let's take a little look at what makes these images tick. Now I've already uploaded these to Directus, so this gives me a couple of options to work with them. If I click on one of the images, for example, the photo of my trip to the national park, Torres del Paine, we will see that we can do things like change the title, add a description, some tags, location, if we wish, some focal points, more on that later, and also have access to its asset ID.
But that's not all. We can even edit that image. Now we're not going to be doing that in this series, except for using it to create focal points. But again, more on that later. Now, if I want to access that image from say my browser, I can take that asset ID and navigate to my instances URL/assets/the ID of that image, which is fantastic.
But one thing to bear in mind, I'm logged into Directus as an admin. But if I wanted to access this image from an application, I would need to assign that application the correct permissions, which we can do here in Directus. When I navigate to the settings module and then go over to access policies, we can see that I already have some permissions and roles set for administrators, which is my logged in user. But I wanna make these images fully public. So what I can do is click here on public and under permissions, click on add collection and select the Directus Files system collection.
I will be able to assign different permissions for folks accessing that from anywhere. But I only want to give folks the ability to read. So we'll click here on read access and then assign all access. The last thing to do is to save that permission. Fantastic.
Now I can access this image from a browser, from an application, from anywhere. So let's go back and look at that image. Now you remember that these images are of different sizes and qualities. So in order to create some consistencies, we're going to be applying different image transformations, but also giving them a little bit of pizzazz with some advanced transformations. It's gonna be super cool.
Before we wrap up this video, I'd like to show you a couple of the types of transformations we can do. In the next video, we'll be looking at image manipulation where we can use query parameters like width, like height, and fit to manipulate our image and in this case make it a consistent 300 by 300 pixels. But that's not all. In our 3rd episode, we'll be looking at how we can manipulate the size and performance of our images. For example, here we're applying a quality of 5% and a format of web P to be used in our applications.
Next. Now bear with me. We're going to be doing some advanced transformations. Now this looks a little wild, but you'll see that we're applying some powerful transforms with that sharp API. So we're applying a blur, a tint, we're negating colors.
All of this is done with direct us, which is super cool. And finally, in our last episode, we'll talk about preset transformation where we can assign presets to a key, and that way we don't have to type out all of those transformations, but rather place them in one consistent place in Directus. Finally, let's talk about that processing power. You might think it'd be pretty cumbersome if every time I reload this image, it reprocesses all of those transformations. And I have good news.
That transformation is done once and then saved in Directus, and you don't have to apply that every time. That means that you can reload that image worry free of any extra processing power done. So there you have it. Now we've seen how direct us works with images out of the box and how we can apply access permissions, which is gonna be super handy because in the next 4 episodes, we're gonna be working with a new Nuxt application to work with these images and display them in a variety of ways using transformations. So what's next?
In episode 2, we'll be looking at how to resize our images using width, height, and other parameters, and I can't wait to show you all how it works. So till next time, keep those cameras ready.
Speaker 0: We've put together a reading list from suggestions within the director's team of resources they found interesting, educational, or entertaining this month. Firstly, we have how we built a powerful JSON data type for ClickHouse. They talk about some of the challenges they face, such as true column oriented storage, dynamically changing data without type unification, and prevention of avalanche of column data files on disk. Next, a conflict free replicated data type, also known as a CRDT, is a data structure that lets multiple users or applications make changes to the same piece of data. This blog post from BlockSuite, called Building Document Centric CRDT Native Editors, explores the evolution of collaborative document editors, including the transitioning from the traditional editor centric approach to the document centric approach.
Next, not a blog post, but an interesting project, pdlight. Run a full Postgres database, locally in WASM, with reactivity and live sync As opposed to running it in the application, you can run this in the browser, dependency free And unlike previous Postgres in the browser projects, pdlight does not use a Linux virtual machine. It is simply Postgres in WASM. Finally, there are some roles that rely on you being able to work with a lot of people from different teams where sometimes that's not always possible time wise and they become a blocker. This post from Kirk Campbell addresses that challenge by looking at how to utilise AI, specifically Claude Projects, in absence of people being able to give you their time and how to bridge that gap.
Those are 4 really solid recommendations from the team that we hope you enjoy. We want to take a moment towards the end of the changelog to thank our amazing community contributors who give their time and expertise to improving the director's project. Since last month, there have been 3 releases and 8 contributors. A massive thank you to Gerard for adding support for batch editing in many to many and one to many table interfaces. Thank you to Jun Hong for fixing a display error when selecting Kanban layout for the first time, adding condition to only show the create dashboard if the user has the correct permission, fixing tag interfaces to correctly handle reset white space option, ensuring new operation can reuse same key as previously deleted one in current flow editing session, fixing an issue where the WYSIWYG interface would reload with every keystroke if custom formats are given, and fixing query time logging, leaking memory for failed queries.
Thank you to Ayush for ensuring Elements login page are correctly truncated when not enough space is available. Thank you to Chris for adding save options to role and policy item pages. Thank you to Shay for fixing an issue where the mail sender is not displayed correctly for instances that use special characters in project name. Thank you to Shane for ensuring failing GraphQL requests are properly handled by throwing an error and exposing errors and data information. Thank you to Osman for fixing disabled state of the add file empty state button for users without permissions.
Thank you again to all our contributors, and you can see their specific pull requests inside of the full release notes on GitHub. Lastly, we also want to take the time to thank the GitHub Sponsors of October for financially contributing to Directus' development. A huge thank you to Clement, that's DLXCLM, for sponsoring our backer tier of $100 a month. A huge thank you also to Entle, d Mathams, Fergus, Omar, Marcus, c k, Tommy, Perissa, Utomic, Steven, Kadir, nonlinear, Andreas, Valentino, Anthony, John, Wayne, Adam, Jason, Birka, Jens, Marcel, Vincent, Mike, Weifan, Lassie, Pedro, and Gemma Liddin. Thank you so much once again.
The money we are given from our GitHub Sponsors go straight back to community members who build tooling and extensions for the director's ecosystem. Thank you again for being part of that. Alright. That is the end of this month's changelog. If you've made it this far, thank you so much for staying with us and watching till the end.
We really appreciate it. All of these recordings will be available on director's TV as well as all 5 episodes of sharp focus. If you are wanting to see anything new from, us as part of the change log, this, would be a great time to tell us. We'll be sticking around in the chat for a couple more minutes. If you've got any questions that do come up throughout the month, Discord general, Discord help are the places to go.
We will be back with December's version of the change log on December 10th at 3 PM, GMT or wherever that is your time. Discord handily tells you in your current, time zone, which is great. I've put all of the reading list recommendation URLs in the chat. If anyone's got any questions, as I said, we will be hanging around for a couple more minutes. But other than that, thank you so much once again.
I hope you have a great week, a great month, and hopefully see you next time for December's change log. Have a great day, everyone.