···1717Examples of behavior that contributes to a positive environment for our
1818community include:
19192020-* Demonstrating empathy and kindness toward other people
2121-* Being respectful of differing opinions, viewpoints, and experiences
2222-* Giving and gracefully accepting constructive feedback
2323-* Accepting responsibility and apologizing to those affected by our mistakes,
2020+- Demonstrating empathy and kindness toward other people
2121+- Being respectful of differing opinions, viewpoints, and experiences
2222+- Giving and gracefully accepting constructive feedback
2323+- Accepting responsibility and apologizing to those affected by our mistakes,
2424 and learning from the experience
2525-* Focusing on what is best not just for us as individuals, but for the
2525+- Focusing on what is best not just for us as individuals, but for the
2626 overall community
27272828Examples of unacceptable behavior include:
29293030-* The use of sexualized language or imagery, and sexual attention or
3030+- The use of sexualized language or imagery, and sexual attention or
3131 advances of any kind
3232-* Trolling, insulting or derogatory comments, and personal or political attacks
3333-* Public or private harassment
3434-* Publishing others' private information, such as a physical or email
3232+- Trolling, insulting or derogatory comments, and personal or political attacks
3333+- Public or private harassment
3434+- Publishing others' private information, such as a physical or email
3535 address, without their explicit permission
3636-* Other conduct which could reasonably be considered inappropriate in a
3636+- Other conduct which could reasonably be considered inappropriate in a
3737 professional setting
38383939## Enforcement Responsibilities
···5959## Enforcement
60606161Instances of abusive, harassing, or otherwise unacceptable behavior may be
6262-reported to the community leaders responsible for enforcement at
6262+reported to the community leaders responsible for enforcement at
6363princesseuh@proton.me or goulven.clech@protonmail.com .
6464All complaints will be reviewed and investigated promptly and fairly.
6565···106106### 4. Permanent Ban
107107108108**Community Impact**: Demonstrating a pattern of violation of community
109109-standards, including sustained inappropriate behavior, harassment of an
109109+standards, including sustained inappropriate behavior, harassment of an
110110individual, or aggression toward or disparagement of classes of individuals.
111111112112**Consequence**: A permanent ban from any sort of public interaction within
+2-10
crates/maudit-cli/Cargo.toml
···1313chrono = "0.4.39"
1414colored = "2.2.0"
1515clap = { version = "4.5.23", features = ["derive"] }
1616-tokio = { version = "1", features = [
1717- "macros",
1818- "rt-multi-thread",
1919- "signal",
2020- "process",
2121-] }
1616+tokio = { version = "1", features = ["macros", "rt-multi-thread", "signal", "process"] }
2217axum = { version = "0.8.6", features = ["ws"] }
2318futures = "0.3"
2419tower-http = { version = "0.6.6", features = ["fs", "trace"] }
2520tracing = "0.1"
2626-tracing-subscriber = { version = "=0.3.19", features = [
2727- "env-filter",
2828- "chrono",
2929-] }
2121+tracing-subscriber = { version = "=0.3.19", features = ["env-filter", "chrono"] }
3022notify = "8.2.0"
3123notify-debouncer-full = "0.6.0"
3224inquire = "0.7.5"
···1717### Minor changes
18181919- [2bfa8a8](https://github.com/bruits/maudit/commit/2bfa8a87212243b27c2231b836e7da9ec2cd3288) Rename (almost) all instances of Routes to Pages and vice versa.
2020-2020+2121 Previously, in Maudit, a _page_ referred to the struct you'd pass to `coronate` and a page could have multiple routes if it was dynamic. In my opinion, the reverse is more intuitive: a _route_ is the struct you define, and a route can have multiple _pages_ if it's dynamic. This also applies to every other types that had "Route" or "Page" in their name.
2222-2222+2323 As such, the following renames were made:
2424-2524 - `Route` -> `Page`
2625 - `FullRoute` -> `FullPage`
2726 - `RouteContext` -> `PageContext`
···2928 - `Routes` -> `Pages`
3029 - `fn routes` -> `fn pages`
3130 - `maudit::page` -> `maudit::route` (including the prelude, which is now `maudit::route::prelude`)
3232-3131+3332 And probably some others I forgot. — Thanks @Princesseuh!
3434-35333634## 0.4.0
37353836### Minor changes
39374038- [52eda9e](https://github.com/bruits/maudit/commit/52eda9ea4eac8efd3efd945d00f39a1b99f284ab) Update generated code to support returning properties in dynamic routes. — Thanks @Princesseuh!
4141-
···3535```
36363737This route is accessible at:
3838+3839- `/about` - the base/default path
3940- `/en/about` - English variant
4041- `/sv/om-oss` - Swedish variant (using natural Swedish URL structure)
···6263 Page::from_params(MixedParams { id: "phone".to_string() }),
6364 ]
6465 }
6565-6666+6667 fn render(&self, ctx: &mut PageContext) -> impl Into<RenderResult> {
6768 let params = ctx.params::<MixedParams>();
6869 // Render using params.id
···7172```
72737374This generates only variant pages:
7575+7476- `/en/products/laptop` and `/en/products/phone`
7577- `/sv/produkter/laptop` and `/sv/produkter/phone`
7678···9799 Page::from_params(ArticleParams { slug: "getting-started".to_string() }),
98100 ]
99101 }
100100-102102+101103 fn render(&self, ctx: &mut PageContext) -> impl Into<RenderResult> {
102104 let params = ctx.params::<ArticleParams>();
103105 // Render using params.slug
···106108```
107109108110This generates:
111111+109112- `/articles/hello-world` and `/articles/getting-started` - base pages
110113- `/en/articles/hello-world` and `/en/articles/getting-started` - English variants
111114- `/sv/artiklar/hello-world` and `/sv/artiklar/getting-started` - Swedish variants (note the localized "artiklar" path segment)
···119122- `variants(&self) -> Vec<(String, String)>` - Get all variants as `(id, path)` tuples
120123121124Example:
125125+122126```rust
123127let about = About;
124128let variants = about.variants();
···173177174178 fn render(&self, ctx: &mut PageContext) -> impl Into<RenderResult> {
175179 let params = ctx.params::<ArticleParams>();
176176-180180+177181 // Render differently based on variant
178182 let greeting = match ctx.variant.as_deref() {
179183 Some("en") => "Hello",
···181185 None => "Hi",
182186 _ => "?"
183187 };
184184-188188+185189 format!("{}: {}", greeting, params.slug)
186190 }
187191}
···21121516:38:08 pages generated 13 pages in 1ms
212216```
213217214214-Each variant is treated as a separate page with its own URL and output file. For dynamic routes, all pages are generated for each variant automatically.218218+Each variant is treated as a separate page with its own URL and output file. For dynamic routes, all pages are generated for each variant automatically.
···6677Maudit supports adding JavaScript and TypeScript files to your site.
8899-To import a script, add it anywhere in your project's directory, and use the [`ctx.assets.add_script()`](https://docs.rs/maudit/latest/maudit/assets/struct.RouteAssets.html#method.add_script) method to add it to a page's assets.
99+To import a script, add it anywhere in your project's directory, and use the [`ctx.assets.add_script()`](https://docs.rs/maudit/latest/maudit/assets/struct.RouteAssets.html#method.add_script) method to add it to a page's assets.
10101111This function will return an error if the image file does not exist, or cannot be read for any reason. If you'd rather not deal with errors, you can use the `add_script_unchecked()` method, which will instead panic on failure.
1212
+1-1
website/content/docs/routing.md
···162162163163## Internationalization (i18n)
164164165165-Maudit includes the ability to generate *variants* of pages based on locales. For instance, you may have a `/about` page and want to create a `/fr/about` or `/a-propos` page with a localized slug.
165165+Maudit includes the ability to generate _variants_ of pages based on locales. For instance, you may have a `/about` page and want to create a `/fr/about` or `/a-propos` page with a localized slug.
166166167167While you could do this by duplicating your `/about` page, creating a new struct, re-implementing Route etc etc, it would be quite time consuming if your website support more languages and probably lead to a lot of duplicated code, as your Swedish about page probably uses a lot of the same layout as your Danish one.
168168
+1-1
website/content/news/for-static-websites.md
···55date: 2025-10-15
66---
7788-We have one goal for Maudit: To make it the best tool to generate static websites. This may include helpful side features like loading Markdown content, syntax highlighting, image processing, sitemap generation, RSS feeds, etc.
88+We have one goal for Maudit: To make it the best tool to generate static websites. This may include helpful side features like loading Markdown content, syntax highlighting, image processing, sitemap generation, RSS feeds, etc.
991010But the end result is always the same: You get a static website. No server, no serverless (with a server), no nothing. You get `.html` files that you can host wherever support hosting static files.
1111