Compare commits

...

2 commits

Author SHA1 Message Date
984b7f2641 add templates 2026-04-24 15:45:57 -04:00
9a458ebfa3 fix email 2026-04-24 15:45:39 -04:00
17 changed files with 845 additions and 189 deletions

622
Cargo.lock generated
View file

@ -1,6 +1,24 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
version = 4
[[package]]
name = "aho-corasick"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
[[package]]
name = "android_system_properties"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
dependencies = [
"libc",
]
[[package]]
name = "atomic-waker"
@ -8,6 +26,12 @@ version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "autocfg"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "base64"
version = "0.22.1"
@ -29,18 +53,83 @@ dependencies = [
"generic-array",
]
[[package]]
name = "bstr"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
dependencies = [
"memchr",
"serde",
]
[[package]]
name = "bumpalo"
version = "3.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
[[package]]
name = "bytes"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
[[package]]
name = "cc"
version = "1.2.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d"
dependencies = [
"find-msvc-tools",
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "chrono"
version = "0.4.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
dependencies = [
"iana-time-zone",
"num-traits",
"windows-link",
]
[[package]]
name = "chrono-tz"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb"
dependencies = [
"chrono",
"chrono-tz-build",
"phf",
]
[[package]]
name = "chrono-tz-build"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1"
dependencies = [
"parse-zoneinfo",
"phf",
"phf_codegen",
]
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpufeatures"
version = "0.2.17"
@ -50,6 +139,31 @@ dependencies = [
"libc",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crypto-common"
version = "0.1.7"
@ -60,6 +174,12 @@ dependencies = [
"typenum",
]
[[package]]
name = "deunicode"
version = "1.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04"
[[package]]
name = "digest"
version = "0.10.7"
@ -86,6 +206,12 @@ dependencies = [
"windows-sys",
]
[[package]]
name = "find-msvc-tools"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
[[package]]
name = "fnv"
version = "1.0.7"
@ -150,6 +276,41 @@ dependencies = [
"version_check",
]
[[package]]
name = "getrandom"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "globset"
version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
dependencies = [
"aho-corasick",
"bstr",
"log",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "globwalk"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757"
dependencies = [
"bitflags",
"ignore",
"walkdir",
]
[[package]]
name = "h2"
version = "0.4.13"
@ -244,6 +405,15 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "humansize"
version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7"
dependencies = [
"libm",
]
[[package]]
name = "hyper"
version = "1.9.0"
@ -280,6 +450,46 @@ dependencies = [
"tower-service",
]
[[package]]
name = "iana-time-zone"
version = "0.1.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"log",
"wasm-bindgen",
"windows-core",
]
[[package]]
name = "iana-time-zone-haiku"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
"cc",
]
[[package]]
name = "ignore"
version = "0.4.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a"
dependencies = [
"crossbeam-deque",
"globset",
"log",
"memchr",
"regex-automata",
"same-file",
"walkdir",
"winapi-util",
]
[[package]]
name = "indexmap"
version = "2.14.0"
@ -296,12 +506,34 @@ version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
name = "js-sys"
version = "0.3.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"
dependencies = [
"once_cell",
"wasm-bindgen",
]
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.185"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f"
[[package]]
name = "libm"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]]
name = "lock_api"
version = "0.4.14"
@ -350,6 +582,15 @@ dependencies = [
"windows-sys",
]
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
[[package]]
name = "once_cell"
version = "1.21.4"
@ -379,12 +620,102 @@ dependencies = [
"windows-link",
]
[[package]]
name = "parse-zoneinfo"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24"
dependencies = [
"regex",
]
[[package]]
name = "percent-encoding"
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pest"
version = "2.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662"
dependencies = [
"memchr",
"ucd-trie",
]
[[package]]
name = "pest_derive"
version = "2.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77"
dependencies = [
"pest",
"pest_generator",
]
[[package]]
name = "pest_generator"
version = "2.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f"
dependencies = [
"pest",
"pest_meta",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "pest_meta"
version = "2.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220"
dependencies = [
"pest",
"sha2",
]
[[package]]
name = "phf"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
dependencies = [
"phf_shared",
]
[[package]]
name = "phf_codegen"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
dependencies = [
"phf_generator",
"phf_shared",
]
[[package]]
name = "phf_generator"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
dependencies = [
"phf_shared",
"rand",
]
[[package]]
name = "phf_shared"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
dependencies = [
"siphasher",
]
[[package]]
name = "pin-project"
version = "1.1.11"
@ -411,6 +742,15 @@ version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
[[package]]
name = "ppv-lite86"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [
"zerocopy",
]
[[package]]
name = "proc-macro2"
version = "1.0.106"
@ -429,6 +769,36 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
]
[[package]]
name = "redox_syscall"
version = "0.5.18"
@ -438,12 +808,56 @@ dependencies = [
"bitflags",
]
[[package]]
name = "regex"
version = "1.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
[[package]]
name = "rustversion"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "ryu"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
dependencies = [
"winapi-util",
]
[[package]]
name = "scoped-tls"
version = "1.0.1"
@ -521,6 +935,23 @@ dependencies = [
"digest",
]
[[package]]
name = "sha2"
version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
"cfg-if",
"cpufeatures",
"digest",
]
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook-registry"
version = "1.4.8"
@ -531,12 +962,28 @@ dependencies = [
"libc",
]
[[package]]
name = "siphasher"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e"
[[package]]
name = "slab"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
[[package]]
name = "slug"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "882a80f72ee45de3cc9a5afeb2da0331d58df69e4e7d8eeb5d3c7784ae67e724"
dependencies = [
"deunicode",
"wasm-bindgen",
]
[[package]]
name = "smallvec"
version = "1.15.1"
@ -564,6 +1011,28 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "tera"
version = "1.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8004bca281f2d32df3bacd59bc67b312cb4c70cea46cbd79dbe8ac5ed206722"
dependencies = [
"chrono",
"chrono-tz",
"globwalk",
"humansize",
"lazy_static",
"percent-encoding",
"pest",
"pest_derive",
"rand",
"regex",
"serde",
"serde_json",
"slug",
"unicode-segmentation",
]
[[package]]
name = "tokio"
version = "1.52.1"
@ -637,6 +1106,12 @@ version = "1.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
[[package]]
name = "ucd-trie"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
[[package]]
name = "unicase"
version = "2.9.0"
@ -649,12 +1124,28 @@ version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "unicode-segmentation"
version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "walkdir"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
"same-file",
"winapi-util",
]
[[package]]
name = "warp"
version = "0.4.2"
@ -690,20 +1181,129 @@ version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "wasm-bindgen"
version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"
dependencies = [
"unicode-ident",
]
[[package]]
name = "website"
version = "0.1.0"
dependencies = [
"lazy_static",
"tera",
"tokio",
"warp",
]
[[package]]
name = "winapi-util"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
"windows-sys",
]
[[package]]
name = "windows-core"
version = "0.62.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
dependencies = [
"windows-implement",
"windows-interface",
"windows-link",
"windows-result",
"windows-strings",
]
[[package]]
name = "windows-implement"
version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-interface"
version = "0.59.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-result"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-strings"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-sys"
version = "0.61.2"
@ -713,6 +1313,26 @@ dependencies = [
"windows-link",
]
[[package]]
name = "zerocopy"
version = "0.8.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "zmij"
version = "1.0.21"

View file

@ -4,5 +4,7 @@ version = "0.1.0"
edition = "2021"
[dependencies]
lazy_static = "1.5.0"
tera = "1.20.1"
tokio = { version = "1", features = ["full"] }
warp = { version = "0.4", features = ["server"] }

View file

@ -7,6 +7,7 @@ FROM debian:bookworm-slim
WORKDIR /app
COPY --from=builder /usr/src/app/target/release/website /app/warp_server
COPY ./static /app/static
COPY ./templates /app/templates
EXPOSE 3030
CMD ["./warp_server"]

View file

@ -1,8 +1,21 @@
use warp::Filter;
use tera::{Context, Tera};
use warp::{Filter, filters::path::Tail, Reply, Rejection};
lazy_static::lazy_static! {
pub static ref TEMPLATES: Tera = Tera::new("templates/**/*").expect("failed to parse templates");
}
#[tokio::main]
async fn main() {
let static_files = warp::fs::dir("static");
let static_pages = warp::fs::dir("static");
for name in TEMPLATES.get_template_names() {
println!("Loaded template {}", name);
}
let templates = warp::get()
.and(warp::path::tail())
.and_then(render_template);
let root = warp::path::end()
.and(warp::header::optional::<String>("accept-language"))
@ -14,9 +27,24 @@ async fn main() {
warp::redirect(warp::http::Uri::from_static(target))
});
let routes = root.or(static_files);
let routes = root.or(static_pages).or(templates);
warp::serve(routes)
.run(([0,0,0,0], 3030))
.await;
}
async fn render_template(tail: Tail) -> Result<impl Reply, Rejection> {
let mut path = tail.as_str().to_string();
if path.is_empty() || path.ends_with('/') {
path.push_str("index.html");
}
match TEMPLATES.render(&path, &Context::new()) {
Ok(html) => Ok(warp::reply::html(html)),
Err(e) => {
eprintln!("Tera error: {}", e);
Err(warp::reject::not_found())
}
}
}

Binary file not shown.

View file

@ -1,12 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Spencer Whitehead</title>
</head>
<link rel="stylesheet" href="/assets/main.css">
<body>
<p>Pour accéder à la version française, veuillez cliquer <a href="/fr/">ici.</a></p>
<p>This is the personal website of Spencer Whitehead.</p>
<p><a href="resume/">Resume</p></p>
</body>

View file

@ -1,154 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Spencer Nicholas Whitehead - CV</title>
</head>
<body>
<link rel="stylesheet" href="/assets/main.css">
<header>
<h1>Spencer Nicholas Whitehead</h1>
<address>
Courriel: <a href="mailto:spencer@firemail.cc">spencer@firemail.cc</a><br>
No de tél.: +1 984 312 9089
</address>
</header>
<section>
<h2>Education</h2>
<article>
<p><strong>Doctorant, Department of Mathematics, Université Duke</strong> | septembre 2022 Avril 2027</p>
<ul>
<li>Currently researching four- and eight-dimensional geometry with Prof. Mark Stern.</li>
<li>Member of the Certificate in College Teaching program, to be awarded on graduation.</li>
</ul>
</article>
<article>
<p><strong>M.Math. in Pure Mathematics (research thesis), Université de Waterloo</strong> | Octobre 2021 août 2022</p>
<ul>
<li>Supervisé de Prof. Benoit Charbonneau.</li>
<li>Titre du thèse: Integrality theorems for symmetric instantons.</li>
</ul>
</article>
<article>
<p><strong>B.Math. in Pure Mathematics; Minor in études de l'Asie d'Est, Université de Waterloo</strong> | septembre 2016 août 2021</p>
<ul>
<li>Recipient of 2021 Alumni Gold Medal for the Faculty of Mathematics.</li>
<li>Recipient of 2021 Jessie W.H. Zou Memorial Award for Excellence in Undergraduate Research.</li>
</ul>
</article>
</section>
<section>
<h2>Industry Experience</h2>
<article>
<p><strong>Stagiaire en ingénierie logicielle</strong>, Citadel Enterprise, Janvier 2020 Avril 2020</p>
<ul>
<li>Developed C++ data pipelines to parse and archive data streams from Thompson Reuters.</li>
<li>Handled over 300GB per day of market data at the height of the market impact of COVID-19.</li>
</ul>
</article>
<article>
<p><strong>Stagiaire en ingénierie logicielle</strong>, ContextLogic LLC, Janvier 2018 Avril 2018</p>
<ul>
<li>Worked as a member of the Platform Data team, monitoring the health of policies and shipping estimates.</li>
<li>Conducted shipping time estimate experiments ranging from neutral to gross +2.5% profits.</li>
<li>Created reports and Grafana dashboards combining data from MongoDB and TreasureData tracking merchant policy effectiveness.</li>
</ul>
</article>
<article>
<p><strong>Stagiaire en ingénierie logicielle</strong>, Citadel LLC, septembre 2017 décembre 2017</p>
<ul>
<li>Worked on the Accounting Development Team, creating and maintaining software for over 100 clients.</li>
<li>Designed, tested, and implemented new response formats reducing response size by 10x and increasing speed 5x.</li>
</ul>
</article>
</section>
<section>
<h2>Skills</h2>
<dl>
<dt><strong>Langages</strong></dt>
<dd>anglais, français (DELF B2), japonais (niveau B2/C1).</dd>
<dt><strong>Langages de programmation</strong></dt>
<dd>C, C++, Python, Sage, Maple, Haskell.</dd>
<dt><strong>Logiciel</strong></dt>
<dd>sklearn, numpy, (geo)pandas, pytorch, SQL.</dd>
</dl>
</section>
<section>
<h2>Leadership and Professional Service</h2>
<p>Délegué syndical, Duke Graduate Students Union, septembre 2025 - prèsent</p>
<ul>
<li>Mediated workplace disputes and represented graduate workers in grievance proceedings.</li>
</ul>
<p>Président, Chapitre étudiant de l'American Mathematical Society, année scolaire 2024-25</p>
<ul>
<li>Organized and hosted the Triangle Area Graduate Mathematics Seminar with NC State University and UNC Chapel Hill at Duke, fevrier 2025.</li>
</ul>
<p>Représentant des doctorants, Duke Mathematics Departmental Teaching Committee, novembre 2023 - present</p>
<ul>
<li>Performed annual interviews and advocated for graduate interests in departmental teaching decisions.</li>
</ul>
</section>
<section>
<h2>Academic Activity</h2>
<article>
<h3>Selected Publications</h3>
<ul>
<li>Edidin, Dan, Matthew Satriano, et Spencer Whitehead. "On a smoothness characterization for good moduli spaces." <em>Advances in Mathematics</em> 442 (Avril 2024).</li>
<li>Charbonneau, B. et Whitehead, S. "Studying Wythoff and Zometool Constructions using Maple." <em>Maple in Mathematics Education and Research</em> (pp. 6576), 2020.</li>
</ul>
</article>
<article>
<h3>Supervision</h3>
<p><strong>Duke Math+ program</strong> (joint with Biji Wong, Gregory Herschlag), Spring 2026</p>
<p>Supervised four undergraduate students in a project on the application of diffusion maps and machine learning to graph partition problems, with a focus on the study of gerrymandering.</p>
<p><strong>MITACS internship program</strong> (joint with Benoit Charbonneau), Spring 2022</p>
<p>Supervised two undergraduate students in a computational project on low-dimensional optimal packing problems</p>
</article>
<article>
<h3>Selected Research Presentations</h3>
<ul>
<li>[Invité] <em>An asymptotic Nahm transform for Spin(7) instantons.</em> Mathematical Congress of the Americas, Miami, juliet 2025.</li>
<li><em>Symmetric instantons.</em> (Poster). Geometric Models of Matter, Leeds, août 2024.</li>
<li><em>Generalized Pythagorean lutes.</em> Bridges 2022, Helsinki, août 2022.</li>
<li><em>Integrality theorems for symmetric instantons.</em> Union College Mathematics Conference, Schenectady, juin 2022.</li>
</ul>
</article>
<article>
<h3>Selected Teaching Experience</h3>
<p><strong>Chargé de cours</strong> MATH 106L (Lab calculus 2), août - décembre 2023, Université Duke</p>
<ul>
<li>Instruction et coordination d'une classe de 18 élèves.</li>
<li>Gestion d'un equipe de 4 auxiliaires d'enseignment</li>
</ul>
<p><strong>Auxiliaire d'enseignment</strong> CS 246(E) ([Enriched] Object-Oriented Software Development), septembre 2018 - décembre 2019, Université de Waterloo.</p>
<ul>
<li>Delivered weekly tutorial lectures for classes of 50+ students.</li>
<li>Designed assignments and managed the course platform for running and evaluating student code.</li>
</ul>
</article>
</section>
</body>
</html>

20
templates/common.html Normal file
View file

@ -0,0 +1,20 @@
{% macro meta(title, lang) %}
<!DOCTYPE html>
<html lang="{{ lang }}">
<head>
<meta charset="UTF-8">
<meta name="language" content="{{ lang }}">
<title>{{ title }}</title>
</head>
<link rel="stylesheet" href="/assets/main.css">
{% endmacro %}
{% macro nav() %}
<nav>
{% if lang == "fr" %}
<a href="/">Accueil</a>
{% else %}
<a href="/">Home</a>
{% endif %}
</nav>
{% endmacro %}

8
templates/en/index.html Normal file
View file

@ -0,0 +1,8 @@
{% import "common.html" as common %}
{{ common::meta(title="Home Page", lang="en") }}
<body>
<p>Pour accéder à la version française, veuillez cliquer <a href="/fr/">ici.</a></p>
<p>This is the personal website of Spencer Whitehead. I am a fourth-year Ph.D. candidate at Duke University, expecting to graduate in early 2027.
My primary research interests are in gauge theory, four- and eight-dimensional differential geometry, and the applications of computer algebra systems to solving problems in geometry.</p>
<p><a href="resume/">Resume</a></p>
</body>

View file

@ -1,11 +1,7 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Spencer Nicholas Whitehead - CV</title>
</head>
{% import "common.html" as common %}
{{ common::meta(title="Spencer Whitehead - Resume", lang="en") }}
<body>
<link rel="stylesheet" href="/assets/main.css">
{{ common::nav() }}
<header>
<h1>Spencer Nicholas Whitehead</h1>
@ -19,16 +15,15 @@
<h2>Education</h2>
<article>
<p><strong>Ph.D. candidate, Department of Mathematics, Duke University</strong> | September 2022 April 2027 (expected)</p>
<p><strong>Ph.D. candidate, Department of Mathematics, Duke University</strong>, September 2022 April 2027 (expected)</p>
<ul>
<li>Currently researching four- and eight-dimensional geometry with Dr. Mark Stern.</li>
<li>Advanced to candidacy March 2025.</li>
<li>Member in the Certificate in College Teaching program, to be awarded on graduation.</li>
</ul>
</article>
<article>
<p><strong>M.Math. in Pure Mathematics (research thesis), University of Waterloo</strong> | October 2021 August 2022</p>
<p><strong>M.Math. in Pure Mathematics (research thesis), University of Waterloo</strong>, October 2021 August 2022</p>
<ul>
<li>Supervised by Dr. Benoit Charbonneau.</li>
<li>Thesis title: Integrality theorems for symmetric instantons.</li>
@ -36,7 +31,7 @@
</article>
<article>
<p><strong>B.Math. in Pure Mathematics; Minor in East Asian Studies, University of Waterloo</strong> | September 2016 August 2021</p>
<p><strong>B.Math. in Pure Mathematics; Minor in East Asian Studies, University of Waterloo</strong>, September 2016 August 2021</p>
<ul>
<li>Recipient of 2021 Alumni Gold Medal for the Faculty of Mathematics.</li>
<li>Recipient of 2021 Jessie W.H. Zou Memorial Award for Excellence in Undergraduate Research.</li>
@ -58,8 +53,7 @@
<article>
<p><strong>Software Engineering Intern</strong>, ContextLogic LLC, January 2018 April 2018</p>
<ul>
<li>Worked as a member of the Platform Data team, monitoring the health of policies and shipping estimates.</li>
<li>Conducted shipping time estimate experiments ranging from neutral to gross +2.5% profits.</li>
<li>Conducted shipping time estimate experiments providing up to gross +2.5% profits.</li>
<li>Created reports and Grafana dashboards combining data from MongoDB and TreasureData tracking merchant policy effectiveness.</li>
</ul>
</article>

View file

@ -1,11 +1,10 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Spencer Whitehead</title>
</head>
{% import "common.html" as common %}
{{ common::meta(title="Page d'accueil", lang="fr") }}
<link rel="stylesheet" href="/assets/main.css">
<body>
<p>To access the English version, click <a href="/en/">here.</a></p>
<p>Ceci est le site web personnel de Spencer Whitehead.</p>
<p><a href="resume/">CV</a></p>
</body>

View file

@ -0,0 +1,150 @@
{% import "common.html" as common %}
{{ common::meta(title="Spencer Whitehead - CV", lang="fr") }}
<body>
{{ common::nav() }}
<header>
<h1>Spencer Nicholas Whitehead</h1>
<address>
Courriel : <a href="mailto:spencer@firemail.cc">spencer@firemail.cc</a><br>
Tél. : +1 984 312 9089
</address>
</header>
<section>
<h2>Education</h2>
<article>
<p><strong>Doctorant, départment des mathématiques, Université Duke</strong> | septembre 2022 avril 2027</p>
<ul>
<li>Chercheur de la geometrie de quatre et huit dimensions sous la direction du Pr Mark Stern.</li>
<li>Membre du programme de certificat en enseignant universitaire, qui sera décerné à la reussit au doctorat.</li>
</ul>
</article>
<article>
<p><strong>M.Math. en mathématiques pures (thèse du recherche), Université de Waterloo</strong> | octobre 2021 août 2022</p>
<ul>
<li>Sous la direction du Pr Benoit Charbonneau.</li>
<li>Titre du thèse : Integrality theorems for symmetric instantons.</li>
</ul>
</article>
<article>
<p><strong>B.Math. en mathématiques pures; mineure en études de l'Asie de l'Est, Université de Waterloo</strong> | septembre 2016 août 2021</p>
<ul>
<li>2021 Médaille d'or des anciens, Faculty of Mathematics.</li>
<li>2021 Prix commémoratif Jessie W.H. Zou pour l'excellence en recherche au premier cycle.</li>
</ul>
</article>
</section>
<section>
<h2>Industry Experience</h2>
<article>
<p><strong>Stagiaire en ingénierie logicielle</strong>, Citadel Enterprise, janvier 2020 avril 2020</p>
<ul>
<li>Developpment de pipelines en C++ pour analyser et archiver donnèes de Thompson Reuters.</li>
<li>Traitment d'en haute de 300GB des donnèes de marché par jour pendant la crise de COVID-19.</li>
</ul>
</article>
<article>
<p><strong>Stagiaire en ingénierie logicielle</strong>, ContextLogic LLC, janvier 2018 avril 2018</p>
<ul>
<li>Recherche sur les estimates de délais de livraison qui ont généré 2,5% de profits supplémentaires.</li>
<li>Création de reports et tableau de bord Grafana en combinaison des donnèes de MongoDB et TreasureData.</li>
</ul>
</article>
<article>
<p><strong>Stagiaire en ingénierie logicielle</strong>, Citadel LLC, septembre 2017 décembre 2017</p>
<ul>
<li>Création et soutien de logiciel de accounting comptabilité pour plus de 100 clients interne.</li>
<li>Conception et implementation des nouveaux formats de réponse, ce qui a reduisé la taille de la réponse 10x et a amelioré la vitesse 5x.</li>
</ul>
</article>
</section>
<section>
<h2>Skills</h2>
<dl>
<dt><strong>Langues</strong></dt>
<dd>anglais, français (DELF B2), japonais (niveau B2/C1).</dd>
<dt><strong>Langages de programmation</strong></dt>
<dd>C, C++, Python, Sage, Maple, Haskell.</dd>
<dt><strong>Outils informatiques</strong></dt>
<dd>sklearn, numpy, (geo)pandas, pytorch, SQL.</dd>
</dl>
</section>
<section>
<h2>Leadership et services professionnels</h2>
<p>Délégué syndical, Duke Graduate Students Union, septembre 2025 - à ce jour</p>
<ul>
<li>Mediation de conflits au travail et répresentation des doctorants en procédure de gref.</li>
</ul>
<p>Président, Section étudiant de l'American Mathematical Society, année universitaire 2024-25</p>
<ul>
<li>Organisation du Triangle Area Graduate Mathematics Seminar avec l'Université NC State et l'UNC Chapel Hill à Duke, février 2025.</li>
</ul>
<p>Représentant des doctorants, Duke Mathematics Departmental Teaching Committee, novembre 2023 - à ce jour</p>
<ul>
<li>Performed annual interviews and advocated for graduate interests in departmental teaching decisions.</li>
</ul>
</section>
<section>
<h2>Academic Activity</h2>
<article>
<h3>Selected Publications</h3>
<ul>
<li>Edidin, Dan, Matthew Satriano, et Spencer Whitehead. "On a smoothness characterization for good moduli spaces." <em>Advances in Mathematics</em> 442 (avril 2024).</li>
<li>Charbonneau, B. et Whitehead, S. "Studying Wythoff and Zometool Constructions using Maple." <em>Maple in Mathematics Education and Research</em> (pp. 6576), 2020.</li>
</ul>
</article>
<article>
<h3>Direction</h3>
<p><strong>Duke Math+ program</strong> (joint with Biji Wong, Gregory Herschlag), mai - août 2026</p>
<p>Direction de quatres étudiants dans un projet sur l'application de diffusion maps et apprentissage automatique pour rechercher le gerrymandering.</p>
<p><strong>MITACS internship program</strong> (joint with Benoit Charbonneau), mai - août 2022</p>
<p>Direction de deux étudiants dans un projet sur le probleme de packing en bas dimension.</p>
</article>
<article>
<h3>Selected Research Presentations</h3>
<ul>
<li>[Invité] <em>An asymptotic Nahm transform for Spin(7) instantons.</em> Mathematical Congress of the Americas, Miami, julliet 2025.</li>
<li><em>Symmetric instantons.</em> (Poster). Geometric Models of Matter, Leeds, août 2024.</li>
<li><em>Generalized Pythagorean lutes.</em> Bridges 2022, Helsinki, août 2022.</li>
<li><em>Integrality theorems for symmetric instantons.</em> Union College Mathematics Conference, Schenectady, juin 2022.</li>
</ul>
</article>
<article>
<h3>Selected Teaching Experience</h3>
<p><strong>Chargé de cours</strong> MATH 106L (Lab calculus 2), août - décembre 2023, Université Duke</p>
<ul>
<li>Enseignement et coordination d'un group de 18 étudiants.</li>
<li>Gestion d'une équipe de 4 auxiliaires d'enseignement</li>
</ul>
<p><strong>Auxiliaire d'enseignment</strong> CS 246(E) ([Enriched] Object-Oriented Software Development), septembre 2018 - décembre 2019, Université de Waterloo.</p>
<ul>
<li>Delivered weekly tutorial lectures for classes of 50+ students.</li>
<li>Creation des devoirs et gestation d'outils logiciels pour evaluer code d'étudiants</li>
</ul>
</article>
</section>
</body>
</html>