Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ECS chapter for new book #182

Closed
wants to merge 146 commits into from
Closed
Show file tree
Hide file tree
Changes from 69 commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
252325d
Book structure (#154)
alice-i-cecile Jun 2, 2021
8a3cf22
Overview of ECS
alice-i-cecile Jun 19, 2021
8f903e0
Added page on entities and components
alice-i-cecile Jun 19, 2021
4f0bc41
Editing cleanup
alice-i-cecile Jun 19, 2021
ac89c61
Basic page on queries
alice-i-cecile Jun 20, 2021
cee206b
Rust tips for Bevy
alice-i-cecile Jun 20, 2021
c69c59b
Resources page
alice-i-cecile Jun 20, 2021
c8ede28
Guessing game resource example
alice-i-cecile Jun 21, 2021
1e32b8f
Links should point to latest, not 0.5
alice-i-cecile Jun 21, 2021
b15e909
Improved clarity of guessing game example
alice-i-cecile Jun 21, 2021
1a145a8
Stub for commands
alice-i-cecile Jun 21, 2021
38c54c3
Spawning and despawning with Commands example
alice-i-cecile Jun 22, 2021
8574c9e
spawn_batch example
alice-i-cecile Jun 22, 2021
4c7e9fa
Added (buggy) insert / remove example
alice-i-cecile Jun 22, 2021
f91b0a2
Fixed add/remove components example
alice-i-cecile Jun 22, 2021
6a060a5
Linter plz
alice-i-cecile Jun 24, 2021
713a57f
Advice warning against use of type aliases
alice-i-cecile Jun 24, 2021
b054d15
Text body for query filters
alice-i-cecile Jun 28, 2021
b39bdd6
Section on optional resource types
alice-i-cecile Jun 28, 2021
815beb4
Explanatory note on missing mut
alice-i-cecile Jun 28, 2021
1152b21
Change detection explanation
alice-i-cecile Jun 28, 2021
d6cc1fe
Explanation of generic systems
alice-i-cecile Jun 29, 2021
38821f5
Text for exclusive world access page
alice-i-cecile Jun 29, 2021
607f71a
Explained how to control exclusive system insertion timing
alice-i-cecile Jun 29, 2021
98e46f4
Note on ordering exclusive systems
alice-i-cecile Jun 29, 2021
a812e4f
Corrected name of exclusive_system().at_end()
alice-i-cecile Jun 29, 2021
e3e927a
Typo fix
alice-i-cecile Jun 29, 2021
e158ab0
Clarity improvements to ECS chapter introduction
alice-i-cecile Jun 29, 2021
cb4cecb
Typo fix
alice-i-cecile Jun 29, 2021
b24a3a6
at_start is default behavior
alice-i-cecile Jun 29, 2021
aaf3e23
Option resources also work for NonSend
alice-i-cecile Jun 29, 2021
5cb00f0
Clarity edits on Query syntax
alice-i-cecile Jun 29, 2021
c9d7fe2
Clarified purpose of bundle field names
alice-i-cecile Jun 29, 2021
d0653de
Added query conflict error message
alice-i-cecile Jun 29, 2021
cddfea3
Removed long and complex example from entities and components page
alice-i-cecile Jun 29, 2021
5dad8ad
Accessing system parameters + manually running systems
alice-i-cecile Jun 29, 2021
3537668
Manually flushing commands
alice-i-cecile Jun 29, 2021
8a1e053
Updated notes on manually running systems from &mut World
alice-i-cecile Jun 30, 2021
8289828
Correctness nit
alice-i-cecile Jul 1, 2021
0b664f5
Typo fix
alice-i-cecile Jul 1, 2021
04a2d33
Corrected explanation of NonSend resource behavior
alice-i-cecile Aug 3, 2021
f4dff89
Added note on system parallelism + Without filters
alice-i-cecile Aug 3, 2021
8878e81
Require Component derive
alice-i-cecile Aug 3, 2021
01402b5
Shortened page names
alice-i-cecile Aug 3, 2021
3058e79
Moved tips and tricks to separate page
alice-i-cecile Aug 3, 2021
58d1b7c
Better scheduling explanation
alice-i-cecile Aug 3, 2021
4ed2ca5
Added high-level ECS example to start of chapter
alice-i-cecile Aug 4, 2021
d5636c8
High-level overview of commands in ECS intro
alice-i-cecile Aug 4, 2021
8352bd2
Added more explanation to the initial example
alice-i-cecile Aug 4, 2021
29eaf59
Added more clarifying links
alice-i-cecile Aug 4, 2021
16356d5
Added more technical details to ECS description
alice-i-cecile Aug 4, 2021
ed89be5
Swapped to much simpler falling example by @Nilirad
alice-i-cecile Aug 4, 2021
8f27ecd
Rewrote entities-components page to be more useful
alice-i-cecile Aug 5, 2021
20a2fb6
Reorganized chapter layout
alice-i-cecile Aug 5, 2021
80df83f
Polished page on resources
alice-i-cecile Aug 5, 2021
11260e7
Explained nested bundles
alice-i-cecile Aug 5, 2021
49eed9c
Completed page on Queries
alice-i-cecile Aug 5, 2021
0420c95
Cleaned up page on Systems
alice-i-cecile Aug 5, 2021
b05c7f5
Clarity improvements from @TypicalFork
alice-i-cecile Aug 5, 2021
3ae04bf
Completed change-detection page
alice-i-cecile Aug 6, 2021
cd44547
Fixed stale doc links
alice-i-cecile Aug 6, 2021
ebf131e
Added demonstration of how to manually run systems
alice-i-cecile Aug 6, 2021
31dd304
Exclusive system page editing pass
alice-i-cecile Aug 6, 2021
e99da61
Added exclusive system example from @JMS55
alice-i-cecile Aug 6, 2021
b0b671b
Moved custom commands to commands page
alice-i-cecile Aug 6, 2021
34f3198
Satisfy the gods of lint
alice-i-cecile Aug 6, 2021
6f5dff0
Custom commands example
alice-i-cecile Aug 6, 2021
e776c74
Added explanation of shared mutable access to World
alice-i-cecile Aug 6, 2021
9847aba
Command application order rules
alice-i-cecile Aug 6, 2021
f734bc5
Welcome blurb
alice-i-cecile Jun 14, 2021
528a91f
Community blurb
alice-i-cecile Jun 14, 2021
b35d0b8
Why not Bevy
alice-i-cecile Jun 14, 2021
8e7794c
Hello World
alice-i-cecile Jun 14, 2021
b0a7a0b
Quick draft on plugins
alice-i-cecile Jun 14, 2021
d82ee9b
Explain MinimalPlugins
alice-i-cecile Jun 14, 2021
9896278
Disabling plugins
alice-i-cecile Jun 14, 2021
1c28e56
Third-party plugins
alice-i-cecile Jun 14, 2021
62b998a
Removed Community page
alice-i-cecile Jun 16, 2021
07f4528
Content polish
alice-i-cecile Jun 16, 2021
50dbe1c
Link to documentation strategies
alice-i-cecile Jun 16, 2021
bef720e
Typo
alice-i-cecile Jun 16, 2021
a4ef5f8
Typo fix
alice-i-cecile Jun 16, 2021
a0b0363
Use link over embedding default plugins code
alice-i-cecile Jun 19, 2021
ab2410c
Better explained how plugins work
alice-i-cecile Jun 19, 2021
b6b0de4
Concrete example of a plugin before jumping to DefaultPlugins
alice-i-cecile Jun 19, 2021
0e9677d
Added page on App and AppBuilder
alice-i-cecile Jun 19, 2021
0b38fba
Fix hello_world code
alice-i-cecile Jun 19, 2021
138fa48
Swapped out Hello World example in Installation
alice-i-cecile Jun 19, 2021
70fbcb1
Condensed section on MinimalPlugins to link to code
alice-i-cecile Jun 19, 2021
c2f9070
Added advice on publishing 3rd party plugins
alice-i-cecile Jul 31, 2021
b2f30c1
Removed references to AppBuilder
alice-i-cecile Jul 31, 2021
a3a00ad
Encourage the reader to explore the reference docs more
alice-i-cecile Jul 31, 2021
3e370de
Introduction page optimism and clarity
alice-i-cecile Aug 1, 2021
190c6a2
Cleaned up game terminology
alice-i-cecile Aug 1, 2021
ec50cff
dbg -> info
alice-i-cecile Aug 1, 2021
f2799f5
Clarity improvements for Plugin page
alice-i-cecile Aug 2, 2021
fc9a7ad
Clarity improvements for `App` page
alice-i-cecile Aug 2, 2021
d8ebee3
Clarified that Bevy is both free and libre
alice-i-cecile Aug 2, 2021
4f169ab
Clarity improvements to Welcome page
alice-i-cecile Aug 2, 2021
ee2bfc3
Removed .system() call
alice-i-cecile Aug 6, 2021
4bd12cc
Typo fix
alice-i-cecile Aug 6, 2021
ce83f85
Style and phrasing tweaks
cart Aug 6, 2021
d9d038e
Wording fixes from @MinerSebas
alice-i-cecile Aug 7, 2021
f45037d
Yeet .system()
alice-i-cecile Aug 7, 2021
0bcb450
Improved clarity and flow of exclusive systems page
alice-i-cecile Aug 7, 2021
af47f49
Converted links and inline code-formatted names to short codes
alice-i-cecile Aug 9, 2021
34ef339
Expanded on explanation of query filters
alice-i-cecile Aug 12, 2021
1c2e1d8
Editing pass
alice-i-cecile Aug 12, 2021
83a7939
fix code highlighting after zola 0.14 (#191)
mockersf Jul 21, 2021
8a8731a
Fixed missing shortcodes
alice-i-cecile Aug 13, 2021
18cbae9
Added page on ECS internals for advanced users
alice-i-cecile Aug 13, 2021
5c6f450
Named queries
Nilirad Oct 3, 2021
86fa2ba
Ignore Zola-generated files
alice-i-cecile Oct 14, 2021
c62f9cb
Subtle but important mental model tweak on Queries
alice-i-cecile Oct 14, 2021
32ea535
Merge pull request #1 from Nilirad/named-queries
alice-i-cecile Oct 15, 2021
0328a1e
Fixed broken links (thanks to @sseemayer)
alice-i-cecile Nov 1, 2021
7690cc7
Minor edits
alice-i-cecile Nov 1, 2021
fdeab37
Edits from @tsoutsman
alice-i-cecile Nov 1, 2021
a03852c
Edits from @tsoutsman
alice-i-cecile Nov 1, 2021
137be61
Merge remote-tracking branch 'origin/book-ecs' into book-ecs
alice-i-cecile Nov 1, 2021
dc31a3a
Clarity improvements prompted by @mirkoRainer
alice-i-cecile Nov 3, 2021
8442122
Editing pass for clarity and polish
alice-i-cecile Nov 4, 2021
06d9aea
Wording workaround for #219
alice-i-cecile Nov 4, 2021
6f7a0c4
Mole game!
alice-i-cecile Nov 5, 2021
8e6f32f
Remove tabs in favor of spaces for better end result formatting
mirkoRainer Nov 5, 2021
d658883
Merge pull request #2 from mirkoRainer/mirko-converts-tabs-to-space-f…
alice-i-cecile Nov 5, 2021
5579722
Simplified / clarified 'static lifetime explanation
alice-i-cecile Dec 12, 2021
6712313
Use consistent spacing
sklum Jan 14, 2022
df9864e
Remove erroneous paren
sklum Jan 14, 2022
6cb86c9
Add missing paren
sklum Jan 14, 2022
9b0efb8
Use consistent function styling
sklum Jan 14, 2022
e3f41c3
Correct remove call
sklum Jan 14, 2022
c26a280
Use consistent function styling
sklum Jan 14, 2022
e4147f7
Add missing comma
sklum Jan 14, 2022
d562f22
Add missing comma
sklum Jan 14, 2022
f39156b
Use consistent spacing
sklum Jan 14, 2022
581ee6b
Add missing comma
sklum Jan 14, 2022
575af57
Merge pull request #3 from sklum/book-ecs
alice-i-cecile Jan 14, 2022
3206cae
Replace shortcodes
alice-i-cecile Feb 11, 2022
1bca9d8
Ignore generate-errors folder
alice-i-cecile Feb 11, 2022
1e9b8a6
Finish replacing shortcodes
alice-i-cecile Feb 11, 2022
ea4434c
Fix blog link
alice-i-cecile Feb 12, 2022
55beec6
Fix nits from Cart
alice-i-cecile Feb 12, 2022
1013543
Simplify Combatants example
alice-i-cecile Feb 12, 2022
9089603
Enable anchor links in ECS section
Feb 12, 2022
69e840b
Merge pull request #4 from KDecay/enable_anchor_links_ecs
alice-i-cecile Feb 12, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 149 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# Writing the Bevy book

So, you want to help write some learning material for the [Bevy website](https://bevyengine.org/)?

As you probably noticed, our introductory learning material is split into two main sections:

1. **Bevy Quick Start:** "Get started making your first game now!"
2. **Bevy Book:** "Understand how Bevy works, and how you can use it"

This is intended to cater to two different types of learners, without compromising the experience for either:

- **Example-first:** These users want to dive right in, see everything in action and get a working game as quickly as possible.
These users often have an idea in their mind that they want to start prototyping as quickly as possible.
- **Definition-first:** These users want to carefully build up a mental model of Bevy, thoroughly understanding each new concept before moving on.
These users tend to be driven by curiosity, or are aiming to carefully develop a new skill.

Crucially, these paths are independent of the experience levels of the learner!
Bevy intentionally aims to be inclusive of both complete beginners who have never programmed before, and professionals coming from other engines.

| | **Beginner** | **Professional** |
| -------------------- | ------------------------------------------------------------------ | -------------------------------------------------------------------- |
| **Example-first** | Enthusiastic, wants to create a new version of the game they love. | Exploratory, wants to dive in and see how Bevy holds up in practice. |
| **Definition-first** | Curious, wants to understand how making games works. | Critical, wants to understand Bevy's unique design choices. |

Each of these requires their own complementary learning paths that branch as soon as they get to the [Learn page](https://bevyengine.org/learn/) to ensure that the first experience that they have with Bevy matches what they need.

Once users have completed the introductory learning materials in their path of choice, they can begin creating their own games or move on to our advanced examples to see how everything comes together in a realistic way.

## Bevy Quick Start: the example-first path

Users following the example-first path will tend to take the following route:

1. Encounter the Bevy homepage due to social media or word of mouth.
2. Navigate to the Learn page.
3. Choose one of the most relevant **quick start games**.
4. Complete that tutorial.
5. Dive into making the game they have in mind, accessing the following resources as needed when they encounter road-blocks:
1. Official Examples.
2. The Bevy book.
3. Community tutorials and template games.
4. Various community support forums.
5. Streams, YouTube channels and blogs.
6. Advanced examples.

Each quick start game should:

1. Assume zero existing knowledge of Bevy.
2. Begin with a initial high-level explanation of what we're trying to build.
3. Introduce commented code first, then explain what each of the critical terms means as they come up.
4. Be broken into compilable, playable sections: one per page of the guide.
5. Gradually refactor the code to add more functionality.
6. End with a list of suggestions (with appropriate links) on how you could extend the game in interesting ways.

This path should prioritize:

1. Rapid time-to-fun.
2. Functional, good-enough explanations that are tied to the code in front of them.
3. Relevance of quick-start game to the genre of game they want to make.
4. High asset quality.
5. Ease of extending the quick-start game with their own tweaks.
6. Explaining how to get unstuck, through documentation, community help and filing issues.

## The Bevy Book: the definition-first path

Users following the definition-first path will tend to take the following route:

1. Encounter the Bevy homepage due to social media or word of mouth.
2. Navigate to the Learn page.
3. Select the **Bevy book**.
4. Read through the book, largely in order.
5. Once they feel they have a good enough understanding of the engine, they will begin to make their own games, typically by jumping over onto the example-first path.
6. As they explore, they will also browse:
1. The source code.
2. [docs.rs](https://docs.rs/bevy/)
3. CONTRIBUTING.md, GitHub issues and pull requests.
4. Release notes.
5. The engine development channels on Discord.
6. Advanced examples to see how everything comes together.

Each chapter of the Bevy Book should:

1. Have a clear topic, and give a high-level overview of the subtopics it is going to cover and how they fit together.
2. Be broken down into several sections / pages to focus on detailed topics.
1. These should have simple, minimal examples explaining how that functionality works.
3. Link to appropriate sections of quick start guides that demonstrate the ideas being taught in a more coherent way.

This path should prioritize:

1. Clear, thorough explanations.
2. Carefully introducing one concept at a time in an organized fashion.
3. Connecting concepts to each other in context.
4. Explaining the technical details of how things work, but only in clearly marked asides.
5. Communicating all of the supporting development practices that make Bevy productive:
1. How to set up your dev environment.
2. Code organization.
3. Design patterns and best practices.
4. Testing, benchmarking and debugging.
5. Contributing to Bevy itself.
6. Linking to further reading: official examples, `docs.rs` and (very sparingly) source code links.

## Contributor's style guide

When writing and reviewing learning material for the Bevy Book and Quick Start Games, please try to follow these guidelines:

### Writing

1. Use clear, simple language.
2. Prefer short sentences. Remove extra words.
3. **Bold** new vocabulary words where they are defined.
1. Define them as soon as is reasonable after they are introduced.
4. Make sure your grammar and spelling are correct.
5. Avoid idioms and slang.
6. Speak directly to the reader in an approachable tone. Use "we" and "you" pronouns.
7. It can be useful to create specific, named characters to demonstrate a point.
1. If you do, pick a pronoun set for them and stick to it.
2. Otherwise, use "they/them" third-person pronouns to refer to the reader or others.
8. Keep humor light.
1. Avoid off-color or offensive humor.
2. Be mindful not to overuse in-jokes or cultural references.
3. Don't drag your jokes out: that's not what the audience is here to read.

### Organizational

1. Carefully organize your work into separate pages, headings, paragraphs and code blocks.
2. Clearly signal when you are explaining a concept in technical depth so it can be skipped.
3. Use lists, numbered lists and sub-lists to present information in bite-sized ways.
1. Refer back to these items by number!
4. Provide plenty of links, but be sure that what you are linking to is obvious by context.
1. Link to other sections of the book / example / web page when you mention them.
2. Always link to the most specific location you can, whether that's a section on a page or a method on a struct.
3. Use the `latest` tag when linking to Bevy docs and source code so it won't go stale every time the version is updated.
4. When linking to detailed explanations or discussions, summarize the most important points in addition to providing a link.

### Technical

1. All examples must be able to be compiled and run.
2. Prefer game-relevant, descriptive examples and variable names over generic ones like `MyEvent`. Avoid meaningless names like `foo` at all times.
3. It's good practice to break your code into blocks with comments or explanatory text, but you need to link to a cohesive, copy-able whole at the end.
4. Examples must pass Bevy's standard `clippy` lints.
alice-i-cecile marked this conversation as resolved.
Show resolved Hide resolved
5. The polish level of your examples should correspond to the point you're trying to make.
1. If you're demonstrating a new feature, show only the most basic syntax as locally as possible.
2. When trying to explain how a game can be made, organize and polish your code to showcase best practices.
3. Lack of polish should serve an end: don't show bad or sloppy practices without a good reason.
4. Showing how (and why!) to refactor your code is a very powerful teaching tool.
6. Stick to a consistent style (e.g. for loops vs map) within each example.
7. If you need to give advice that will only matter to some of your audience (e.g. how to handle an edge case, or support a specific platform), do so in a clearly marked aside or list.
8. Examples should not use or rely on third-party plugins.
These may be appropriate to link in "next steps" however at the end of the examples.
1. Third-party crates should be limited to the most essential, such as `rand`.
2 changes: 1 addition & 1 deletion content/learn/book/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ title = "Book"
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
redirect_to = "learn/book/introduction"
redirect_to = "learn/book/welcome"
+++
11 changes: 11 additions & 0 deletions content/learn/book/assets/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
+++
title = "Assets"
weight = 5
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: explain what an asset is.

TODO: Give a high-level overview of asset loading in Bevy. Make sure to describe how handles work.
9 changes: 9 additions & 0 deletions content/learn/book/assets/custom-assets/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
+++
title = "Custom assets"
weight = 3
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: Demonstrate how to write a custom asset loader.
11 changes: 11 additions & 0 deletions content/learn/book/assets/hot-reloading/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
+++
title = "Hot reloading"
weight = 4
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: demonstrate how to watch for changes to automatically hot reload assets when modified

Steal from https://github.com/bevyengine/bevy/blob/main/examples/asset/hot_asset_reloading.rs
13 changes: 13 additions & 0 deletions content/learn/book/assets/loading-assets/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
+++
title = "Loading assets"
weight = 1
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: Demonstrate how to load assets.

TODO: Discuss how to change the asset loading folder.

TODO: Discuss asset loading patterns to deal with async nature.
17 changes: 17 additions & 0 deletions content/learn/book/assets/scenes/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
+++
title = "Scenes and reflection"
weight = 5
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: explain what scenes are

TODO: explain what reflection is

TODO: demonstrate how to use scenes to load a prefab

TODO: demonstrate how to use scenes to load a level

TODO: demonstrate how to use scenes to save and load a game
15 changes: 15 additions & 0 deletions content/learn/book/assets/working-with-handles/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
+++
title = "Working with handles"
weight = 2
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: Explain what a handle is, and point to resources on reference counting in Rust

TODO: Demonstrate handle storage patterns

TODO: Demonstrate how to change materials of an asset

TODO: Explain what weak handles are
11 changes: 11 additions & 0 deletions content/learn/book/audio/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
+++
title = "Audio"
weight = 7
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: Tiny blurb about audio

TODO: disclaim WIP status, point to `bevy_kira_audio` and competing community crates
11 changes: 11 additions & 0 deletions content/learn/book/audio/audio_basics/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
+++
title = "Audio basics"
weight = 1
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: demonstrate how to load and play sounds

TODO: discuss compatible file formats
16 changes: 0 additions & 16 deletions content/learn/book/contributing/_index.md

This file was deleted.

32 changes: 0 additions & 32 deletions content/learn/book/contributing/code/_index.md

This file was deleted.

59 changes: 0 additions & 59 deletions content/learn/book/contributing/docs/_index.md

This file was deleted.

9 changes: 9 additions & 0 deletions content/learn/book/development-practices/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
+++
title = "Development practices"
weight = 9
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: this chapter covers practices that help you write larger Bevy apps in a clearer, safer and more productive way
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
+++
title = "Boilerplate reduction"
weight = 5
sort_by = "weight"
template = "book-section.html"
page_template = "book-section.html"
+++

TODO: link to resources on macros

TODO: discuss custom system parameters
Loading