diff --git a/content/about/_index.md b/content/about/_index.md
index 087da6f..e694e93 100644
--- a/content/about/_index.md
+++ b/content/about/_index.md
@@ -8,7 +8,7 @@ Hi, I'm Yifei (逸飞)!
This is my personal website where I maintain a very cool blog and share various photos I've taken on my camera (FujiFilm X100) and on my smartphone (Samsung Galaxy S9).
-This website doesn't use any JavaScript or cookies, just some plain HTML and CSS built with Hugo, hosted on GitHub Pages. The website theme was designed and coded by myself ! :D !
+This website doesn't use any cookies, and for the most part doesn't use any JavaScript. Pages that do contain scripting will indicate so at the top of the page. This website is built with Hugo, and is hosted on GitHub Pages. The website theme was designed and coded by myself ! :D !
## life
diff --git a/content/gallery/hypnosis.md b/content/gallery/hypnosis.md
index 08129c8..bcd3f38 100644
--- a/content/gallery/hypnosis.md
+++ b/content/gallery/hypnosis.md
@@ -6,4 +6,6 @@ location: "University of Waterloo, SCH to Arts Tunnel"
imageUrl: "https://live.staticflickr.com/65535/53713021703_83ddf8ec50_o.jpg"
width: 2870
height: 4310
----
\ No newline at end of file
+---
+
+One time during university, my friend and I 1v1'ed each other here in a fierce battle of the [penis game](https://www.urbandictionary.com/define.php?term=the+penis+game).
\ No newline at end of file
diff --git a/content/gallery/solar-eclipse.md b/content/gallery/solar-eclipse.md
index 1bbb76f..6eba42f 100644
--- a/content/gallery/solar-eclipse.md
+++ b/content/gallery/solar-eclipse.md
@@ -8,7 +8,7 @@ width: 4310
height: 2870
---
-First in my life experiencing a total solar eclipse, and holy shit that was magical. Unfortunately I didn't have a zoom lens so this photo hopefully captures more accurately what the real experience is like seeing the sun through eclipse glasses.
+First time in my life experiencing a total solar eclipse, and holy shit was that magical. Unfortunately I didn't have a zoom lens so this photo hopefully captures more accurately what the real experience is like seeing the sun through eclipse glasses.
A few weeks before the eclipse, I suggested to one of my good friends that we organize a small trip to see the total solar eclipse. That small group ended up becoming 10 or so people, and we struggled for a while coming to a decision on where to go. Initially we were thinking of going to Niagara Falls. It was right under the path of totality, and there were a lot of fun things to do in the area while we waited. Buuuuut eventually we all came to realize that the other six million people living in the GTA were all going to go there as well, so we figured we'd go somewhere else with hopefully fewer people. Spoiler alert: Niagara Falls ended up being completely clouded out for the entire eclipse ! :D !
diff --git a/content/posts/hashing.md b/content/posts/hashing.md
new file mode 100644
index 0000000..33385da
--- /dev/null
+++ b/content/posts/hashing.md
@@ -0,0 +1,46 @@
+---
+title: "SHA-256"
+date: 2025-03-05
+draft: false
+scripts: ["hash.js"]
+stylesheets: ["hash"]
+---
+
+*The data visualizations in this post may be more legible on a light colour-scheme.*
+
+I had this sudden idea to visualize each and every single bit of a SHA-256 hash in a heatmap-style visual, not really sure where the inspiration came from.
+
+We generally know that SHA-256 is pretty secure (for now), but aside from just trusting that it works, I've never really stopped to understand nor proven to myself that it truly is secure.
+
+Now I'm not really a mathematician, but I _do_ have some rapidly decaying leftover memories from [ECE 307 - Probability Theory and Statistics 2](https://ucalendar.uwaterloo.ca/2324/COURSE/course-ECE.html#ECE307), so let's run some un-scientific tests to see if we can find any predictable patterns in how SHA-256 hashes are computed.
+
+One of the craziest things to me is that this algorithm is supposed to be able to generate two virtually indistinguishable hashes from two nearly-identical strings. You'd think that the difference between `0x61` ('a') and `0x63` ('c') is pretty minute right? Bit-wise, they differ by 1 bit-flip in the 2nd least significant bit.
+
+```
+'a' -> 0x61 -> 01100001
+'c' -> 0x63 -> 01100011
+```
+
+Below, I've displayed two heatmaps for the SHA-256 hashes of both 'a' and 'c'. Each column of the heatmap corresponds to one byte of the 32 byte long hash, and each cell corresponds to one of the eight bits in that byte. The left-most column displays the most significant byte, and the top of each column represents the most significant bit.
+
+{{< hash id="hash-a" caption="SHA-256 hash of UTF-8 string 'a'" >}}
+
+{{< hash id="hash-c" caption="SHA-256 hash of UTF-8 string 'c'" >}}
+
+It's pretty hard to compare these two visualizations at a glance, so let's overlay them on top of each other.
+
+{{< hash id="hash-a-c" caption="SHA-256 hashes of UTF-8 string 'a' & 'c' overlaid on top of each other" >}}
+
+I don't know about you, but I don't really see any obvious patterns going on here. The
+
+# Playground
+
+Before we begin, here's a little interactive sandbox to compute the SHA-256 hash of any text.
+
+{{< hash id="table" >}}
+
- {{ .Content }}
+ {{ .Content | safeHTML }}
{{- end -}}
\ No newline at end of file
diff --git a/themes/ennui/layouts/shortcodes/hash.html b/themes/ennui/layouts/shortcodes/hash.html
new file mode 100644
index 0000000..4ed39b5
--- /dev/null
+++ b/themes/ennui/layouts/shortcodes/hash.html
@@ -0,0 +1,14 @@
+{{ $id := .Get "id" }}
+
+ {{ with .Get "caption" }}
+
{{ . }}
+ {{ end }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/themes/ennui/static/svg/code.svg b/themes/ennui/static/svg/code.svg
new file mode 100644
index 0000000..7c4b685
--- /dev/null
+++ b/themes/ennui/static/svg/code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file