the home site for me: also iteration 3 or 4 of my site

chore: use enhanced md syntax now

dunkirk.sh baf9632e 7da2b000

verified
+17 -17
content/blog/2023-07-10_install-truenas-core-proxmox.md
···
<!-- more -->
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/81f100961a1c4033c0c50c9192b48521e968a8e8_0image.png" alt="screenshot of the vault vm in proxmox" caption="my active vault storing 1.8TB of old projects") }}
+
![screenshot of the vault vm in proxmox](https://hc-cdn.hel1.your-objectstorage.com/s/v3/81f100961a1c4033c0c50c9192b48521e968a8e8_0image.png){caption="my active vault storing 1.8TB of old projects"}
## Introduction
···
Sign-in to Proxmox and upload your ISO to the local storage or, download the file directly from the link using the built-in ISO fetcher.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/45ce25b0bd1accf6a31004e0d71dc92783151266_Ww212rUDQ_Ms9P2WhJMwz.png" alt="download iso tool in proxmox") }}
+
![download iso tool in proxmox](https://hc-cdn.hel1.your-objectstorage.com/s/v3/45ce25b0bd1accf6a31004e0d71dc92783151266_Ww212rUDQ_Ms9P2WhJMwz.png)
Next to create the VM, the only thing that needs to be changed from the defaults is the memory, which I set to `8192 MB` (8 GB).
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/1e5d72e4a50907ad23fc1f24a7163cb4898f9bd2_bDT9VdIMMG1LWvv1RwNKl.png" alt="create a vm modal in proxmox") }}
+
![create a vm modal in proxmox](https://hc-cdn.hel1.your-objectstorage.com/s/v3/1e5d72e4a50907ad23fc1f24a7163cb4898f9bd2_bDT9VdIMMG1LWvv1RwNKl.png)
Now finish creating the VM and click on the VM after it is created. Go to options and enable start at boot.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/81a9d9897274eaac53e0d2cc3ff7075cb4ba8cdd_ImxOHWJNuRL3yiF12cQfe.png" alt="start at boot checkbox") }}
+
![start at boot checkbox](https://hc-cdn.hel1.your-objectstorage.com/s/v3/81a9d9897274eaac53e0d2cc3ff7075cb4ba8cdd_ImxOHWJNuRL3yiF12cQfe.png)
Next, we need to pass through the physical drives to the VM. Open a terminal on the Proxmox server (use the built-in terminal or ssh in) and run the following command. Only run the part after the #.
···
Now find your VM_ID, mine is 102.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/ac8724875dd07e84903cfe0004a435041a21c35c_gwjgFbI5IrnJSTLTB0PeX.png" alt="vm list in proxmox") }}
+
![vm list in proxmox](https://hc-cdn.hel1.your-objectstorage.com/s/v3/ac8724875dd07e84903cfe0004a435041a21c35c_gwjgFbI5IrnJSTLTB0PeX.png)
Run the following command, replacing the VM_ID and DISK_ID with yours.
···
Here is how it appears in Proxmox:
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/c313b32c8c099ea8644663e3d796c12a861ac8e8_QBpmqflEHmPiUHbd8JVk2.png" alt="hardware page of the vm in proxmox") }}
+
![hardware page of the vm in proxmox](https://hc-cdn.hel1.your-objectstorage.com/s/v3/c313b32c8c099ea8644663e3d796c12a861ac8e8_QBpmqflEHmPiUHbd8JVk2.png)
If everything went well, then you can start your VM now. After it finishes booting up, you will get the screen below. Make sure Install/Upgrade is selected and hit enter.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/0eb213f7699f79c389328cdc9f591bcde475e4fe_UFqhrRdD3GkP1_No5lWaj.png" alt="truenas startup screen") }}
+
![truenas startup screen](https://hc-cdn.hel1.your-objectstorage.com/s/v3/0eb213f7699f79c389328cdc9f591bcde475e4fe_UFqhrRdD3GkP1_No5lWaj.png)
You will then get this screen, use space to select the first drive and hit enter.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/c53f8a58f746d0ae045882c9563d83219ab9f29f_xD5QxmFtHxw10p624FgwM.png" alt="destination media screen") }}
+
![destination media screen](https://hc-cdn.hel1.your-objectstorage.com/s/v3/c53f8a58f746d0ae045882c9563d83219ab9f29f_xD5QxmFtHxw10p624FgwM.png)
Hit enter one last time and enter your password.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/a0f2b37568b394eaff15e1b487ab68bbc3736cd1_MZy3mN1cXBaicgVolVYs5.png" alt="confirm erase page") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/0bccd9e726a027cf96ab98a8b313ea8c710b46f5_KWq2P7Iok9LThOF5Xoj6l.png" alt="repeat password page") }}
+
![confirm erase page](https://hc-cdn.hel1.your-objectstorage.com/s/v3/a0f2b37568b394eaff15e1b487ab68bbc3736cd1_MZy3mN1cXBaicgVolVYs5.png)
+
![repeat password page](https://hc-cdn.hel1.your-objectstorage.com/s/v3/0bccd9e726a027cf96ab98a8b313ea8c710b46f5_KWq2P7Iok9LThOF5Xoj6l.png)
Select BIOS, as this is the default mode for Proxmox VMs.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/7f52c721a7fcb2542552d997224f7d02c3ebba9b_RfXwEGx6oug1vVF3UZuCj.png" alt="boot via bios or via uefi screen") }}
+
![boot via bios or via uefi screen](https://hc-cdn.hel1.your-objectstorage.com/s/v3/7f52c721a7fcb2542552d997224f7d02c3ebba9b_RfXwEGx6oug1vVF3UZuCj.png)
After about five to ten minutes, the installation process will finish and the VM will ask you to remove installation media and reboot.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/f28005427ff5ea328550a079dcb7a65d07f09c95_mFEH-FHY10H7NUAvYi0aE.png" alt="installation succeded message") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/acd7be1e3ac4903269c9af7e808287a94eb96398_JPXkEQJgBmeATEE40HHpr.png" alt="hardware screen in proxmox") }}
+
![installation succeded message](https://hc-cdn.hel1.your-objectstorage.com/s/v3/f28005427ff5ea328550a079dcb7a65d07f09c95_mFEH-FHY10H7NUAvYi0aE.png)
+
![hardware screen in proxmox](https://hc-cdn.hel1.your-objectstorage.com/s/v3/acd7be1e3ac4903269c9af7e808287a94eb96398_JPXkEQJgBmeATEE40HHpr.png)
Select the installation media and remove it with the top button, go back to the console and hit enter, which will take you back to the main menu. On the main menu, select reboot with the arrow keys and hit enter.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/52eb8ec8c018c185d3a0361de58be8351b61fa79_IfvdMuF6AVU_f0-_rngqq.png" alt="power options screen in truenas") }}
+
![power options screen in truenas](https://hc-cdn.hel1.your-objectstorage.com/s/v3/52eb8ec8c018c185d3a0361de58be8351b61fa79_IfvdMuF6AVU_f0-_rngqq.png)
Once the machine restarts, it will display an IP address in the console.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/80f56ad99e3e9fa8a997798096214dd5592c40ac_0image.png" alt="ip address displayed in proxmox console") }}
+
![ip address displayed in proxmox console](https://hc-cdn.hel1.your-objectstorage.com/s/v3/80f56ad99e3e9fa8a997798096214dd5592c40ac_0image.png)
Upon connecting to the IP address, you will get this screen. Use the root username and the password, previously configured, to login.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/5211ac631426d7ffb4add091c4308f460b5ef746_ghvCsvwAJMudUCUGvcnCu.png" alt="truenas web ui signin page") }}
+
![truenas web ui signin page](https://hc-cdn.hel1.your-objectstorage.com/s/v3/5211ac631426d7ffb4add091c4308f460b5ef746_ghvCsvwAJMudUCUGvcnCu.png)
Once logged in, I updated the system using the button on the home screen.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/392e592dd232096380a29f4e769b80eb290fee31_nrBop3a9ilvuc7h-0WPEG.png" alt="check for updates button in the truenas web ui") }}
+
![check for updates button in the truenas web ui](https://hc-cdn.hel1.your-objectstorage.com/s/v3/392e592dd232096380a29f4e769b80eb290fee31_nrBop3a9ilvuc7h-0WPEG.png)
I chose not to save the configuration file when prompted, proceeded to install the updates, and rebooted.
+9 -9
content/blog/2023-08-04_garmin-vivoactive-homeassistant.md
···
<!-- more -->
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/3893acb0d518216e8051bb59f602748ffde69a68_0img_3051.jpg" alt="a garmin watch with the apicall app open to a spotify page" caption="I can control spotify from my watch via api hooks how bout you?") }}
+
![a garmin watch with the apicall app open to a spotify page](https://hc-cdn.hel1.your-objectstorage.com/s/v3/3893acb0d518216e8051bb59f602748ffde69a68_0img_3051.jpg){caption="I can control spotify from my watch via api hooks how bout you?"}
This widget interested me because it allowed me to call any webhook I wanted utilizing the onboard Wi-Fi as well as through the Connect IQ app. This was a very important feature for me because I can’t get the app to run on LineageOS as it keeps asking for the location permission even though it was already granted.
···
Now for the Google Assistant SDK / APICall / Home Assistant tutorial. The first thing you want to do is follow this guide, [Google Assistant SDK - Home Assistant](https://www.home-assistant.io/integrations/google_assistant_sdk#configuration), to install the Assistant SDK. Once you have completed that, go to Settings / Automations & Services.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/24972b625b42a5348d22eebcd2116df317fa7a99_Yha1bUhOH_iuWK30QR0F1.png" alt="arrow pointing to settings in home assistant") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/91729592f4a9cee25691c1e013244b5f3fb0d22b_RR0VzZqsU7uTxiNlqVGum.png" alt="arrow pointing to Automations & Services in home assistant") }}
+
![arrow pointing to settings in home assistant](https://hc-cdn.hel1.your-objectstorage.com/s/v3/24972b625b42a5348d22eebcd2116df317fa7a99_Yha1bUhOH_iuWK30QR0F1.png)
+
![arrow pointing to Automations & Services in home assistant](https://hc-cdn.hel1.your-objectstorage.com/s/v3/91729592f4a9cee25691c1e013244b5f3fb0d22b_RR0VzZqsU7uTxiNlqVGum.png)
This is where you can create the action that you want to trigger with your smartwatch. The first thing you need to do is to create a new automation. Save and name the automation you just created. Now add a trigger, scroll to the bottom of the list and select webhook. If done successfully, it will look like the image below.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/fe82d82d970e7560e285e4606b5f17d842ab4c6b_VqiM4d3wncM9BuoDR_FW7.png" alt="creating a new webhook in home assistant") }}
+
![creating a new webhook in home assistant](https://hc-cdn.hel1.your-objectstorage.com/s/v3/fe82d82d970e7560e285e4606b5f17d842ab4c6b_VqiM4d3wncM9BuoDR_FW7.png)
Now add an action. I decided to use the media player to play a song on Spotify. Also go back to the webhook section and click the settings icon next to the webhook ID. Change the settings to reflect below screenshot.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/53c6ef6999ab4a636983cfcc879b75c4d7ba0375_Xh3BtyMxA1MhI0rHuo3WG.png" alt="editing the webook in home assistant to allow GET queries") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/382d74c38d3323197636f0af125d3a5faff13e7f_rAbDGMrBS5fcGo7AzPT-O.png" alt="adding a play media block to the webhook") }}
+
![editing the webook in home assistant to allow GET queries](https://hc-cdn.hel1.your-objectstorage.com/s/v3/53c6ef6999ab4a636983cfcc879b75c4d7ba0375_Xh3BtyMxA1MhI0rHuo3WG.png)
+
![adding a play media block to the webhook](https://hc-cdn.hel1.your-objectstorage.com/s/v3/382d74c38d3323197636f0af125d3a5faff13e7f_rAbDGMrBS5fcGo7AzPT-O.png)
Now for the fun part. Download [APICall](https://apps.garmin.com/en-US/apps/ac9a81ab-a52d-41b3-8c14-940a9de37544) onto your Garmin smartwatch and go to the configuration section for the app.
> Note: I’ll be using Garmin Express on my MacBook, but you can also use the Garmin Connect app on a phone.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/37f7a72276cc3c1bc2575833cb4f663ce23bbbd6_0image.png" alt="garmin express app homepage on desktop") }}
+
![garmin express app homepage on desktop](https://hc-cdn.hel1.your-objectstorage.com/s/v3/37f7a72276cc3c1bc2575833cb4f663ce23bbbd6_0image.png)
If you are using Garmin Express, then you can access the app settings by selecting the 3 dots next to the app. You will have 36 possible API calls that you can enter.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/b98ab669cd8549519876b95d99af1d8edebb0f28_-lSqNObL3TGNk0VQc8xOq.png" alt="ApiCall settings page" caption="Yes that formatting is atrocious but it works at least!") }}
+
![ApiCall settings page](https://hc-cdn.hel1.your-objectstorage.com/s/v3/b98ab669cd8549519876b95d99af1d8edebb0f28_-lSqNObL3TGNk0VQc8xOq.png){caption="Yes that formatting is atrocious but it works at least!"}
> webhooks
```ts
···
These are the actions that I configured for my watch so far. To customize for your API calls you need to change the `deviceName`, `actionName`, and `url` fields. The `method` and `headers` need to stay the same across all actions. If you want to add an icon to that action, then you can configure that with the `actionIcon` field. A table with the possible icons is included below, sourced from APICall’s [documentation](https://apicall.dumesnil.net/documentation_en.html).
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/e957a6b2b01133d35ccfe189e0466049a58da3bb_119m02PEgn6_wcNGtCnjM.png" alt="ApiCall icons") }}
+
![ApiCall icons](https://hc-cdn.hel1.your-objectstorage.com/s/v3/e957a6b2b01133d35ccfe189e0466049a58da3bb_119m02PEgn6_wcNGtCnjM.png)
In conclusion, you can use APICall to trigger actions in home assistant from your Garmin smartwatch. I hope this tutorial proved to be useful, and have a great rest of your day (or night).
+1 -1
content/blog/2023-11-01_censorship-or-protection.md
···
<!-- more -->
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/5523fdca5f558bc9ff49b4053e02cd1ded0c6e43_0image.png" alt="child looking out window" caption="Law makers keeping producing new “online safety bills” but do they really help?") }}
+
![child looking out window](https://hc-cdn.hel1.your-objectstorage.com/s/v3/5523fdca5f558bc9ff49b4053e02cd1ded0c6e43_0image.png){caption="Law makers keeping producing new “online safety bills” but do they really help?"}
In the last few years, we have seen a wave of “online safety bills” created by lawmakers that will ostensibly help protect children online. The US has the Protecting Kids on Social Media Act (PKSMA, S.1291) and the Kids Online Safety Act (KOSA, S.1409) while in the UK they have the Online Safety Bill (OSB). The main feature that all of these bills have in common is the censorship of online content for minors. The Electronic Frontier Foundation (EFF) has raised concerns over KOSA, saying, “The bill requires all websites, apps, and online platforms to filter and block legal speech” (Mullin). These bills raise an important question–should the government regulate the online activities of children, or should that responsibility lie solely with parents?
+2 -2
content/blog/2023-11-10_monaspace-vs-code-install.md
···
<!-- more -->
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/7abefc1fcefa49d2ab5aac9afbafa1da41259382_KuOAwCEm9ypWEemv60Qs7.png" alt="monaspace font in action" caption="This font is so pretty and has so many features its amazing. It's main downside is to work it takes to set it up.") }}
+
![monaspace font in action](https://hc-cdn.hel1.your-objectstorage.com/s/v3/7abefc1fcefa49d2ab5aac9afbafa1da41259382_KuOAwCEm9ypWEemv60Qs7.png){caption="This font is so pretty and has so many features its amazing. It's main downside is to work it takes to set it up."}
## 1. Download and install the Monaspace font:
···
- You will find this option under _Editor: Font Family_ in the user preferences
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/107040ab22c6ccfaa53c82bd5a328168f5d2d119_v0cMm5jcwHEgrvtBv4Syx.png" alt="the available varients of the font") }}
+
![the available varients of the font](https://hc-cdn.hel1.your-objectstorage.com/s/v3/107040ab22c6ccfaa53c82bd5a328168f5d2d119_v0cMm5jcwHEgrvtBv4Syx.png)
Next enable font ligatures in the settings.json with following snippet:
+8 -8
content/blog/2024-08-03_ssd-removal-mbp-2017.md
···
<!-- more -->
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/d294f113bf415a0d1c544fbf3c2d0f4286d892a6_0img_1846_1_.jpg" alt="MacBook proprietary blade SSD" caption="it really was a rather sleek design; shame that apple got rid of it in favor of soldered on storage") }}
+
![MacBook proprietary blade SSD](https://hc-cdn.hel1.your-objectstorage.com/s/v3/d294f113bf415a0d1c544fbf3c2d0f4286d892a6_0img_1846_1_.jpg){caption="it really was a rather sleek design; shame that apple got rid of it in favor of soldered on storage"}
I eventually decided to just try and remove the SSD from the MacBook and see if there was a way to recover any files from it (spoiler: there kinda is, but it's annoying) but I couldn't find any guide online and iFixit had nothing. So I decided to just try and yolo it and see if I could figure it out on my own, and surprisingly I actually managed to do it! Turns out, the process isn't that hard! I'll take you through the steps I took so that if you want to do this, it's much less of a hassle.
## Guide
1. the first thing you need to do is to remove the screws from the back of your MacBook. This will use a P5 Pentalobe driver, which I believe you can buy from iFixit as well as several other companies on Amazon.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/ed2c207dcd77b9dede8496aa40959042fca082ba_1img_1838.jpg", alt="Removing the screws") }}
+
![Removing the screws](https://hc-cdn.hel1.your-objectstorage.com/s/v3/ed2c207dcd77b9dede8496aa40959042fca082ba_1img_1838.jpg)
1. next you need to crack open the shell of the MacBook by prying under the front (on the side where the MacBook opens). It's pretty helpful to have a suction cup or something to lift it up a bit so you can get your prying tool underneath (I used a flat plastic prying tool I got from the battery repair kit for this MacBook, but a guitar pick or credit card would probably also work)
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/faf7ece0437ca9ae232361dc1305c7012c676d88_2img_1839.jpg", alt="using a suction cup to lift the back shell") }}
+
![using a suction cup to lift the back shell](https://hc-cdn.hel1.your-objectstorage.com/s/v3/faf7ece0437ca9ae232361dc1305c7012c676d88_2img_1839.jpg)
1. now once you've got the back slightly opened up just run around the edge of the shell prying up on it until the front and two sides are free then just pull forward at a slight (15ish degree?) angle, and it should slide right out.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/0b55d2aed8ecda90aa39091bc5dacd72c2c5aab0_3img_1840.jpg", alt="the opened MacBook") }}
+
![the opened MacBook](https://hc-cdn.hel1.your-objectstorage.com/s/v3/0b55d2aed8ecda90aa39091bc5dacd72c2c5aab0_3img_1840.jpg)
1. once it's open, locate the silver metal block looking thing; this is your SSD
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/acc1ae05460bf0792959c684e5104d225d309b5e_4img_1841.jpg", alt="the SSD") }}
+
![the SSD](https://hc-cdn.hel1.your-objectstorage.com/s/v3/acc1ae05460bf0792959c684e5104d225d309b5e_4img_1841.jpg)
1. now using a T5 Torx driver (why couldn't you just use one type of screws apple 😭; be more like framework) you need to unscrew the two screws on either side of the front of the SSD
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/f04ad8221ae080dba828e8e0cad9492ae2691118_7img_1844.jpg", alt="the screws") }}
+
![the screws](https://hc-cdn.hel1.your-objectstorage.com/s/v3/f04ad8221ae080dba828e8e0cad9492ae2691118_7img_1844.jpg)
1. now comes the slightly scary part (for me at least) you need to lift the black tape that's covering the top of the SSD (don't worry the SSD will be fine)
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/d63a97738c3378a1813a7c59263c37b2e4120470_8img_1845.jpg", alt="the removed tape on the SSD") }}
+
![the removed tape on the SSD](https://hc-cdn.hel1.your-objectstorage.com/s/v3/d63a97738c3378a1813a7c59263c37b2e4120470_8img_1845.jpg)
1. now just slightly pull on the SSD (again at a slight angle) and it should pop right out!
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/85632b1b9443498a770aae1687b6ff594aad79ff_9img_1846.jpg", alt="the SSD out of the MacBook") }}
+
![the SSD out of the MacBook](https://hc-cdn.hel1.your-objectstorage.com/s/v3/85632b1b9443498a770aae1687b6ff594aad79ff_9img_1846.jpg)
## Postlog and notes
+12 -17
content/blog/2024-10-11_example_post.md
···
{{/* img(id="https://url.com/image.png" alt="alt text" caption="this can be ommited if you want or added! It's optional :)") */}}
```
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/d294f113bf415a0d1c544fbf3c2d0f4286d892a6_0img_1846_1_.jpg" alt="MacBook proprietary blade SSD" caption="it really was a rather sleek design; shame that apple got rid of it in favor of soldered on storage") }}
+
![MacBook proprietary blade SSD](https://hc-cdn.hel1.your-objectstorage.com/s/v3/d294f113bf415a0d1c544fbf3c2d0f4286d892a6_0img_1846_1_.jpg){caption="it really was a rather sleek design; shame that apple got rid of it in favor of soldered on storage"}
You can also display multiple images side-by-side using the `imgs` shortcode with comma-separated URLs:
···
{{/* imgs(id="https://url.com/image1.png, https://url.com/image2.png" alt="alt text 1, alt text 2" caption="optional caption for both images") */}}
```
-
{{ imgs(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/c509aeaac769c3e5b99d5a7d320cc4a759db4ff5_img_8880.jpeg, https://hc-cdn.hel1.your-objectstorage.com/s/v3/ed400c26ddfa37ab4a9ef4fd5a506f2dcc1bcfbb_img_8879.jpeg", alt="the copyright section, the ssh section", caption="side by side images from the remarkable tutorial") }}
+
!![the copyright section](https://hc-cdn.hel1.your-objectstorage.com/s/v3/c509aeaac769c3e5b99d5a7d320cc4a759db4ff5_img_8880.jpeg)[the ssh section](https://hc-cdn.hel1.your-objectstorage.com/s/v3/ed400c26ddfa37ab4a9ef4fd5a506f2dcc1bcfbb_img_8879.jpeg){caption="side by side images from the remarkable tutorial"}
### Videos
···
### Info Callout
-
{% callout(type="info") %}
-
This is an info callout! Use this for general information that readers should be aware of.
-
{% end %}
+
> [!INFO]
+
> This is an info callout! Use this for general information that readers should be aware of.
### Warning Callout
-
{% callout(type="warning") %}
-
This is a warning callout! Use this to alert readers about potential issues or things to watch out for.
-
{% end %}
+
> [!WARNING]
+
> This is a warning callout! Use this to alert readers about potential issues or things to watch out for.
### Danger Callout
-
{% callout(type="danger") %}
-
This is a danger callout! Use this for critical information that could cause problems if ignored.
-
{% end %}
+
> [!DANGER]
+
> This is a danger callout! Use this for critical information that could cause problems if ignored.
### Tip Callout
-
{% callout(type="tip") %}
-
This is a tip callout! Use this to share helpful hints and best practices.
-
{% end %}
+
> [!TIP]
+
> This is a tip callout! Use this to share helpful hints and best practices.
### Note Callout
-
{% callout(type="note") %}
-
This is a note callout! Use this for additional context or side information.
-
{% end %}
+
> [!NOTE]
+
> This is a note callout! Use this for additional context or side information.
### Custom Title
+3 -3
content/blog/2024-10-13_hilton_tomfoolery.md
···
I'm connecting over WireGuard, so I fired up mitmproxy with `mitmweb --mode wireguard` on my laptop. Connecting via WireGuard theoretically is pretty simple; all I need to do is to scan a qr code and connect. Unfortunately, the hotel Wi-Fi seems to be oddly segmented, and I can't access the WireGuard server or ping my laptop from my phone. I'm going to try firing up a hot spot on my dad's phone and see if that allows me to talk to my phone.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/29c856921e88c31bfc2e2d73d09d287ce4aa149a_2install_profile.png" alt="screenshot of the root certificate install process" caption="You have to dig through several menus to trust it") }}
+
![screenshot of the root certificate install process](https://hc-cdn.hel1.your-objectstorage.com/s/v3/29c856921e88c31bfc2e2d73d09d287ce4aa149a_2install_profile.png){caption="You have to dig through several menus to trust it"}
I messed with getting my laptop to connect to my dad's phone, but it kept refusing for some reason. My next idea is to ngrok the WireGuard tunnel, which ended up failing because ngrok doesn't support UDP. Finally, after an embarrassingly long time, I realized that I could simply use `ngrok tcp 8080` and the HTTP proxy server built into mitmproxy instead. After installing the root certificate and trusting it in the iPhone settings, we were good to go!
···
## Locks
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/06dcbd4c5166d7f17e31027b687f32539d68aa44_0hotel-key.png" alt="screenshot of the hotel digital key" caption="What it looks like in the app") }}
+
![screenshot of the hotel digital key](https://hc-cdn.hel1.your-objectstorage.com/s/v3/06dcbd4c5166d7f17e31027b687f32539d68aa44_0hotel-key.png){caption="What it looks like in the app"}
When using the unlock button, it made a request to this URL: `https://smetric.hilton.com/b/ss/hiltonglobalprod/10/IOSN030200030900/s65425920` with a payload of a URL encoded form.
···
Taking inspiration from the [LOW←TECH MAGAZINE](https://solar.lowtechmagazine.com/) I will be taking any questions / comments about this article via email and then posting them here to my site! If you have a question or comment, feel free to email me at [me@dunkirk.sh](mailto://me@dunkirk.sh). Now to go eat breakfast :)
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/c974178c62fc836657a1c5e61cac90596c13a3bd_3img_2777.jpg" alt="image of my hotel breakfast" caption="A delicious waffle, mildy warm bacon, and under seasoned potatoes.") }}
+
![image of my hotel breakfast](https://hc-cdn.hel1.your-objectstorage.com/s/v3/c974178c62fc836657a1c5e61cac90596c13a3bd_3img_2777.jpg){caption="A delicious waffle, mildy warm bacon, and under seasoned potatoes."}
+4 -4
content/blog/2025-01-31_my-life-story-with-tech.md
···
Hi! My name is Kieran, and I've been interested in / involved with cybersecurity and programming since I first started using a laptop at 10! I started out with a raspberry pi 3b+ which taught me how to use debian as well as the basics of creating and maintaining databases and web services. I moved on to an ubuntu laptop about a year latter and started using my raspberry pi as a home server to run small websites on our local lan. Soon I wanted to share them with others and expose them to the internet, so I learned how to use dns and port forwarding and then how to secure the server to prevent attacks with tools like fail2ban!
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/b237edcfbdefc74f6296d157203ba539187a1e24_0image_from_ios.jpg" alt="2 boxes of electronics sitting on a closet shelf" caption="I still have that same rpi today! It's joined with all the random tech bits in two enormously heavy bins in my closet") }}
+
![2 boxes of electronics sitting on a closet shelf](https://hc-cdn.hel1.your-objectstorage.com/s/v3/b237edcfbdefc74f6296d157203ba539187a1e24_0image_from_ios.jpg){caption="I still have that same rpi today! It's joined with all the random tech bits in two enormously heavy bins in my closet"}
Over the next 2 years, I systematically read every single book in the tech section of my local library and became interested in white-hat hacking. I taught myself how to use kali linux and metasploit with the help of many web searches and had quite a bit of fun rooting and then sideloading custom payloads onto our families set of kindle fires (I was eventually restricted to just playing with just one but I did make a home security system with all of them once). I figured out wireshark and started playing with wifi protocals but eventually reached the limit of what I could figure out on my own and took a quick detour of two years to learn blender and build my first computer.
I became interested in home labs and self hosting services around 14 and bought an old workstation off ebay which combined with my set of 3 rasberry pis and several old laptops (and one old pentium tower that I found on the side of the road) made quite a nice playground for deploying my own services. Half a year later I had to pick it all up and move up north which was quite the adventure; my services got completely messed up during the move, and it took my a week or so tinkering with everything to get it back to a stable state.
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/bf06e9d57d41dd75e328b8898cfe04ef2f30a3f3_0contributions-graph.gif" alt="gif of my github contributions graph 2021-2025" caption="2021-2022 is mainly just unity and hugo sites lol; I really started seriously using it and doing contributions to other projects 2023-2025. You can also see where I broke my wrist in January of 2025") }}
+
![gif of my github contributions graph 2021-2025](https://hc-cdn.hel1.your-objectstorage.com/s/v3/bf06e9d57d41dd75e328b8898cfe04ef2f30a3f3_0contributions-graph.gif){caption="2021-2022 is mainly just unity and hugo sites lol; I really started seriously using it and doing contributions to other projects 2023-2025. You can also see where I broke my wrist in January of 2025"}
After the move, I became quite interested in front end development and started making quite a few websites and various random coding projects. If you look on my GitHub contributions graph ([github.com/taciturnaxolotl](https://github.com/taciturnaxolotl), you can see it go from a lightly speckled grid in 2021 and 2022 to a much more solid commit streak in 2023. I only had one week when I didn't code anything and that was the second week of the year :) Toward the end of that year I started learning about hardware design and made my first PCB! I also joined a wonderful community called hackclub where I met a ton of amazing teenagers who were also interested in tech just like me! I joined an FRC robotics team in January of the next year and had a blast designing, building, and programming a custom meter square, 150 lb, industrial robot to compete in that year's game!
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/a9e816e5c00a7bdd8e8f0dc8ad2180dfe9792aa5_logo.png_raw_true" alt="purple bubble logo" caption="I loved working on purple bubble 💖 i worked with some pretty incredible people and learned a ton. ik know yall are probably reading this when rss drops it so 🫶") }}
+
![purple bubble logo](https://hc-cdn.hel1.your-objectstorage.com/s/v3/a9e816e5c00a7bdd8e8f0dc8ad2180dfe9792aa5_logo.png_raw_true){caption="I loved working on purple bubble 💖 i worked with some pretty incredible people and learned a ton. ik know yall are probably reading this when rss drops it so 🫶"}
During that same time I also started a 501(c)3 named Purple Bubble with friends that I had met through Hackclub focused on making a secure, cost-effective, and privacy preserving messaging protocol. We drafted a specification and poured many, many hours into planning and developing the protocol over the next year but eventual realized that the messaging protocol space is *incredibly* hard and that there were innate flaws in our protocol that would compromise the security of the app (We couldn't find a good way to anonymize connections to a network of server's while also providing zero metadata transfer of messages between servers; we had originally planned for the protocol to be zero trust federated, but this proved to be a challenge that, no matter how hard we kept thinking and talking about it, we couldn't find a solution too). I learned a huge amount about organizing a group of people and running an organization through that experience and made some wonderful friends, so it wasn't entirely in vain.
My latest project and biggest learning experience in both security and development has been building a time tracking server for coding called Hackatime. It is fully compatible with the popular wakatime.org, which allows it to leverage the hundreds of existing extensions for tracking time spent coding in almost every popular IDE and editor. I made this as a part of an event Hackclub ran called High Seas where they encouraged high school students to make cool projects by giving out awesome prizes for time spent coding (you had to "ship" your project where it would get voted on by the other four thousand teens participating and then via a custom ELO system convert your hours into "doubloons" that could be redeemed for prizes like framework laptops, soldering irons, McMaster Car credits, and many others. If you want to learn more about it, the website is [highseas.hackclub.com](https://highseas.hackclub.com)). In order to track the time of the thousands of teenagers participating, I created this server which was handling thousands of users an hour and hundreds of requests a second. I learned how to scale the server and database and learned an incredible amount that only comes at scale. At one point I got an email that the database bill had increased so much over the previous month that we were going to hit both the `$1k` hard limit and then a `$4k` limit that I had placed on the monthly bill, expecting never to hit it. The team hosting the database (Cockroach DB) graciously offered to reduce our bill down to only `$500` which was incredible. There were many more instances where things broke, or where I discovered security issues that made me grow an insane amount in my knowledge of how to fix things and really pushed me out of my comfort zone. (If you want to take a look at the github repo it is at [github.com/hackclub/hackatime](https://github.com/hackclub/hackatime) and the hosted version is at [waka.hackclub.com](https;//waka.hackclub.com) with a live hours counted tracker)
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/23f88382d4fabf9d9f3481c176f5eb5722a188b4_0image.png" alt="the cockroach charges in hcb" caption="The price really sky rocketed as we started using it in prod 😂") }}
+
![the cockroach charges in hcb](https://hc-cdn.hel1.your-objectstorage.com/s/v3/23f88382d4fabf9d9f3481c176f5eb5722a188b4_0image.png){caption="The price really sky rocketed as we started using it in prod 😂"}
I'm still trying to figure out what exactly I want to major in, and I'm pretty solidly split between Comp Sci with a cybersecurity focus and Computer/Electrical Engineering. I'm hoping that this camp can help make that decision a bit more clear and give me a better understanding of what getting a major in Cyber Security would be like!
+3 -3
content/blog/2025-02-02_degraded-zpool-proxmox.md
···
<!-- more -->
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/e54fd32f9a72ef35d310cb3cdc299b297c87baea_2image.png" alt="the zpool reporting a downed disk" caption="That really scared the pants off me when I first saw it 😂") }}
+
![the zpool reporting a downed disk](https://hc-cdn.hel1.your-objectstorage.com/s/v3/e54fd32f9a72ef35d310cb3cdc299b297c87baea_2image.png){caption="That really scared the pants off me when I first saw it 😂"}
## Actually fixing it
···
ata-ST3750640NS_3QD0BN6V
```
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/f539cc5cb4e40b768f4b7bc6dc719467e438c6ed_0image_from_ios.jpg" alt="chick-fil-a macaroni and cheese with 2 nuggets and some ketchup" caption="My case situation is a bit of a mess and I'm using old 7200rpm server drives for pretty much everything; the dream is a 3 drive 2 TB each m.2 nvme ssd setup, maybe someday 🤷") }}
+
![chick-fil-a macaroni and cheese with 2 nuggets and some ketchup](https://hc-cdn.hel1.your-objectstorage.com/s/v3/f539cc5cb4e40b768f4b7bc6dc719467e438c6ed_0image_from_ios.jpg){caption="My case situation is a bit of a mess and I'm using old 7200rpm server drives for pretty much everything; the dream is a 3 drive 2 TB each m.2 nvme ssd setup, maybe someday 🤷"}
We are going to go with the first id so no we move on to the zfs part. Running `zpool status vault-of-the-eldunari` we can get the status of the pool:
···
We can add our new disk with `zpool replace vault-of-the-eldunari 9201394420428878514 ata-ST3750640NS_3QD0BN6V` but first we wipe the disk from proxmox under the disks tab on our proxmox node to make sure its all clean before we restore the pool after we do that we also initalize a new gpt table. Now we are ready to replace the disk. Running this command can take quite a while and it doesn't output anything so sit tight. After waiting a few minutes proxmox reported that resilvering would take 1:49 minutes and it was 5% done already! I hope this helped at least one other person but I'm mainly writing this to remind myself how to do this when it inevitably happens again :)
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/8cc1c0d1717abacbc29d634004b14ec7475de0f2_0image.png" alt="the zpool reporting a downed disk" caption="It's slow but faster then I expected for HDDs") }}
+
![the zpool reporting a downed disk](https://hc-cdn.hel1.your-objectstorage.com/s/v3/8cc1c0d1717abacbc29d634004b14ec7475de0f2_0image.png){caption="It's slow but faster then I expected for HDDs"}
+1 -1
content/blog/2025-02-15_remove-exif-git-hook.md
···
I started with the naive method of just having a `.git/hooks/pre-commit` file that would run `exiftool` on the input but after realizing that hooks placed there wouldn't be synced to the repo decided that wasn't the best way. I moved to using a script that would symlink files from the `hooks` directory to `.git/hooks`. It worked moderately well but due to the fact that I used (yes I feel the shame admitting this [:uw_embarrassed:](https://cachet.dunkirk.sh/emojis/uw_embarrassed/r)) `#!/bin/bash` instead of `#!/usr/bin/env bash`. Not realizing my mistake and believing it to be related to the symlink I found [this stack overflow](https://stackoverflow.com/questions/4592838/symbolic-link-to-a-hook-in-git/#:~:text=While%20you%20can%20use%20symbolic%20links) answer which taught me that you can use `git config core.hooksPath hooks` to move the hooks directory to `./hooks` in the root of your repo! After doing that and it still not working (i feel very dense writing this lol) I finally realized that the shebang was wrong and then it worked!
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/f2ba3f2dbad8c67eccc42ddbb51bc7128f85d049_9049d20038cc3058acee1bbe58c5ac3f.png" alt="the commit hook finally working!" caption="phew") }}
+
![the commit hook finally working!](https://hc-cdn.hel1.your-objectstorage.com/s/v3/f2ba3f2dbad8c67eccc42ddbb51bc7128f85d049_9049d20038cc3058acee1bbe58c5ac3f.png){caption="phew"}
Is there anything at all to learn from this? Well yes actually! You can use the script below and the `git config core.hooksPath hooks` setting to scrub your own images!
+16 -16
content/blog/2025-03-14_my-animations.md
···
{{ youtube(id="O7SYcdUM8mI", caption="2021.01.27 first jelly jar") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/24338fe6379f23bebeda87ab6b0868c4a2890460_2f6bd410317b341df20d8349771bb716.jpg" alt="tesla in a showroom with fire jets" caption="2021.02.10 tesla showroom") }}
+
![tesla in a showroom with fire jets](https://hc-cdn.hel1.your-objectstorage.com/s/v3/24338fe6379f23bebeda87ab6b0868c4a2890460_2f6bd410317b341df20d8349771bb716.jpg){caption="2021.02.10 tesla showroom"}
{{ youtube(id="7Ozt7WcVwt0", caption="2021.09.27 Chalet a la Tagia minecraft animation") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/7ba5e3e478447e92bb4dc5091c99081c7294745c_90335a1f835749fe219a677a24aedd02.png" alt="cube diorama" caption="2021.12.15 cube diorama") }}
+
![cube diorama](https://hc-cdn.hel1.your-objectstorage.com/s/v3/7ba5e3e478447e92bb4dc5091c99081c7294745c_90335a1f835749fe219a677a24aedd02.png){caption="2021.12.15 cube diorama"}
{{ youtube(id="O5iHoFwKQuE", caption="2021.12.17 creature walk cycle test") }}
···
{{ youtube(id="Gy0K-Gi95Jg", caption="2022.01.22 lost music visualization") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/ed654ffc15801a163f4996e011371f433d66d8f6_c1759999d78c2a99312b5b34562c6f72.png" alt="ice sphere" caption="2022.01.24 ice icosphere") }}
+
![ice sphere](https://hc-cdn.hel1.your-objectstorage.com/s/v3/ed654ffc15801a163f4996e011371f433d66d8f6_c1759999d78c2a99312b5b34562c6f72.png){caption="2022.01.24 ice icosphere"}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/766558e98ab81bd262f26e0650507669f88bbdb6_c9587628d15c605e99a3a72769bad60a.png" alt="glass jar with marbles" caption="2022.01.27 marble jar") }}
+
![glass jar with marbles](https://hc-cdn.hel1.your-objectstorage.com/s/v3/766558e98ab81bd262f26e0650507669f88bbdb6_c9587628d15c605e99a3a72769bad60a.png){caption="2022.01.27 marble jar"}
{{ youtube(id="ue-hy7w1-JE", caption="2022.02.08 firefly particle sim") }}
···
{{ youtube(id="BGJbmXqCD5M", caption="2022.03.16 molecular plexus") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/67268702bc70adbfef7c9a2aaca996901e766737_57287dfc2f5eb7d6effe43f7ebbde030.png" alt="twisted torus with flattened sphere in the center" caption="2022.03.16 twisted torus") }}
+
![twisted torus with flattened sphere in the center](https://hc-cdn.hel1.your-objectstorage.com/s/v3/67268702bc70adbfef7c9a2aaca996901e766737_57287dfc2f5eb7d6effe43f7ebbde030.png){caption="2022.03.16 twisted torus"}
{{ youtube(id="yT37oZmd4hc", caption="2022.03.17 hex tunnel") }}
{{ youtube(id="3SQN0L0wbhU", caption="2022.03.23 wavy strips motion effects") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/f74e7ccb0591b5f3d1b2cff6c773fa88653aa6a8_b47952a40fd7695b9667357fb0c8386b.png" alt="airship far bottom" caption="2022.03.31 airship") }}
+
![airship far bottom](https://hc-cdn.hel1.your-objectstorage.com/s/v3/f74e7ccb0591b5f3d1b2cff6c773fa88653aa6a8_b47952a40fd7695b9667357fb0c8386b.png){caption="2022.03.31 airship"}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/1dddf1a9c6d8fcf5f907fd534e7a1cd1a679d1b9_52c9ccd4378fdac717a5a9f1b924000d.png" alt="airship far side") }}
+
![airship far side](https://hc-cdn.hel1.your-objectstorage.com/s/v3/1dddf1a9c6d8fcf5f907fd534e7a1cd1a679d1b9_52c9ccd4378fdac717a5a9f1b924000d.png)
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/d25c0834922bb1283bf8e994e2e550127f93aa31_4138d497e2deb1f9c7369762e08e5a7c.png" alt="airship front top") }}
+
![airship front top](https://hc-cdn.hel1.your-objectstorage.com/s/v3/d25c0834922bb1283bf8e994e2e550127f93aa31_4138d497e2deb1f9c7369762e08e5a7c.png)
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/552636643eee62271818fed80b6e365de91aca05_bac28fe85728b6d009c4e520ccff3140.png" alt="airship front cab") }}
+
![airship front cab](https://hc-cdn.hel1.your-objectstorage.com/s/v3/552636643eee62271818fed80b6e365de91aca05_bac28fe85728b6d009c4e520ccff3140.png)
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/a62a9da89cff18aeeb95f1cc84027f86fc43cde9_963198d64f001f55d703cdc65a257e98.png" alt="airship front side") }}
+
![airship front side](https://hc-cdn.hel1.your-objectstorage.com/s/v3/a62a9da89cff18aeeb95f1cc84027f86fc43cde9_963198d64f001f55d703cdc65a257e98.png)
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/966ccc3514057cbee79f1fa0b91750e909cbbce0_d3c7021428757b3bd607ffdbcc9daa7f.png" alt="minecraft village front door with villager" caption="2022.04.06 viking village") }}
+
![minecraft village front door with villager](https://hc-cdn.hel1.your-objectstorage.com/s/v3/966ccc3514057cbee79f1fa0b91750e909cbbce0_d3c7021428757b3bd607ffdbcc9daa7f.png){caption="2022.04.06 viking village"}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/58c5f094932910f8f011a36c710ca6c7ac51396f_55aff1a73336f1262e625a667ca4d7f8.png" alt="minecraft village from across a small lake with a skeleton and witch" caption="2022.04.06 mountain lake village") }}
+
![minecraft village from across a small lake with a skeleton and witch](https://hc-cdn.hel1.your-objectstorage.com/s/v3/58c5f094932910f8f011a36c710ca6c7ac51396f_55aff1a73336f1262e625a667ca4d7f8.png){caption="2022.04.06 mountain lake village"}
{{ youtube(id="gPRrt_0NMKE", caption="2022.04.07 rolling balls motion effects") }}
···
{{ youtube(id="zqyv7GBTLGA", caption="2022.05.30 fire handwriting") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/36eaad616bad2d70d5f066d6039b191ff26cfea2_42e90de7ab09d863c735a6ca74069fdc.png" alt="a cylinder with a bunch of bumps on it" caption="2022.06.24 the cylinder") }}
+
![a cylinder with a bunch of bumps on it](https://hc-cdn.hel1.your-objectstorage.com/s/v3/36eaad616bad2d70d5f066d6039b191ff26cfea2_42e90de7ab09d863c735a6ca74069fdc.png){caption="2022.06.24 the cylinder"}
{{ youtube(id="XVyMUROofZ8", caption="2022.07.21 the iconic donut") }}
···
{{ youtube(id="zRlgWbW1Qcw", caption="2022.08.01 mirror physics") }}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/d30ec95b2224c93cf244bb65f6bc9fda1c458149_b5876d1491b397c1a80fb8d7411fd627.png" alt="the earth from space" caption="2022.08.30 the earth") }}
+
![the earth from space](https://hc-cdn.hel1.your-objectstorage.com/s/v3/d30ec95b2224c93cf244bb65f6bc9fda1c458149_b5876d1491b397c1a80fb8d7411fd627.png){caption="2022.08.30 the earth"}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/e30d3004c23540bf048cd5bbb3f5c98336db456f_bb000a699c4aa41413a282a31cfb0f59.png" alt="11 glowing pendulums swinging in a flowing curve" caption="2022.08.31 glowing pendulums") }}
+
![11 glowing pendulums swinging in a flowing curve](https://hc-cdn.hel1.your-objectstorage.com/s/v3/e30d3004c23540bf048cd5bbb3f5c98336db456f_bb000a699c4aa41413a282a31cfb0f59.png){caption="2022.08.31 glowing pendulums"}
-
{{ img(id="https://hc-cdn.hel1.your-objectstorage.com/s/v3/a5c2d4885ccaaa95628344bedf0fd7fb433034db_f1cdd1a422c0a3280541f3bbab4f662e.png" alt="an orange flower in a flower pot with skyline dirt" caption="2022.10.22 orange flower") }}
+
![an orange flower in a flower pot with skyline dirt](https://hc-cdn.hel1.your-objectstorage.com/s/v3/a5c2d4885ccaaa95628344bedf0fd7fb433034db_f1cdd1a422c0a3280541f3bbab4f662e.png){caption="2022.10.22 orange flower"}
## 2023