diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a08bec2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,55 @@
+# aoc-2022
+
+don't look in `src/bin/day_*.rs` if you don't want spoilers.
+
+yes some of this setup is needlessly overengineered
+
+## magic rust macros (tm)
+
+yes
+
+i thought teehee i could make a proc macro for this
+
+## using this
+
+just don't
+
+### ok alright
+
+Make a solution for a day:
+
+```rust
+// Some useful things, including macros + color_eyre
+use aoc_2022::prelude::*;
+
+type Input = String; // some mildly useful structure for the input data
+
+fn parse(s: &str) -> Result {
+ // implement whatever scary string manipulation you like
+ Ok(s.to_owned())
+}
+
+ // heres some macro magic ✨
+#[aoc(
+ day = 100, // used to fetch the challenge stuff from AOC directly
+ parse = parse, // so I can reuse parsers if needed
+ test_cases = ["day_100.txt"] // loaded from `test_cases/`
+)]
+fn day_100(mut input: Input) -> Result<()> {
+ // do something remotely awful to solve the challenge
+
+ // probably should println!() the results or something
+
+ Ok(())
+}
+
+// macro: a wild main function appears!
+```
+
+### auto-fetching
+
+steal your session cookie from the browser devtools
+
+make `.env` and add `AOC_SESSION=`
+
+maybe use direnv to make it easier to load the `.env` file? (and the nix flake (yes theres one of those too uwu))