diff --git a/.gitignore b/.gitignore
index 31acff3..f2999ca 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,6 +28,7 @@
[Oo]bj/
_UpgradeReport_Files/
[Pp]ackages/
+/.contest
Thumbs.db
Desktop.ini
diff --git a/NuGet.Config b/NuGet.Config
index 1a18c7e..954ec62 100644
--- a/NuGet.Config
+++ b/NuGet.Config
@@ -3,5 +3,12 @@
+
-
\ No newline at end of file
+
+
+
+
+
+
+
diff --git a/StitchATon/StitchATon.csproj b/StitchATon/StitchATon.csproj
index f4e555f..c0dc6f0 100644
--- a/StitchATon/StitchATon.csproj
+++ b/StitchATon/StitchATon.csproj
@@ -11,12 +11,8 @@
+
-
-
- ..\..\..\.nuget\packages\jetbrains.annotations\2023.3.0\lib\netstandard2.0\JetBrains.Annotations.dll
-
-
diff --git a/mise.toml b/mise.toml
new file mode 100644
index 0000000..5b17a42
--- /dev/null
+++ b/mise.toml
@@ -0,0 +1,92 @@
+# Quick Guide
+# - install mise
+# - download the asset and extract them to ASSET_PATH_RO
+# - mise trust mise.toml
+# - mise run verify-asset
+# - require hashdeep
+# `hashdeep` package in debian
+# or `md5deep` package in fedora
+# or uncomment `tools."http:hashdeep"` below in windows
+# - mise run serve
+# - mise run arrange
+# - mise run action
+# - mise run assert
+# - mise run bench
+
+[env]
+ASSET_PATH_RO = "{{ [xdg_cache_home, 'stitch-a-ton', 'asset'] | join_path }}"
+CONTEST_HOST = "http://localhost:7007"
+CONTEST_API = "/api/image/generate"
+CONTEST_OUTPUT = "{{ [cwd, '.contest'] | join_path }}"
+DOTNET_ENVIRONMENT = "Production"
+ANSWER_COMMIT_HASH = "89a07b40bf0414212c96945671a012035d375a25"
+
+[tools]
+dotnet = "8"
+xh = "latest"
+uv = "latest"
+k6 = "latest"
+
+# uncomment these if you're on windows
+#[tools."http:hashdeep"]
+#version = "4.4"
+
+#[tools."http:hashdeep".platforms]
+#windows-x64 = {url = "https://github.com/jessek/hashdeep/releases/download/v4.4/md5deep-4.4.zip"}
+
+[tasks.setup]
+run = '''
+{% if env.CONTEST_OUTPUT is not exists %}
+mkdir .contest
+{% endif %}
+'''
+
+[tasks.verify-asset]
+dir = "{{ env.ASSET_PATH_RO }}"
+run = '''
+xh get https://null.formulatrix.dev/Contest/stitch-a-ton-answer/raw/commit/{{ env.ANSWER_COMMIT_HASH }}/asset.txt -o ../asset.txt
+hashdeep -arbvk ../asset.txt .
+'''
+
+[tasks.arrange]
+depends = ['setup']
+dir = "{{ env.CONTEST_OUTPUT }}"
+outputs = ['answer.json', 'action.py', 'assert.py', 'bench.js', 'fuzzy.json']
+run = '''
+xh get https://null.formulatrix.dev/Contest/stitch-a-ton-answer/raw/commit/{{ env.ANSWER_COMMIT_HASH }}/answer.json -o answer.json
+xh get https://null.formulatrix.dev/Contest/stitch-a-ton-answer/raw/commit/{{ env.ANSWER_COMMIT_HASH }}/action.py -o action.py
+xh get https://null.formulatrix.dev/Contest/stitch-a-ton-answer/raw/commit/{{ env.ANSWER_COMMIT_HASH }}/assert.py -o assert.py
+xh get https://null.formulatrix.dev/Contest/stitch-a-ton-answer/raw/commit/{{ env.ANSWER_COMMIT_HASH }}/bench.js -o bench.js
+xh get https://null.formulatrix.dev/Contest/stitch-a-ton-answer/raw/commit/{{ env.ANSWER_COMMIT_HASH }}/fuzzy.json -o fuzzy.json
+'''
+
+[tasks.serve]
+run = "dotnet run -c Release --no-launch-profile --urls {{env.CONTEST_HOST}} --project StitchATon"
+
+[tasks.quick]
+depends = ['arrange']
+dir = "{{ env.CONTEST_OUTPUT }}"
+run = '''
+xh post {{env.CONTEST_HOST}}{{env.CONTEST_ENDPOINT}} canvas_rect=A1:H12 crop_offset:=[0,0] crop_size:=[1,1] output_scale:=0.25 -o quick.png
+'''
+
+[tasks.action]
+depends = ['arrange']
+dir = "{{ env.CONTEST_OUTPUT }}"
+run = '''
+uv run --no-config --script {{ [env.CONTEST_OUTPUT, 'action.py'] | join_path }}
+'''
+
+[tasks.assert]
+depends = ['arrange']
+dir = "{{ env.CONTEST_OUTPUT }}"
+run = '''
+uvx --no-config --with-requirements assert.py pytest assert.py
+'''
+
+[tasks.bench]
+depends = ['arrange']
+dir = "{{ env.CONTEST_OUTPUT }}"
+run = '''
+k6 run -e TARGET_URL="{{ env.CONTEST_HOST }}{{ env.CONTEST_API }}" bench.js
+'''