Compare commits
3 commits
main
...
feat/desig
Author | SHA1 | Date | |
---|---|---|---|
dcb19d69e4 | |||
93a560da12 | |||
cbeb1a9a47 |
55 changed files with 157 additions and 622 deletions
|
@ -22,4 +22,5 @@ That's it. You'll have a dev server on http://localhost:8080. Have fun!
|
|||
The following tokens need to be defined inside `.env`:
|
||||
|
||||
- `DARK_VISITORS_ACCESS_TOKEN`
|
||||
- `LISTENBRAINZ_API_KEY`
|
||||
- `LAST_FM_API_KEY`
|
||||
|
||||
|
|
|
@ -1,90 +0,0 @@
|
|||
---
|
||||
title: "Weekly Notes #11"
|
||||
date: 2025-09-14T22:00
|
||||
excerpt: Let's not talk about how long it's been.
|
||||
tags:
|
||||
- post
|
||||
- career
|
||||
- music
|
||||
youtube: true
|
||||
---
|
||||
|
||||
I know, I know... it's been a while. I'm not good with keeping up my writing habits. I try.
|
||||
|
||||
A lot has happened since my most recent "weekly notes" post. Around October 2024 I started in the exciting world of freelancing! A company I worked for years ago was looking for help, so I figured let's give this thing a shot. It worked! I managed to find contracts through former colleagues and contacts. As it turns out networking is still the most valuable skill when it comes to careers (in my opinion, anyway).
|
||||
|
||||
My most recent contract, which has wrapped up as of last week, has lead to full-time, salaried employment. This is a huge relief for me. I've enjoyed the variety of work that comes with freelancing, but I'm ready to settle back down and get stabilized again. I'm starting as a **Senior Software Engineer**. I feel like I'm actually making some career progress.
|
||||
|
||||
From [Weekly Notes #10](/posts/weekly-notes-10/):
|
||||
|
||||
> I’ll get a job eventually, and for now I’m taking care of myself.
|
||||
|
||||
Hey, whaddya know. I did (to both). :)
|
||||
|
||||
Outside of work, I've kept busy. Most recently I participated in another game jam (and [here's a post if you'd like to learn more](/posts/2025-gmtk-game-jam-post-mortem-2025-edition/)). We went on our annual trip to Calgary, Alberta to visit family, and took a sidebar trip to Edmonton (about a 3-ish hour drive from Calgary) to experience a small slice of [Edmonton Fringe](https://www.fringetheatre.ca/). When we learned that a sequel to our beloved [Rat Academy](https://www.instagram.com/the_rat_academy/?hl=en) was happening in Edmonton, we knew we had to be there. And it did not disappoint. I'm hoping they will make a stop in Victoria again soon.
|
||||
|
||||
My latest gaming addiction is [Abiotic Factor](https://www.abioticfactor.com/), which is like "what if half-life 1 but a survival crafting game?" and I'm here for it. I adore the aesthetic. It's been great fun playing with a group of friends ("alright, who's ready to do a science?"), and since it's not an early access game (typical for your survival-crafters) there's actually a complete experience here with story and everything. We haven't reached the end yet (in fact I'm not even sure if we're close), but there has been a consistent pace of discoveries (some fun, some horrifying).
|
||||
|
||||
And then [Silksong](https://hollowknightsilksong.com/) practically stealth-dropped out of nowhere on September 4th. I've barely started this one - I'm maybe an hour or two in? _Also_, Hades II was [just announced to be released on September 25th](https://www.rogue.site/news/hades-2-launch-date-announcement-nintendo-switch-2/). Then about a month later, [Mina the Hollower](https://www.minathehollower.org/) comes out on October 31st. Can we slow our roll, amazing indie games?
|
||||
|
||||
In between everything that's been going on, I've been working with [Old School Blue](https://bsky.app/profile/theforevergm.bsky.social) on taking Rumor Mill from game jam to full release. I want to say more, but I'll zip my lips and hope that what we're cooking looks fun to you!
|
||||
|
||||
## Links
|
||||
|
||||
[How Tim Cook sold out Steve Jobs](https://www.anildash.com/2025/09/09/how-tim-cook-sold-out-steve-jobs/)
|
||||
|
||||
It's beating a dead horse at this point, but the Apple of 2025 is nothing like the Apple of 20 years ago. With the latest version of iOS shaping up to be a design and accessibility nightmare, my faith in my once favourite company is at an all time low. Despite that though, I feel like they are the lesser of two evils (the other being Google/Android) when it comes to mobile phones. I'm ready to jump ship, but I don't see any great alternatives yet.
|
||||
|
||||
[How Lofi Girl Became a Chill Beats Empire](https://www.404media.co/how-lofi-girl-became-a-chill-beats-empire/)
|
||||
|
||||
I do lament the loss of the hip hop influence with recent lofi trends. It feels softer, quieter. It does make for great "focus music", but I find myself searching for more "instrumental hip hop" these days.
|
||||
|
||||
[Does Silksong Seem Unreasonably Hard? You Probably Took a Wrong Turn](https://www.404media.co/does-silksong-seem-unreasonably-hard-you-probably-took-a-wrong-turn/)
|
||||
|
||||
I agree that the difficulty of Silksong feels like quite a step up from the previous game. My aging gamer instincts are nowhere near as sharp as they once were. I can feel the struggle already in my short time spent so far in the world of Silksong.
|
||||
|
||||
Yet, it feels a bit funny to me that gamers playing "metroid-vania-likes" are not engaging in probably the most important part of the genre: exploration. Some sage advice at the end of the article:
|
||||
|
||||
> But when a truly amazing game comes along that tries to gently steer the player with burly ants and difficult puzzles, they don’t appreciate it and they don’t listen. If you’re really stuck in *Silksong*, try going somewhere else.
|
||||
|
||||
## Videos
|
||||
|
||||
{% youtube "ylL-SSRDyJc", "Turnstile: Tiny Desk Concert" %}
|
||||
|
||||
I love Turnstile. I also love seeing how bands "make it work" in a Tiny Desk setting.
|
||||
|
||||
{% youtube "r5Y1I1Zol2k", "I Got So Annoyed with YouTube I Built My Own" %}
|
||||
|
||||
I feel both seen and completely [nerd-sniped](https://xkcd.com/356/) with this one. I am loathe to admit it, but this is an ideal use-case for AI. Feed it _your_ data, with an LLM _you_ control, to create an algorithm that works _for you_.
|
||||
|
||||
Completely reasonable developer behaviour.
|
||||
|
||||
## Developing
|
||||
|
||||
I made some small tweaks to the posts layout and style today. I think it makes it easier to scan. I also had to fix my development pipeline last month. I guess it's been a while since I've posted, so I didn't notice it breaking.
|
||||
|
||||
## Watching
|
||||
|
||||
We recently finished all of _The Good Wife_, which was rather enthralling! The last season faltered around a bit, but the previous six were great TV through and through. I'm surprised that I hadn't heard of the show during its original run.
|
||||
|
||||
We've swiftly moved onto _The Good Fight_, which takes place a year after the end of _The Good Wife_. It follows Diane Lockhart, after she is forced out of her previous firm. I'm not so sure about it after the first few episodes of season 1, but I'll let it cook and see what it has to offer. There's also the second spin-off _Elsbeth_, which follows Elsbeth Tascioni - probably my favourite character of the "Good Wife Universe".
|
||||
|
||||
## Listening
|
||||
|
||||
Been ravenously listening to the new The Beaches album _No Hard Feelings_, and I'm beyond excited to see them live in October. No skips on this one.
|
||||
|
||||
Deftones' newest album _private music_ is stellar. I read on a music review somewhere that said "they are able to play loud music softly" which feels apt. It's aggressive, but thoughtful. It's in your face, but contemplative. I don't know how they do it, but it's _good_.
|
||||
|
||||
Recently discovered the shoegaze band [Slow Crush](https://slowcrush.bandcamp.com/), and have been also devouring their newest album _Thirst_.
|
||||
|
||||
The _Metal Gear Solid 3_ soundtrack has been on heavy rotation the past 2 weeks as my "focus music". I guess with the recent release of _Metal Gear Solid Delta: Snake Eater_ it's been on my mind lately. I want to play the game, but not bad enough to fork over $90+ for it. I'll wait for a steep sale.
|
||||
|
||||
## Coming Up
|
||||
|
||||
Tomorrow is my first day as a full-time employee. I'm excited. I've been working with the team already for 3 months, so I'm well integrated and "in the work". Plenty of onboarding to do too.
|
||||
|
||||
Later on we have a symphony performance of "Broadway & Beyond" which is symphonic renditions of famous broadway tunes. I'm looking forward to it!
|
||||
|
||||
Later in the October two good friends of mine are finally getting married! I think the wedding will be a ton of fun. They're both giant nerds and I know they've been cooking up something neat.
|
||||
|
||||
Until next time! ✌️
|
|
@ -1,287 +0,0 @@
|
|||
---
|
||||
title: "GMTK Game Jam Post-Mortem: 2025 Edition"
|
||||
date: 2025-09-14T14:23
|
||||
excerpt: My second game jam ever!
|
||||
tags:
|
||||
- gamejam
|
||||
- gamedev
|
||||
- pixel-art
|
||||
- post
|
||||
---
|
||||
|
||||
Once again I participated in this year's [GMTK Game Jam](https://itch.io/jam/gmtk-2025)! There were over 9,000 games made this year. It ran from July 30th to August 3rd, 2025. This year I teamed up with [Old School Blue](https://bsky.app/profile/theforevergm.bsky.social) to make **[Rumor Mill](https://oldschoolblue.itch.io/rumor-mill)**!
|
||||
|
||||
The theme this year was **loop**. There are many ways to interpret the theme - we saw a lot of games that had you playing the same levels repeatedly, drawing loops (lassos), moving in loops... a whole lotta looping. We quickly narrowed in on the office phrase "to keep you in the loop", which naturally lead to our game taking the idea of spreading gossip around the workplace.
|
||||
|
||||
> Start as a gossipy gossipmonger at "SlowDays Inc" and try to become the SULTAN OF SECRETS in the office!
|
||||
>
|
||||
> Boost the Tea Score of your hot gossip by making sure your coworkers are passing it along to the right people, amplifying its effectiveness (and salaciousness!)
|
||||
>
|
||||
> Some people love hearing the latest dish from HR, while others hate hearing about the latest lascivious lore from the Engineering Department.
|
||||
>
|
||||
> Some love to be the first to know, while others hate being kept out of the loop until the last minute!
|
||||
|
||||
## Result
|
||||
|
||||
Our final score from 30 ratings:
|
||||
|
||||
| Criteria | Rank | Score |
|
||||
| ---------- | ----- | ----- |
|
||||
| Creativity | #819 | 4.067 |
|
||||
| Narrative | #1204 | 3.167 |
|
||||
| Enjoyment | #1735 | 3.467 |
|
||||
| Audio | #1812 | 3.267 |
|
||||
| Artwork | #2367 | 3.467 |
|
||||
|
||||
I'm quite pleased with how we fared, especially considering the sheer amount of games that were made! We had a lot of excellent competition. I'm especially proud of the Creativity score, which suggests to me that we found a concept that felt unique and interesting. I was surprised by the Artwork score as a I felt we had a pretty cool art style, but hey that's the breaks sometimes. There were some especially pretty games this year, so I had a lot of competition.
|
||||
|
||||
At the end of the day, we've both decided we like the game enough to keep working on it! There's some fun ideas brewing that I think will work very well as a fun puzzle game.
|
||||
|
||||
<aside>
|
||||
I know I said I would continue working on my last game jam game back in 2021 (and we didn't, sadly). This time feels different. We're both energized about our concept and we've started drafting up design documents and are already taking planning seriously. It feels different this time...
|
||||
</aside>
|
||||
|
||||
## Planning & Creation
|
||||
|
||||
As I mentioned earlier, we figured out that we had some kind of gossip-spreading game in mind.
|
||||
|
||||
> **Old School Blue**:
|
||||
> You have a piece of hot goss to spread, it scores.....5 points, whatever....You have to arrange a set of co-workers to spread the goss and get it back to you. Some co-workers increase the gossip score, some lower it, some double it, some cut it in half, your goal is to make it the juiciest gossip in the office. The set of Coworkers you get to use each round is random, you get 6 and have to use...4 of them, there's 4 places to plug them into the "game board"
|
||||
>
|
||||
> **wonderfulfrog**:
|
||||
> HAH okay maybe there’s something here
|
||||
|
||||
We started toying with some ideas - what if we have different department employees who prefer talking to one group but not the other? Oh, and what about certain people love being first in the loop (or maybe last)? We had some ideas organically brew from that initial concept.
|
||||
|
||||
We eventually arrived at a scoring mechanic being the driving force of the game. The idea is to place employees to maximize your "tea score" such that you progress to the next level.
|
||||
|
||||
> **Old School Blue**:
|
||||
> At "Slow Days Inc." the common way to pass the day is passing the latest hot gossip and, as part of HR, you always know the best secrets. Figure out the best way to pass this gossip through the office to ensure the maximum effect and greatest enjoyment. Some coworkers love spilling the tea, others only trust certain coworkers with the juciest bits of lore. The player has a piece of Gossip with a "Tea Score", their goal is to maximize the "Tea Score" when the gossip eventually makes it back to them.
|
||||
>
|
||||
> The office has a series of cubicles, each cubicle can hold one coworker. The path that the gossip will take is clearly labeled. Each coworker will adjust the score in various ways, based on certain criteria. The player will be given two Co-workers to choose from, only one may be chosen, the other is discarded. The chosen coworker can be dragged into one of the Cubicles and may not be changed after being chosen.
|
||||
>
|
||||
> Once all Cubicle spots are filled, the goss is spread and a final "Tea Score" is gained. A minimum Tea Score is needed to level up and be promoted to the next HR rank and have a larger office, with more Cubicle Spaces and more Coworkers.
|
||||
>
|
||||
> "Tom Doubles the Tea Score", "Sandra Halves the Tea Score if she's not the first person to hear about it" "Debra loves to spread goss to Tammy and adds 50% to the goss if Tammy is next" sort of thing.
|
||||
|
||||
Within the first 24 hours or so we had a functioning prototype, which felt great to see. Having a working game so quickly helped us iterate and test out ideas we had.
|
||||
|
||||
Initially we thought gossip might travel between coworkers on a grid (kind of like [Pipe Dream](https://en.wikipedia.org/wiki/Pipe_Mania)).
|
||||
|
||||

|
||||
|
||||
I was playing with the idea of gossip traveling along a line (hence the red/white colours there). Early on we also knew we wanted a “departments” concept, something that would affect the score depending on who talked to who (which is where the coloured borders come from).
|
||||
|
||||
We really wanted to tie into the loop theme though, so we opted with the gossip starting from you, going around a set of cubicles, and arriving back to you to really hammer that theme home.
|
||||
|
||||

|
||||
|
||||
We wanted to experiment with branching paths, with the idea being that perhaps your "coworker deck" would function better with the alternate path available. This was a feature we decided to cut to save time.
|
||||
|
||||

|
||||
|
||||
## Artwork
|
||||
|
||||
For this game jam I was dead set on using a 1-bit pixel art style. I'm not sure what had me quite so attracted to the style, but I suspect it was the game [Phasing Puller](https://mvln.itch.io/phasing-puller) from the 2021 GMTK Game Jam having a lasting impression on me. I guess [Undertale's](https://undertale.com/) portraits also share this style, although I did not consciously choose the style to imitate Undertale.
|
||||
|
||||
<aside>
|
||||
What is 1-bit pixel art?
|
||||
Think of this being the same thing as limited to 2 colours. Traditionally, this is white and black, but could be anything like two shades of the same colour.
|
||||
|
||||
But how do you convey shadows and softness? With great difficulty! This is a challenging limitation to work within. Something like dithering is super helpful here!
|
||||
|
||||
</aside>
|
||||
|
||||
It has been several years since my last pixel art drawing, but I found my footing quickly (and had to given our deadline). My first piece of art (besides the concept art) was this portrait:
|
||||
|
||||

|
||||
|
||||
I wasn't deliberately going for a [Will Wright](https://cdn.mos.cms.futurecdn.net/ZKDrAxpQM4dWkFWowKZ5Rh-970-80.png.webp) vibe, but must've done it unconsciously (we've been exploring another game concept that might involve something from SimCity... my lips are sealed 🤐). I ended up tweaking the portrait a bit to try and move in a different direction, and apparently ended up creating disheveled Hideo Kojima. Oh well.
|
||||
|
||||

|
||||
|
||||
Immediately I thought it would be fun to have animated portraits:
|
||||
|
||||

|
||||
|
||||
Although decided to scrap that plan due to how little time we had.
|
||||
|
||||
We needed some way to represent coworkers in a "deck of cards" fashion, since we started leaning into a deck-building aspect pretty quickly. ID badges felt like the way to go here, so off I went:
|
||||
|
||||

|
||||
|
||||
I wasn't really sure where I was going with this one, but I thought some odd geometric shapes and funky patterns conveyed some kind of "high tech feel" (even though our fictional in-game company is anything but high tech). It was an amusing contrast to me. I also thought it might be fun to add some variation to each ID badge, so created a few options with icons!
|
||||
|
||||

|
||||
|
||||
Somehow our conversation turned to J. Jonah Jameson, and naturally that meant he was going to be our second coworker!
|
||||
|
||||
<figure>
|
||||
<img src="https://cdn.wonderfulfrog.com/images/rm-portrait-concept-3.png" />
|
||||
<figcaption>Please get me all the gossip on Spider-man Mr. Parker, if you have the time that is...</figcaption>
|
||||
</figure>
|
||||
|
||||
Something wasn't quite right here. The eyes felt a little... small. JJJ is a big personality, so I went back and experimented a bit more and landed on that stern face:
|
||||
|
||||
<figure>
|
||||
<img src="https://cdn.wonderfulfrog.com/images/rm-portrait-concept-3-1.png" />
|
||||
<figcaption>I need all the gossip about Spider-Man, Parker!</figcaption>
|
||||
</figure>
|
||||
|
||||
After that I picked a few more "office people" to add to our roster. First was Pam from Archer:
|
||||
|
||||
<figure>
|
||||
<img src="https://cdn.wonderfulfrog.com/images/rm-portrait-concept-4.png" />
|
||||
<figcaption>The watercooler goes "sploosh"</figcaption>
|
||||
</figure>
|
||||
|
||||
And I've been watching The Good Wife lately, so why not add Diane Lockhart?
|
||||
|
||||
<figure>
|
||||
<img src="https://cdn.wonderfulfrog.com/images/rm-portrait-concept-5.png" />
|
||||
<figcaption>I bet she loves to open phishing emails...</figcaption>
|
||||
</figure>
|
||||
|
||||
I'm having a ton of fun making various portraits, but realizing quickly that we don't have as much time as I estimate we do. I'll need to move onto other visuals... how about the title screen?
|
||||
|
||||
A piece of iconography I latched onto was palm trees. Somehow I felt the tropical vibe was a good fit for "SlowDays Inc". That's how we ended up somewhere vaguely Miami:
|
||||
|
||||
<figure>
|
||||
<img src="https://cdn.wonderfulfrog.com/images/rm-title.png" />
|
||||
<figcaption>I should've added a sun!</figcaption>
|
||||
</figure>
|
||||
|
||||
For the logo itself I thought the blue and white looked pretty slick, but accidentally kinda recreated a watercooler motif?
|
||||
|
||||
<figure>
|
||||
<img src="https://cdn.wonderfulfrog.com/images/rm-logo.png" />
|
||||
<figcaption>You can feel the watercooler filling up, right?</figcaption>
|
||||
</figure>
|
||||
|
||||
Lastly, we needed a breakroom!
|
||||
|
||||
<figure>
|
||||
<img src="https://cdn.wonderfulfrog.com/images/rm-breakroom.png" />
|
||||
<figcaption>Thirsty? Enjoy our SlowDays Inc branded water!</figcaption>
|
||||
</figure>
|
||||
|
||||
## Audio
|
||||
|
||||
On top of the visuals, I also got to play the role of sound designer! I did a bit of foley to get the majority of our sounds. For most sounds I used my Blue Yeti, and a bit of finesse inside Audacity. A simple setup, but it worked well!
|
||||
|
||||
The ID badge sounds were created using a deck of cards - I would slide, pick up, place, and generally muck around with them to produce a variety of sounds. I think I recorded over 50 different sounds in total, but pared it down to about 15 (using about 3-6 sounds each for picking up, placing, and hovering cards).
|
||||
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/pickup1.wav"></audio>
|
||||
<figcaption>Pickup 1</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/pickup2.wav"></audio>
|
||||
<figcaption>Pickup 2</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/pickup3.wav"></audio>
|
||||
<figcaption>Pickup 3</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/shuffle1.wav"></audio>
|
||||
<figcaption>Shuffle 1</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/shuffle2.wav"></audio>
|
||||
<figcaption>Shuffle 2</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/shuffle3.wav"></audio>
|
||||
<figcaption>Shuffle 3</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/place1.wav"></audio>
|
||||
<figcaption>Place 1</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/place2.wav"></audio>
|
||||
<figcaption>Place 2</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/place3.wav"></audio>
|
||||
<figcaption>Place 3</figcaption>
|
||||
</figure>
|
||||
|
||||
The coworkers blabbing to each other were recorded by myself and my wife! Again, I ended up recording a bunch of sounds for this and had to pare it down to the best. We knew from the outset we wanted a kind of “wah wah” sound the adults in Peanuts make. How did we do?
|
||||
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/babble1.wav"></audio>
|
||||
<figcaption>Wah-wah 1</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/babble_lady_1.wav"></audio>
|
||||
<figcaption>Wah-wah 2</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/babble2.wav"></audio>
|
||||
<figcaption>Wah-wah 3</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/babble_lady_2.wav"></audio>
|
||||
<figcaption>Wah-wah 4</figcaption>
|
||||
</figure>
|
||||
|
||||
Various bleeps and bloops came from [sfxer](https://sfxr.me/) (which I was happy to learn is still a thing), and a few online tools for generating “game sounds”.
|
||||
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/gainedPoints.wav"></audio>
|
||||
<figcaption>Gain Points</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/rumorTransform1.wav"></audio>
|
||||
<figcaption>Gossip Transformation 1</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/rumorTransform4.wav"></audio>
|
||||
<figcaption>Gossip Transformation 2</figcaption>
|
||||
</figure>
|
||||
|
||||
Lastly, I had to record our cat Ramona for her grand reveal in game. Let me tell you, getting a cat to meow when you want them to is difficult! I think we only got one or two usable ones. I used my phone’s microphone (through the Voice Memo app).
|
||||
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/cat1.wav"></audio>
|
||||
<figcaption>Meow 1</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<audio controls src="https://cdn.wonderfulfrog.com/audio/rm/cat2.wav"></audio>
|
||||
<figcaption>Meow 2</figcaption>
|
||||
</figure>
|
||||
|
||||
<details>
|
||||
<summary>And if you'd like to spoil the surprise, here's Ramona's portrait!</summary>
|
||||
<img src="https://cdn.wonderfulfrog.com/images/rm-ramona.png" />
|
||||
</details>
|
||||
|
||||
To really sell the office vibe, we sourced some stock sounds of people chatting, microwave beeps, and general ambiance. It really feels like you're having lunch in the breakroom (and someone is microwaving fish _again_).
|
||||
|
||||
Overall I'm super happy with how the sound and ambiance came off.
|
||||
|
||||
## My experience
|
||||
|
||||
Unlike my previous experience in the GMTK game jam, we found our concept pretty quickly, like within an hour or two. Once we have a concept, we can get cracking!
|
||||
|
||||
This game jam took place during the week, and we both decided that we didn't want to take any additional time off, which meant we were balancing work and other commitments while working on the game.
|
||||
|
||||
It had been a long while since I'd mucked around with pixel art (in fact probably since 2021), and it took me a while to "get back into it" again. As always though, once I find my groove I really love it. I had much fun creating spins on "famous office people".
|
||||
|
||||
My time management was fairly balanced compared to the last one. No late nights and constant check-ins kept us both updated and aware of what we were working on.
|
||||
|
||||
Something I tried last game jam (and decided to repeat this time) was getting into "rating exchange groups" in order to get more ratings for my game. My thought was that the more ratings it has, the better result we get. Something I noticed after everything wrapped up was that the majority of the top games never appeared in my ratings exchange. The games at the very top (10 or so), might've had 30 or less ratings.
|
||||
|
||||
I'm beginning to question the strategy of these exchanges. I believe they ended up doing more harm than good. In terms of wanting to "do well", I think we tend to get harder grading rather than organic reviews. On the other hand, I don't know how to get the game "out there" so people can play it. I really don't know what to do. Next time, I will try not joining these exchanges.
|
||||
|
||||
Overall, I had a great time. I'm proud of what we made and feel like we found a novel concept that is worth expanding on. Speaking of which...
|
||||
|
||||
## Post-jam
|
||||
|
||||
I know I said this last time, but I swear this time I mean it! We are continuing to work on the game. I don't want to spoil too much, but we are revisiting some of the core mechanics to develop a vision of the game that matches our expectations. With a game jam you have to set yourself certain limits to save time, but now that we have plenty of time... let's see where we can push things.
|
||||
|
||||
I've spent some time trying to determine a "visual style" of where I think things should go... I'm getting close to finding it. Let's just say "Windows NT" and leave it there. I know for certain though that while I enjoyed the constraints of a 1-bit style, I'm going to want a few more colours for a full game.
|
||||
|
||||
Hopefully the next time I'm talking about **Rumor Mill** will be revealing a game release! Until then!
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
date: 2025-01-20
|
||||
title: Solo Leveling
|
||||
year: 2024
|
||||
releaseYear: 2024
|
||||
tags:
|
||||
- anime
|
||||
- drama
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
---
|
||||
date: 2025-05-17
|
||||
title: Dandadan
|
||||
year: 2024
|
||||
tags:
|
||||
- anime
|
||||
- action
|
||||
- comedy
|
||||
- science-fiction
|
||||
image: https://cdn.wonderfulfrog.com/images/tv/dandadan-poster.jpg
|
||||
pullquote: Ghosts or aliens? Why not both?
|
||||
watchHistory:
|
||||
rating: 3
|
||||
isFavourite: false
|
||||
hasSpoilers: false
|
||||
thetvdb: https://thetvdb.com/series/dandadan
|
||||
---
|
||||
|
||||
I love the animation and style of this show evokes, it always has something new and exciting to share. Many scenes are gorgeous and fluid, hands down some of the best visuals I've seen in recent memory.
|
||||
|
||||
The dynamic of Momo and Okarun having unique powers that can shore up the other's weaknesses is so fun. Each episode has them teaming up in unique (often amusing) ways to defeat this week's monster.
|
||||
|
||||
The show's perversion turns me right off, though. While the show feels like it's trying to advance the art form visually, the reliance on erotic art and tired tropes drags it down. It reminds me of _Kill la Kill_, which was fanservice under the guise of "critique", while accomplishing nothing of the sort. It's your classic "anime problem" and frankly I wish the industry would be done with it.
|
||||
|
||||
Speaking of horniness, another weak point would be the show's story. The current arc (in season 1) surrounds the gang trying to recover Okarun's penis and testicles. Yup, that's the plot. I get that things are supposed to be silly and slapstick, but come on. This is just stupid.
|
||||
|
||||
I'm hoping the show is going somewhere and it's a slow burn, but I don't have a ton of faith.
|
|
@ -1,27 +0,0 @@
|
|||
import "dotenv/config";
|
||||
|
||||
import EleventyFetch from "@11ty/eleventy-fetch";
|
||||
|
||||
const API_KEY = process.env.LISTENBRAINZ_API_KEY;
|
||||
const BASE_URL = "https://api.listenbrainz.org";
|
||||
|
||||
async function fetchListenBrainz() {
|
||||
try {
|
||||
const url = `${BASE_URL}/1/user/wonderfulfrog/listens`;
|
||||
const response = await EleventyFetch(url, {
|
||||
duration: "1h",
|
||||
type: "json",
|
||||
fetchOptions: {
|
||||
headers: {
|
||||
Authorization: `Bearer ${API_KEY}`,
|
||||
},
|
||||
},
|
||||
});
|
||||
return response.payload.listens;
|
||||
} catch (e) {
|
||||
console.error("Error fetching data from ListenBrainz", e);
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
export default fetchListenBrainz;
|
|
@ -1,19 +1,4 @@
|
|||
.posts-grid {
|
||||
.posts-list-item {
|
||||
display: grid;
|
||||
gap: var(--spacing-4);
|
||||
}
|
||||
|
||||
.post {
|
||||
&:not(:last-of-type) {
|
||||
border-bottom: 1px solid var(--color-border);
|
||||
padding-block-end: var(--spacing-4);
|
||||
}
|
||||
|
||||
time {
|
||||
font-size: var(--font-size-sm);
|
||||
}
|
||||
|
||||
.post--title {
|
||||
display: inline-block;
|
||||
}
|
||||
grid-template-columns: auto auto;
|
||||
}
|
||||
|
|
|
@ -10,8 +10,5 @@
|
|||
--font-weight-bold: 700;
|
||||
--font-weight-black: 900;
|
||||
|
||||
--font-size-xs: 0.8rem;
|
||||
--font-size-sm: 1rem;
|
||||
|
||||
--triangles: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80"><path stroke-width="0" d="M0,0 40,40 80,0z" /></svg>');
|
||||
}
|
||||
|
|
|
@ -13,7 +13,3 @@
|
|||
.line-height-l {
|
||||
line-height: 1.5rem;
|
||||
}
|
||||
|
||||
.font-semibold {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
|
|
@ -3,10 +3,16 @@ layout: "layouts/base"
|
|||
---
|
||||
|
||||
{% from "macros/date.njk" import format %}
|
||||
{% from "macros/utils.njk" import stars, spoilerWarning, pageHeader %}
|
||||
{% from "macros/utils.njk" import stars, spoilerWarning %}
|
||||
{% from "macros/tags.njk" import tagList %}
|
||||
<article class="flow">
|
||||
{{ pageHeader(title, pullquote, page.date) }}
|
||||
<header class="flow">
|
||||
<div class="flow flow-space-1">
|
||||
<h1>{{ title }}</h1>
|
||||
{% if pullquote %}<h3 class="text-fadeText">{{ pullquote }}</h3>{% endif %}
|
||||
</div>
|
||||
{{ format(page.date) }}
|
||||
</header>
|
||||
{% if hasSpoilers %}
|
||||
{{ spoilerWarning() }}
|
||||
{% endif %}
|
||||
|
|
|
@ -3,10 +3,16 @@ layout: "layouts/base"
|
|||
---
|
||||
|
||||
{% from "macros/date.njk" import format %}
|
||||
{% from "macros/utils.njk" import stars, spoilerWarning, pageHeader %}
|
||||
{% from "macros/utils.njk" import stars, spoilerWarning %}
|
||||
{% from "macros/tags.njk" import tagList %}
|
||||
<article class="flow">
|
||||
{{ pageHeader(title, pullquote, page.date) }}
|
||||
<header class="flow">
|
||||
<div class="flow flow-space-1">
|
||||
<h1>{{ title }}</h1>
|
||||
{% if pullquote %}<h3 class="text-fadeText">{{ pullquote }}</h3>{% endif %}
|
||||
</div>
|
||||
{{ format(page.date) }}
|
||||
</header>
|
||||
{% if hasSpoilers %}
|
||||
{{ spoilerWarning() }}
|
||||
{% endif %}
|
||||
|
|
|
@ -3,10 +3,16 @@ layout: "layouts/base"
|
|||
---
|
||||
|
||||
{% from "macros/date.njk" import format %}
|
||||
{% from "macros/utils.njk" import stars, spoilerWarning, pageHeader %}
|
||||
{% from "macros/utils.njk" import stars, spoilerWarning %}
|
||||
{% from "macros/tags.njk" import tagList %}
|
||||
<article class="flow">
|
||||
{{ pageHeader(title, pullquote, page.date) }}
|
||||
<header class="flow">
|
||||
<div class="flow flow-space-1">
|
||||
<h1>{{ title }}</h1>
|
||||
{% if pullquote %}<h3 class="text-fadeText">{{ pullquote }}</h3>{% endif %}
|
||||
</div>
|
||||
{{ format(page.date) }}
|
||||
</header>
|
||||
{% if hasSpoilers %}
|
||||
{{ spoilerWarning() }}
|
||||
{% endif %}
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
---
|
||||
layout: "layouts/base"
|
||||
---
|
||||
|
||||
{% from "macros/date.njk" import format %}
|
||||
{% from "macros/tags.njk" import tagList %}
|
||||
{% from "macros/utils.njk" import pageHeader %}
|
||||
<article class="flow">
|
||||
{{ pageHeader(title, subtitle) }}
|
||||
<section class="flow flow-space-default">
|
||||
{{ content | safe }}
|
||||
</section>
|
||||
</article>
|
|
@ -4,13 +4,16 @@ layout: "layouts/base"
|
|||
|
||||
{% from "macros/date.njk" import format %}
|
||||
{% from "macros/tags.njk" import tagList %}
|
||||
{% from "macros/utils.njk" import pageHeader %}
|
||||
<article class="flow">
|
||||
{{ pageHeader(title, excerpt, page.date) }}
|
||||
<section>
|
||||
{{ tagList(tags | filter("post") , "/posts") }}
|
||||
</section>
|
||||
<header class="flow">
|
||||
<div class="flow flow-space-1">
|
||||
<h1>{{ title }}</h1>
|
||||
<h3 class="text-fadeText">{{ excerpt }}</h3>
|
||||
</div>
|
||||
{{ format(page.date) }}
|
||||
</header>
|
||||
<section class="flow flow-space-default">
|
||||
{{ content | safe }}
|
||||
</section>
|
||||
{{ tagList(tags | filter("post") , "/posts") }}
|
||||
</article>
|
||||
|
|
|
@ -3,10 +3,16 @@ layout: "layouts/base"
|
|||
---
|
||||
|
||||
{% from "macros/date.njk" import format %}
|
||||
{% from "macros/utils.njk" import stars, spoilerWarning, pageHeader %}
|
||||
{% from "macros/utils.njk" import stars, spoilerWarning %}
|
||||
{% from "macros/tags.njk" import tagList %}
|
||||
<article class="flow">
|
||||
{{ pageHeader(title, pullquote, page.date) }}
|
||||
<header class="flow">
|
||||
<div class="flow flow-space-1">
|
||||
<h1>{{ title }}</h1>
|
||||
{% if pullquote %}<h3 class="text-fadeText">{{ pullquote }}</h3>{% endif %}
|
||||
</div>
|
||||
{{ format(page.date) }}
|
||||
</header>
|
||||
{% if hasSpoilers %}
|
||||
{{ spoilerWarning() }}
|
||||
{% endif %}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{% macro format(dateString) %}
|
||||
<time class="date flex items-center gap-2 text-fadeText"
|
||||
datetime="{{ dateString }}">
|
||||
{{ dateString | formatDate("MMMM Do YYYY") }}
|
||||
<span class="text-primary line-height-s">{% include "svgs/calendar.svg" %}</span>{{ dateString | formatDate("MMMM Do YYYY") }}
|
||||
</time>
|
||||
{% endmacro %}
|
||||
|
|
|
@ -1,21 +1,15 @@
|
|||
{% from "macros/tags.njk" import tagList %}
|
||||
{% from "macros/date.njk" import format %}
|
||||
|
||||
{% macro one(post, fmt = "MM/DD") %}
|
||||
{% set tags = post.data.tags | filter("post") %}
|
||||
<article class="post flow flow-space-0">
|
||||
{{ format(post.date) }}
|
||||
<a href="{{ post.url }}" class="post--title font-semibold">{{ post.data.title }}</a>
|
||||
<p class="text-fadeText font-size-s">{{ post.data.excerpt }}</p>
|
||||
<article class="posts-list-item column-gap-0.5 justify-between line-height-l">
|
||||
<a href="{{ post.url }}">{{ post.data.title }}</a>
|
||||
<time datetime="{{ post.date }}" class="text-fadeText">{{ post.date | formatDate(fmt) }}</time>
|
||||
<p class="text-fadeText font-size-s line-height-m">{{ post.data.excerpt }}</p>
|
||||
</article>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro list(posts, format = "MM/DD") %}
|
||||
<section class="posts-grid flow-space-6">
|
||||
{% for post in posts %}{{ one(post, format) }}{% endfor %}
|
||||
</section>
|
||||
<ol class="flow p-0" role="list">
|
||||
{% for post in posts %}<li class="flow-space-2">{{ one(post, format) }}</li>{% endfor %}
|
||||
</ol>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro yearList(posts, year, format = "MM/DD") %}
|
||||
<section class="flow">
|
||||
<header class="cluster gap-0.5">
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
{% from "macros/date.njk" import format %}
|
||||
|
||||
{% macro stars(number) %}
|
||||
{% set filledStars = number %}
|
||||
{% set emptyStars = 5 - number %}
|
||||
|
@ -21,13 +19,3 @@
|
|||
The following may contain spoilers!
|
||||
</section>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro pageHeader(title, subtitle, date) %}
|
||||
<header class="flow">
|
||||
<div class="flow flow-space-3">
|
||||
{% if date %}{{ format(date) }}{% endif %}
|
||||
<h1>{{ title }}</h1>
|
||||
{% if subtitle %}<h3 class="text-fadeText">{{ subtitle }}</h3>{% endif %}
|
||||
</div>
|
||||
</header>
|
||||
{% endmacro %}
|
||||
|
|
|
@ -46,9 +46,6 @@
|
|||
<li>
|
||||
<a href="/webrings">Webrings</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/past-designs">Past Designs</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ meta.repoUrl }}"
|
||||
target="_blank"
|
||||
|
|
|
@ -12,7 +12,7 @@ permalink: /
|
|||
<p>
|
||||
I like to <a href="/posts">write</a> about <a href="/games">games</a>, <a href="/books">books</a>, and <a href="/watching/movies/recent">movies</a> to name a few things. There's a lot to explore, and I hope you have fun!
|
||||
</p>
|
||||
<section class="flow flow-space-8">
|
||||
<section class="flow-space-8">
|
||||
<header class="flow">
|
||||
<h2>Favourite posts</h2>
|
||||
<p class="flow-space-1">Hand-picked, curated selection of my favourite posts!</p>
|
||||
|
@ -20,7 +20,7 @@ permalink: /
|
|||
{% set favouritePosts = collections.post | filterFavourites | reverse %}
|
||||
{{ list(favouritePosts, "MM/DD/YYYY") }}
|
||||
</section>
|
||||
<section class="flow flow-space-8">
|
||||
<section class="flow-space-8">
|
||||
<header>
|
||||
<h2>Recent posts</h2>
|
||||
</header>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
---
|
||||
permalink: /404.html
|
||||
title: 404 - Can't Find That Frog 🐸
|
||||
subtitle: Where froggo art thou?
|
||||
title: 404 - Can't Find That Frog
|
||||
youtube: true
|
||||
---
|
||||
|
||||
<section class="flow">
|
||||
<h1>404 🍞</h1>
|
||||
<p>Couldn't find what you're looking for. But would you like some bread for your journey home? 🥖</p>
|
||||
{% youtube "GQw-aEk05qY", "Call 1800 Tobë ( Bread Ad )" %}
|
||||
<p>
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
---
|
||||
title: About me
|
||||
subtitle: It's all about me!
|
||||
title: About
|
||||
description: All about me!
|
||||
---
|
||||
|
||||
# About me
|
||||
|
||||
**See also**: [Stuff I use](/uses), my [contact info](/contact), or [what's happening now](/now).
|
||||
|
||||
Hello! Ahoj! Welcome to my site!
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
title: Blogroll
|
||||
subtitle: A collection of my favourite sites, in no particular order.
|
||||
description: A collection of my favourite sites.
|
||||
---
|
||||
|
||||
<section class="flow">
|
||||
<h1>Blogroll</h1>
|
||||
<p>A collection of my favourite sites, in no particular order.</p>
|
||||
<p>
|
||||
If you're looking for more cool sites, visit <a href="https://blogroll.org"
|
||||
target="_blank"
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
title: Favourite books
|
||||
subtitle: A collection of my favourite books!
|
||||
permalink: "books/favourites/index.html"
|
||||
---
|
||||
|
||||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set data = collections.book | filterFavourites | reverse %}
|
||||
<section class="flow">
|
||||
<h1>Favourite books</h1>
|
||||
<p>A collection of my favourite books!</p>
|
||||
{{ grid(data) }}
|
||||
</section>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
title: Books
|
||||
subtitle: A collection of books I've read over the years.
|
||||
permalink: "books/index.html"
|
||||
---
|
||||
|
||||
|
@ -9,7 +8,8 @@ permalink: "books/index.html"
|
|||
{% set faves = collections.book | filterFavourites | reverse | limit(5) %}
|
||||
{% set tags = collections.book | allTagCounts(["book"]) | limit(5) %}
|
||||
<section class="flow">
|
||||
<p>I hope one day its an exhaustive list.</p>
|
||||
<h1>Books</h1>
|
||||
<p>A collection of books I've read over the years. I hope one day its an exhaustive list.</p>
|
||||
<h2>
|
||||
<a href="tags">Tags</a>
|
||||
</h2>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
title: Recent books
|
||||
subtitle: A collection of books I've read recently.
|
||||
permalink: "books/recent/index.html"
|
||||
---
|
||||
|
||||
|
@ -8,6 +7,8 @@ permalink: "books/recent/index.html"
|
|||
{% set data = collections.book | reverse %}
|
||||
{% set tags = collections.book | allTagCounts(["book"]) | limit(5) %}
|
||||
<section class="flow">
|
||||
<h1>Recent books</h1>
|
||||
<p>A collection of books I've read.</p>
|
||||
<h2>
|
||||
<a href="../tags">Tags</a>
|
||||
</h2>
|
||||
|
|
|
@ -4,13 +4,12 @@ pagination:
|
|||
size: 1
|
||||
alias: tag
|
||||
permalink: "books/tag/{{ tag | slugify }}/index.html"
|
||||
eleventyComputed:
|
||||
title: "Books: Tag: \"{{ tag }}\""
|
||||
subtitle: "All books tagged with \"{{ tag }}\""
|
||||
---
|
||||
|
||||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set data = collections.booksByTag[tag] | reverse %}
|
||||
<section class="flow">
|
||||
{{ grid(data) }}
|
||||
</section>
|
||||
<header class="flow flow-space-4">
|
||||
<h1>Books</h1>
|
||||
<p class="text-fadeText flow-space-1">Tagged with "{{ tag }}"</p>
|
||||
</header>
|
||||
{{ grid(data) }}
|
||||
|
|
|
@ -6,6 +6,7 @@ permalink: "books/tags/index.html"
|
|||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set tags = collections.book | allTagCounts(["book"]) %}
|
||||
<section class="flow">
|
||||
<h1>Tagged in Books</h1>
|
||||
<ul class="categories cluster list-none p-0 line-height-m">
|
||||
{% for tag in tags %}
|
||||
<li>
|
||||
|
|
|
@ -1,16 +1,15 @@
|
|||
---
|
||||
title: Changelog
|
||||
subtitle: All the changes that are fit to read!
|
||||
eleventyComputed:
|
||||
description: All of the latest changes on {{ meta.siteName }}.
|
||||
---
|
||||
|
||||
# Changelog
|
||||
|
||||
All the changes that are fit to read!
|
||||
|
||||
If preferred, the [commit log is available here][commits].
|
||||
|
||||
## May 31st, 2025
|
||||
|
||||
- Added a new page called [Past Designs](/past-designs)!
|
||||
|
||||
## May 30th, 2025
|
||||
|
||||
- As much as I tried, I just couldn't give up **iA Writer Quattro** as my body font. So it's back! Perhaps in the future I can use Hyperlegible as a toggle option.
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
---
|
||||
title: Colophon
|
||||
subtitle: A fancy word for describing how this site was built.
|
||||
description: A little bit of everything about this site.
|
||||
---
|
||||
|
||||
# Colophon
|
||||
|
||||
A little bit of everything regarding how this site was built and its origins.
|
||||
|
||||
## Technology
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
---
|
||||
title: Contact
|
||||
subtitle: Various ways to get in touch with me on the internet.
|
||||
description: Various ways to get in touch.
|
||||
permalink: "/contact/index.html"
|
||||
---
|
||||
|
||||
<header class="flow flow-space-4">
|
||||
<h1>Contact</h1>
|
||||
<p class="text-fadeText flow-space-1">Various ways to get in touch with me on the internet.</p>
|
||||
</header>
|
||||
<section class="flow">
|
||||
<p>Below are my primary methods of contact. They are the ones I monitor most and likely to respond!</p>
|
||||
<div class="table-wrapper">
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
---
|
||||
title: Feeds
|
||||
subtitle: Feed yourself a veritable bevy of feeds.
|
||||
description: Feed yourself a veritable bevy of feeds.
|
||||
---
|
||||
|
||||
<h1>Feeds</h1>
|
||||
<p>Here is my collection of feeds for your perusal. They come in RSS varieties.</p>
|
||||
<ul class="flow list-none pl-0">
|
||||
<li>
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
title: Favourite games
|
||||
subtitle: A collection of my favourite games!
|
||||
permalink: "games/favourites/index.html"
|
||||
---
|
||||
|
||||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set data = collections.game | filterFavourites | reverse %}
|
||||
<section class="flow">
|
||||
<h1>Favourite games</h1>
|
||||
<p>A collection of my favourite games!</p>
|
||||
{{ grid(data) }}
|
||||
</section>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
title: Games
|
||||
subtitle: I happen to quite like video games.
|
||||
permalink: "games/index.html"
|
||||
---
|
||||
|
||||
|
@ -9,6 +8,7 @@ permalink: "games/index.html"
|
|||
{% set faves = collections.game | filterFavourites | reverse | limit(5) %}
|
||||
{% set tags = collections.game | allTagCounts(["game"]) | limit(5) %}
|
||||
<section class="flow">
|
||||
<h1>Games</h1>
|
||||
<p>
|
||||
A collection of games I played over the years. Ideally this would include every game I've every played, but realistically it's an approximation. I try to include my own thoughts with each.
|
||||
</p>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
title: Recent games
|
||||
subtitle: A collection of games that I've played recently.
|
||||
permalink: "games/recent/index.html"
|
||||
---
|
||||
|
||||
|
@ -8,6 +7,8 @@ permalink: "games/recent/index.html"
|
|||
{% set data = collections.game | reverse %}
|
||||
{% set tags = collections.game | allTagCounts(["game"]) | limit(5) %}
|
||||
<section class="flow">
|
||||
<h1>Recent games</h1>
|
||||
<p>A collection of games I've played.</p>
|
||||
<h2>
|
||||
<a href="../tags">Tags</a>
|
||||
</h2>
|
||||
|
|
|
@ -4,13 +4,12 @@ pagination:
|
|||
size: 1
|
||||
alias: tag
|
||||
permalink: "games/tag/{{ tag | slugify }}/index.html"
|
||||
eleventyComputed:
|
||||
title: "Games: Tag: \"{{ tag }}\""
|
||||
subtitle: "All games tagged with \"{{ tag }}\""
|
||||
---
|
||||
|
||||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set data = collections.gamesByTag[tag] %}
|
||||
<section class="flow">
|
||||
{{ grid(data) }}
|
||||
</section>
|
||||
<header class="flow flow-space-4">
|
||||
<h1>Games</h1>
|
||||
<p class="text-fadeText flow-space-1">Tagged with "{{ tag }}"</p>
|
||||
</header>
|
||||
{{ grid(data) }}
|
||||
|
|
|
@ -6,6 +6,7 @@ permalink: "games/tags/index.html"
|
|||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set tags = collections.game | allTagCounts(["game"]) %}
|
||||
<section class="flow">
|
||||
<h1>Tagged in Games</h1>
|
||||
<ul class="categories cluster list-none p-0 line-height-m">
|
||||
{% for tag in tags %}
|
||||
<li>
|
||||
|
|
|
@ -1,22 +1,13 @@
|
|||
---
|
||||
title: /now
|
||||
subtitle: Right now! What's happening right now?
|
||||
description: What's going on now and all the latest with myself.
|
||||
---
|
||||
|
||||
<p>Everything on here is automatically generated from various data sources.</p>
|
||||
{% if listenbrainz.length > 0 %}
|
||||
<section class="flow">
|
||||
<h2>🎶 <a href="https://listenbrainz.org/user/wonderfulfrog/" target="_blank">Listening</a></h2>
|
||||
<ol>
|
||||
{% for listen in listenbrainz | limit(5) %}
|
||||
<li><a href="https://listenbrainz.org/artist/{{ listen.track_metadata.additional_info.artist_mbids[0] }}" target="_blank">{{listen.track_metadata.artist_name}}</a> - <a href="https://musicbrainz.org/recording/{{ listen.track_metadata.additional_info.recording_mbid }}" target="_blank">{{ listen.track_metadata.track_name }}</a></li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
</section>
|
||||
{% endif %}
|
||||
{% set recentTrack = lastfm.recentTracks[0] %}
|
||||
<h1>/now</h1>
|
||||
<p>What am I doing right now? Everything on here is automatically generated from various data sources.</p>
|
||||
{% if letterboxd.length > 0 %}
|
||||
<h2>🍿 <a href="https://letterboxd.com/wonderfulfrog/" target="_blank">Movies</a></h2>
|
||||
<h2>🍿 Movies</h2>
|
||||
<ul class="media-grid p-0" role="list">
|
||||
{% for movie in letterboxd %}
|
||||
<li class="radius-0.5">
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"layout": "layouts/page",
|
||||
"layout": "layouts/base",
|
||||
"permalink": "{{ page.fileSlug }}/index.html",
|
||||
"tags": ["page"]
|
||||
}
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
---
|
||||
title: Past Designs
|
||||
subtitle: Who doesn't love a trip down memory lane?
|
||||
description: The living chronicle of my site's design.
|
||||
---
|
||||
|
||||
I love to tinker, and my website design is no exception. Trying my best to chronicle the visual changes it has taken over the years. I may update this page from time to time to include even older designs!
|
||||
|
||||
## 3.0 ([March 2024](/posts/version-3/))
|
||||
|
||||
### Index
|
||||
|
||||

|
||||
|
||||
### About me
|
||||
|
||||

|
||||
|
||||
### Posts
|
||||
|
||||

|
||||
|
||||
### Catalogue
|
||||
|
||||

|
|
@ -1,12 +1,18 @@
|
|||
---
|
||||
title: All posts
|
||||
title: Posts
|
||||
description: Read all of my posts.
|
||||
---
|
||||
|
||||
{% from "macros/posts.njk" import list %}
|
||||
{% from "macros/posts.njk" import yearList %}
|
||||
<h1>All posts</h1>
|
||||
<p>
|
||||
Browse all of my posts, or narrow things down <a href="/tags">via tags</a>.
|
||||
</p>
|
||||
{% set itemsByYear = collections.post | reverse | organizeByYear %}
|
||||
{% set years = itemsByYear | keys | sort("desc") %}
|
||||
<section class="flow">
|
||||
{{ list(collections.post | reverse) }}
|
||||
{% for year in years %}
|
||||
{% set itemsInYear = itemsByYear[year] %}
|
||||
{{ yearList(itemsInYear, year) }}
|
||||
{% endfor %}
|
||||
</section>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
title: Styleguide
|
||||
subtitle: A demo of the site's theme.
|
||||
description: A demo of the site's theme.
|
||||
---
|
||||
|
||||
|
@ -25,14 +24,14 @@ description: A demo of the site's theme.
|
|||
</p>
|
||||
<hr />
|
||||
<div class="flex">
|
||||
<div class="size-6" style="background-color: var(--color-primary)"></div>
|
||||
<div class="size-6" style="background-color: var(--color-secondary)"></div>
|
||||
<div class="size-6" style="background-color: var(--color-background)"></div>
|
||||
<div class="size-6" style="background-color: var(--color-surface)"></div>
|
||||
<div class="size-6" style="background-color: var(--color-border)"></div>
|
||||
<div class="size-6" style="background-color: var(--color-text)"></div>
|
||||
<div class="size-6" style="background-color: var(--color-fadeText)"></div>
|
||||
<div class="size-6" style="background-color: var(--color-shadow)"></div>
|
||||
<div class="size-2" style="background-color: var(--color-primary)"></div>
|
||||
<div class="size-2" style="background-color: var(--color-secondary)"></div>
|
||||
<div class="size-2" style="background-color: var(--color-background)"></div>
|
||||
<div class="size-2" style="background-color: var(--color-surface)"></div>
|
||||
<div class="size-2" style="background-color: var(--color-border)"></div>
|
||||
<div class="size-2" style="background-color: var(--color-text)"></div>
|
||||
<div class="size-2" style="background-color: var(--color-fadeText)"></div>
|
||||
<div class="size-2" style="background-color: var(--color-shadow)"></div>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="flex gap-1">
|
||||
|
|
|
@ -7,14 +7,19 @@ pagination:
|
|||
- post
|
||||
permalink: /tags/{{ tag | slugify }}/index.html
|
||||
eleventyComputed:
|
||||
title: "Tag: \"{{ tag }}\""
|
||||
description: Browse all posts tagged with "{{ tag }}".
|
||||
---
|
||||
|
||||
{% from "macros/posts.njk" import list %}
|
||||
{% from "macros/posts.njk" import yearList %}
|
||||
<h1>Tag: {{ tag }}</h1>
|
||||
<p>
|
||||
All posts tagged with "{{ tag }}", or go back to <a href="/tags">all tags</a>.
|
||||
</p>
|
||||
{% set itemsByYear = collections.postsByTag[tag] | reverse | organizeByYear %}
|
||||
{% set years = itemsByYear | keys | sort("desc") %}
|
||||
<section class="flow">
|
||||
{{ list(collections.postsByTag[tag] | reverse) }}
|
||||
{% for year in years %}
|
||||
{% set itemsInYear = itemsByYear[year] %}
|
||||
{{ yearList(itemsInYear, year) }}
|
||||
{% endfor %}
|
||||
</section>
|
||||
|
|
|
@ -5,6 +5,7 @@ description: Browse posts by all tags.
|
|||
|
||||
{% set tags = collections.post | allTagCounts %}
|
||||
<section class="flow">
|
||||
<h1>{{ title }}</h1>
|
||||
<ol class="cluster p-0 gap-0.5" role="list">
|
||||
{% for tag in tags %}
|
||||
<li>
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
---
|
||||
title: /uses
|
||||
subtitle: A list of my favourite software, tools, gear, configurations, and everything else between.
|
||||
description: A list of my favourite things and why I like 'em.
|
||||
---
|
||||
|
||||
Last updated on **May 31st, 2025**.
|
||||
# Uses
|
||||
|
||||
Last updated on **January 10th, 2025**.
|
||||
|
||||
A list of my favourite software, tools, gear, configurations, and everything else between.
|
||||
|
||||
More lists like this are available at [uses.tech](https://uses.tech/).
|
||||
|
||||
|
@ -12,7 +15,7 @@ There are no affiliate links.
|
|||
|
||||
## Development
|
||||
|
||||
My editor of choice is [Neovim](https://neovim.io/), which uses a [very opinionated setup](https://git.cloud.haska.me/wonderfulfrog/neovim).
|
||||
My editor of choice is [Neovim](https://neovim.io/), which uses a [very opinionated setup](https://github.com/wonderfulfrog/neovim).
|
||||
|
||||
My preferred terminal is [WezTerm](https://wezfurlong.org/wezterm/index.html), which works on all major platforms. On Windows I also use [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701?hl=en-us&gl=US).
|
||||
|
||||
|
@ -50,7 +53,7 @@ I'm one of those weirdos that likes to buy music, so my favourite purchasing pla
|
|||
|
||||
Speaking of buying music, I need a way to keep it organized. Enter [beets](https://beets.io/?trk=public_post-text), which does an amazing job. It ships with a bunch of opinionated defaults that line up with my own opinions, which worked great for me. Can be tweaked and tinkered with to your heart's content.
|
||||
|
||||
My personal music server is [Lightweight Music Server](https://github.com/epoupon/lms) which provides a Subsonic/OpenSonic backend. My client of choice is [Amperfy](https://github.com/BLeeEZ/amperfy).
|
||||
I use [Plex](https://www.plex.tv/) as a media server. It does a fine job with serving music. I use [Plexamp](https://www.plex.tv/plexamp/) for playing music from the server.
|
||||
|
||||
I use the Sony WH-1000XM3 headphones. Unparalleled noise cancelling and long battery life. Just wish it could swap devices easier. I've had these for over 5 years and they keep going. One day I might upgrade to a recent model that handles device switching better, but these are great. If I need wired headphones, I plug in a 3.5mm jack and they work great (even unpowered).
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
title: Watching
|
||||
subtitle: A collection of movies and shows I've seen.
|
||||
permalink: "watching/index.html"
|
||||
---
|
||||
|
||||
|
@ -10,7 +9,8 @@ permalink: "watching/index.html"
|
|||
{% set favouriteMovies = collections.movie | filterFavourites | reverse | limit(5) %}
|
||||
{% set favouriteShows = collections.tv | filterFavourites | reverse | limit(5) %}
|
||||
<section class="flow">
|
||||
<p>I tend to watch more movies than shows these days.</p>
|
||||
<h1>Watching</h1>
|
||||
<p>A collection of movies and shows I've seen. I tend to watch more movies than shows these days.</p>
|
||||
<h2>
|
||||
<a href="movies/recent">Recent movies</a>
|
||||
</h2>
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
title: Favourite movies
|
||||
subtitle: A collection of my favourite movies!
|
||||
permalink: "watching/movies/favourites/index.html"
|
||||
---
|
||||
|
||||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set data = collections.movie | filterFavourites | reverse %}
|
||||
<section class="flow">
|
||||
<h1>Favourite movies</h1>
|
||||
<p>A collection of my favourite movies!</p>
|
||||
{{ grid(data) }}
|
||||
</section>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
title: Recent movies
|
||||
subtitle: A collection of movies I've seen recently.
|
||||
permalink: "watching/movies/recent/index.html"
|
||||
---
|
||||
|
||||
|
@ -8,6 +7,8 @@ permalink: "watching/movies/recent/index.html"
|
|||
{% set data = collections.movie | reverse %}
|
||||
{% set tags = collections.movie | allTagCounts(["movie"]) | limit(5) %}
|
||||
<section class="flow">
|
||||
<h1>Recent movies</h1>
|
||||
<p>A collection of movies I've seen recently.</p>
|
||||
<h2>
|
||||
<a href="../tags">Tags</a>
|
||||
</h2>
|
||||
|
|
|
@ -4,13 +4,12 @@ pagination:
|
|||
size: 1
|
||||
alias: tag
|
||||
permalink: "watching/movies/tag/{{ tag | slugify }}/index.html"
|
||||
eleventyComputed:
|
||||
title: "Movies: Tag: \"{{ tag }}\""
|
||||
subtitle: "All movies tagged with \"{{ tag }}\""
|
||||
---
|
||||
|
||||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set data = collections.moviesByTag[tag] | reverse %}
|
||||
<section class="flow">
|
||||
{{ grid(data) }}
|
||||
</section>
|
||||
<header class="flow flow-space-4">
|
||||
<h1>Movies</h1>
|
||||
<p class="text-fadeText flow-space-1">Tagged with "{{ tag }}"</p>
|
||||
</header>
|
||||
{{ grid(data) }}
|
||||
|
|
|
@ -6,6 +6,7 @@ permalink: "watching/movies/tags/index.html"
|
|||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set tags = collections.movie | allTagCounts(["movie"]) %}
|
||||
<section class="flow">
|
||||
<h1>Tagged in Movies</h1>
|
||||
<ul class="categories cluster list-none p-0 line-height-m">
|
||||
{% for tag in tags %}
|
||||
<li>
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
title: Favourite shows
|
||||
subtitle: A collection of my favourite shows!
|
||||
permalink: "watching/shows/favourites/index.html"
|
||||
---
|
||||
|
||||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set data = collections.tv | filterFavourites | reverse %}
|
||||
<section class="flow">
|
||||
<h1>Favourite shows</h1>
|
||||
<p>A collection of my favourite shows!</p>
|
||||
{{ grid(data) }}
|
||||
</section>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
title: Recent shows
|
||||
subtitle: A collection of shows I've seen recently.
|
||||
permalink: "watching/shows/recent/index.html"
|
||||
---
|
||||
|
||||
|
@ -8,6 +7,8 @@ permalink: "watching/shows/recent/index.html"
|
|||
{% set data = collections.tv | reverse %}
|
||||
{% set tags = collections.tv | allTagCounts(["tv"]) | limit(5) %}
|
||||
<section class="flow">
|
||||
<h1>Recent shows</h1>
|
||||
<p>A collection of shows I've seen recently.</p>
|
||||
<h2>
|
||||
<a href="../tags">Tags</a>
|
||||
</h2>
|
||||
|
|
|
@ -4,13 +4,12 @@ pagination:
|
|||
size: 1
|
||||
alias: tag
|
||||
permalink: "watching/shows/tag/{{ tag | slugify }}/index.html"
|
||||
eleventyComputed:
|
||||
title: "Shows: Tag: \"{{ tag }}\""
|
||||
subtitle: "All shows tagged with \"{{ tag }}\""
|
||||
---
|
||||
|
||||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set data = collections.showsByTag[tag] | reverse %}
|
||||
<section class="flow">
|
||||
{{ grid(data) }}
|
||||
</section>
|
||||
<header class="flow flow-space-4">
|
||||
<h1>Shows</h1>
|
||||
<p class="text-fadeText flow-space-1">Tagged with "{{ tag }}"</p>
|
||||
</header>
|
||||
{{ grid(data) }}
|
||||
|
|
|
@ -6,6 +6,7 @@ permalink: "watching/shows/tags/index.html"
|
|||
{% from "macros/media-grid.njk" import grid %}
|
||||
{% set tags = collections.tv | allTagCounts(["tv"]) %}
|
||||
<section class="flow">
|
||||
<h1>Tagged in Shows</h1>
|
||||
<ul class="categories cluster list-none p-0 line-height-m">
|
||||
{% for tag in tags %}
|
||||
<li>
|
||||
|
|
|
@ -3,6 +3,7 @@ title: Webrings
|
|||
description: What's a webring?
|
||||
---
|
||||
|
||||
<h1>Webrings</h1>
|
||||
<p>
|
||||
You're probably wondering what the <em>heck</em> is a webring? It's a collection of sites banding under a common theme or idea, and it's circular (like a ring). You can read more on <a href="https://en.wikipedia.org/wiki/Webring" target="_blank">Wikipedia</a>!
|
||||
</p>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue