summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author53hornet <atc@53hor.net>2021-08-22 11:03:36 -0400
committer53hornet <atc@53hor.net>2021-08-22 11:03:36 -0400
commit7494b946920bf93fa12ac1fc71a07b1165a203e2 (patch)
tree0003ebcdb595c53a0a8bb1cde8cf54b94a52c3f7
parentf2e39406302c3b79a608a6f20e058a084401c6eb (diff)
downloadcarpentertutoring-7494b946920bf93fa12ac1fc71a07b1165a203e2.tar.xz
carpentertutoring-7494b946920bf93fa12ac1fc71a07b1165a203e2.zip
begin migrate to warp for evals functionality and site server
-rw-r--r--.gitignore6
-rw-r--r--Cargo.lock1272
-rw-r--r--Cargo.toml23
-rw-r--r--src/main.rs60
-rw-r--r--static/about/index.php (renamed from about/index.php)0
-rw-r--r--static/assets/amy.png (renamed from assets/amy.png)bin346630 -> 346630 bytes
-rw-r--r--static/assets/amy.webp (renamed from assets/amy.webp)bin44532 -> 44532 bytes
-rw-r--r--static/assets/bg.png (renamed from assets/bg.png)bin150111 -> 150111 bytes
-rw-r--r--static/assets/favicon.ico (renamed from assets/favicon.ico)bin327262 -> 327262 bytes
-rw-r--r--static/assets/icons/close-box.svg (renamed from assets/icons/close-box.svg)0
-rw-r--r--static/assets/icons/dots-horizontal-circle.svg (renamed from assets/icons/dots-horizontal-circle.svg)0
-rw-r--r--static/assets/icons/email-variant.svg (renamed from assets/icons/email-variant.svg)0
-rw-r--r--static/assets/icons/phone-classic.svg (renamed from assets/icons/phone-classic.svg)0
-rw-r--r--static/assets/icons/send-circle.svg (renamed from assets/icons/send-circle.svg)0
-rw-r--r--static/assets/icons/star-box.svg (renamed from assets/icons/star-box.svg)0
-rw-r--r--static/assets/logo-simple.png (renamed from assets/logo-simple.png)bin9332 -> 9332 bytes
-rw-r--r--static/assets/logo-small.png (renamed from assets/logo-small.png)bin46158 -> 46158 bytes
-rw-r--r--static/assets/logo.png (renamed from assets/logo.png)bin89452 -> 89452 bytes
-rw-r--r--static/assets/logo.webp (renamed from assets/logo.webp)bin10338 -> 10338 bytes
-rw-r--r--static/assets/signature.png (renamed from assets/signature.png)bin17196 -> 17196 bytes
-rw-r--r--static/assets/signature.webp (renamed from assets/signature.webp)bin11102 -> 11102 bytes
-rw-r--r--static/desktop.css (renamed from desktop.css)0
-rw-r--r--static/favicon.ico (renamed from favicon.ico)bin327262 -> 327262 bytes
-rw-r--r--static/footer.php (renamed from footer.php)0
-rw-r--r--static/header.php (renamed from header.php)0
-rw-r--r--static/index.php (renamed from index.php)0
-rw-r--r--static/policies/index.php (renamed from policies/index.php)0
-rw-r--r--static/widescreen.css (renamed from widescreen.css)0
-rw-r--r--templates/base.hbs317
-rw-r--r--templates/index.hbs468
30 files changed, 2146 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 5958712..afa3bec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,9 @@
_site/
*.core
PHPMailer-master
+
+
+# Added by cargo
+
+/target
+*.core
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..8372740
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,1272 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "ahash"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98"
+dependencies = [
+ "getrandom 0.2.3",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+
+[[package]]
+name = "base64"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "block-buffer"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
+dependencies = [
+ "block-padding",
+ "byte-tools",
+ "byteorder",
+ "generic-array 0.12.4",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
+dependencies = [
+ "generic-array 0.14.4",
+]
+
+[[package]]
+name = "block-padding"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
+dependencies = [
+ "byte-tools",
+]
+
+[[package]]
+name = "buf_redux"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f"
+dependencies = [
+ "memchr",
+ "safemem",
+]
+
+[[package]]
+name = "byte-tools"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "cpufeatures"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "ct"
+version = "0.1.0"
+dependencies = [
+ "handlebars",
+ "lazy_static",
+ "rusqlite",
+ "serde",
+ "tokio",
+ "warp",
+]
+
+[[package]]
+name = "digest"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
+dependencies = [
+ "generic-array 0.12.4",
+]
+
+[[package]]
+name = "digest"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
+dependencies = [
+ "generic-array 0.14.4",
+]
+
+[[package]]
+name = "fake-simd"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
+
+[[package]]
+name = "fallible-iterator"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
+dependencies = [
+ "matches",
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99"
+
+[[package]]
+name = "futures-io"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582"
+
+[[package]]
+name = "futures-sink"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53"
+
+[[package]]
+name = "futures-task"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2"
+
+[[package]]
+name = "futures-util"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78"
+dependencies = [
+ "autocfg",
+ "futures-core",
+ "futures-sink",
+ "futures-task",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
+dependencies = [
+ "typenum",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.10.2+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "handlebars"
+version = "3.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4498fc115fa7d34de968184e473529abb40eeb6be8bc5f7faba3d08c316cb3e3"
+dependencies = [
+ "log",
+ "pest",
+ "pest_derive",
+ "quick-error 2.0.1",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "hashlink"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf"
+dependencies = [
+ "hashbrown",
+]
+
+[[package]]
+name = "headers"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0b7591fb62902706ae8e7aaff416b1b0fa2c0fd0878b46dc13baa3712d8a855"
+dependencies = [
+ "base64",
+ "bitflags",
+ "bytes",
+ "headers-core",
+ "http",
+ "mime",
+ "sha-1 0.9.7",
+ "time",
+]
+
+[[package]]
+name = "headers-core"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
+dependencies = [
+ "http",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "http"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68"
+
+[[package]]
+name = "httpdate"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440"
+
+[[package]]
+name = "hyper"
+version = "0.14.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b61cf2d1aebcf6e6352c97b81dc2244ca29194be1b276f5d8ad5c6330fffb11"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "idna"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "input_buffer"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413"
+dependencies = [
+ "bytes",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790"
+
+[[package]]
+name = "libsqlite3-sys"
+version = "0.22.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290b64917f8b0cb885d9de0f9959fe1f775d7fa12f1da2db9001c1c8ab60f89d"
+dependencies = [
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "log"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "maplit"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
+
+[[package]]
+name = "matches"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
+
+[[package]]
+name = "memchr"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
+
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
+[[package]]
+name = "mio"
+version = "0.7.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16"
+dependencies = [
+ "libc",
+ "log",
+ "miow",
+ "ntapi",
+ "winapi",
+]
+
+[[package]]
+name = "miow"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "multipart"
+version = "0.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d050aeedc89243f5347c3e237e3e13dc76fbe4ae3742a57b94dc14f69acf76d4"
+dependencies = [
+ "buf_redux",
+ "httparse",
+ "log",
+ "mime",
+ "mime_guess",
+ "quick-error 1.2.3",
+ "rand 0.7.3",
+ "safemem",
+ "tempfile",
+ "twoway",
+]
+
+[[package]]
+name = "ntapi"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
+
+[[package]]
+name = "opaque-debug"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[package]]
+name = "pest"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53"
+dependencies = [
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d"
+dependencies = [
+ "maplit",
+ "pest",
+ "sha-1 0.8.2",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "quick-error"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
+
+[[package]]
+name = "quick-error"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
+
+[[package]]
+name = "quote"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc 0.2.0",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.3",
+ "rand_hc 0.3.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[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 0.6.3",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
+dependencies = [
+ "getrandom 0.2.3",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
+dependencies = [
+ "rand_core 0.6.3",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "rusqlite"
+version = "0.25.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57adcf67c8faaf96f3248c2a7b419a0dbc52ebe36ba83dd57fe83827c1ea4eb3"
+dependencies = [
+ "bitflags",
+ "fallible-iterator",
+ "fallible-streaming-iterator",
+ "hashlink",
+ "libsqlite3-sys",
+ "memchr",
+ "smallvec",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+
+[[package]]
+name = "safemem"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
+
+[[package]]
+name = "scoped-tls"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
+
+[[package]]
+name = "serde"
+version = "1.0.127"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.127"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha-1"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
+dependencies = [
+ "block-buffer 0.7.3",
+ "digest 0.8.1",
+ "fake-simd",
+ "opaque-debug 0.2.3",
+]
+
+[[package]]
+name = "sha-1"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a0c8611594e2ab4ebbf06ec7cbbf0a99450b8570e96cbf5188b5d5f6ef18d81"
+dependencies = [
+ "block-buffer 0.9.0",
+ "cfg-if",
+ "cpufeatures",
+ "digest 0.9.0",
+ "opaque-debug 0.3.0",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527"
+
+[[package]]
+name = "smallvec"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
+
+[[package]]
+name = "socket2"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.74"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "rand 0.8.4",
+ "redox_syscall",
+ "remove_dir_all",
+ "winapi",
+]
+
+[[package]]
+name = "time"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+
+[[package]]
+name = "tokio"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b7b349f11a7047e6d1276853e612d152f5e8a352c61917887cc2169e2366b4c"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "memchr",
+ "mio",
+ "num_cpus",
+ "once_cell",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "tokio-macros",
+ "winapi",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-tungstenite"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1a5f475f1b9d077ea1017ecbc60890fda8e54942d680ca0b1d2b47cfa2d861b"
+dependencies = [
+ "futures-util",
+ "log",
+ "pin-project",
+ "tokio",
+ "tungstenite",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "log",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tower-service"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"
+
+[[package]]
+name = "tracing"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d"
+dependencies = [
+ "cfg-if",
+ "log",
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
+
+[[package]]
+name = "tungstenite"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24"
+dependencies = [
+ "base64",
+ "byteorder",
+ "bytes",
+ "http",
+ "httparse",
+ "input_buffer",
+ "log",
+ "rand 0.8.4",
+ "sha-1 0.9.7",
+ "url",
+ "utf-8",
+]
+
+[[package]]
+name = "twoway"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "typenum"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
+
+[[package]]
+name = "unicase"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
+
+[[package]]
+name = "url"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "matches",
+ "percent-encoding",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
+
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
+[[package]]
+name = "warp"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "332d47745e9a0c38636dbd454729b147d16bd1ed08ae67b3ab281c4506771054"
+dependencies = [
+ "bytes",
+ "futures",
+ "headers",
+ "http",
+ "hyper",
+ "log",
+ "mime",
+ "mime_guess",
+ "multipart",
+ "percent-encoding",
+ "pin-project",
+ "scoped-tls",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-stream",
+ "tokio-tungstenite",
+ "tokio-util",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.10.2+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..2a7bb32
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,23 @@
+[package]
+name = "ct"
+version = "0.1.0"
+edition = "2018"
+authors = ["Adam T. Carpenter <atc@53hor.net>"]
+
+[dependencies]
+#env_logger = { version = "0.8", default-features = false }
+#log = "0.4"
+#serde_urlencoded = "0.7"
+handlebars = "3"
+lazy_static = "1.4"
+rusqlite = "0.25"
+warp = "0.3"
+
+[dependencies.serde]
+version = "1"
+features = ["derive"]
+
+[dependencies.tokio]
+version = "1"
+default-features = false
+features = ["rt-multi-thread", "macros", "signal"]
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..cbabc10
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,60 @@
+use handlebars::Handlebars;
+use serde::Serialize;
+use serde_json::json;
+use std::sync::Arc;
+use std::time::SystemTime;
+use warp::{Filter, Rejection};
+
+#[tokio::main]
+async fn main() -> Result<(), Box<dyn std::error::Error>> {
+ // Build template registry
+ let mut hbs = Handlebars::new();
+ hbs.register_template_file("base", "templates/base.hbs")?;
+ hbs.register_template_file("index", "templates/index.hbs")?;
+ let hbs = Arc::new(hbs);
+
+ // Build routes
+ let routes = index_filter(hbs.clone())
+ .or(evals_list())
+ .or(warp::fs::dir("static"));
+
+ // Start server
+ warp::serve(routes).run(([127, 0, 0, 1], 8080)).await;
+
+ // Done
+ Ok(())
+}
+
+fn index_filter(
+ hbs: Arc<Handlebars<'static>>,
+) -> impl Filter<Extract = (impl warp::Reply,), Error = Rejection> + Clone {
+ warp::get()
+ .and(warp::path::end())
+ .map(move || render("index", hbs.clone(), json!({"year", year().unwrap()})))
+}
+
+fn evals_list() -> impl Filter<Extract = (&'static str,), Error = Rejection> + Clone {
+ warp::get()
+ .and(warp::path("evals"))
+ .and(warp::path::end())
+ .map(|| "evals here")
+}
+
+fn render<T>(template: &str, hbs: Arc<Handlebars>, value: T) -> impl warp::Reply
+where
+ T: Serialize,
+{
+ let render = hbs
+ .render(template, &value)
+ .unwrap_or_else(|err| err.to_string());
+ warp::reply::html(render)
+}
+
+const UNIX_YEAR: u64 = 31556926;
+
+fn year() -> Result<u64, Box<dyn std::error::Error>> {
+ let date = SystemTime::now()
+ .duration_since(SystemTime::UNIX_EPOCH)?
+ .as_secs();
+ Ok(date / UNIX_YEAR)
+}
diff --git a/about/index.php b/static/about/index.php
index 0b09bfc..0b09bfc 100644
--- a/about/index.php
+++ b/static/about/index.php
diff --git a/assets/amy.png b/static/assets/amy.png
index ea2f165..ea2f165 100644
--- a/assets/amy.png
+++ b/static/assets/amy.png
Binary files differ
diff --git a/assets/amy.webp b/static/assets/amy.webp
index 6ca2282..6ca2282 100644
--- a/assets/amy.webp
+++ b/static/assets/amy.webp
Binary files differ
diff --git a/assets/bg.png b/static/assets/bg.png
index a0c9ab8..a0c9ab8 100644
--- a/assets/bg.png
+++ b/static/assets/bg.png
Binary files differ
diff --git a/assets/favicon.ico b/static/assets/favicon.ico
index 8ba4c15..8ba4c15 100644
--- a/assets/favicon.ico
+++ b/static/assets/favicon.ico
Binary files differ
diff --git a/assets/icons/close-box.svg b/static/assets/icons/close-box.svg
index 717756e..717756e 100644
--- a/assets/icons/close-box.svg
+++ b/static/assets/icons/close-box.svg
diff --git a/assets/icons/dots-horizontal-circle.svg b/static/assets/icons/dots-horizontal-circle.svg
index ca1de94..ca1de94 100644
--- a/assets/icons/dots-horizontal-circle.svg
+++ b/static/assets/icons/dots-horizontal-circle.svg
diff --git a/assets/icons/email-variant.svg b/static/assets/icons/email-variant.svg
index e8ef2dd..e8ef2dd 100644
--- a/assets/icons/email-variant.svg
+++ b/static/assets/icons/email-variant.svg
diff --git a/assets/icons/phone-classic.svg b/static/assets/icons/phone-classic.svg
index 814990b..814990b 100644
--- a/assets/icons/phone-classic.svg
+++ b/static/assets/icons/phone-classic.svg
diff --git a/assets/icons/send-circle.svg b/static/assets/icons/send-circle.svg
index 1b7e5c3..1b7e5c3 100644
--- a/assets/icons/send-circle.svg
+++ b/static/assets/icons/send-circle.svg
diff --git a/assets/icons/star-box.svg b/static/assets/icons/star-box.svg
index 2973ca8..2973ca8 100644
--- a/assets/icons/star-box.svg
+++ b/static/assets/icons/star-box.svg
diff --git a/assets/logo-simple.png b/static/assets/logo-simple.png
index b299e66..b299e66 100644
--- a/assets/logo-simple.png
+++ b/static/assets/logo-simple.png
Binary files differ
diff --git a/assets/logo-small.png b/static/assets/logo-small.png
index a128e24..a128e24 100644
--- a/assets/logo-small.png
+++ b/static/assets/logo-small.png
Binary files differ
diff --git a/assets/logo.png b/static/assets/logo.png
index 81e0776..81e0776 100644
--- a/assets/logo.png
+++ b/static/assets/logo.png
Binary files differ
diff --git a/assets/logo.webp b/static/assets/logo.webp
index 16ab275..16ab275 100644
--- a/assets/logo.webp
+++ b/static/assets/logo.webp
Binary files differ
diff --git a/assets/signature.png b/static/assets/signature.png
index 7d115de..7d115de 100644
--- a/assets/signature.png
+++ b/static/assets/signature.png
Binary files differ
diff --git a/assets/signature.webp b/static/assets/signature.webp
index 8ce6e28..8ce6e28 100644
--- a/assets/signature.webp
+++ b/static/assets/signature.webp
Binary files differ
diff --git a/desktop.css b/static/desktop.css
index 2f2b342..2f2b342 100644
--- a/desktop.css
+++ b/static/desktop.css
diff --git a/favicon.ico b/static/favicon.ico
index 8ba4c15..8ba4c15 100644
--- a/favicon.ico
+++ b/static/favicon.ico
Binary files differ
diff --git a/footer.php b/static/footer.php
index 91bc9d6..91bc9d6 100644
--- a/footer.php
+++ b/static/footer.php
diff --git a/header.php b/static/header.php
index 42925fa..42925fa 100644
--- a/header.php
+++ b/static/header.php
diff --git a/index.php b/static/index.php
index c3aef21..c3aef21 100644
--- a/index.php
+++ b/static/index.php
diff --git a/policies/index.php b/static/policies/index.php
index 1fdd037..1fdd037 100644
--- a/policies/index.php
+++ b/static/policies/index.php
diff --git a/widescreen.css b/static/widescreen.css
index 8231129..8231129 100644
--- a/widescreen.css
+++ b/static/widescreen.css
diff --git a/templates/base.hbs b/templates/base.hbs
new file mode 100644
index 0000000..a16e6eb
--- /dev/null
+++ b/templates/base.hbs
@@ -0,0 +1,317 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <title>
+ Tutoring Excellence Online and in Hampton Roads, VA - Carpenter Tutoring,
+ LLC
+ </title>
+ <style>
+ /* Colors */
+ :root {
+ --darkteal: rgb(0, 100, 108);
+ --green: rgb(88, 169, 143);
+ --darkerteal: rgb(29, 133, 137);
+ --gray: rgb(157, 210, 211);
+ --teal: rgb(58, 165, 166);
+ --cyan: rgb(156, 210, 210);
+ --darkgray: rgb(127, 177, 181);
+ --darkgreen: rgb(59, 136, 114);
+ --yellow: rgb(186, 214, 187);
+ }
+
+ /* Elements */
+
+ html,
+ body {
+ margin: 0;
+ padding: 0;
+ font-family: "PT Sans", sans-serif;
+ color: dimgray;
+ }
+
+ body {
+ background-image: url("/assets/bg.png");
+ }
+
+ .banner {
+ font-size: 1em;
+ text-align: center;
+ padding: 3em;
+ background-color: white;
+ }
+
+ nav {
+ display: flex;
+ background-color: white;
+ flex-direction: column-reverse;
+ }
+
+ nav img {
+ height: 1.4em;
+ }
+
+ nav a {
+ font-family: "PT Sans", sans-serif;
+ color: dimgray;
+ text-align: center;
+ text-decoration: none;
+ padding: 1em 1em;
+ transition: 0.15s;
+ }
+
+ nav a:hover {
+ color: var(--darkteal);
+ background-color: lightgray;
+ }
+
+ div.buttons {
+ display: flex;
+ flex-direction: column;
+ }
+
+ h1 {
+ font-size: 3em;
+ color: var(--darkteal);
+ font-family: "Architects Daughter", cursive;
+ }
+
+ h2 {
+ font-size: 2em;
+ color: var(--darkteal);
+ font-family: "Indie Flower", cursive;
+ }
+
+ section {
+ font-size: 1.5em;
+ margin: 0;
+ padding: 1em;
+ }
+
+ section.quiet {
+ background-color: white;
+ }
+
+ .button img {
+ margin-right: 1em;
+ }
+
+ button.button,
+ a.button {
+ display: flex;
+ align-items: center;
+ background-color: var(--teal);
+ padding-left: 1em;
+ padding-right: 1em;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ margin-right: 0.5em;
+ margin-bottom: 0.5em;
+ text-decoration: none;
+ color: white;
+ border-radius: 3em;
+ transition: 0.15s;
+ }
+
+ button.button:hover,
+ a.button:hover {
+ box-shadow: 0 4px 8px 0 lightgray, 0 6px 20px 0 lightgray;
+ }
+
+ button {
+ font-family: "PT Sans", sans-serif;
+ border: none;
+ font-size: 0.75em;
+ }
+
+ a.primary {
+ background-color: var(--darkteal);
+ }
+
+ footer {
+ background-color: white;
+ text-align: center;
+ padding: 3em;
+ font-size: 1.5em;
+ }
+
+ footer a,
+ section a {
+ color: var(--darkteal);
+ text-decoration: underline;
+ }
+
+ .card {
+ font-size: 0.9em;
+ background-color: white;
+ padding: 1em;
+ border-radius: 1em;
+ margin-left: 0;
+ margin-right: 0;
+ }
+
+ form input,
+ form textarea {
+ font-family: "PT Sans", sans-serif;
+ margin-bottom: 1.5em;
+ box-sizing: border-box;
+ width: 100%;
+ border: 1px solid lightgray;
+ padding: 1em;
+ }
+
+ form input {
+ border-radius: 3em;
+ }
+
+ textarea {
+ border-radius: 1em;
+ resize: none;
+ }
+
+ table {
+ width: 100%;
+ border-collapse: collapse;
+ }
+
+ table th {
+ text-align: right;
+ color: var(--darkteal);
+ }
+
+ table td,
+ table th {
+ vertical-align: bottom;
+ }
+
+ tr:nth-child(even) {
+ background-color: lightgray;
+ }
+
+ picture img {
+ width: 100%;
+ }
+
+ .shadowy img {
+ box-shadow: 0 4px 8px 0 dimgray, 0 6px 20px 0 dimgray;
+ }
+
+ figcaption {
+ text-align: right;
+ color: var(--darkteal);
+ font-family: "Architects Daughter", cursive;
+ }
+
+ section.flexible {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #reviews .card,
+ #offerings .card {
+ margin: 1em;
+ text-align: center;
+ }
+
+ #reviews,
+ #offerings {
+ padding-left: 0;
+ padding-right: 0;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ }
+
+ .modal {
+ position: fixed;
+ z-index: 1;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ background-color: white;
+ background-color: rgba(1, 1, 1, 0.4);
+ overflow: auto;
+ display: none;
+ font-size: 1.5em;
+ }
+
+ .modal .card {
+ max-height: 90%;
+ max-width: 60%;
+ }
+
+ .modal a,
+ .card a.button {
+ float: right;
+ }
+
+ :target.modal {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ :target.modal .card {
+ overflow: auto;
+ }
+ </style>
+ <link rel="preconnect" href="https://fonts.gstatic.com" />
+ <link
+ href="https://fonts.googleapis.com/css2?family=Architects+Daughter&family=Indie+Flower&family=PT+Sans&display=swap"
+ rel="stylesheet" />
+ <link rel="stylesheet" href="/desktop.css" />
+ <link rel="stylesheet" href="/widescreen.css" />
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <meta name="description" content="Tutoring Excellence Online and in Hampton Roads, VA" />
+ <meta property="og:description" content="Tutoring excellence online and in-person" />
+ <meta property="og:image" content="http://carpentertutoring.com/assets/logo.webp" />
+ <meta property="og:image:secure_url" content="https://carpentertutoring.com/assets/logo.webp" />
+ <meta property="og:site_name" content="Carpenter Tutoring" />
+ <meta property="og:title" content="Tutoring Excellence Online and in Hampton Roads, VA - Carpenter Tutoring, LLC" />
+ <meta property="og:type" content="website" />
+ <meta property="og:url" content="https://carpentertutoring.com" />
+</head>
+
+<body>
+ <nav>
+ <a href="/#contact">Contact Me</a>
+ <a href="/#reviews">Reviews</a>
+ <a href="/about">About</a>
+ <a href="/policies">Policies</a>
+ <a href="/#pricing">Pricing</a>
+ <a href="/#offerings">Offerings</a>
+ <a href="/#"><img src="/assets/logo-simple.png" /></a>
+ </nav>
+
+ <main>
+ {{~> main}}
+ </main>
+
+ <footer>
+ <figure class="logo">
+ <picture>
+ <source srcset="/assets/logo.webp" type="image/webp" />
+ <source srcset="/assets/logo.png" type="image/png" />
+ <img src="/assets/logo.png" />
+ </picture>
+ </figure>
+ <p>
+ &copy;
+ <!-- TODO:<?php echo date('Y'); ?>-->
+ Carpenter Tutoring, LLC. All rights reserved.
+ </p>
+ <p>
+ <a href="https://g.page/carpenter-tutoring?share">Visit me on Google</a>
+ |
+ <a href="https://g.page/carpenter-tutoring/review?np">Submit a review</a>
+ |
+ <a href="mailto:webmaster@carpentertutoring.com">
+ Having trouble with our site?
+ </a>
+ </p>
+ </footer>
+</body>
+
+</html>
diff --git a/templates/index.hbs b/templates/index.hbs
new file mode 100644
index 0000000..bb2c33e
--- /dev/null
+++ b/templates/index.hbs
@@ -0,0 +1,468 @@
+{{#> base}}
+{{#*inline "main"}}
+<!--banner-->
+<section class="banner">
+ <h1>CARPENTER TUTORING</h1>
+ <h2>
+ <b>Discovering <em>your</em> path to success</b>
+ </h2>
+
+ <div class="buttons">
+ <a class="button" href="/#contact"> <img src="/assets/icons/email-variant.svg" alt="mailbox" /> Send a
+ message</a>
+ <a class="button primary" href="tel:1-757-335-7555">
+ <img src="/assets/icons/phone-classic.svg" alt="phone" />
+ (757) 335-7555</a>
+ </div>
+</section>
+
+<!-- welcome-->
+<section class="quiet flexible">
+ <div>
+ <h2>
+ Welcome, and thank you for your interest in Carpenter Tutoring!
+ </h2>
+
+ <p>
+ Carpenter Tutoring is a private tutoring service based in Suffolk,
+ Virginia. I offer in-person sessions throughout the Hampton Roads
+ area and remote sessions anywhere in the country. Most of my
+ offerings are one-on-one, and group sessions and classes are also
+ available. No matter your budget, I am confident that we can find an
+ arrangement that will provide your student services without creating
+ financial strain.
+ </p>
+
+ <p>
+ I invite you to explore my site to learn more about the <a href="/#offerings">
+ services I offer
+ </a>,
+ <a href="/about">my background</a>
+ ,
+ and some of <a href="/policies">my policies</a>. Thank you for visiting, and
+ please do not hesitate to reach out with any questions. I would be thrilled to
+ assist you!
+ </p>
+
+ <figure class="signature">
+ <picture>
+ <source srcset="/assets/signature.webp" type="image/webp" />
+ <source srcset="/assets/signature.png" type="image/png" />
+ <img src="/assets/signature.png" />
+ </picture>
+ </figure>
+
+ </div>
+
+ <figure class="shadowy">
+ <picture>
+ <source srcset="/assets/amy.webp" type="image/webp" />
+ <source srcset="/assets/amy.png" type="image/png" />
+ <img src="/assets/amy.png" />
+ </picture>
+ <figcaption>Amy Carpenter, M.Ed.</figcaption>
+ </figure>
+</section>
+
+<!-- offering modals -->
+<div id="offering-subject-tutoring" class="modal">
+ <div class="card">
+ <p>
+ My regular subject specific offerings include:
+
+ <ul>
+ <li> All levels of reading/language arts/English</li>
+ <li> Writing (formal and creative)</li>
+ <li> All levels of Latin</li>
+ <li> Math through Algebra II/Geometry</li>
+ <li> Introductory Biology, Physics, and Chemistry (not at the honors or AP
+ level)</li>
+ </ul>
+
+ Special arrangements can be made for subjects that fall outside of these
+ offerings. Please contact me directly for more information.
+
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<div id="offering-college-prep" class="modal">
+ <div class="card">
+ <p>
+ Work with a former Higher Education professional to
+ determine what types of schools and/or degree programs may be a good fit
+ for your interests and desires. Additionally, learn how to write an
+ attention-grabbing personal essay for college applications and receive
+ guidance on institution-specific supplemental essays.
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<div id="offering-test-prep" class="modal">
+ <div class="card">
+ <p>
+ One-on-one content instruction, practice testing, and
+ testing strategization for a number of standardized tests, including but
+ not limited to:
+
+ <ul>
+ <li> SAT &amp; ACT</li>
+ <li> PSAT</li>
+ <li> ISEE</li>
+ <li> SSAT</li>
+ <li> GED</li>
+ <li> MAT</li>
+ <li> GRE</li>
+ <li> LSAT</li>
+ </ul>
+
+ Please contact me directly if you'd like assistance for a test not listed
+ here.
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<div id="offering-music-lessons" class="modal">
+ <div class="card">
+ <p>
+ Instruments offered include piano, guitar, drums, and voice.
+ Instrument lessons include a combination of formal instruction and
+ ear-training, which allows students to select the songs they'd like to
+ learn. Music composition lessons focus on the techniques necessary for
+ writing original songs, whether they be instrumental or singer/songwriter
+ style.
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<div id="offering-evals" class="modal">
+ <div class="card">
+ <p>
+ Both evaluations are based on materials submitted through an online
+ portal. Letters are returned within a week of your notice that all documents
+ have been uploaded.</p>
+ <p> <b>$30 option</b>: Considers math and language arts materials,
+ satisfies proof of progress with a personalized letter and evaluator
+ credentials </p>
+ <p><b>$70 option</b>: Considers at least math and language arts materials
+ plus any other subject(s) you desire, satisfies proof of progress with a
+ personalized letter and evaluator credentials, provides homeschool families
+ with a separate document detailing identified areas of strength, areas of
+ weakness, and recommendations for addressing weaknesses.
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<div id="offering-college-writing" class="modal">
+ <div class="card">
+ <p>
+ Learn how to shift high-school level writing to that which will be expected in
+ college. Topics covered include moving beyond the five-paragraph essay, writing
+ research papers, and choosing a topic for essays with open prompts. In-session
+ exercises will allow students to implement these skills in real time with
+ immediate feedback.
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<div id="offering-academic-coaching" class="modal">
+ <div class="card">
+ <p>
+ Academic Coaching offers all the benefits of Study Skills and Time Management
+ appointments plus ongoing planning and accountability support. As an Academic
+ Coach, I keep track of your student's upcoming assignments and assessments and
+ help craft a schedule week to week for them to accomplish their goals. Students
+ come away as more independent and confident planners and self-advocates.
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<div id="offering-study-skills" class="modal">
+ <div class="card">
+ <p>
+ Study Skills sessions will allow students to develop a toolkit for
+ successful study habits. Learn about techniques to fight mental fatigue and
+ tools for mental recall. Study Skills sessions also cover ways to address
+ motivation, attention, and avoidance. Topics will be tailored for your specific
+ needs.
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<div id="offering-dissertation-coaching" class="modal">
+ <div class="card">
+ <p>
+ Dissertation coaching consists of one-on-one work to strengthen the effort you
+ have already put in. Draw out the significance of your research by honing in on
+ the implications, connections, and recommendations that stem from your
+ findings. Together, we will break past a surface-level review of your study to
+ generate the greatest impact possible. Dissertation coaching can also focus on
+ general writing mechanics, clarity of message, and/or consistency of voice.
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<div id="offering-time-management" class="modal">
+ <div class="card">
+ <p>
+ Learn how to balance all of the demands in your life. Time
+ Management sessions are tailored to your needs and can include building an
+ hour-by-hour schedule of your week, creating a long-term plan for assignments
+ and responsibilities, and discussing time and stress management techniques.
+ </p>
+ <a href="#offerings" class="button"><img src="/assets/icons/close-box.svg" alt="close" />Close</a>
+ </div>
+</div>
+
+<!-- offerings cards -->
+<section id="offerings">
+
+ <div class="card">
+ <h2>Subject Tutoring</h2>
+ <p>Tutoring for specific courses or disciplines
+ </p>
+ <a class="button" href="#offering-subject-tutoring"><img src="/assets/icons/dots-horizontal-circle.svg"
+ alt="expand" /> Learn more</a>
+ </div>
+
+ <div class="card">
+ <h2>Time Management</h2>
+ <p>
+ Personalized plans for managing academics, extracurriculars, and
+ other commitments
+ </p>
+ <a class="button" href="#offering-time-management"><img src="/assets/icons/dots-horizontal-circle.svg"
+ alt="expand" /> Learn more</a>
+ </div>
+
+ <div class="card">
+ <h2>Study Skills</h2>
+ <p>Learn how to make the most of your study time</p>
+ <a class="button" href="#offering-study-skills"><img src="/assets/icons/dots-horizontal-circle.svg"
+ alt="expand" /> Learn more</a>
+ </div>
+
+ <div class="card">
+ <h2>Academic Coaching</h2>
+ <p>
+ Time management and study skills blended with continuing
+ accountability
+ </p>
+ <a class="button" href="#offering-academic-coaching"><img src="/assets/icons/dots-horizontal-circle.svg"
+ alt="expand" /> Learn more</a>
+ </div>
+
+ <div class="card">
+ <h2>College Application Assistance</h2>
+ <p>
+ Assistance with generating a college list and crafting application
+ essays
+ </p>
+ <a class="button" href="#offering-college-prep"><img src="/assets/icons/dots-horizontal-circle.svg"
+ alt="expand" /> Learn more</a>
+ </div>
+
+ <div class="card">
+ <h2>College-Level Writing</h2>
+ <p>Get a head start on meeting professors' expectations</p>
+ <a class="button" href="#offering-college-writing"><img src="/assets/icons/dots-horizontal-circle.svg"
+ alt="expand" /> Learn more</a>
+ </div>
+
+ <div class="card">
+ <h2>Dissertation Coaching</h2>
+ <p>Ensure your research is communicated effectively and eloquently</p>
+ <a class="button" href="#offering-dissertation-coaching"><img src="/assets/icons/dots-horizontal-circle.svg"
+ alt="expand" /> Learn more</a>
+ </div>
+
+ <div class="card">
+ <h2>Standardized Test Prep</h2>
+ <p>
+ Tailored assistance in preparing for a variety of standardized tests
+ </p>
+ <a class="button" href="#offering-test-prep"><img src="/assets/icons/dots-horizontal-circle.svg" alt="expand" />
+ Learn more</a>
+ </div>
+
+ <div class="card">
+ <h2>Music Lessons</h2>
+ <p>Instrument and/or composition lessons for students of all ages</p>
+ <a class="button" href="#offering-music-lessons"><img src="/assets/icons/dots-horizontal-circle.svg"
+ alt="expand" /> Learn more</a>
+ </div>
+
+ <div class="card">
+ <h2>Proof of Progress Evaluations</h2>
+ <p>
+ Two levels of portfolio-based evaluations for homeschool families
+ looking to satisfy Proof of Progress or gain insight into their
+ child's learning
+ </p>
+ <a class="button" href="#offering-evals"><img src="/assets/icons/dots-horizontal-circle.svg" alt="expand" />
+ Learn more</a>
+ </div>
+
+</section>
+
+<!-- pricing -->
+<section class="quiet" id="pricing">
+ <h2>Pricing Guide</h2>
+
+ <table>
+ <tbody>
+ <tr>
+ <td></td>
+ <td>Remote</td>
+ <td>In-Person</td>
+ </tr>
+
+ <tr>
+ <th>
+ <a href="#offering-subject-tutoring">Subject</a>, <a href="#offering-time-management">Time
+ Management</a>, <a href="#offering-study-skills">Study Skills Tutoring</a>, <a
+ href="#offering-music-lessons">Music Lessons</a>
+ </th>
+ <td>$50/hr</td>
+ <td>$60/hr</td>
+ </tr>
+
+ <tr>
+ <th>
+ <a href="#offering-academic-coaching">Academic Coaching</a>, <a
+ href="#offering-dissertation-coaching">Dissertation Coaching</a>, <a
+ href="#offering-test-prep">Test Prep</a>, <a href="#offering-college-prep">College
+ Application Assistance</a>
+ </th>
+ <td>$60/hr</td>
+ <td>$70/hr</td>
+ </tr>
+
+ <tr>
+ <th>Small Group Sessions, Group Lessons</th>
+ <td>$30/hr</td>
+ <td>$40/hr</td>
+ </tr>
+ <tr>
+ <th><a href="#offering-evals">Simplified Homeschool Evaluations</a></th>
+ <td colspan="2">$30</td>
+ </tr>
+ <tr>
+ <th><a href="#offering-evals">Detailed Homeschool Evaluations</a></th>
+ <td colspan="2">$70</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <h3>
+ <a href="/policies">See a list of my policies and procedures regarding scheduling,
+ payment, and booking.</a>
+ </h3>
+
+</section>
+
+<!-- contact box -->
+<section id="contact">
+
+ <form class="card" action="/#contact" method="post">
+ <h2>Contact</h2>
+
+ <label for="name">Name</label>
+ <input name="name" type="text" id="name" placeholder="Jane Doe" required />
+
+ <label for="email">Email Address</label>
+ <input name="email" type="email" id="email" placeholder="jdoe85@aol.com" required />
+
+ <label for="body">Question/Comment</label>
+ <textarea name="body" id="body"
+ placeholder="Briefly describe your inquiry, including any services or areas of study you're interested in."
+ required></textarea>
+
+ <button type="submit" class="button"><img src="/assets/icons/send-circle.svg" alt="send" />Send</button>
+ </form>
+
+</section>
+
+<!-- reviews -->
+<section id="reviews">
+
+ <div class="card">
+ <h2>Connor Fenton</h2>
+ <blockquote>
+ I was a Graduate student at the College of William and Mary who
+ needed to pass a Latin Language test as part of my degree
+ requirements. I was struggling with refreshing my Latin after a few
+ years out of the classroom and Amy was both professional and
+ helpful. With her tutoring I was able to pass my test and finish my
+ degree. She is very considerate and easy to work with.
+ </blockquote>
+ <p>
+ <a href="https://goo.gl/maps/73wWvyS7azkBBkA39">View on Google</a>
+ or
+ <a href="https://g.page/carpenter-tutoring/review?np">leave a review.</a>
+ </p>
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ </div>
+
+ <div class="card">
+ <h2>Marie &amp; Robert</h2>
+ <blockquote>
+ I highly recommend Amy as a dissertation coach. Amy is a very kind
+ and patient person. Over the time we worked together, she helped me
+ take down the barriers that were preventing me from moving forward
+ in my process and assisted me in creating a plan to get to the
+ finish line and achieve my goal. She was very helpful with revising
+ and editing my writing to strengthen it. She helped me think
+ creatively, so I could clarify and expand upon my findings. Amy not
+ only pointed out grammatical errors and typos, but she made sure I
+ was able to keep my voice consistent in my writing. Because of her,
+ I was able to finish my doctoral degree, something that I will be
+ forever grateful to her for.
+ </blockquote>
+ <p>
+ <a href="https://goo.gl/maps/73wWvyS7azkBBkA39">View on Google</a>
+ or
+ <a href="https://g.page/carpenter-tutoring/review?np">leave a review.</a>
+ </p>
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ </div>
+
+ <div class="card">
+ <h2>Lee Crabtree</h2>
+ <blockquote>
+ Amy is a wonderful tutor who helped my child (who does not like
+ help at all) though [sic] some difficult classes where the teacher
+ was not providing the support my child needed. Highly recommended.
+ </blockquote>
+ <p>
+ <a href="https://goo.gl/maps/73wWvyS7azkBBkA39">View on Google</a>
+ or
+ <a href="https://g.page/carpenter-tutoring/review?np">leave a review.</a>
+ </p>
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ <img src="/assets/icons/star-box.svg" alt="star" />
+ </div>
+
+</section>
+{{/inline}}
+{{/base}}