<div class="oranda-hide">
# Intrepid Core
</div>
Intrepid is a [magic handler][magic-handler] kit where most of the boilerplate work is already done. For cases where you'd like to get the ergonomics of Bevy or Actix-Web, but for your own stuff.
Intrepid core holds its interior concepts in the Core crate. Those are:
1. Frames ([`Frame`]); a type that represents a few different byte-forward structures.
1. Handlers ([`Handler`]); a trait that applies to handlers which can asynchronously work with frames.
1. Actions ([`Action`]); functions that we can treat as handlers.
1. Systems ([`System`]); bundles of actions grouped together that can be dispatched one frame over a bunch of actions.
All of this is a bunch of boilerplate managed to enable the intrepid core concept, which is this: you should be able to write your app logic once and then compose and recompose it a bunch of different ways.
Intrepid wants you to split your program into three groups:
1. Data; the things that you can turn into bytes and back. This is a hard limit on your program: it's something that you can persist or transmit outside of your program if you need.
1. State; the part of your program that gets shared across it at runtime. Sometimes state is serializable, sometimes it's not! For example, your database connection is state.
1. Behavior; the actual functions of your program themselves. These are async functions that need to know about your data and state, and only your data and state.
If you're able to split your code up like this, intrepid rewards you with a ton of bonus ergonomics by letting you write most of your code in the form of types and async functions that use those types. It lets you make business logic out of a function and then turn that function into a reusable thing that you can pop into place all over your codebase, or use directly in pretty fancy ways.
[magic-handler]: https://lunatic.solutions/blog/magic-handler-functions-in-rust/