From 8c162a4086b753984771610f7ece2926500ee20b Mon Sep 17 00:00:00 2001 From: Olivia Brooks <109807080+Cutieguwu@users.noreply.github.com> Date: Tue, 31 Mar 2026 18:04:49 -0400 Subject: [PATCH] Really trying to clean things up... --- balloon.py | 11 +- src/errors/400.html | 32 +- src/errors/401.html | 22 +- src/errors/403.html | 26 +- src/errors/404.html | 22 +- src/errors/500.html | 26 +- src/errors/501.html | 26 +- src/errors/502.html | 26 +- src/errors/503.html | 26 +- src/errors/504.html | 32 +- src/includes/blog_recent_posts.html | 120 ++- src/includes/footer.html | 4 +- src/includes/nav_header.html | 2 +- src/includes/nav_quick_links.html | 48 +- src/pages/about.html | 18 +- src/pages/acknowledgements.html | 28 +- src/pages/blog/index.html | 28 +- .../blog/posts/0_divergent_pathways.html | 191 ++-- src/pages/blog/posts/1_unsure_u.html | 188 ++-- src/pages/blog/posts/2_buyers_anxiety.html | 266 +++--- src/pages/blog/posts/3_closing_chapters.html | 12 +- src/pages/blog/posts/4_pointless_plans.html | 228 +++-- src/pages/blog/posts/5_optical_recovery.html | 233 +++-- src/pages/blog/posts/6_hack_racing.html | 690 +++++++-------- src/pages/disclosure.html | 466 +++++----- src/pages/index.html | 46 +- src/pages/resume.html | 836 ++++++++---------- src/scripts/themes/.gitignore | 4 - src/scripts/themes/gleam.toml | 19 - src/scripts/themes/manifest.toml | 11 - src/scripts/themes/src/themes.gleam | 5 - src/scripts/themes/test/themes_test.gleam | 13 - src/styles/partials/_a_common.scss | 21 +- src/styles/partials/_a_quick_links.scss | 3 +- src/styles/partials/_a_section_list.scss | 4 +- src/styles/partials/_nav_location.scss | 4 +- src/styles/partials/_pane_blog.scss | 30 +- src/styles/partials/_pane_main.scss | 85 +- src/styles/partials/_pane_nav.scss | 5 +- 39 files changed, 1780 insertions(+), 2077 deletions(-) delete mode 100644 src/scripts/themes/.gitignore delete mode 100644 src/scripts/themes/gleam.toml delete mode 100644 src/scripts/themes/manifest.toml delete mode 100644 src/scripts/themes/src/themes.gleam delete mode 100644 src/scripts/themes/test/themes_test.gleam diff --git a/balloon.py b/balloon.py index 941c402..f0b1724 100644 --- a/balloon.py +++ b/balloon.py @@ -3,7 +3,6 @@ from __future__ import annotations from dataclasses import dataclass from types import NoneType from typing import Optional -from result import Result, Ok, Err import os import sys @@ -76,25 +75,25 @@ class HTML: tags.append(Tag(tag, trail)) return tags - def inflate(self) -> Result[str, str]: + def inflate(self) -> str: file = str() for tag in self.tags(): if tag.type() == 'include': chunk = tag.get_param('src') if isinstance(chunk, NoneType): - return Err('FileNotFoundError') + raise FileNotFoundError html = HTML(open(str(WORK_DIR) + '/src/' + chunk, 'rt').read()) - file += html.inflate().expect('FileNotFoundError') + file += html.inflate() else: file += tag.write() - return Ok(file) + return file # Convert the HTML obj into a str to write to file. def write(self) -> str: - return self.inflate().unwrap() + return self.inflate() def main() -> None: diff --git a/src/errors/400.html b/src/errors/400.html index 2464f0c..5c9bf62 100644 --- a/src/errors/400.html +++ b/src/errors/400.html @@ -11,29 +11,27 @@
-

You are here:

-
Error - 400
+

You are here:

+

Error - 400

-
-
-

400

-

Bad Request!

-
-
-

- The server cannot or will not process this request due to apparent client-side - error or deception. -

-
+
+

400

+

Bad Request!

+
+
+

+ The server cannot or will not process this request due to apparent client-side error + or deception. +

-
-

#AD

-

#AD

-
+
    +
  • #AD
  • +
  • #AD
  • +
diff --git a/src/errors/401.html b/src/errors/401.html index ee79d1f..2cab2c4 100644 --- a/src/errors/401.html +++ b/src/errors/401.html @@ -11,24 +11,22 @@
-

You are here:

-
Error - 401
+

You are here:

+

Error - 401

-
-
-

401

-

Unauthorized!

-
-
+
+

401

+

Unauthorized!

+
-
-

#AD

-

#AD

-
+
    +
  • #AD
  • +
  • #AD
  • +
diff --git a/src/errors/403.html b/src/errors/403.html index 5be2057..1f0a80d 100644 --- a/src/errors/403.html +++ b/src/errors/403.html @@ -11,26 +11,24 @@
-

You are here:

-
Error - 403
+

You are here:

+

Error - 403

-
-
-

403

-

Forbidden!

-
-
-

The server is refusing to act upon your request.

-
+
+

403

+

Forbidden!

+
+
+

The server is refusing to act upon your request.

-
-

#AD

-

#AD

-
+
    +
  • #AD
  • +
  • #AD
  • +
diff --git a/src/errors/404.html b/src/errors/404.html index 88d4033..a38331e 100644 --- a/src/errors/404.html +++ b/src/errors/404.html @@ -11,24 +11,22 @@
-

You are here:

-
Error - 404
+

You are here:

+

Error - 404

-
-
-

404

-

Page not found!

-
-
+
+

404

+

Page not found!

+
-
-

#AD

-

#AD

-
+
    +
  • #AD
  • +
  • #AD
  • +
diff --git a/src/errors/500.html b/src/errors/500.html index 4a9100b..6069d57 100644 --- a/src/errors/500.html +++ b/src/errors/500.html @@ -11,26 +11,24 @@
-

You are here:

-
Error - 500
+

You are here:

+

Error - 500

-
-
-

500

-

Internal Server Error!

-
-
-

The server has no clue WTF happened here.

-
+
+

500

+

Internal Server Error!

+
+
+

The server has no clue WTF happened here.

-
-

#AD

-

#AD

-
+
    +
  • #AD
  • +
  • #AD
  • +
diff --git a/src/errors/501.html b/src/errors/501.html index 835395d..18b88a6 100644 --- a/src/errors/501.html +++ b/src/errors/501.html @@ -11,26 +11,24 @@
-

You are here:

-
Error - 501
+

You are here:

+

Error - 501

-
-
-

501

-

Not Implemented!

-
-
-

Whatever you just tried doing, the server doesn't know how to handle it.

-
+
+

501

+

Not Implemented!

+
+
+

Whatever you just tried doing, the server doesn't know how to handle it.

-
-

#AD

-

#AD

-
+
    +
  • #AD
  • +
  • #AD
  • +
diff --git a/src/errors/502.html b/src/errors/502.html index ca59927..dd9feb7 100644 --- a/src/errors/502.html +++ b/src/errors/502.html @@ -11,26 +11,24 @@
-

You are here:

-
Error - 502
+

You are here:

+

Error - 502

-
-
-

502

-

Bad Gateway!

-
-
-

This service may be offline.

-
+
+

502

+

Bad Gateway!

+
+
+

This service may be offline.

-
-

#AD

-

#AD

-
+
    +
  • #AD
  • +
  • #AD
  • +
diff --git a/src/errors/503.html b/src/errors/503.html index 0710a79..0c48770 100644 --- a/src/errors/503.html +++ b/src/errors/503.html @@ -11,26 +11,24 @@
-

You are here:

-
Error - 503
+

You are here:

+

Error - 503

-
-
-

503

-

Service Unavailable!

-
-
-

The server may be overloaded or down for maintenance.

-
+
+

503

+

Service Unavailable!

+
+
+

The server may be overloaded or down for maintenance.

-
-

#AD

-

#AD

-
+
    +
  • #AD
  • +
  • #AD
  • +
diff --git a/src/errors/504.html b/src/errors/504.html index 0ee0d4e..afecced 100644 --- a/src/errors/504.html +++ b/src/errors/504.html @@ -11,29 +11,27 @@
-

You are here:

-
Error - 504
+

You are here:

+

Error - 504

-
-
-

504

-

Gateway Timeout!

-
-
-

- The server acted as a proxy and didn't receive a timely response from the - upstream server. -

-
+
+

504

+

Gateway Timeout!

+
+
+

+ The server acted as a proxy and didn't receive a timely response from the upstream + server. +

-
-

#AD

-

#AD

-
+
    +
  • #AD
  • +
  • #AD
  • +
diff --git a/src/includes/blog_recent_posts.html b/src/includes/blog_recent_posts.html index 7246851..5590c7f 100644 --- a/src/includes/blog_recent_posts.html +++ b/src/includes/blog_recent_posts.html @@ -1,68 +1,52 @@ -
-

Recent Posts

-
-
-
-
-

Hack Racing

- 28 March, 2026 -
- View -
-
-
-
-
-

Optical Recovery

- 10 January, 2026 -
- View -
-
-
-
-
-

Pointless Plans

- 18 December, 2025 -
- View -
-
-
-
-
-

Closing Chapters

- 18 December, 2025 -
- View -
-
-
-
-
-

Buyer's Anxiety

- 11 September, 2025 -
- View -
-
-
-
-
-

Unsure U.

- 09 August, 2025 -
- View -
-
-
-
-
-

Divergent Pathways

- 29 July, 2025 -
- View -
-
-
-
+
  • +

    Recent Posts

    +
    +
    +

    Hack Racing

    +

    28 March, 2026

    +
    + View +
    +
    +
    +

    Optical Recovery

    +

    10 January, 2026

    +
    + View +
    +
    +
    +

    Pointless Plans

    +

    18 December, 2025

    +
    + View +
    +
    +
    +

    Closing Chapters

    +

    18 December, 2025

    +
    + View +
    +
    +
    +

    Buyer's Anxiety

    +

    11 September, 2025

    +
    + View +
    +
    +
    +

    Unsure U.

    +

    09 August, 2025

    +
    + View +
    +
    +
    +

    Divergent Pathways

    +

    29 July, 2025

    +
    + View +
    +
  • diff --git a/src/includes/footer.html b/src/includes/footer.html index dc3a308..ea96106 100644 --- a/src/includes/footer.html +++ b/src/includes/footer.html @@ -1,3 +1 @@ -
    -

    Made with love in Canada 🇨🇦

    -
    + diff --git a/src/includes/nav_header.html b/src/includes/nav_header.html index 995dfea..a8b49e9 100644 --- a/src/includes/nav_header.html +++ b/src/includes/nav_header.html @@ -1,5 +1,5 @@ diff --git a/src/includes/nav_quick_links.html b/src/includes/nav_quick_links.html index e6175a0..fd907fc 100644 --- a/src/includes/nav_quick_links.html +++ b/src/includes/nav_quick_links.html @@ -1,21 +1,33 @@ - +
  • + diff --git a/src/pages/about.html b/src/pages/about.html index e26d441..0984cf7 100644 --- a/src/pages/about.html +++ b/src/pages/about.html @@ -10,19 +10,17 @@
    -

    You are here:

    -
    About
    +

    You are here:

    +

    About

    -
    -

    This page has not yet been filled out. Sorry!

    - -
    -
    -

    #AD

    -

    #AD

    -
    +

    This page has not yet been filled out. Sorry!

    + +
      +
    • #AD
    • +
    • #AD
    • +
    diff --git a/src/pages/acknowledgements.html b/src/pages/acknowledgements.html index 049da35..2d67833 100644 --- a/src/pages/acknowledgements.html +++ b/src/pages/acknowledgements.html @@ -10,26 +10,24 @@
    -

    You are here:

    -
    Acknowledgements
    +

    You are here:

    +

    Acknowledgements

    -
    -

    There are currently no acknowledgements

    -

    In terms of security, hopefully that means I'm doing a good-ish job.

    -

    - I will get my thanks to various open projects in here in time, but I'm still - busy getting the basics handled. -

    -
    - +

    There are currently no acknowledgements

    +

    In terms of security, hopefully that means I'm doing a good-ish job.

    +

    + I will get my thanks to various open projects in here in time, but I'm still busy + getting the basics handled. +

    -
    -

    #AD

    -

    #AD

    -
    + +
      +
    • #AD
    • +
    • #AD
    • +
    diff --git a/src/pages/blog/index.html b/src/pages/blog/index.html index 5093a1f..969d04b 100644 --- a/src/pages/blog/index.html +++ b/src/pages/blog/index.html @@ -10,28 +10,24 @@
    -

    You are here:

    -
    Blog
    +

    You are here:

    +

    Blog

    -
    -
    -

    Blog

    -

    Last Edited: 03 August, 2025

    -
    -
    -

    I have an RSS feed!

    -

    Just look for the RSS Quick Link in the Navigation pane.

    -
    -
    - +
    +

    Blog

    +

    Last Edited: 03 August, 2025

    +
    +

    I have an RSS feed!

    +

    Just look for the RSS Quick Link in the Navigation pane.

    -
    + +
      -

      #AD

      -
    +
  • #AD
  • + diff --git a/src/pages/blog/posts/0_divergent_pathways.html b/src/pages/blog/posts/0_divergent_pathways.html index f02da0b..ae0f941 100644 --- a/src/pages/blog/posts/0_divergent_pathways.html +++ b/src/pages/blog/posts/0_divergent_pathways.html @@ -11,113 +11,102 @@
    -

    You are here:

    -
    Blog - Divergent Pathways
    +

    You are here:

    +

    Blog - Divergent Pathways

    -
    -
    -

    Divergent Pathways

    -

    Posted: 29 July, 2025

    -

    Last Edited: 29 July, 2025

    -
    -
    -

    I can't say that this is how I wanted to start my blog.

    -

    - Although, in all honesty, I didn't really have an idea for how I wanted it - to start. That's not to say I didn't know what I *didn't* want. A - meaningless 'Welcome to my Blog' filled with my hopes and aspirations that - inevitably would never come to light was something I knew I didn't want. I - figured it more likely for me to have a semi-respectful rant about - whatever's causing me to 'crash out' on that particular day. That would - certainly be in character for me. -

    -

    - But no. Instead, I'm starting my blog on one of the last things I ever - expected to write about. -

    -

    Love.

    -

    Or rather, the passing of it due to life.

    -

    - I've been in two relationships now. Both ended mutually, although what I - consider mutual may not be everyone else's. We came to see the same side of - things, and we understood that we couldn't sustain our lives together. We're - all still friends at the end. -

    -

    - Me and my ex-boyfriend were struggling a lot with being able to see each - other. It's not like this relationship was geographically long distance; we - went to the same school. The distance came more from our schedules and - pathways. I have always been a relatively heavy academic. My parents and - teachers certainly made sure of that, and ultimately helped lead me down a - path of being the teacher's pet. Maybe I'll talk about my experiences and - struggles related to that another time, but the short of it is that I am a - high-achieving workaholic as a result. My ex-boyfriend on the other hand, - didn't have that kind of an experience, and ultimately was led down the - college-level course stream in high school. -

    -

    - Now, as I began to struggle in my fourth year, particularly with my - mathematics continuing their downwards trend, I decided that the life of a - software engineer wasn't for me. I turned around, almost on a dime, and set - myself towards a career in Psychology. Now, on the surface, this may look - like it would help with our scheduling issues, but no. While I was studying - at school, and desperately trying to keep up my grades, my boyfriend would - be doing a co-op elsewhere. Even when that ended at the end of the term, the - problem remained. I was too much of a workaholic. -

    -

    - Ultimately, the break-up that I've just had has left me intent on not - spiralling downward. My first was rough on me, and I was not in a good place - for about a week. This time, we both kind of saw this coming. Perhaps that - makes it easier, but it still sucks for both of us. And, why squander the - motivation I have to better my self care, my habits, and thus myself? I'm - about to go into my first year of university. Normally, I'm either scared of - my inevitable death, or some past regret of my life that chooses to grip me. - But now, I'm also anxious for the life ahead. -

    -

    - So what does this all mean in terms of dating for me? Well, it leaves me - considering the idea that some people are meant to walk through life alone. - I'm at a point in my life where dating is probably not a great idea for me. - I struggle enough with burnout spells that adding heartbreak on top would - likely kill my education. -

    -

    - On top of that are my concerns with online dating. Aside from data privacy, - breaches, and otherwise disgusting people who can't leave these projects to - be a good part of the internet, are the risks with being trans. There are - far too many stories, even if most of them are probably from the US, of - people 'trying it out' with a trans person. Ignoring how slimy and - disgusting you have to be to even do that without considering the effects of - those actions, the point of dating is for love (and to meet societal - expectations while seeking a dual income for the household, among other - things). -

    -

    - To make it extra clear, love != sex. The point at the end of it isn't so you - can run home and shag every night--this isn't some 1960s Bond film. -

    -

    - If you want to have kids, some trans people who are on HRT, may still be - able to if they've gone to the really awkward and expensive effort of - cryopreservation. -

    -

    - Anyway, being someone who was a 'test run' is crushing. I certainly don't - want to run that risk, and other people are in the same boat. -

    -

    Given all this, I'll probably tough it out on my own for a while.

    -
    -
    - +
    +

    Divergent Pathways

    +

    Posted: 29 July, 2025

    +

    Last Edited: 29 July, 2025

    +
    +

    I can't say that this is how I wanted to start my blog.

    +

    + Although, in all honesty, I didn't really have an idea for how I wanted it to start. + That's not to say I didn't know what I *didn't* want. A meaningless 'Welcome to my + Blog' filled with my hopes and aspirations that inevitably would never come to light + was something I knew I didn't want. I figured it more likely for me to have a + semi-respectful rant about whatever's causing me to 'crash out' on that particular + day. That would certainly be in character for me. +

    +

    + But no. Instead, I'm starting my blog on one of the last things I ever expected to + write about. +

    +

    Love.

    +

    Or rather, the passing of it due to life.

    +

    + I've been in two relationships now. Both ended mutually, although what I consider + mutual may not be everyone else's. We came to see the same side of things, and we + understood that we couldn't sustain our lives together. We're all still friends at + the end. +

    +

    + Me and my ex-boyfriend were struggling a lot with being able to see each other. It's + not like this relationship was geographically long distance; we went to the same + school. The distance came more from our schedules and pathways. I have always been a + relatively heavy academic. My parents and teachers certainly made sure of that, and + ultimately helped lead me down a path of being the teacher's pet. Maybe I'll talk + about my experiences and struggles related to that another time, but the short of it + is that I am a high-achieving workaholic as a result. My ex-boyfriend on the other + hand, didn't have that kind of an experience, and ultimately was led down the + college-level course stream in high school. +

    +

    + Now, as I began to struggle in my fourth year, particularly with my mathematics + continuing their downwards trend, I decided that the life of a software engineer + wasn't for me. I turned around, almost on a dime, and set myself towards a career in + Psychology. Now, on the surface, this may look like it would help with our + scheduling issues, but no. While I was studying at school, and desperately trying to + keep up my grades, my boyfriend would be doing a co-op elsewhere. Even when that + ended at the end of the term, the problem remained. I was too much of a workaholic. +

    +

    + Ultimately, the break-up that I've just had has left me intent on not spiralling + downward. My first was rough on me, and I was not in a good place for about a week. + This time, we both kind of saw this coming. Perhaps that makes it easier, but it + still sucks for both of us. And, why squander the motivation I have to better my + self care, my habits, and thus myself? I'm about to go into my first year of + university. Normally, I'm either scared of my inevitable death, or some past regret + of my life that chooses to grip me. But now, I'm also anxious for the life ahead. +

    +

    + So what does this all mean in terms of dating for me? Well, it leaves me considering + the idea that some people are meant to walk through life alone. I'm at a point in my + life where dating is probably not a great idea for me. I struggle enough with + burnout spells that adding heartbreak on top would likely kill my education. +

    +

    + On top of that are my concerns with online dating. Aside from data privacy, + breaches, and otherwise disgusting people who can't leave these projects to be a + good part of the internet, are the risks with being trans. There are far too many + stories, even if most of them are probably from the US, of people 'trying it out' + with a trans person. Ignoring how slimy and disgusting you have to be to even do + that without considering the effects of those actions, the point of dating is for + love (and to meet societal expectations while seeking a dual income for the + household, among other things). +

    +

    + To make it extra clear, love != sex. The point at the end of it isn't so you can run + home and shag every night--this isn't some 1960s Bond film. +

    +

    + If you want to have kids, some trans people who are on HRT, may still be able to if + they've gone to the really awkward and expensive effort of cryopreservation. +

    +

    + Anyway, being someone who was a 'test run' is crushing. I certainly don't want to + run that risk, and other people are in the same boat. +

    +

    Given all this, I'll probably tough it out on my own for a while.

    -
    + +
      -

      #AD

      -
    +
  • #AD
  • + diff --git a/src/pages/blog/posts/1_unsure_u.html b/src/pages/blog/posts/1_unsure_u.html index 248d5f3..076b229 100644 --- a/src/pages/blog/posts/1_unsure_u.html +++ b/src/pages/blog/posts/1_unsure_u.html @@ -11,111 +11,101 @@
    -

    You are here:

    -
    Blog - Unsure U.
    +

    You are here:

    +

    Blog - Unsure U.

    -
    -
    -

    Unsure U.

    -

    Posted: 09 August, 2025

    -

    Last Edited: 09 August, 2025

    -
    -
    - A Coaster which reads 'focus on the good,' placed in front of a window. -

    The little things, it's the little things that count.

    -

    Or so I'm told.

    -

    - All around me, all my friends are super excited for university, or college, - or appreticeship, or--post-secondary in general. They're excited about - meeting new [like-minded] people, clubs, increased autonomy, the future - promises of post-secondary education, and of course, parties (within - reason). They look to the hopeful side of things. -

    -

    - Now, I have this set of coasters which I got a year or so ago at a local - market. They're meant to keep me in a more positive headspace, but half the - time they're covered up by drinks... Anyway, one of them advises me to - "focus on the good". -

    -

    - And boy, do I try hard to do that. But without a job, I'm left to my - hyperfixation and burnout routine. If I'm lucky, I just start going a bit - stir-crazy from sitting in my room, doing things that I consider productive, - with only the occasional break for the loo and another cup of bean juice. - Then, it's back to work, dawn until dinner, then maybe I'll play a game - briefly, but not until working some more. -

    -

    - There are of course plenty of things that I'd like to blame for why I'm like - this, but that's not the purpose of this post, nor more than speculation. -

    -

    - Anyway, I'm currently writing this in a cheerful little café after an - appointment so that I take a break to process, and perhaps understand, some - emotions, while taking in this little thing. So, back to university, since - that's my academic trajectory. -

    -

    I'm terrified.

    -

    - I've struggled a lot to plan and get course selections which will allow me - to fulfill my degree, only to fail rather badly. Seriously, I will probably - do poorly in philosophy, and it doesn't help me with just about any of my - requirements. On top of that, I'm worried about the teachers that I'll get. - It was bad enough in grade 5, and I'd had a few years to anticipate that - teacher. In university, I have no knowledge going into first year. The best - resource I have is something like RateMyProf which honestly kinda sucks and - probably makes things worse unless there's a resoundingly poor overall - rating. -

    -

    - That's not to say that all of my course selections are bad; I still have the - ones within the interest of my degree and some in my hobbies, that also - contribute directly to the degree. One friend and I were also able to get - some courses together since I had to take them, and they wanted to. This may - sound silly given the struggles with course availabilities, but I promise - these decisions were made following a lot of logical consideration of both - of our degrees' completion. -

    -

    - Another concern is the fact that I know so little, and I get my orientation - the day before I need to use it... that's not a lot of time to figure out if - you're missing something. That then contributes to my concerns about being - able to move around campus fast enough to not miss classes, on top of the - fatigue that I'll have from waking up at 5h30. -

    -

    - Finally, because otherwise I could keep going on, are my concerns regarding - the ever-shoved-down-our-gullets AIs. I write oddly. This blog, my poetry, - and all of my past essays and analyses. My teachers can attest, especially - my grade 9 & 12 English teacher who had to consult two other teachers and - myself to fully understand - Building Up, a poem I wrote with the rust programming language for symbology. -

    -

    - The concerns about having to prove that I don't use AI were bad enough in - High School. Universities have far more strict policies, which likely - utilize a guilty until proven innocent model. -

    -

    - At the end of the day, I'm trying to take in the little things and not worry - too much. -

    -
    -
    - +
    +

    Unsure U.

    +

    Posted: 09 August, 2025

    +

    Last Edited: 09 August, 2025

    +
    + A Coaster which reads 'focus on the good,' placed in front of a window. +

    The little things, it's the little things that count.

    +

    Or so I'm told.

    +

    + All around me, all my friends are super excited for university, or college, or + appreticeship, or--post-secondary in general. They're excited about meeting new + [like-minded] people, clubs, increased autonomy, the future promises of + post-secondary education, and of course, parties (within reason). They look to the + hopeful side of things. +

    +

    + Now, I have this set of coasters which I got a year or so ago at a local market. + They're meant to keep me in a more positive headspace, but half the time they're + covered up by drinks... Anyway, one of them advises me to "focus on the good". +

    +

    + And boy, do I try hard to do that. But without a job, I'm left to my hyperfixation + and burnout routine. If I'm lucky, I just start going a bit stir-crazy from sitting + in my room, doing things that I consider productive, with only the occasional break + for the loo and another cup of bean juice. Then, it's back to work, dawn until + dinner, then maybe I'll play a game briefly, but not until working some more. +

    +

    + There are of course plenty of things that I'd like to blame for why I'm like this, + but that's not the purpose of this post, nor more than speculation. +

    +

    + Anyway, I'm currently writing this in a cheerful little café after an appointment so + that I take a break to process, and perhaps understand, some emotions, while taking + in this little thing. So, back to university, since that's my academic trajectory. +

    +

    I'm terrified.

    +

    + I've struggled a lot to plan and get course selections which will allow me to + fulfill my degree, only to fail rather badly. Seriously, I will probably do poorly + in philosophy, and it doesn't help me with just about any of my requirements. On top + of that, I'm worried about the teachers that I'll get. It was bad enough in grade 5, + and I'd had a few years to anticipate that teacher. In university, I have no + knowledge going into first year. The best resource I have is something like + RateMyProf which honestly kinda sucks and probably makes things worse unless there's + a resoundingly poor overall rating. +

    +

    + That's not to say that all of my course selections are bad; I still have the ones + within the interest of my degree and some in my hobbies, that also contribute + directly to the degree. One friend and I were also able to get some courses together + since I had to take them, and they wanted to. This may sound silly given the + struggles with course availabilities, but I promise these decisions were made + following a lot of logical consideration of both of our degrees' completion. +

    +

    + Another concern is the fact that I know so little, and I get my orientation the day + before I need to use it... that's not a lot of time to figure out if you're missing + something. That then contributes to my concerns about being able to move around + campus fast enough to not miss classes, on top of the fatigue that I'll have from + waking up at 5h30. +

    +

    + Finally, because otherwise I could keep going on, are my concerns regarding the + ever-shoved-down-our-gullets AIs. I write oddly. This blog, my poetry, and all of my + past essays and analyses. My teachers can attest, especially my grade 9 & 12 English + teacher who had to consult two other teachers and myself to fully understand + Building Up, a poem I wrote with the rust programming language for symbology. +

    +

    + The concerns about having to prove that I don't use AI were bad enough in High + School. Universities have far more strict policies, which likely utilize a guilty + until proven innocent model. +

    +

    + At the end of the day, I'm trying to take in the little things and not worry too + much. +

    -
    + +
      -

      #AD

      -
    +
  • #AD
  • + diff --git a/src/pages/blog/posts/2_buyers_anxiety.html b/src/pages/blog/posts/2_buyers_anxiety.html index aac89f0..8a3940d 100644 --- a/src/pages/blog/posts/2_buyers_anxiety.html +++ b/src/pages/blog/posts/2_buyers_anxiety.html @@ -11,152 +11,138 @@
    -

    You are here:

    -
    Blog - Buyer's Anxiety
    +

    You are here:

    +

    Blog - Buyer's Anxiety

    -
    -
    -

    Buyer's Anxiety

    -

    Posted: 11 September, 2025

    -

    Last Edited: 14 September, 2025

    -
    -
    - Katie's old laptop, seated upon her clean desk, struggling on. Although, you can't tell how broken the hinge is or the parts that her kitten chewed. I swear, it's in worse condition than it looks. -

    - I can't say that I'm thrilled that my blog posts have only been when I'm - down or struggling with something. But, here we are: the third one. -

    -

    - I'm stuck with an internal conflict. It feels like remorse, but before the - poor choice has happened, as opposed to fear? But it is fear. -

    -

    - It's no secret that I love my Framework 16, the company's values, and Linux. -

    -

    I also want to support my friends whenever and however I can.

    -

    But what if those two things clash?... Spoiler: they have.

    -

    - To preface this whole thing, my friend is looking for a new laptop. She - bought her old one because it was in her price range. Four years later, - it's... struggling. The enshittification of the tech industry took hold, one - hinge died a couple years ago, the whole body is weak, the system is - relatively underpowered for her needs, and it's not going to survive - university in any good condition, if even that. As a two-time published - author, she needs to be able to type and open this system a lot. That means - a good keyboard and good hinges. She also wants to play Minecraft, Roblox, - and probably Uno on it too. Thus, GPU demands aren't high and she'll want at - least a 15" display. She treats her devices well and cares for their - longevity. -

    -

    - To me, this sounds like a great place for a Framework laptop. Expensive - upfront, sure. But the 16" model has an iGPU that runs Minecraft and Roblox - just fine, has a super easy to replace input module system to replace the - keyboard, good hinges, a CPU that's total overkill (even for the stuff I do; - I wanted a six-core), and it wears like a tank. A guy at our high school - proved that unintentionally. I have the dent in the lid and the pristene - display to prove it. It also has some added benefits, like the hardware - switches for the camera and mic, overall modular design, repairability, and - the upgrade paths, which save her from spending more money to buy a full - tower or another laptop. Framework recently announced the new generation - boards for the FW 16, and knocked down the price of the 7040 series boards - slightly, but that's a nice-to-have. Even if you're a non-techie, you won't - need to get into the hardware unless you're building it or repairing - something, and Framework's guides have only gotten better. Even when trying - to replace the liquid metal, or solve an issue that I thought was a loose - display cable (it was a linux software issue of some kind), the guides got - me through the wholly unknown to me. -

    -

    This makes it sound perfect.

    -

    - The downside? Well, I feel like I'm just succumbing to brand loyalty. A - total shill. The whole above paragraph sounds like a sales pitch without the - company's values explicitly spouted. The one thing I envy of Apple fans, is - their ability to convince others that Apple is great and feel no conflict. -

    -

    - Is this what a parent feels like when buying for a child? Probably not? - After all, the child likely isn't knowledgeable upon the context, or doesn't - care enough to question the rationale leading to the purchase. But here, I'm - buying for a friend. Someone smart (Before someone starts, I'm not saying - that a child can't be smart or that the rest of my friends are dumb). Sure, - she's not a techie the way I am, but she is more than capable of questioning - things for herself. What's the price? What's the rationale? Are you just - pushing me into an ecosystem that you love? Are you buying my friendship? - ...and so on down the rabbit hole my train of thought hops. -

    -

    - I've already convinced two friends to try Linux, but their hardware and - personal needs caused too many problems. I also convinced a family member of - mine, who was an Apple fan, to shift to a Framework 13 running Linux. -

    -

    - I feel like a manipulator. I left my proud, cheerful "switch to Linux" - chanting phase a while ago. But did I really? Am I so moral-driven that I'm - blind? Is this really a selfless gift to a friend? Is this because I'm - afraid of losing my friends? Or do I subconciously hold an agenda to migrate - everyone to Framework and Linux? As stupid as it sounds, I mean this - literally. -

    -

    - Even if you consider the idea that "only a good person would think like - that, because a bad person would know it," it doesn't help. -

    -

    - To make things worse again, I've long spouted buying something with the - intent to run it long term, instead of buying a bunch of cheap somethings - that die super fast. My previous laptop, which I got from my father, ran for - nearly 12 years before the display started dying; now it's a server. So - imagine a teenager with that kind of a background in keeping a computer - running for so long, sees a 3-year old laptop already in a far worse - condition than their 10/11-year old one (with comparable specs). I was that - teenager, and I started a "joke" once I got my new laptop, about it's easily - replaceable hinges... and so on. Of course, I was prideful in a sense, and I - kept that "joke" going too long... So how will it look when the laptop who's - death I foretold gets replaced by the exact laptop that it was compared to? - (Assuming that I didn't start the "joke" about the purchase decisions, age, - and condition of my previous one.) -

    -

    - The only consolation I get for now, is that I have a few days to see how - Katie likes the FW 13, which is loaned off the aforementioned family member - of mine. The trouble, because of course there's more, is that I need to - discern between her impressions of the computer, and the OS, since it's - Manjaro Linux. Because of that, my plan is to dual boot the gifted system. - That way she can finish her computer science stuff in the same environment, - and then decide whether or not to scrap the Linux partition. -

    -

    - Of course, as always, my troubles start just after having had a counselling - session. So, I'm left to deal with this myself for a few weeks. -

    -

    Sometimes I wonder why things can't just be simple for me in life...

    -
    -

    - Now, as a note, I'm not saying that Framework is perfect. They've had, and - continue to have, their issues. The difference is that they actually listen - and work on them. The guides, the incorrect QR codes, the support system, - FW16 keyboard deflection, late UEFI updates, the FW16 keyboard wake-up issue - with the screen closed, the first-gen display expansion cards power draw - issue, and so on. And sure, they can be slow. But they're small, and they - try to do it right the first time. They release the software and hardware - patches to affected systems, and listen on to further critique in the - interest of improving. -

    -
    -
    - +
    +

    Buyer's Anxiety

    +

    Posted: 11 September, 2025

    +

    Last Edited: 14 September, 2025

    +
    + Katie's old laptop, seated upon her clean desk, struggling on. Although, you can't tell how broken the hinge is or the parts that her kitten chewed. I swear, it's in worse condition than it looks. +

    + I can't say that I'm thrilled that my blog posts have only been when I'm down or + struggling with something. But, here we are: the third one. +

    +

    + I'm stuck with an internal conflict. It feels like remorse, but before the poor + choice has happened, as opposed to fear? But it is fear. +

    +

    It's no secret that I love my Framework 16, the company's values, and Linux.

    +

    I also want to support my friends whenever and however I can.

    +

    But what if those two things clash?... Spoiler: they have.

    +

    + To preface this whole thing, my friend is looking for a new laptop. She bought her + old one because it was in her price range. Four years later, it's... struggling. The + enshittification of the tech industry took hold, one hinge died a couple years ago, + the whole body is weak, the system is relatively underpowered for her needs, and + it's not going to survive university in any good condition, if even that. As a + two-time published author, she needs to be able to type and open this system a lot. + That means a good keyboard and good hinges. She also wants to play Minecraft, + Roblox, and probably Uno on it too. Thus, GPU demands aren't high and she'll want at + least a 15" display. She treats her devices well and cares for their longevity. +

    +

    + To me, this sounds like a great place for a Framework laptop. Expensive upfront, + sure. But the 16" model has an iGPU that runs Minecraft and Roblox just fine, has a + super easy to replace input module system to replace the keyboard, good hinges, a + CPU that's total overkill (even for the stuff I do; I wanted a six-core), and it + wears like a tank. A guy at our high school proved that unintentionally. I have the + dent in the lid and the pristene display to prove it. It also has some added + benefits, like the hardware switches for the camera and mic, overall modular design, + repairability, and the upgrade paths, which save her from spending more money to buy + a full tower or another laptop. Framework recently announced the new generation + boards for the FW 16, and knocked down the price of the 7040 series boards slightly, + but that's a nice-to-have. Even if you're a non-techie, you won't need to get into + the hardware unless you're building it or repairing something, and Framework's + guides have only gotten better. Even when trying to replace the liquid metal, or + solve an issue that I thought was a loose display cable (it was a linux software + issue of some kind), the guides got me through the wholly unknown to me. +

    +

    This makes it sound perfect.

    +

    + The downside? Well, I feel like I'm just succumbing to brand loyalty. A total shill. + The whole above paragraph sounds like a sales pitch without the company's values + explicitly spouted. The one thing I envy of Apple fans, is their ability to convince + others that Apple is great and feel no conflict. +

    +

    + Is this what a parent feels like when buying for a child? Probably not? After all, + the child likely isn't knowledgeable upon the context, or doesn't care enough to + question the rationale leading to the purchase. But here, I'm buying for a friend. + Someone smart (Before someone starts, I'm not saying that a child can't be smart or + that the rest of my friends are dumb). Sure, she's not a techie the way I am, but + she is more than capable of questioning things for herself. What's the price? What's + the rationale? Are you just pushing me into an ecosystem that you love? Are you + buying my friendship? ...and so on down the rabbit hole my train of thought hops. +

    +

    + I've already convinced two friends to try Linux, but their hardware and personal + needs caused too many problems. I also convinced a family member of mine, who was an + Apple fan, to shift to a Framework 13 running Linux. +

    +

    + I feel like a manipulator. I left my proud, cheerful "switch to Linux" chanting + phase a while ago. But did I really? Am I so moral-driven that I'm blind? Is this + really a selfless gift to a friend? Is this because I'm afraid of losing my friends? + Or do I subconciously hold an agenda to migrate everyone to Framework and Linux? As + stupid as it sounds, I mean this literally. +

    +

    + Even if you consider the idea that "only a good person would think like that, + because a bad person would know it," it doesn't help. +

    +

    + To make things worse again, I've long spouted buying something with the intent to + run it long term, instead of buying a bunch of cheap somethings that die super fast. + My previous laptop, which I got from my father, ran for nearly 12 years before the + display started dying; now it's a server. So imagine a teenager with that kind of a + background in keeping a computer running for so long, sees a 3-year old laptop + already in a far worse condition than their 10/11-year old one (with comparable + specs). I was that teenager, and I started a "joke" once I got my new laptop, about + it's easily replaceable hinges... and so on. Of course, I was prideful in a sense, + and I kept that "joke" going too long... So how will it look when the laptop who's + death I foretold gets replaced by the exact laptop that it was compared to? + (Assuming that I didn't start the "joke" about the purchase decisions, age, and + condition of my previous one.) +

    +

    + The only consolation I get for now, is that I have a few days to see how Katie likes + the FW 13, which is loaned off the aforementioned family member of mine. The + trouble, because of course there's more, is that I need to discern between her + impressions of the computer, and the OS, since it's Manjaro Linux. Because of that, + my plan is to dual boot the gifted system. That way she can finish her computer + science stuff in the same environment, and then decide whether or not to scrap the + Linux partition. +

    +

    + Of course, as always, my troubles start just after having had a counselling session. + So, I'm left to deal with this myself for a few weeks. +

    +

    Sometimes I wonder why things can't just be simple for me in life...

    +
    +

    + Now, as a note, I'm not saying that Framework is perfect. They've had, and continue + to have, their issues. The difference is that they actually listen and work on them. + The guides, the incorrect QR codes, the support system, FW16 keyboard deflection, + late UEFI updates, the FW16 keyboard wake-up issue with the screen closed, the + first-gen display expansion cards power draw issue, and so on. And sure, they can be + slow. But they're small, and they try to do it right the first time. They release + the software and hardware patches to affected systems, and listen on to further + critique in the interest of improving. +

    -
    + +
      -

      #AD

      -
    +
  • #AD
  • + diff --git a/src/pages/blog/posts/3_closing_chapters.html b/src/pages/blog/posts/3_closing_chapters.html index 40a3bd5..857dea0 100644 --- a/src/pages/blog/posts/3_closing_chapters.html +++ b/src/pages/blog/posts/3_closing_chapters.html @@ -11,8 +11,8 @@
    -

    You are here:

    -
    Blog - Closing Chapters
    +

    You are here:

    +

    Blog - Closing Chapters

    @@ -131,12 +131,12 @@

    - -
    + +
      -

      #AD

      -
    +
  • #AD
  • + diff --git a/src/pages/blog/posts/4_pointless_plans.html b/src/pages/blog/posts/4_pointless_plans.html index 77dbd6d..57c7600 100644 --- a/src/pages/blog/posts/4_pointless_plans.html +++ b/src/pages/blog/posts/4_pointless_plans.html @@ -11,139 +11,129 @@
    -

    You are here:

    -
    Blog - Pointless Plans
    +

    You are here:

    +

    Blog - Pointless Plans

    -
    -
    -

    Pointless Plans

    -

    Posted: 18 December, 2025

    -

    Last Edited: 18 December, 2025

    -
    -
    -

    - So... remember my first post where I said that "a meaningless 'Welcome to my - Blog' filled with my hopes and aspirations that inevitably would never come - to light was something I knew I didn't want." Well... -

    -

    - I've been stuck in a doom and gloom phase here, and with me hopefully - concluding my counselling soon, I definitely don't want to dwell in it. -

    -

    - As a result, I'm making a little list of things that I'd love to write - about, and that you can hopefully expect to read about sometime soon! -

    +
    +

    Pointless Plans

    +

    Posted: 18 December, 2025

    +

    Last Edited: 18 December, 2025

    +
    +

    + So... remember my first post where I said that "a meaningless 'Welcome to my Blog' + filled with my hopes and aspirations that inevitably would never come to light was + something I knew I didn't want." Well... +

    +

    + I've been stuck in a doom and gloom phase here, and with me hopefully concluding my + counselling soon, I definitely don't want to dwell in it. +

    +

    + As a result, I'm making a little list of things that I'd love to write about, and + that you can hopefully expect to read about sometime soon! +

    +
      +
    • +

      CyberSci

      • -

        CyberSci

        -
          -
        • - I had the fortune to participate at the Regional level, - representing Carleton University. (Spoiler: We won, barely) -
        • -
        • - This will probably have a follow up once Nationals happens in - the summer. -
        • -
        + I had the fortune to participate at the Regional level, representing + Carleton University. (Spoiler: We won, barely)
      • -

        Creative Writing Work

        -
          -
        • - I've written some good things and some really bad things for the - Creative Writing course this term. Obviously, I'll only publish - works that I believe are well polished. -
        • -
        -
      • -
      • -

        Poetry

        -
          -
        • - I want to get back to writing poetry, but for now I have some - things that are still unpublished. -
        • -
        • - They're nothing like Building Up, so if you can't read [bad] - Rust, don't worry. They're also far less whacky than Falling - Down. -
        • -
        • - Falling Down & Building Up -
        • -
        + This will probably have a follow up once Nationals happens in the + summer.
      -

      - Also, I've come to realise that I have a thing for memoirs. I never actually - realised it because I usually read book series, but I now have four memoirs - in my library. -

      -
        + +
      1. +

        Creative Writing Work

        +
        • - Fatty Legs by Christy Jordan-Fenton and Margaret Pokiak-Fenton + I've written some good things and some really bad things for the + Creative Writing course this term. Obviously, I'll only publish works + that I believe are well polished.
        • -
        • its sequel, A Stranger At Home
        • -
        • The Glass Castle by Jeannette Walls
        • -
        • Tomboy Survival Guide by Ivan Coyote
        • -
      -

      - So, after a creative non-fiction flash writing assignment just didn't work - out well, even after reworking it heavily for the exam, I decided that I - should actually take it in the direction of a full memoir, rather than the - poetic form that it currently has. -

      -

      - The problem is that I mean, a full memoir. And the problem with - that is that memory is a complex thing. Many important and relevant things - for a memoir are episodic, iconic, flashbulb memories, which can be - difficult to just retrieve on the spot. (Yes, I referenced my textbook, no I - am not a credible source for interpreting this information.) -

      -

      - A lot of the time, my writing, particularly my poetry, comes from what can - best be described as state-dependent memory. If I'm lucky, some random - stimulus or set of stimuli will trigger a recollection of these memories, - and give me an image from which to write. The problem is that this also - means I cannot write sequentially. -

      -

      - And just to make things even more difficult, memory is unreliable and easily - influenced. So I need to review and consider how much I trust my own - recollection of events, and work to mitigate my biases whenever possible by - asking someone else to recount the event and compare details. -

      -

      - So, in the background, I'm going to start working on that. Almost like - forgetting to write in a diary for a week, then trying to catch up while you - still remember. -

      -

      - Hopefully this will have the added benefit of holding back some of the - future doom and gloom from the blog. -

      -

      - And finally, I'm going to try to finish up my blog generator, - cutinews. It's - about time I got back and actually finished a programming project. Chances - are that I'll be live on Twitch (yes, eww, ik) working on the code. -

      -
    -
    - + + +
  • +

    Poetry

    +
      +
    • + I want to get back to writing poetry, but for now I have some things + that are still unpublished. +
    • +
    • + They're nothing like Building Up, so if you can't read [bad] Rust, don't + worry. They're also far less whacky than Falling Down. +
    • +
    • + Falling Down & Building Up +
    • +
    +
  • + +

    + Also, I've come to realise that I have a thing for memoirs. I never actually + realised it because I usually read book series, but I now have four memoirs in my + library. +

    +
      +
    1. Fatty Legs by Christy Jordan-Fenton and Margaret Pokiak-Fenton
    2. +
    3. its sequel, A Stranger At Home
    4. +
    5. The Glass Castle by Jeannette Walls
    6. +
    7. Tomboy Survival Guide by Ivan Coyote
    8. +
    +

    + So, after a creative non-fiction flash writing assignment just didn't work out well, + even after reworking it heavily for the exam, I decided that I should actually take + it in the direction of a full memoir, rather than the poetic form that it currently + has. +

    +

    + The problem is that I mean, a full memoir. And the problem with that is + that memory is a complex thing. Many important and relevant things for a memoir are + episodic, iconic, flashbulb memories, which can be difficult to just retrieve on the + spot. (Yes, I referenced my textbook, no I am not a credible source for interpreting + this information.) +

    +

    + A lot of the time, my writing, particularly my poetry, comes from what can best be + described as state-dependent memory. If I'm lucky, some random stimulus or set of + stimuli will trigger a recollection of these memories, and give me an image from + which to write. The problem is that this also means I cannot write sequentially. +

    +

    + And just to make things even more difficult, memory is unreliable and easily + influenced. So I need to review and consider how much I trust my own recollection of + events, and work to mitigate my biases whenever possible by asking someone else to + recount the event and compare details. +

    +

    + So, in the background, I'm going to start working on that. Almost like forgetting to + write in a diary for a week, then trying to catch up while you still remember. +

    +

    + Hopefully this will have the added benefit of holding back some of the future doom + and gloom from the blog. +

    +

    + And finally, I'm going to try to finish up my blog generator, + cutinews. It's about + time I got back and actually finished a programming project. Chances are that I'll + be live on Twitch (yes, eww, ik) working on the code. +

    -
    + +
      -

      #AD

      -
    +
  • #AD
  • + diff --git a/src/pages/blog/posts/5_optical_recovery.html b/src/pages/blog/posts/5_optical_recovery.html index 97a9996..4195027 100644 --- a/src/pages/blog/posts/5_optical_recovery.html +++ b/src/pages/blog/posts/5_optical_recovery.html @@ -11,134 +11,123 @@
    -

    You are here:

    -
    Blog - Optical Recovery
    +

    You are here:

    +

    Blog - Optical Recovery

    -
    -
    -

    Optical Recovery

    -

    Posted: 10 January, 2026

    -

    Last Edited: 10 January, 2026

    -
    -
    -

    - Data preservation is increasingly threatened in the digital age. That almost - sounds backwards, until you dig into modern architecture. -

    -

    - Once upon a time, the greatest threat to information preservation was nature - and memory retrieval errors. The digital age introduced denser, - longer-lasting forms of data storage. As we progressed from punch card, to - tape, to 8 inch floppies, to flash and optical, and ever denser forms of - all, we got better at preventing data loss. Quality control, error - correction techniques bundled with file systems, and redundancy (parity) in - storage virtualizations, like RAID. -

    -

    - But in the modern age, the Enshittocene1, some would call it, - consumers are ever strongarmed into corporate-controlled cloud storage. With - that, comes a lack of ownership. -

    -

    - Now, normally that's the lead-up to advocating for homelabbing, FOSS, and - de-Googling. However, in this instance, it's the lead up to optical media - preservation. Why? Because optical media remains a great storage medium - today. Even if you don't believe that, many old games in their original - form, or other preserved media, are still only available on discs. -

    -

    - However, discs are subject to natural degradation through scratches, - delamination, and disc rot. Especially as the quality control on these discs - dwindles. Thus, there must be additional work put into caring for this - medium. -

    -

    - RAID arrays are great as alternatives too, as they already have parity, - ddrescue, and error-correcting filesystems available. The problem is that - the arrays themselves are not. At least not right now. Once again, partly - thanks to AI datacentres demanding obscene amounts of resources, the cost of - hard drives has gone up significantly since the pandemic. -

    -

    - With that, we segue into my latest project, temporarily named - Kramer. I know I did some research to come up with that name, but I - genuinely don't recall who it was in reference to. In fact, having tried - tracking down who it's in reference to, I may have messed up when I picked - the name. My best guess is that it's in reference to Kane Kramer, but he - helped design the Digital Audio Player, not optical media. -

    -

    - Regardless, it's always been a working name while I figure out if I can - finish the project. -

    -

    So, what is Kramer?

    -

    - Kramer is a recovery utility. Conceptually, it's meant to be akin to - ddrescue2, but optimized for recovering data from optical media. -

    -

    - There are two main problems I've experienced while trying to use ddrescue - with optical drives, and both stem from the drive's firmware. Now, I don't - know if me using the --reset-slow flag is contributing to these - issues or not, but I experience more problems without it. -

    -

    - If you've ever tried working with optical media in Linux, you may be - familiar with The Sleep Bug. Normally, this is when a drive's - firmware decides to sleep after two minutes, and never wakes. In the case of - ddrescue, I've noticed that the drive often sleeps after read errors. When - this happens, I can't kill ddrescue, and it just hangs. Even if I forcefully - disconnect the drive, it just hangs, awaiting a response from the block - device. -

    -

    - For the record, Kramer still has this issue. I've only recently gotten - mapping working alongside directIO to get around the Linux kernel's read - poisoning. -

    -

    - Keep in mind that I know very little C, and I don't play this low in the - system much yet. So, I don't know why, but without the - O_DIRECT flag to bypass the kernel's buffer (and whatever else - directIO technically bypasses), after a single IO error, the kernel will - refuse to return anything but that same IO error until the parent process is - restarted. I tried doing the C calls directly through FFI, since poisoning - is something that Rust employs in some places for safety. That didn't work, - so I tried spawning a child process to execute the read, but that also - didn't work. Thankfully, I know a guy, and with his help I was able to track - down not only how to implement directIO, but also without using FFI to call - posix_memalign. -

    -

    - Back on track, the other issue is the spin-down. As ddrescue reads smaller - clusters and/or starts hitting a particularly poor section of the disc, some - drives' firmware is too quick to spin down, causing the spindle to - constantly speed up and slow down, increasing wear. -

    -
    -
      -
    1. - I would recommend reading Enshittification by Cory Doctorow. -
    2. -
    3. - As I'm writing Kramer in Rust, I also have to stress the point that this - project is not intended as a ddrescue rewrite in rust, for the sake of a - rewrite in rust. I'm not trying to clone or replace ddrescue. Kramer has - a different target, and ddrescue is a resource for me to learn from and - use as a guide while I dig deeper into the system than I ever have. -
    4. -
    -
    -
    - +
    +

    Optical Recovery

    +

    Posted: 10 January, 2026

    +

    Last Edited: 10 January, 2026

    +
    +

    + Data preservation is increasingly threatened in the digital age. That almost sounds + backwards, until you dig into modern architecture. +

    +

    + Once upon a time, the greatest threat to information preservation was nature and + memory retrieval errors. The digital age introduced denser, longer-lasting forms of + data storage. As we progressed from punch card, to tape, to 8 inch floppies, to + flash and optical, and ever denser forms of all, we got better at preventing data + loss. Quality control, error correction techniques bundled with file systems, and + redundancy (parity) in storage virtualizations, like RAID. +

    +

    + But in the modern age, the Enshittocene1, some would call it, consumers + are ever strongarmed into corporate-controlled cloud storage. With that, comes a + lack of ownership. +

    +

    + Now, normally that's the lead-up to advocating for homelabbing, FOSS, and + de-Googling. However, in this instance, it's the lead up to optical media + preservation. Why? Because optical media remains a great storage medium today. Even + if you don't believe that, many old games in their original form, or other preserved + media, are still only available on discs. +

    +

    + However, discs are subject to natural degradation through scratches, delamination, + and disc rot. Especially as the quality control on these discs dwindles. Thus, there + must be additional work put into caring for this medium. +

    +

    + RAID arrays are great as alternatives too, as they already have parity, ddrescue, + and error-correcting filesystems available. The problem is that the arrays + themselves are not. At least not right now. Once again, partly thanks to AI + datacentres demanding obscene amounts of resources, the cost of hard drives has gone + up significantly since the pandemic. +

    +

    + With that, we segue into my latest project, temporarily named + Kramer. I know I did some research to come up with that name, but I + genuinely don't recall who it was in reference to. In fact, having tried tracking + down who it's in reference to, I may have messed up when I picked the name. My best + guess is that it's in reference to Kane Kramer, but he helped design the Digital + Audio Player, not optical media. +

    +

    + Regardless, it's always been a working name while I figure out if I can finish the + project. +

    +

    So, what is Kramer?

    +

    + Kramer is a recovery utility. Conceptually, it's meant to be akin to + ddrescue2, but optimized for recovering data from optical media. +

    +

    + There are two main problems I've experienced while trying to use ddrescue with + optical drives, and both stem from the drive's firmware. Now, I don't know if me + using the --reset-slow flag is contributing to these issues or not, but + I experience more problems without it. +

    +

    + If you've ever tried working with optical media in Linux, you may be familiar with + The Sleep Bug. Normally, this is when a drive's firmware decides to sleep + after two minutes, and never wakes. In the case of ddrescue, I've noticed that the + drive often sleeps after read errors. When this happens, I can't kill ddrescue, and + it just hangs. Even if I forcefully disconnect the drive, it just hangs, awaiting a + response from the block device. +

    +

    + For the record, Kramer still has this issue. I've only recently gotten mapping + working alongside directIO to get around the Linux kernel's read poisoning. +

    +

    + Keep in mind that I know very little C, and I don't play this low in the system much + yet. So, I don't know why, but without the + O_DIRECT flag to bypass the kernel's buffer (and whatever else directIO + technically bypasses), after a single IO error, the kernel will refuse to return + anything but that same IO error until the parent process is restarted. I tried doing + the C calls directly through FFI, since poisoning is something that Rust employs in + some places for safety. That didn't work, so I tried spawning a child process to + execute the read, but that also didn't work. Thankfully, I know a guy, and with his + help I was able to track down not only how to implement directIO, but also without + using FFI to call posix_memalign. +

    +

    + Back on track, the other issue is the spin-down. As ddrescue reads smaller clusters + and/or starts hitting a particularly poor section of the disc, some drives' firmware + is too quick to spin down, causing the spindle to constantly speed up and slow down, + increasing wear. +

    +
    +
      +
    1. I would recommend reading Enshittification by Cory Doctorow.
    2. +
    3. + As I'm writing Kramer in Rust, I also have to stress the point that this project + is not intended as a ddrescue rewrite in rust, for the sake of a rewrite in + rust. I'm not trying to clone or replace ddrescue. Kramer has a different + target, and ddrescue is a resource for me to learn from and use as a guide while + I dig deeper into the system than I ever have. +
    4. +
    -
    + +
      -

      #AD

      -
    +
  • #AD
  • + diff --git a/src/pages/blog/posts/6_hack_racing.html b/src/pages/blog/posts/6_hack_racing.html index ff00f05..966ce2b 100644 --- a/src/pages/blog/posts/6_hack_racing.html +++ b/src/pages/blog/posts/6_hack_racing.html @@ -11,189 +11,183 @@
    -

    You are here:

    -
    Blog - Hack Racing
    +

    You are here:

    +

    Blog - Hack Racing

    -
    -
    -

    Hack Racing

    -

    Posted: 28 March, 2026

    -

    Last Edited: 28 March, 2026

    -
    -
    -

    Hack Racing

    -

    - After many delays in releasing this post, I've decided to make this a - multi-part series to shamelessly boost my meaningless engagement stats. -

    -

    - I have done my best to make this series digestible to all (also for them - sweet engagement stats). So, I hope that this can be informative for - seasoned techies, those new to Cybersecurity (like myself), and you normie - folk who've somehow made your way here (hopefully not as victims). -

    -

    - It's important to note that this particular attack (and operation) may very - well still be active. -

    -

    - Also, I apologise in advance if the formatting of this post is really messed - up, I have a lot of work to do overhauling the blog section for converting - Markdown to HTML, better metadata tracking, and the lovely CSS that goes - along with those changes. -

    -

    Prologue

    -

    February 4th, 2026

    -

    - This story begins like any other major public security story of early 2026: - Discord. -

    -

    - I received a message from a friend asking for a quick favour. So naturally, - I responded, only to be ghosted for almost exactly 24 hours. -

    -

    The Next Day

    -

    - Aside from the odd behaviour, the hacker didn't account for the possibility - that this friend and I might see each other the following day. At which - point I was informed that they were hacked. -

    -

    Eventually, at 24 hours post-hack,

    -
    -

    - hi^^ , So I am currently pursuing an IT course where we are developing - games. and I developed a simple car racing simulator , As a part of the - assignment, I require feedback from people who have played the game. - Would you give it a try and provide feedback? It would really help me - out and be a big part of my learning! -

    -
    -

    Setting the bait

    -

    - It had to be right. After all, they could read all of our messages, profile - me, and discern that I have enough of a background in computing to not fall - for such obvious bull. Especially as I know the person outside the digital - realm, what they're doing course wise, and what certain subject they're - distinctly not carrying on with, which happens to be computer - science. -

    -
    -

    Sure, I'd love to!

    -
    -

    Super sophisticated bait, I know.

    -
    -

    - tysm~! , here you go and also if you could give me your feedback in the - next 5-10 minutes, let me know if you faced any problem. - https://tinyurl.com/Race-Project-IT -

    -
    -

    - Bro literally is trying to live off the stereotypical behaviour of a person - with a themed nitro account, and leaves a random comma. Also note the time - constraint. -

    -

    I was also later sent a second gift:

    -
    -

    https://tinyurl.com/Racing-Pro updated

    -
    -

    Epidemiology

    -

    - This is clearly a token and/or password-stealing trojan, targeting at least - Discord. -

    -

    - Until much later, I didn't know that this attacked many, many other - services including Steam, Browsers, and Wallets. -

    -

    - Another piece of information gathered by someone else found that the attack - is only designed for Windows. -

    -

    Static Analysis

    -

    - Most of this will center around the first trojan, - Race-Project-IT. -

    -

    Links

    -

    - The links aren't markdown spoofed, but they are obscured by - tinyurl. Using expandurl, I can tell that they go - to Discord's CDN, and that I'm supposedly downloading a zip archive. Why on - earth they'd make this even more suspicious by providing a tinyurl instead - of a link to Discord's CDN on discord, I have no idea. -

    -

    VirusTotal

    -

    Tossing both binaries into VirusTotal finds... absolutely nothing?

    -

    - These files were last scanned nearly 24 hours ago as of writing. This could - concieveably be the hacker(s) reviewing the quality of their trojan. Other - than that, no vendors are screaming alarm bells. The Yomi Hunter sandbox has - flagged the second as malware. -

    -

    - I'll force a rescan just to see if one of the vendors that timed out will - flag one of them. -

    -

    - And yup. Kapersky managed to not time out during the scan of the first - binary, flagging it as HEUR:Trojan-PSW.Script.Generic. Kapersky - timed out while analyzing the second. -

    -

    Strings

    -

    I notice a comment string in the binary:

    -
    // feature.h, simple_feature.h, and feature_provider.h..
    +            
    +

    Hack Racing

    +

    Posted: 28 March, 2026

    +

    Last Edited: 28 March, 2026

    +
    +

    Hack Racing

    +

    + After many delays in releasing this post, I've decided to make this a multi-part + series to shamelessly boost my meaningless engagement stats. +

    +

    + I have done my best to make this series digestible to all (also for them sweet + engagement stats). So, I hope that this can be informative for seasoned techies, + those new to Cybersecurity (like myself), and you normie folk who've somehow made + your way here (hopefully not as victims). +

    +

    + It's important to note that this particular attack (and operation) may very well + still be active. +

    +

    + Also, I apologise in advance if the formatting of this post is really messed up, I + have a lot of work to do overhauling the blog section for converting Markdown to + HTML, better metadata tracking, and the lovely CSS that goes along with those + changes. +

    +

    Prologue

    +

    February 4th, 2026

    +

    + This story begins like any other major public security story of early 2026: Discord. +

    +

    + I received a message from a friend asking for a quick favour. So naturally, I + responded, only to be ghosted for almost exactly 24 hours. +

    +

    The Next Day

    +

    + Aside from the odd behaviour, the hacker didn't account for the possibility that + this friend and I might see each other the following day. At which point I was + informed that they were hacked. +

    +

    Eventually, at 24 hours post-hack,

    +
    +

    + hi^^ , So I am currently pursuing an IT course where we are developing games. + and I developed a simple car racing simulator , As a part of the assignment, I + require feedback from people who have played the game. Would you give it a try + and provide feedback? It would really help me out and be a big part of my + learning! +

    +
    +

    Setting the bait

    +

    + It had to be right. After all, they could read all of our messages, profile me, and + discern that I have enough of a background in computing to not fall for such obvious + bull. Especially as I know the person outside the digital realm, what they're doing + course wise, and what certain subject they're distinctly not carrying on + with, which happens to be computer science. +

    +
    +

    Sure, I'd love to!

    +
    +

    Super sophisticated bait, I know.

    +
    +

    + tysm~! , here you go and also if you could give me your feedback in the next + 5-10 minutes, let me know if you faced any problem. + https://tinyurl.com/Race-Project-IT +

    +
    +

    + Bro literally is trying to live off the stereotypical behaviour of a person with a + themed nitro account, and leaves a random comma. Also note the time constraint. +

    +

    I was also later sent a second gift:

    +
    +

    https://tinyurl.com/Racing-Pro updated

    +
    +

    Epidemiology

    +

    + This is clearly a token and/or password-stealing trojan, targeting at least Discord. +

    +

    + Until much later, I didn't know that this attacked many, many other + services including Steam, Browsers, and Wallets. +

    +

    + Another piece of information gathered by someone else found that the attack is only + designed for Windows. +

    +

    Static Analysis

    +

    + Most of this will center around the first trojan, + Race-Project-IT. +

    +

    Links

    +

    + The links aren't markdown spoofed, but they are obscured by + tinyurl. Using expandurl, I can tell that they go to + Discord's CDN, and that I'm supposedly downloading a zip archive. Why on earth + they'd make this even more suspicious by providing a tinyurl instead of a link to + Discord's CDN on discord, I have no idea. +

    +

    VirusTotal

    +

    Tossing both binaries into VirusTotal finds... absolutely nothing?

    +

    + These files were last scanned nearly 24 hours ago as of writing. This could + concieveably be the hacker(s) reviewing the quality of their trojan. Other than + that, no vendors are screaming alarm bells. The Yomi Hunter sandbox has flagged the + second as malware. +

    +

    + I'll force a rescan just to see if one of the vendors that timed out will flag one + of them. +

    +

    + And yup. Kapersky managed to not time out during the scan of the first binary, + flagging it as HEUR:Trojan-PSW.Script.Generic. Kapersky timed out while + analyzing the second. +

    +

    Strings

    +

    I notice a comment string in the binary:

    +
    // feature.h, simple_feature.h, and feature_provider.h..
                             // This feature is only enabled if the embedder's delegated check returns
                             // true.
                         
    -

    - Searching for these comments leads to mentions of Chromium, maybe more - specifically Microsoft Chromium (Edge). I'll keep that in mind. -

    -

    The Executable

    -

    - Extracting the archive reveals a Windows Executable. Breaking down the - executable with binwalk turns up traces of - electron and more Chromium, including: -

    -
      -
    • chrome_100_percent.pak
    • -
    • chrome_200_percent.pak
    • -
    • LICENSE.electron.txt
    • -
    • LICENSES.chromium.html
    • -
    • app.asar
    • -
    • Racing_Sim.exe.extracted/A3D5760/image.png
    • -
    -

    - Within the EXE is another Racing_Sim.exe, and given the - electron image (image.png above) and node modules within it, I suspect this - is the actual payload, wrapped in an installer. -

    -

    - Doing a bit of dynamic analysis by checking the behaviour seen in the - VirusTotal sandboxes, and then comparing that with the files installed on my - friend's system confirms this. -

    -

    Metadata

    -

    The payload has an interesting bit of metadata:

    -
    Squirrel Aware Version          : 1
    +            

    + Searching for these comments leads to mentions of Chromium, maybe more specifically + Microsoft Chromium (Edge). I'll keep that in mind. +

    +

    The Executable

    +

    + Extracting the archive reveals a Windows Executable. Breaking down the executable + with binwalk turns up traces of electron and more + Chromium, including: +

    +
      +
    • chrome_100_percent.pak
    • +
    • chrome_200_percent.pak
    • +
    • LICENSE.electron.txt
    • +
    • LICENSES.chromium.html
    • +
    • app.asar
    • +
    • Racing_Sim.exe.extracted/A3D5760/image.png
    • +
    +

    + Within the EXE is another Racing_Sim.exe, and given the electron image + (image.png above) and node modules within it, I suspect this is the actual payload, + wrapped in an installer. +

    +

    + Doing a bit of dynamic analysis by checking the behaviour seen in the VirusTotal + sandboxes, and then comparing that with the files installed on my friend's system + confirms this. +

    +

    Metadata

    +

    The payload has an interesting bit of metadata:

    +
    Squirrel Aware Version          : 1
                         
    -

    - With a bit of help from SearXNG, this points me towards the - Squirrel.Windows - installer project. From here, I can confirm that - Squirrel.Windows plays a part in this by identifying common - metadata listed at - https://github.com/Squirrel/Squirrel.Windows/blob/develop/docs/using/custom-squirrel-events-non-cs.md - with the metadata on the file: -

    -
    File Description                : Racing_Sim
    +            

    + With a bit of help from SearXNG, this points me towards the + Squirrel.Windows + installer project. From here, I can confirm that + Squirrel.Windows plays a part in this by identifying common metadata + listed at + https://github.com/Squirrel/Squirrel.Windows/blob/develop/docs/using/custom-squirrel-events-non-cs.md + with the metadata on the file: +

    +
    File Description                : Racing_Sim
                         File Version                    : 2.1.1
                         Internal Name                   : Racing_Sim
                         Legal Copyright                 : Copyright © 2026 Racing_Sim
    @@ -205,123 +199,118 @@
                         PDB Age                         : 1
                         PDB File Name                   : C:\projects\src\out\Default\electron.exe.pdb
                         
    -

    - The existence of the PDB metadata leads me to believe that this might be a - debug build, but the PDB isn't present. -

    -

    - Reading up on Squirrel.Windows, it uses either squirrel-pack or - electron-builder to package the application. I don't know a lot - about the electron ecosystem, but it seems rather clear that I should - extract the electron archive. -

    -

    And there's our target: 4305567d2fbbd1d2.js

    -

    The Payload?

    -

    - Unsurprisingly, there's a bunch of node modules present. Some are for - interacting with databases, cryptography, and system information gathering. -

    -

    - One thing that peaks my interest is a bit of metadata on the - package.json: -

    -
    Copyright                       : Genesis © 2025
    +            

    + The existence of the PDB metadata leads me to believe that this might be a debug + build, but the PDB isn't present. +

    +

    + Reading up on Squirrel.Windows, it uses either squirrel-pack or + electron-builder to package the application. I don't know a lot about + the electron ecosystem, but it seems rather clear that I should extract the electron + archive. +

    +

    And there's our target: 4305567d2fbbd1d2.js

    +

    The Payload?

    +

    + Unsurprisingly, there's a bunch of node modules present. Some are for interacting + with databases, cryptography, and system information gathering. +

    +

    + One thing that peaks my interest is a bit of metadata on the + package.json: +

    +
    Copyright                       : Genesis © 2025
                         
    -

    - Everything up until now has been crediting the copyright holder as - Racing_Sim. -

    -

    Who Art Thou, Genesis?

    -

    Unsurprisingly, Genesis is a fairly generic name.

    -

    - But, narrowing the search to "Copyright Genesis 2025 nodejs" - brings up a TrendMicro report from November 22, 2023. - https://www.trendmicro.com/en_us/research/23/k/attack-signals-possible-return-of-genesis-market.html -

    -

    - But the modus operandi of the Genesis Market was very different, and there's - been no news about it since 2023 and parts of 2024. All the dates I've found - are 2026, and now 2025. -

    -

    - Trying a cryptocurrency route, there's Genesis Global Capital, a company - that went bankrupt in January of 2023. - https://www.bankingdive.com/news/genesis-crypto-completes-restructuring-begins-payouts/723330/ -

    -

    - There's also genesiscrypto.org which has a rather plain site, - and no upcoming events. The blog is a bit more interesting, screaming - "I'm a get rich quick scam". The last post was - "12/18/24", so it's clearly American. -

    -

    - There's also genesiscoin, but I'm getting tired of reading about crypto, and - otherwise getting nowhere from this line of inquiry. -

    -

    - If you're going to be a hacker group, at least pick something that you can - actually be recognized with. Pick a more distinct name. -

    -

    - For example, if you're going to pick the brand of your father's brother's - nephew's cousin's former roommate's car, at least slap a dollar sign on the - end! Something! -

    -

    Deobfuscating the Payload

    -

    Oh... lovely.

    - A wall of obfuscated JavaScript. -

    - Tossing the script into - deobfuscate.io makes the linter happy, - but not much more. -

    -

    - All content is minified, substituted against a central table (Ysa8NnK - in this version of the trojan), and control flow flattened, with opaque - steps and dead clones seemingly present. -

    -

    - One of the strings in the script is plain base64 encoded, - "bmV3IEZ1bmN0aW9uKCJyZXF1aXJlIiwgZGVjcnlwdGVkKShyZXF1aXJlKTs=" - which comes out to: -

    -
    new Function("require", decrypted)(require);
    +            

    + Everything up until now has been crediting the copyright holder as + Racing_Sim. +

    +

    Who Art Thou, Genesis?

    +

    Unsurprisingly, Genesis is a fairly generic name.

    +

    + But, narrowing the search to "Copyright Genesis 2025 nodejs" brings up a + TrendMicro report from November 22, 2023. + https://www.trendmicro.com/en_us/research/23/k/attack-signals-possible-return-of-genesis-market.html +

    +

    + But the modus operandi of the Genesis Market was very different, and there's been no + news about it since 2023 and parts of 2024. All the dates I've found are 2026, and + now 2025. +

    +

    + Trying a cryptocurrency route, there's Genesis Global Capital, a company that went + bankrupt in January of 2023. + https://www.bankingdive.com/news/genesis-crypto-completes-restructuring-begins-payouts/723330/ +

    +

    + There's also genesiscrypto.org which has a rather plain site, and no + upcoming events. The blog is a bit more interesting, screaming "I'm a get rich + quick scam". The last post was "12/18/24", so it's clearly American. +

    +

    + There's also genesiscoin, but I'm getting tired of reading about crypto, and + otherwise getting nowhere from this line of inquiry. +

    +

    + If you're going to be a hacker group, at least pick something that you can actually + be recognized with. Pick a more distinct name. +

    +

    + For example, if you're going to pick the brand of your father's brother's nephew's + cousin's former roommate's car, at least slap a dollar sign on the end! Something! +

    +

    Deobfuscating the Payload

    +

    Oh... lovely.

    + A wall of obfuscated JavaScript. +

    + Tossing the script into + deobfuscate.io makes the linter happy, but not + much more. +

    +

    + All content is minified, substituted against a central table (Ysa8NnK + in this version of the trojan), and control flow flattened, with opaque steps and + dead clones seemingly present. +

    +

    + One of the strings in the script is plain base64 encoded, + "bmV3IEZ1bmN0aW9uKCJyZXF1aXJlIiwgZGVjcnlwdGVkKShyZXF1aXJlKTs=" + which comes out to: +

    +
    new Function("require", decrypted)(require);
                         
    - Source code of a list containing the four strings as elaborated upon below. -

    - Also, there's a very long encrypted string sitting in an array with - what appears to be two base64-encoded strings and one that's a neat 32 - characters long. -

    -

    - Trying to skip around the control flow flattening, I look for the decryption - call. Searching around, I locate the following string: -

    -

    aes-256-cbc

    -

    This ought to be fun.

    -

    Breaking Into the Walled Garden

    -

    Decryption is handled through the internal crypto module.

    -

    - Working back the components of the AES decryption call finds that the - initialization vector is a simple Buffer from base64. -

    -
    // This has some undone substitution.
    +            Source code of a list containing the four strings as elaborated upon below.
    +            

    + Also, there's a very long encrypted string sitting in an array with what + appears to be two base64-encoded strings and one that's a neat 32 characters long. +

    +

    + Trying to skip around the control flow flattening, I look for the decryption call. + Searching around, I locate the following string: +

    +

    aes-256-cbc

    +

    This ought to be fun.

    +

    Breaking Into the Walled Garden

    +

    Decryption is handled through the internal crypto module.

    +

    + Working back the components of the AES decryption call finds that the initialization + vector is a simple Buffer from base64. +

    +
    // This has some undone substitution.
                         xK7i7T.crypto.pbkdf2Sync(
                           w4Matvo,
                           (1, xK7Canadiani7T.bHHea4)("GJOvrnu").from(
    @@ -333,79 +322,76 @@
                           "sha512",
                         );
                         
    -

    - The key decryption (shown above) isn't quite so simple. It's mangled with - pbkdf2 (Password-Based Key Derivation Function 2; I had to - double check I hadn't messed up a substitution on that method call...) and - integrating a value calculated through all of the control flow flattening. -

    -

    Brute forcing that value is easy as:

    -
      -
    • All numbers in the script are integers.
    • -
    • - Value must be in the range of 0 - 244XX (I forget as of writing; check - the docs) -
    • -
    • Cannot be less than 157.
    • -
    -

    - The list containing the keys, initialization vector, and encrypted data is - unpacked all at once. However, it is also dastardly obfuscated with ROT1. -

    -

    - Yes, in all 14,000 or so lines of code, they rotated the list entries - once. -

    -

    And with a simple adaptation of the call, I can brute-force the integer:

    -
    const { createDecipheriv, pbkdf2Sync } = require("crypto");
    -                    const { exit } = require("process");
    +            

    + The key decryption (shown above) isn't quite so simple. It's mangled with + pbkdf2 (Password-Based Key Derivation Function 2; I had to double check + I hadn't messed up a substitution on that method call...) and integrating a value + calculated through all of the control flow flattening. +

    +

    Brute forcing that value is easy as:

    +
      +
    • All numbers in the script are integers.
    • +
    • + Value must be in the range of 0 - 244XX (I forget as of writing; check the docs) +
    • +
    • Cannot be less than 157.
    • +
    +

    + The list containing the keys, initialization vector, and encrypted data is unpacked + all at once. However, it is also dastardly obfuscated with ROT1. +

    +

    + Yes, in all 14,000 or so lines of code, they rotated the list entries + once. +

    +

    And with a simple adaptation of the call, I can brute-force the integer:

    +
    const { createDecipheriv, pbkdf2Sync } = require("crypto");
    +const { exit } = require("process");
     
    -                    const algorithm = "aes-256-cbc";
    +const algorithm = "aes-256-cbc";
     
    -                    const inputEncoding = "base64";
    -                    const outputEncoding = "utf8";
    +const inputEncoding = "base64";
    +const outputEncoding = "utf8";
     
    -                    const [keyRoot, base64KeyRoot, base64IvRoot, dataRoot] = [
    -                      "Gcp/3fAC2AjoejyfB73T1xckjDWmMKA4",
    -                      "bx3omGLfT2FpBrmpQ3vGQg==",
    -                      "emZUVlGzS6tC6XAxZ3qQsg==",
    -                      "Encrypted data string here"
    -                    ];
    +const [keyRoot, base64KeyRoot, base64IvRoot, dataRoot] = [
    +    "Gcp/3fAC2AjoejyfB73T1xckjDWmMKA4",
    +    "bx3omGLfT2FpBrmpQ3vGQg==",
    +    "emZUVlGzS6tC6XAxZ3qQsg==",
    +    "Encrypted data string here"
    +];
     
    -                    const iv = Buffer.from(base64IvRoot, inputEncoding);
    +const iv = Buffer.from(base64IvRoot, inputEncoding);
     
    -                    function decrypt(c) {
    -                      var key = pbkdf2Sync(
    -                        keyRoot,
    -                        Buffer.from(base64KeyRoot, inputEncoding),
    -                        1e5,
    -                        c - 157,
    -                        "sha512",
    -                      );
    -                      var decipheriv = createDecipheriv(algorithm, key, iv);
    +function decrypt(c) {
    +    var key = pbkdf2Sync(
    +    keyRoot,
    +    Buffer.from(base64KeyRoot, inputEncoding),
    +    1e5,
    +    c - 157,
    +    "sha512",
    +    );
    +    var decipheriv = createDecipheriv(algorithm, key, iv);
     
    -                      data = decipheriv.update(dataRoot, inputEncoding, outputEncoding);
    -                      data += decipheriv.final(outputEncoding);
    +    data = decipheriv.update(dataRoot, inputEncoding, outputEncoding);
    +    data += decipheriv.final(outputEncoding);
     
    -                      return data;
    -                    }
    +    return data;
    +}
     
    -                    for (c = 158; c < Number.MAX_SAFE_INTEGER; c++) {
    -                      try {
    -                        console.log(decrypt(c));
    -                        exit();
    -                      } catch (_) {}
    -                    }
    +for (c = 158; c < Number.MAX_SAFE_INTEGER; c++) {
    +    try {
    +    console.log(decrypt(c));
    +    exit();
    +    } catch (_) {}
    +}
                         
    -

    And we're in.

    -
    -
    - +

    And we're in.

    -
    + +
      -

      #AD

      -
    +
  • #AD
  • + diff --git a/src/pages/disclosure.html b/src/pages/disclosure.html index ac49f8d..79a05dc 100644 --- a/src/pages/disclosure.html +++ b/src/pages/disclosure.html @@ -10,284 +10,226 @@
    -

    You are here:

    -
    Disclosure
    +

    You are here:

    +

    Disclosure

    -
    -
    -

    Disclosure

    -

    Last Edited: 01 August, 2025

    -
    -
    -
    -
    -

    Website Security

    +
    +

    Disclosure

    +

    Last Edited: 01 August, 2025

    +
    +
    +
    +

    Website Security

    +

    + This website uses a number of security features, most of which are built + into your browser, to protect my and your: +

    +
      +
    • Infrastructure
    • +
    • Data, and
    • +
    • Experience
    • +
    +

    You can see some of the main methods that this website uses below:

    +
    +
    +
    +

    Anubis

    +

    AI Scraper Screening Utility

    +

    - This website uses a number of security features, most of which are - built into your browser, to protect my and your: + This website is protected by a screening utility known as + Anubis. You may also have heard of this program as + BotStopper for those who purchase a commercial license + because they somehow can't live with a cute anime girl showing up on + their websites. UNESCO notably don't have a problem with that, and + proudly present an anime girl as of writing this. +

    +

    + I do not have a commercial license and do not pay in any way for + Anubis. If I had money to spare, I would actively fund the project. +

    +

    + Despite what some fools at the FSF figure, Anubis IS NOT malware. + See: + I Platformed A Linux "Cyber Criminal". It does have similar behaviour due to its proof-of-work + scheme, which asks your browser to run a throwaway calculation in an + effort to block or dissuade AI scrapers. Many, if not nearly all + clients, are subject to screening based on various filters around + your browser's user agent string. +

    +

    + Additionally, if you have concerns about the legality of my use of + Anubis, please see + Anubis Issue #50 + where concerns were looked into. +

    +

    + Now, if you have a moral issue with this project, you may do one of + two things (because adjusting your UA will just make me block the + UA, or add a complete catch-all rule): +

    +
      +
    1. Don't allow JavaScript to run. (Have fun making this work)
    2. +
    3. Just don't use my website.
    4. +
    +

    + If you experience issues with Anubis blocking you, which presumably + hasn't happened on your way to this page, you can email me with + details. DO NOT bother the main project as it may be an issue with a + screening rule that I've invoked. +

    +

    + If you do wish to raise an issue with the Anubis dev(s), PLEASE DO + NOT DO SOMETHING LIKE THIS:

    +
    +
    +
    +

    Content Security Policy (CSP)

    +

    - You can see some of the main methods that this website uses below: -

    -
    -
    -
    -
    -

    Anubis

    - AI Scraper Screening Utility -
    -
    -
    -

    - This website is protected by a screening utility known - as - Anubis. You may also have heard of this program as - BotStopper for those who purchase a - commercial license because they somehow can't live with - a cute anime girl showing up on their websites. UNESCO - notably don't have a problem with that, and proudly - present an anime girl as of writing this. -

    -

    - I do not have a commercial license and do not pay in any - way for Anubis. If I had money to spare, I would - actively fund the project. -

    -

    - Despite what some fools at the FSF figure, Anubis IS NOT - malware. See: - I Platformed A Linux "Cyber Criminal". It does have similar behaviour due to its - proof-of-work scheme, which asks your browser to run a - throwaway calculation in an effort to block or dissuade - AI scrapers. Many, if not nearly all clients, are - subject to screening based on various filters around - your browser's user agent string. -

    -

    - Additionally, if you have concerns about the legality of - my use of Anubis, please see - Anubis Issue #50 - where concerns were looked into. -

    -

    - Now, if you have a moral issue with this project, you - may do one of two things (because adjusting your UA will - just make me block the UA, or add a complete catch-all - rule): -

    -
      -
    1. - Don't allow JavaScript to run. (Have fun making this - work) -
    2. -
    3. Just don't use my website.
    4. -
    -

    - If you experience issues with Anubis blocking you, which - presumably hasn't happened on your way to this page, you - can email me with details. DO NOT bother the main - project as it may be an issue with a screening rule that - I've invoked. -

    -

    - If you do wish to raise an issue with the Anubis dev(s), - PLEASE DO NOT DO SOMETHING LIKE THIS: -

    - -
    -
    -
    -
    -
    -

    Content Security Policy (CSP)

    -
    -
    -
    -

    - This website, unlike a scary number of sites (including - google.com and microsoft.com as of writing) has a CSP - configured. This helps prevent or mitigate a number of - possible attacks including cross-site scripting and - clickjacking. -

    -

    - Further Reading: - https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP -

    -
    -
    -
    -
    -
    -

    - HTTP Strict Transport Security (HSTS) -

    -
    -
    -
    -

    - This website has a HSTS policy which indicates to your - browser to use a secure connection when connecting. -

    -

    - Additionally, the server will force redirect ALL - connections over to HTTPS for any browsers which do not - use this header or have a HTTPS-only mode enabled. -

    -

    - Further Reading: - https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security -

    -
    -
    -
    -
    -
    -

    Other Security Headers

    -
    -
    -
    -

    Some include:

    -
      -
    • X-Content-Type-Options
    • -
    • X-Frame-Options
    • -
    • X-XSS-Protection
    • -
    • Permissions-Policy
    • -
    • Referrer-Policy
    • -
    -
    -
    -
    -
    -
    -

    Security.txt

    -
    -
    -
    -

    - This file offers information to security researchers to - silently report any issues they find so that I can - resolve them. -

    -
    -
    -
    -
    -
    -

    Cookies

    -

    - This website only leaves cookies that are required for the website's - functioning. I do not place any trackers on your system. + This website, unlike a scary number of sites (including google.com + and microsoft.com as of writing) has a CSP configured. This helps + prevent or mitigate a number of possible attacks including + cross-site scripting and clickjacking.

    - Note: I cannot say what cookies may be left by services that I host - (such as Gitea and Web Check). For more details, please see those - projects' documentation. + Further Reading: + https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP

    -

    You can see all cookies that this website uses below:

    -
    -
    -
    -
    -

    Anubis

    - AI Scraper Screening Utility -
    -
    -
    -

    - This website does utilize a cookie. This cookie is made - by Anubis to keep your system from having to pass the - proof-of-work check every time you request a resource - from this site. -

    -

    - THEORETICALLY, this cookie, as with any JavaScript - cookie, - can be used to track you. -

    -

    - HOWEVER, I do not use it for tracking, Anubis does not - use it for tracking, and there is no evidence that 3rd - parties are abusing the cookie. There are far more - attractive targets. -

    -

    - IF this becomes an issue, until the lead developer(s) - and/or community can find a solution, Anubis will be - reconfigured to send out challenges even more - frequently, and an advisory notice to wipe your browser - cookies at the end of your session will be made. -

    -

    - Under the current configuration, Anubis' cookies are - valid for 24h. This does not mean that the cookie is - necessarily gone from your system. -

    -

    - Anubis Issue #50 - briefly looked into the possibility of abuse via the - cookie. -

    -
    -
    -
    -
    + +
    +
    +

    HTTP Strict Transport Security (HSTS)

    +
    +

    + This website has a HSTS policy which indicates to your browser to + use a secure connection when connecting. +

    +

    + Additionally, the server will force redirect ALL connections over to + HTTPS for any browsers which do not use this header or have a + HTTPS-only mode enabled. +

    +

    + Further Reading: + https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security +

    +
    +
    +
    +

    Other Security Headers

    +
    +

    Some include:

    +
      +
    • X-Content-Type-Options
    • +
    • X-Frame-Options
    • +
    • X-XSS-Protection
    • +
    • Permissions-Policy
    • +
    • Referrer-Policy
    • +
    +
    +
    +
    +

    Security.txt

    +
    +

    + This file offers information to security researchers to silently + report any issues they find so that I can resolve them. +

    +
    +
    +
    +
    +

    Cookies

    +

    + This website only leaves cookies that are required for the website's + functioning. I do not place any trackers on your system. +

    +

    + Note: I cannot say what cookies may be left by services that I host (such as + Gitea and Web Check). For more details, please see those projects' + documentation. +

    +

    You can see all cookies that this website uses below:

    +
    +
    +
    +

    Anubis

    +

    AI Scraper Screening Utility

    +
    +

    + This website does utilize a cookie. This cookie is made by Anubis to + keep your system from having to pass the proof-of-work check every + time you request a resource from this site. +

    +

    + THEORETICALLY, this cookie, as with any JavaScript cookie, + can be used to track you. +

    +

    + HOWEVER, I do not use it for tracking, Anubis does not use it for + tracking, and there is no evidence that 3rd parties are abusing the + cookie. There are far more attractive targets. +

    +

    + IF this becomes an issue, until the lead developer(s) and/or + community can find a solution, Anubis will be reconfigured to send + out challenges even more frequently, and an advisory notice to wipe + your browser cookies at the end of your session will be made. +

    +

    + Under the current configuration, Anubis' cookies are valid for 24h. + This does not mean that the cookie is necessarily gone from your + system. +

    +

    + Anubis Issue #50 + briefly looked into the possibility of abuse via the cookie. +

    +
    -
    -
    -

    #AD

    -

    #AD

    -
    + +
      +
    • #AD
    • +
    • #AD
    • +
    diff --git a/src/pages/index.html b/src/pages/index.html index a1dc80f..a25553a 100644 --- a/src/pages/index.html +++ b/src/pages/index.html @@ -10,36 +10,32 @@
    -

    You are here:

    -
    Home
    +

    You are here:

    +

    Home

    -
    -
    -

    Home

    -

    Last Edited: 03 August, 2025

    -
    -
    -

    People, this is under development. Live with the lorem ipsum.

    -

    lorem ipsum idk what else there is in this latin phrase

    -

    - Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex - sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis - convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus - fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada - lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti - sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. -

    -
    -
    - +
    +

    Home

    +

    Last Edited: 03 August, 2025

    +
    +

    People, this is under development. Live with the lorem ipsum.

    +

    lorem ipsum idk what else there is in this latin phrase

    +

    + Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien + vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. + Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec + metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. + Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia + nostra inceptos himenaeos. +

    -
    -

    #AD

    -

    #AD

    -
    + +
      +
    • #AD
    • +
    • #AD
    • +
    diff --git a/src/pages/resume.html b/src/pages/resume.html index d3f8bbc..585b0ad 100644 --- a/src/pages/resume.html +++ b/src/pages/resume.html @@ -11,452 +11,390 @@
    -

    You are here:

    -
    Resume
    +

    You are here:

    +

    Resume

    -
    -
    -

    Olivia Brooks

    -

    Last Edited: 21 February, 2026

    -
    -
    -
    -

    - Hello, I'm Olivia Brooks. I am a passionate, hard-working, and - dependable individual with an innate interest in sharing and expanding - my knowledge and expertise. -

    -

    - For the better part of a decade, I've specced, built, identified and - removed bottlenecks, and breathed new life into both desktops and - laptops. I have experience with all major operating systems including - Linux (which I've daily-driven for 5 years), Windows, MacOS, Android, - and iOS. -

    -

    - Over the years, my technical skills have branched to 3D printing, CNC - machining, basic CAD modelling, programming, and homelabbing. These - interests have garnered me experience with hardware and software from a - variety of vendors, architectures, and ecosystems, big and niche. -

    -

    - I have extensive experience in both leadership and non-leadership - positions across a variety of contexts. This has allowed me to develop a - wide range of skills which I draw upon daily to rapidly develop new - understandings. This additionally gives me the capacity to interact and - excel in unfamiliar situations and novel endeavours. -

    -

    - I am always willing to lend a hand where I can, no matter the learning - curve ahead. -

    -

    - I sincerely appreciate your consideration of me as a candidate, and look - forward to hearing from you. -

    -
    - -
    -
    -

    Work History

    -
    -
    -
    -
    -

    OTHS Tech Crew

    - September 2024 - June 2025 -
    -
    -
    -

    Project Manager

    -
      -
    • - First year that the crew was entirely student-led. -
    • -
    • Identified project scope and requirements.
    • -
    • Ensured timely completion of tasks.
    • -
    • Coordinated crew setup and take-down efforts.
    • -
    • - Effectively worked around live program changes and - weather patterns. -
    • -
    • Additionally handled equipment maintenance.
    • -
    • Acted as administrative liaison.
    • -
    -
    -
    -
    -
    -
    -

    Farmers' Market

    - Wee Youngn' - 2020, Summer 2023 -
    -
    -
    -

    Volunteer - Various Roles

    -
      -
    • - Started as a young child attracting customers to a - fudge stall by looking cute with divine, glorious - red hair. -
    • -
    • Handled the sale of goods.
    • -
    • Handled the preparation of farm-grown goods.
    • -
    • Stocked the displays.
    • -
    • Ran the Kids' Corner activities. (Summer 2023)
    • -
    -
    -
    -
    -
    -
    -

    MPS Audio-Visual Club

    - September 2018 - 2020 -
    -
    -
    -

    Supervisor

    -
      -
    • Identified project scope and requirements.
    • -
    • Ensured timely completion of tasks.
    • -
    • Coordinated crew setup and take-down efforts.
    • -
    -
    -
    -
    -
    - -
    -

    Education

    -
    -
    -
    -
    -

    Carleton University

    - September 2025 to Present - Ottawa, ON -
    -

    IN PROGRESS

    -
    -
    -

    Bachelor of Arts (Honours)

    -
      -
    • Major in Psychology
    • -
    • [Intended] Minor in Computer Science
    • -
    • Concentration in Social/Personality Psychology
    • -
    -
    -
    -
    -
    -
    -

    Osgoode Township High School

    - September 2021 to 2025 - Ottawa, ON -
    -
    -
    -

    Gr. 9 to 12

    -
      -
    • French Immersion Studies
    • -
    -
    -
    -
    -
    -
    -

    Air Cadets, Squadron 742

    - November 2019 to September 2022 - Ottawa, ON -
    -
    -
    -

    Sergeant

    -
      -
    • Drone Pilot Training Course (August 2022)
    • -
    • Cadet Actitivy Program (August 2022)
    • -
    • Poppy Drive (November 2021)
    • -
    • Music (June - July 2021)
    • -
    • Music (March 2021)
    • -
    • Music (August 2020)
    • -
    • Web Programming (April 2020)
    • -
    • Advanced Cybertraining Course (August 2020)
    • -
    • - Cadet Band Member (September 2020 - February 2022) -
    • -
    -
    -
    -

    Earlier history available by request.

    -
    -
    +
    +
    +

    Work History

    +
    +
    +
    +

    OTHS Tech Crew

    +

    September 2024 - June 2025

    +
    +

    Project Manager

    +
      +
    • First year that the crew was entirely student-led.
    • +
    • Identified project scope and requirements.
    • +
    • Ensured timely completion of tasks.
    • +
    • Coordinated crew setup and take-down efforts.
    • +
    • + Effectively worked around live program changes and weather + patterns. +
    • +
    • Additionally handled equipment maintenance.
    • +
    • Acted as administrative liaison.
    • +
    +
    +
    +
    +

    Farmers' Market

    +

    Wee Youngn' - 2020, Summer 2023

    +
    +

    Volunteer - Various Roles

    +
      +
    • + Started as a young child attracting customers to a fudge stall + by looking cute with divine, glorious red hair. +
    • +
    • Handled the sale of goods.
    • +
    • Handled the preparation of farm-grown goods.
    • +
    • Stocked the displays.
    • +
    • Ran the Kids' Corner activities. (Summer 2023)
    • +
    +
    +
    +
    +

    MPS Audio-Visual Club

    +

    September 2018 - 2020

    +
    +

    Supervisor

    +
      +
    • Identified project scope and requirements.
    • +
    • Ensured timely completion of tasks.
    • +
    • Coordinated crew setup and take-down efforts.
    • +
    +
    -
    - -
    -

    Awards

    -
    -
    -
    -
    -

    Ontario Scholar

    - Obtained an average of at least eighty percent in - any six applicable Grade 12 courses. -
    -
    -
    -
    -
    -
    -

    Silver Medalist

    - Average over 90% -
    -

    x2

    -
    -
    -
    -
    -
    -

    CyberSci Regional Winner

    - The Off-By-Ones - Ottawa, 2025 -
    -
    -
    -

    - Queries about other awards available by request. -

    -
    -
    - -
    -

    Certifications and Diplomas

    -
    -
    -
    -

    Ontario Secondary School Diploma

    -
    -
    -
    -
    -

    DELF

    -

    Niveau B2

    -
    -
    -
    -
    -

    Red Cross Swimming

    -

    Level 10

    -
    -
    -
    -
    -

    Canadian Firearms Safety Course

    -

    PAL

    -
    -
    -

    - Queries about certifications available by request. -

    -
    -
    +
    + +
    +

    Education

    +
    +
    +
    +

    Carleton University

    +

    September 2025 to Present - Ottawa, ON

    +

    IN PROGRESS

    +
    +

    Bachelor of Arts (Honours)

    +
      +
    • Major in Psychology
    • +
    • [Intended] Minor in Computer Science
    • +
    • Concentration in Social/Personality Psychology
    • +
    +
    +
    +
    +

    Osgoode Township High School

    +

    September 2021 to 2025 - Ottawa, ON

    +
    +

    Gr. 9 to 12

    +
      +
    • French Immersion Studies
    • +
    +
    +
    +
    +

    Air Cadets, Squadron 742

    +

    November 2019 to September 2022 - Ottawa, ON

    +
    +

    Sergeant

    +
      +
    • Drone Pilot Training Course (August 2022)
    • +
    • Cadet Actitivy Program (August 2022)
    • +
    • Poppy Drive (November 2021)
    • +
    • Music (June - July 2021)
    • +
    • Music (March 2021)
    • +
    • Music (August 2020)
    • +
    • Web Programming (April 2020)
    • +
    • Advanced Cybertraining Course (August 2020)
    • +
    • Cadet Band Member (September 2020 - February 2022)
    • +
    +
    +

    Earlier history available by request.

    - +
    + +
    +

    Awards

    +
    +
    +
    +

    Ontario Scholar

    +

    + Obtained an average of at least eighty percent in any six + applicable Grade 12 courses. +

    +
    +
    +
    +
    +

    Silver Medalist

    +

    Average over 90%

    +

    x2

    +
    +
    +
    +
    +

    CyberSci Regional Winner

    +

    The Off-By-Ones - Ottawa, 2025

    +
    +
    +

    + Queries about other awards available by request. +

    +
    +
    + +
    +

    Certifications and Diplomas

    +
    +
    +
    +

    Ontario Secondary School Diploma

    +
    +
    +
    +
    +

    DELF

    +

    Niveau B2

    +
    +
    +
    +
    +

    Red Cross Swimming

    +

    Level 10

    +
    +
    +
    +
    +

    Canadian Firearms Safety Course

    +

    PAL

    +
    +
    +

    + Queries about certifications available by request. +

    +
    +
    +
    +
    -

    Contact Info

    +

    Contact Info

    -
    -

    - Email -

    - olivia.a.brooks77@gmail.com -
    + Email +

    olivia.a.brooks77@gmail.com

    -

    Spoken Languages

    +

    Spoken Languages

    -
    -

    English

    - Fluent -
    +

    English

    +

    Fluent

    -
    -

    Français

    - DELF B2 -
    +

    Français

    +

    DELF B2

    @@ -504,9 +434,7 @@
    -
    -

    By Request

    -
    +

    By Request

    diff --git a/src/scripts/themes/.gitignore b/src/scripts/themes/.gitignore deleted file mode 100644 index 599be4e..0000000 --- a/src/scripts/themes/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.beam -*.ez -/build -erl_crash.dump diff --git a/src/scripts/themes/gleam.toml b/src/scripts/themes/gleam.toml deleted file mode 100644 index bced9d6..0000000 --- a/src/scripts/themes/gleam.toml +++ /dev/null @@ -1,19 +0,0 @@ -name = "themes" -version = "1.0.0" - -# Fill out these fields if you intend to generate HTML documentation or publish -# your project to the Hex package manager. -# -# description = "" -# licences = ["Apache-2.0"] -# repository = { type = "github", user = "", repo = "" } -# links = [{ title = "Website", href = "" }] -# -# For a full reference of all the available options, you can have a look at -# https://gleam.run/writing-gleam/gleam-toml/. - -[dependencies] -gleam_stdlib = ">= 0.44.0 and < 2.0.0" - -[dev-dependencies] -gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/src/scripts/themes/manifest.toml b/src/scripts/themes/manifest.toml deleted file mode 100644 index ba887ee..0000000 --- a/src/scripts/themes/manifest.toml +++ /dev/null @@ -1,11 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "gleam_stdlib", version = "0.69.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "AAB0962BEBFAA67A2FBEE9EEE218B057756808DC9AF77430F5182C6115B3A315" }, - { name = "gleeunit", version = "1.9.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "DA9553CE58B67924B3C631F96FE3370C49EB6D6DC6B384EC4862CC4AAA718F3C" }, -] - -[requirements] -gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } -gleeunit = { version = ">= 1.0.0 and < 2.0.0" } diff --git a/src/scripts/themes/src/themes.gleam b/src/scripts/themes/src/themes.gleam deleted file mode 100644 index e899180..0000000 --- a/src/scripts/themes/src/themes.gleam +++ /dev/null @@ -1,5 +0,0 @@ -import gleam/io - -pub fn main() -> Nil { - io.println("Hello from themes!") -} diff --git a/src/scripts/themes/test/themes_test.gleam b/src/scripts/themes/test/themes_test.gleam deleted file mode 100644 index fba3c88..0000000 --- a/src/scripts/themes/test/themes_test.gleam +++ /dev/null @@ -1,13 +0,0 @@ -import gleeunit - -pub fn main() -> Nil { - gleeunit.main() -} - -// gleeunit test functions end in `_test` -pub fn hello_world_test() { - let name = "Joe" - let greeting = "Hello, " <> name <> "!" - - assert greeting == "Hello, Joe!" -} diff --git a/src/styles/partials/_a_common.scss b/src/styles/partials/_a_common.scss index 8f235b4..35a55bf 100644 --- a/src/styles/partials/_a_common.scss +++ b/src/styles/partials/_a_common.scss @@ -1,4 +1,4 @@ -@use "_a_colours.css"; +@use "a_colours.css"; @use "a_footer"; @use "a_layouts"; @@ -91,20 +91,24 @@ body { h1 { font-size: 3.3vh; - font-family: var(--font-family-title); } h2 { font-size: 2.5vh; - font-family: var(--font-family-title); } +h1, +h2, h3, h4, h5, -h6, +h6 { + font-family: var(--font-family-title); +} + p, -a { +a, +li { font-family: var(--font-family-generic); } @@ -116,7 +120,7 @@ a { body { grid-template-columns: none; - grid-template-areas: "banner" "nav" "main" "spacer"; + grid-template-areas: "banner" "nav" "main" "tailer" "spacer"; // Compress spacings to maximize useable area. // padding: var(--spacing-small); @@ -129,6 +133,7 @@ a { top: auto; left: auto; right: auto; + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; } } @@ -136,7 +141,7 @@ a { @media (min-width: 601px) and (max-width: 1023px) { body { grid-template-columns: min-content 1fr; - grid-template-areas: "banner banner" "nav main" "spacer main"; + grid-template-areas: "banner banner" "nav main" "spacer main" "spacer tailer"; } } @@ -144,6 +149,6 @@ a { @media (min-width: 1024px) { body { grid-template-columns: min-content 1fr min-content; - grid-template-areas: "banner banner banner" "nav main spacer"; + grid-template-areas: "banner banner banner" "nav main spacer" "nav tailer spacer"; } } diff --git a/src/styles/partials/_a_quick_links.scss b/src/styles/partials/_a_quick_links.scss index 7903f77..eeafdbe 100644 --- a/src/styles/partials/_a_quick_links.scss +++ b/src/styles/partials/_a_quick_links.scss @@ -6,8 +6,7 @@ flex-wrap: wrap; justify-content: center; - > a, - > div { + > * { display: grid; background-color: var(--background-3); diff --git a/src/styles/partials/_a_section_list.scss b/src/styles/partials/_a_section_list.scss index 7e8096f..117218e 100644 --- a/src/styles/partials/_a_section_list.scss +++ b/src/styles/partials/_a_section_list.scss @@ -51,7 +51,7 @@ } } - > .body { + > header ~ { padding: 0 calc(var(--spacing-small) * 2); ul { @@ -81,7 +81,7 @@ column-gap: var(--spacing-small); } - > .body { + > header ~ { // Collapse the L/R padding to maximize usable space padding: 0; } diff --git a/src/styles/partials/_nav_location.scss b/src/styles/partials/_nav_location.scss index 23ab380..80276f7 100644 --- a/src/styles/partials/_nav_location.scss +++ b/src/styles/partials/_nav_location.scss @@ -5,12 +5,12 @@ border-radius: var(--border-radius-leaf); text-align: center; - > header h4 { + > .title { font-weight: bold; margin: 0 0 0.5rem; } - .page { + > .page { margin: 0; } } diff --git a/src/styles/partials/_pane_blog.scss b/src/styles/partials/_pane_blog.scss index dce9d58..9a53f99 100644 --- a/src/styles/partials/_pane_blog.scss +++ b/src/styles/partials/_pane_blog.scss @@ -4,31 +4,29 @@ justify-content: center; - > .body { - padding: var(--spacing-small) 0 0; + padding: var(--spacing-small) 0 0; - > header { - white-space: nowrap; - } + > header { + white-space: nowrap; + } - > .body { - text-align: start; + > header ~ * { + text-align: start; - padding: 0 var(--spacing-thicc) var(--spacing-thicc); + padding: 0 var(--spacing-thicc) var(--spacing-thicc); - img { - max-width: 100%; - max-height: 65vh; - display: block; - margin: 0 auto; - object-fit: contain; - } + img { + max-width: 100%; + max-height: 65vh; + display: block; + margin: 0 auto; + object-fit: contain; } } } @media (max-width: 600px) { - .pane.blog .body > .body { + .pane.blog { padding: var(--spacing-small); } } diff --git a/src/styles/partials/_pane_main.scss b/src/styles/partials/_pane_main.scss index 6ff7c43..46ff560 100644 --- a/src/styles/partials/_pane_main.scss +++ b/src/styles/partials/_pane_main.scss @@ -1,56 +1,49 @@ main.pane { grid-area: main; - > .body, - > footer { - background-color: var(--background-2); - border-radius: var(--border-radius-leaf); - } + background-color: var(--background-2); + border-radius: var(--border-radius-leaf); - > .body { - padding: var(--spacing-small); - - > header { - text-align: center; - padding: var(--spacing-small); - width: max-content; - - margin: 0 auto; - - .title { - background-color: var(--background-1); - border-radius: var(--border-radius-leaf); - padding: var(--spacing-small); - } - - .date { - display: block; - - font-size: 0.85rem; - font-weight: normal; - font-style: italic; - font-family: var(--font-family-generic); - } - } - - > .body { - text-align: start; - } - } - - > footer { - margin: var(--spacing-large) auto 0; - width: min-content; - - font-size: 1.65vh; - white-space: nowrap; - - padding: var(--spacing-small); + text-align: start; + padding: var(--spacing-small); + > header { text-align: center; + padding: var(--spacing-small); + width: max-content; - > p { - margin: 0; + margin: 0 auto; + + .title { + background-color: var(--background-1); + border-radius: var(--border-radius-leaf); + padding: var(--spacing-small); + } + + .date { + display: block; + + font-size: 0.85rem; + font-weight: normal; + font-style: italic; + font-family: var(--font-family-generic); } } } + +main.pane + footer { + grid-area: tailer; + margin: var(--spacing-large) auto 0; + width: min-content; + + font-size: 1.65vh; + white-space: nowrap; + + padding: var(--spacing-small); + + text-align: center; + + > p { + margin: 0; + } +} diff --git a/src/styles/partials/_pane_nav.scss b/src/styles/partials/_pane_nav.scss index bad94b0..27450f7 100644 --- a/src/styles/partials/_pane_nav.scss +++ b/src/styles/partials/_pane_nav.scss @@ -28,6 +28,7 @@ nav.pane { nav.pane { background-color: var(--background-2); border-radius: var(--border-radius-leaf); + width: 100%; padding: 0 var(--spacing-small); .menu, @@ -35,10 +36,6 @@ nav.pane { .location { display: none; } - - > * { - width: 100%; - } } nav.pane > input:checked + label {