diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 81f90cdc48..ac78e7d8a4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -18,3 +18,58 @@ Some of the parts in this list may be hard, don't be afraid to open a PR if you
Some of these checks can be performed automatically during commit using [pre-commit](https://pre-commit.com/).
Once the package is installed, simply run `pre-commit install` to enable the hooks, the checks will run automatically before the commit becomes effective.
+
+## LibAFL Code Rules
+
+Before making your pull requests, try to see if your code follows these rules.
+
+- Wherever possible, use `Cow<'static, str>` instead of String.
+- `PhantomData` should have the smallest set of types needed.
+- Wherever possible, trait implementations with lifetime specifiers should use '_ lifetime elision.
+- Complex constructors should be replaced with `typed_builder`, or write code in the builder pattern for yourself.
+- Remove generic restrictions at the definitions (e.g., we do not need to specify that types impl `Serialize`, `Deserialize`, or `Debug` anymore at the struct definitions). Therefore, try avoiding code like this unless the contraint is really necessary.
+```rust
+pub struct X
+ where
+ A: P // <- Do not add contraints here
+{
+ fn ...
+}
+
+```
+- Reduce generics to the least restrictive necessary. __Never overspecify the contraints__. There's no automated tool to check the useless constraints, so you have to verify this manually.
+```rust
+pub struct X
+ where
+ A: P + Q // <- Try to use the as smallest set of constraints as possible. If the code still compiles after deleting Q, then remove it.
+{
+ fn ...
+}
+
+```
+- Traits which have an associated type should refer to the associated type, not the concrete/generic. In other words, you should only have the associated type when you can define a getter to it. For example, in the following code, you can define a associate type.
+```rust
+pub trait X
+{
+ type A; // <- You should(can) define it as long as you have a getter to it.
+ fn a(&self) -> A;
+}
+
+```
+- __Ideally__ the types used in the the arguments of methods in traits should have the same as the types defined on the traits.
+```rust
+pub trait X // <- this trait have 3 generics, A, B, and C
+{
+ fn do_stuff(&self, a: A, b: B, c: C); // <- this is good because it uses all A, B, and C.
+
+ fn do_other_stuff(&self, a: A, b: B); // <- this is not ideal because it does not have C.
+}
+```
+- Always alphabetically order the type generics. Therefore,
+```rust
+pub struct X {}; // <- Generics are alphabetically ordered
+```
+But not,
+```rust
+pub struct X {}; // <- Generics are not ordered
+```
\ No newline at end of file