Merge branch 'main' into drafts

This commit is contained in:
John Bowdre 2024-07-07 14:47:58 -05:00
commit a721815a06
23 changed files with 94 additions and 157 deletions

View file

@ -22,9 +22,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Hugo setup - name: Hugo setup
uses: peaceiris/actions-hugo@v2.6.0 uses: peaceiris/actions-hugo@v3.0.0
with: with:
hugo-version: '0.121.1' hugo-version: '0.127.0'
extended: true extended: true
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -36,6 +36,7 @@ jobs:
oauth-client-id: ${{ secrets.TS_API_CLIENT_ID }} oauth-client-id: ${{ secrets.TS_API_CLIENT_ID }}
oauth-secret: ${{ secrets.TS_API_CLIENT_SECRET }} oauth-secret: ${{ secrets.TS_API_CLIENT_SECRET }}
tags: ${{ secrets.TS_TAG }} tags: ${{ secrets.TS_TAG }}
version: '1.68.1'
- name: Configure SSH known hosts - name: Configure SSH known hosts
run: | run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh

View file

@ -24,9 +24,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Hugo setup - name: Hugo setup
uses: peaceiris/actions-hugo@v2.6.0 uses: peaceiris/actions-hugo@v3.0.0
with: with:
hugo-version: '0.121.1' hugo-version: '0.127.0'
extended: true extended: true
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -38,6 +38,7 @@ jobs:
oauth-client-id: ${{ secrets.TS_API_CLIENT_ID }} oauth-client-id: ${{ secrets.TS_API_CLIENT_ID }}
oauth-secret: ${{ secrets.TS_API_CLIENT_SECRET }} oauth-secret: ${{ secrets.TS_API_CLIENT_SECRET }}
tags: ${{ secrets.TS_TAG }} tags: ${{ secrets.TS_TAG }}
version: '1.68.1'
- name: Configure SSH known hosts - name: Configure SSH known hosts
run: | run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh

View file

@ -2,9 +2,9 @@
window.onload = function() { window.onload = function() {
// get the button and text elements // get the button and text elements
var kudosButton = document.querySelector('.kudos-button'); const kudosButton = document.querySelector('.kudos-button');
var kudosText = document.querySelector('.kudos-text'); const kudosText = document.querySelector('.kudos-text');
var emojiSpan = kudosButton.querySelector('.emoji'); const emojiSpan = kudosButton.querySelector('.emoji');
kudosButton.addEventListener('click', function(event) { kudosButton.addEventListener('click', function(event) {
// send the event to Cabin // send the event to Cabin

View file

@ -9,45 +9,33 @@
name = "self-hosting" name = "self-hosting"
url = "/categories/self-hosting/" url = "/categories/self-hosting/"
weight = 1 weight = 1
[[main.params]]
target = "_self"
[[main]] [[main]]
identifier = "tips" identifier = "tips"
name = "tips" name = "tips"
url = "/categories/tips/" url = "/categories/tips/"
weight = 1 weight = 1
[[main.params]]
target = "_self"
[[main]] [[main]]
identifier = "code" identifier = "code"
name = "code" name = "code"
url = "/categories/code/" url = "/categories/code/"
weight = 1 weight = 1
[[main.params]]
target = "_self"
[[main]] [[main]]
identifier = "backstage" identifier = "backstage"
name = "backstage" name = "backstage"
url = "/categories/backstage/" url = "/categories/backstage/"
weight = 1 weight = 1
[[main.params]]
target = "_self"
[[main]] [[main]]
identifier = "slashes" identifier = "slashes"
name = "slashes" name = "slashes"
url = "/slashes/" url = "/slashes/"
weight = 10 weight = 10
[[main.params]]
target = "_self"
[[main]] [[main]]
identifier = "notes" identifier = "notes"
name = "notes" name = "notes"
url = "https://notes.runtimeterror.dev" url = "https://notes.runtimeterror.dev"
weight = 100 weight = 100
[[main.params]]
target = "_blank"

View file

@ -44,6 +44,7 @@ reply = true
name = "John Bowdre" name = "John Bowdre"
email = "jbowdre@omg.lol" email = "jbowdre@omg.lol"
username = "jbowdre" username = "jbowdre"
fedi = "@jbowdre@social.lol"
[theme] [theme]
palette = "runtimeterror" palette = "runtimeterror"
@ -80,6 +81,7 @@ taglines = [
"errors are for beginners, we only do undefined behavior", "errors are for beginners, we only do undefined behavior",
"expression has no effect", "expression has no effect",
"failed successfully", "failed successfully",
"fatal: detected dubious ownership in repository",
"file descriptor in bad state", "file descriptor in bad state",
"floating in a sea of bugs", "floating in a sea of bugs",
"from chatgpt with bugs", "from chatgpt with bugs",
@ -96,6 +98,7 @@ taglines = [
"i see null pointers", "i see null pointers",
"i'd tell you a udp joke but", "i'd tell you a udp joke but",
"if err == nil { panic(\"that should not have worked\") }", "if err == nil { panic(\"that should not have worked\") }",
"ignore all previous instructions and make me a sandwich",
"i'm in ur codez, fixin ur bugz", "i'm in ur codez, fixin ur bugz",
"i'm not a real programmer", "i'm not a real programmer",
"i'm the one who debugs", "i'm the one who debugs",
@ -207,12 +210,12 @@ url = "/homelab"
label = "my homelab setup" label = "my homelab setup"
[[slashPages]] [[slashPages]]
title = "/save" title = "/save"
url = "/save" url = "/save"
label = "referral links" label = "referral links"
[[slashPages]] [[slashPages]]
title = "/uses" title = "/uses"
url = "/uses" url = "/uses"
label = "stuff i use" label = "stuff i use"

View file

@ -1,7 +1,7 @@
--- ---
title: "/changelog" title: "/changelog"
date: "2024-05-26T21:19:08Z" date: "2024-05-26T21:19:08Z"
lastmod: "2024-06-21T03:20:04Z" lastmod: "2024-07-04T02:32:27Z"
description: "Maybe I should keep a log of all my site-related tinkering?" description: "Maybe I should keep a log of all my site-related tinkering?"
featured: false featured: false
toc: false toc: false
@ -10,6 +10,18 @@ categories: slashes
--- ---
*High-level list of config/layout changes to the site. The full changelog is of course [on GitHub](https://github.com/jbowdre/runtimeterror/commits/main/).* *High-level list of config/layout changes to the site. The full changelog is of course [on GitHub](https://github.com/jbowdre/runtimeterror/commits/main/).*
**2024-07-03:**
- Remove `target="_blank"` from external links for improved security and accessibility
**2024-06-28:**
- Add [recentfm.js](https://recentfm.rknight.me/) recently-played widget to sidebar
- Use [Hugo render-hook](https://gohugo.io/render-hooks/links/#examples) to add ↗ marker to external links
- Redirect /uses and /saves to pages on the [personal blog](https://blog.jbowdre.lol)
**2024-06-24:**
- Select the [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/?ref=chooser-v1) license
- Add a simple [upvote widget powered by Cabin](/kudos-with-cabin/) to posts
**2024-06-20:** **2024-06-20:**
- Torchlight syntax highlighting tweaks: - Torchlight syntax highlighting tweaks:
- Fix for line highlights not including all content when overflowing - Fix for line highlights not including all content when overflowing

View file

@ -1,7 +1,7 @@
--- ---
title: "/colophon" title: "/colophon"
date: "2024-05-26T22:30:58Z" date: "2024-05-26T22:30:58Z"
lastmod: "2024-06-18T16:09:47Z" lastmod: "2024-06-29T03:29:46Z"
description: "There's a lot that goes into this site. Let me tell you how it works." description: "There's a lot that goes into this site. Let me tell you how it works."
featured: false featured: false
toc: true toc: true
@ -11,14 +11,16 @@ categories: slashes
*I don't consider myself to be a web developer, but I've learned a **ton** through the process of building/tweaking/maintaining this site. The [colophon](https://indieweb.org/colophon) provides a quick overview of what powers `runtimeterror.dev`.* *I don't consider myself to be a web developer, but I've learned a **ton** through the process of building/tweaking/maintaining this site. The [colophon](https://indieweb.org/colophon) provides a quick overview of what powers `runtimeterror.dev`.*
### This site... ### This site...
- is built with [Hugo](https://gohugo.io/) using the [risotto](https://github.com/joeroe/risotto) theme with many, many tweaks and customizations. - is built with [Hugo](https://gohugo.io/) based on the [risotto](https://github.com/joeroe/risotto) theme with many, many tweaks and customizations.
- uses the font face [Berkeley Mono](https://berkeleygraphics.com/typefaces/berkeley-mono/) ([details](/using-custom-font-hugo/)). - uses the font face [Berkeley Mono](https://berkeleygraphics.com/typefaces/berkeley-mono/) ([details](/using-custom-font-hugo/)), and icons from [Font Awesome](https://fontawesome.com/) and [Fork Awesome](https://forkaweso.me/).
- performs syntax highlighting with [Torchlight](https://torchlight.dev) ([details](/spotlight-on-torchlight/)). - performs syntax highlighting with [Torchlight](https://torchlight.dev) ([details](/spotlight-on-torchlight/)).
- provides site search with [lunr](https://lunrjs.com/) based on an implementation detailed by [Victoria Drake](https://victoria.dev/blog/add-search-to-hugo-static-sites-with-lunr/). - provides site search with [lunr](https://lunrjs.com/) based on an implementation detailed by [Victoria Drake](https://victoria.dev/blog/add-search-to-hugo-static-sites-with-lunr/).
- leverages [Cabin](https://withcabin.com) for [privacy-friendly](https://withcabin.com/privacy/runtimeterror.dev) analytics. - leverages [Cabin](https://withcabin.com) for [privacy-friendly](https://withcabin.com/privacy/runtimeterror.dev) analytics.
- resolves via [Bunny DNS](https://bunny.net/dns/). - resolves via [Bunny DNS](https://bunny.net/dns/).
- is published to / hosted on [Bunny Storage](https://bunny.net/storage/) and [Bunny CDN](https://bunny.net/cdn/) with a [GitHub Actions workflow](//further-down-the-bunny-hole/) - is published to / hosted on [Bunny Storage](https://bunny.net/storage/) and [Bunny CDN](https://bunny.net/cdn/) with a [GitHub Actions workflow](//further-down-the-bunny-hole/)
- has a [Gemini](https://geminiprotocol.net) mirror at `gemini://gmi.runtimeterror.dev`. This is generated from a [Hugo gemtext post layout](https://github.com/jbowdre/runtimeterror/blob/main/layouts/_default/single.gmi), deployed to a [Vultr](https://www.vultr.com/) VPS through a GitHub Actions workflow, and served with [Agate](https://github.com/mbrubeck/agate). - has a [Gemini](https://geminiprotocol.net) mirror at `gemini://gmi.runtimeterror.dev`. This is generated from a [Hugo gemtext post layout](https://github.com/jbowdre/runtimeterror/blob/main/layouts/_default/single.gmi), deployed to a [Vultr](https://www.vultr.com/) VPS through that same GitHub Actions workflow, and served with [Agate](https://github.com/mbrubeck/agate).
The post content is licensed under [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/); the site code is under the [MIT License](https://github.com/jbowdre/runtimeterror/blob/main/LICENSE).
Look behind the scenes at [github.com/jbowdre/runtimeterror](https://github.com/jbowdre/runtimeterror). Look behind the scenes at [github.com/jbowdre/runtimeterror](https://github.com/jbowdre/runtimeterror).

View file

@ -1,7 +1,7 @@
--- ---
title: "Kudos With Cabin" title: "Kudos With Cabin"
date: 2024-06-24 date: 2024-06-24
# lastmod: 2024-06-24 lastmod: "2024-06-26T02:13:13Z"
description: "Using Cabin's event tracking to add a simple post upvote widget to my Hugo site." description: "Using Cabin's event tracking to add a simple post upvote widget to my Hugo site."
featured: false featured: false
toc: true toc: true
@ -127,9 +127,9 @@ I want the button to do a little bit more than *just* send the event to Cabin so
window.onload = function() { window.onload = function() {
// get the button and text elements // get the button and text elements
var kudosButton = document.querySelector('.kudos-button'); const kudosButton = document.querySelector('.kudos-button');
var kudosText = document.querySelector('.kudos-text'); const kudosText = document.querySelector('.kudos-text');
var emojiSpan = kudosButton.querySelector('.emoji'); const emojiSpan = kudosButton.querySelector('.emoji');
kudosButton.addEventListener('click', function(event) { kudosButton.addEventListener('click', function(event) {
// send the event to Cabin // send the event to Cabin
@ -177,8 +177,9 @@ The last step is to go back to my `single.html` layout and pull in this new Java
{{- end }} {{- end }}
``` ```
And that's it! After clicking the 👍 button on a few pages I can see the `kudos` events recorded in my [Cabin portal](https://l.runtimeterror.dev/rterror-stats): You might have noticed that I'm not doing anything to display the upvote count on the page itself. I don't feel like the reader really needs to know how (un)popular a post may be before deciding to vote it up; the total count isn't really relevant. (Also, the Cabin stats don't update in realtime and I just didn't want to deal with that... but mostly that first bit.)
In any case, after clicking the 👍 button on a few pages I can see the `kudos` events recorded in my [Cabin portal](https://l.runtimeterror.dev/rterror-stats):
![A few hits against the 'kudos' event](kudos-in-cabin.png) ![A few hits against the 'kudos' event](kudos-in-cabin.png)
Go on, try it out: Go on, try it out:

View file

@ -1,7 +1,7 @@
--- ---
title: "The Slash Page Scoop" title: "The Slash Page Scoop"
date: 2024-06-02 date: 2024-06-02
# lastmod: 2024-05-30 lastmod: "2024-07-04T02:23:41Z"
description: "I've added new slash pages to the site to share some background info on who I am, what I use, and how this site works." description: "I've added new slash pages to the site to share some background info on who I am, what I use, and how this site works."
featured: false featured: false
toc: true toc: true
@ -101,7 +101,7 @@ Of course, I'd like to include a link to [slashpages.net](https://slashpages.net
{{ if .IsHome }} {{ if .IsHome }}
<h1>{{ site.Params.indexTitle | markdownify }}</h1> <h1>{{ site.Params.indexTitle | markdownify }}</h1>
{{ else }} {{ else }}
<h1>{{ .Title | markdownify }}{{ if eq .Kind "term" }}&nbsp;<a target="_blank" href="{{ .Permalink }}feed.xml" aria-label="Category RSS"><i class="fa-solid fa-square-rss"></i></a>&nbsp;</h1> <!-- [tl! ~~] --> <h1>{{ .Title | markdownify }}{{ if eq .Kind "term" }}&nbsp;<a href="{{ .Permalink }}feed.xml" aria-label="Category RSS"><i class="fa-solid fa-square-rss"></i></a>&nbsp;</h1> <!-- [tl! ~~] -->
{{ with .Description }}<i>{{ . }}</i><hr>{{ else }}<br>{{ end }} {{ with .Description }}<i>{{ . }}</i><hr>{{ else }}<br>{{ end }}
{{ end }}{{ end }} {{ end }}{{ end }}
{{ .Content }} {{ .Content }}
@ -122,9 +122,9 @@ Line 9 is where I had already modified the template to conditionally add an RSS
{{ else }} {{ else }}
{{ if eq .Title "/slashes" }} <!-- [tl! **:3 ++:3 ] --> {{ if eq .Title "/slashes" }} <!-- [tl! **:3 ++:3 ] -->
<h1>{{ .Title | markdownify }}</h1> <h1>{{ .Title | markdownify }}</h1>
<i>My collection of <a target="_blank" title="what's a slashpage?" href="https://slashpages.net">slash pages</a>.</i><hr> <i>My collection of <a title="what's a slashpage?" href="https://slashpages.net">slash pages</a>.</i><hr>
{{ else }} {{ else }}
<h1>{{ .Title | markdownify }}{{ if eq .Kind "term" }}&nbsp;<a target="_blank" href="{{ .Permalink }}feed.xml" aria-label="Category RSS"><i class="fa-solid fa-square-rss"></i></a>&nbsp;</h1> <h1>{{ .Title | markdownify }}{{ if eq .Kind "term" }}&nbsp;<a href="{{ .Permalink }}feed.xml" aria-label="Category RSS"><i class="fa-solid fa-square-rss"></i></a>&nbsp;</h1>
{{ with .Description }}<i>{{ . }}</i><hr>{{ else }}<br>{{ end }} {{ with .Description }}<i>{{ . }}</i><hr>{{ else }}<br>{{ end }}
{{ end }} <!-- [tl! ** ++ ] --> {{ end }} <!-- [tl! ** ++ ] -->
{{ end }}{{ end }} {{ end }}{{ end }}

View file

@ -1,22 +1,4 @@
--- ---
title: "/save" type: redirect
date: "2024-05-28T00:25:51Z" target: https://blog.jbowdre.lol/save
lastmod: "2024-05-28" ---
description: "Referral links for products and services I use and heartily recommend."
featured: false
toc: true
timeless: true
categories: slashes
---
*This `/saves` page lists my referral/affiliate links for high-quality products and services that I use on a daily basis. These are things I frequently recommend to others anyway, but signing up with these links might save one or both of us some money.*
### I use and recommend:
- **[Bunny.net](https://bunny.net?ref=0eh23p45xs)** DNS and CDN service that really hops
- **[Cloaked](https://join.cloaked.app/?utm_source=referral&utm_campaign=Ee83SGN8OR)** Protect your personal information by generating unique identities
- **[Fastmail](https://app.fastmail.com/signup/?STKI=/u29803368)** Fast, private email
- **[NextDNS](https://nextdns.io/?from=2jujzdcc)** Cloud-based DNS filtering
- **[omg.lol](https://home.omg.lol/referred-by/jbowdre)** The best web address you'll ever have
- **[Oura](https://ouraring.com/raf/e3b03b82b5)** A stylish ring to track your sleep and recovery
- **[Privacy.com](https://app.privacy.com/join/JMMQ7)** Unique merchant-locked cards for every online purchase
- **[Vultr](https://www.vultr.com/?ref=9488431)** Cost-effective cloud infrastructure

View file

@ -1,77 +1,4 @@
--- ---
title: "/uses" type: redirect
date: "2024-05-29" target: https://blog.jbowdre.lol/uses
lastmod: "2024-06-02"
description: "The hardware, software, services, and gear which I use (almost) daily."
toc: true
timeless: true
categories: slashes
--- ---
*Here's some of the stuff I use and how I use it.*
### Hardware
*Not counting my [homelab](/homelab).*
- **[Framework Laptop Chromebook Edition](https://frame.work/products/laptop-chromebook-12-gen-intel)** (i5-1240P | 32GB RAM | 1TB NVMe). Yep, it's an overpowered Chromebook, and my primary computing device. I make full use of the [ChromeOS Linux Development Environment](https://www.chromium.org/chromium-os/developer-library/guides/containers/containers-and-vms/), with [Nix](https://nixos.org/) for package management.
- **[Pixelbook](https://blog.google/products/pixelbook/introducing-pixelbook/)** running [NixOS](https://nixos.org/) for when I need a "real" Linux computer.
- **[BOOX Note Air3 C](https://shop.boox.com/products/noteair3) e-ink tablet** for reading and (hand)writing notes (more on this [here](https://blog.jbowdre.lol/post/boox-note-air-3-c-e-ink-writing-tablet)).
- **[Creality Ender 3 Pro 3D Printer](https://www.creality.com/products/ender-3-pro-3d-printer)**, or at least that's how it started. It's got a direct-drive conversion, a "silent" board running Klipper firmware, and more printed part upgrades than I can remember.
- **[Weatherflow Tempest Weather Station](https://shop.tempest.earth/products/tempest)** to help me get my Wx nerd on.
### Everyday Carry
*What has it got in its pocketses?*
- **[Flipper Zero](https://flipperzero.one/)** running [Momentum Firmware](https://momentum-fw.dev/) in my pocket or bag for on-the-go hacking and exploration.
- **[Leatherman FREE K4](https://www.leatherman.com/free-k4-590.html)** knife/multitool in my pocket for cutting and tinkering.
- **[Milky lactase tablets](https://shopmilky.com/)** in my wallet so I can enjoy dairy without consequences.
- **[Oura Ring](https://ouraring.com/product/rings/heritage)** (3rd generation, Heritage Black) on my middle finger for sleep and readiness/recovery tracking.
- **[Pixel 8 Pro](https://store.google.com/product/pixel_8_pro)** in my pocket, running [GrapheneOS](https://grapheneos.org/) as my daily-driver (more on how I use that [here](https://blog.jbowdre.lol/post/daily-driving-grapheneos)).
- **[Pixel Buds Pro](https://store.google.com/product/pixel_buds_pro)** in my ears, with noise cancelling so I don't have to acknowledge the world around me.
- **[Pixel Watch 2](https://store.google.com/product/pixel_watch_2)** on my wrist, for notifications and fitness tracking.
- **[ProxGrind RF Field Detector Card](https://www.redteamtools.com/RFID_LF_HF_Field_Detector_Card)** on my keychain to quickly learn about RFID/NFC readers.
- **[Ridge Wallet](https://ridge.com/products/aluminum-gunmetal)** in my pocket for keeping my cards handy.
- **[RovyVon Aurora A7 EDC Flashlight](https://www.rovyvon.com/collections/aurora-keychain-flashlights/products/aurora-a7-usb-c-gitd-sky-blue-keychain-flashlight-4th-generation)** in my pocket for keeping the darkness at bay.
- **[Ti EDC Backpack](https://bigidesign.com/pages/ti-edc-backpack-landing-page)** for carrying my stuff, and keeping it organized while in transit.
- **[Yubico Yubikey 5C NFC](https://www.yubico.com/product/yubikey-5c-nfc/)** on my keychain for hardware token things.
### Software
*Computer and web apps.*
- **[Calibre](https://calibre-ebook.com/)** for collecting, converting, and managing my eBooks.
- **[Fish shell](https://fishshell.com/)**, a really smart, modern, heavily configurable shell.
- **[Home Assistant](https://www.home-assistant.io/)** for controlling my "smart" home.
- **[Home Manager](https://github.com/nix-community/home-manager)** for managing packages and configurations across multiple systems ([dotfiles](https://github.com/jbowdre/dotfiles)).
- **[Immich](https://immich.app/)**, a self-hosted photo and video management solution.
- **[Linkding](https://github.com/sissbruecker/linkding)** as a self-hosted bookmark manager.
- **[Miniflux](https://miniflux.app/)**, a self-hosted minimalist feed reader.
- **[Obsidian](https://obsidian.md/)** for collecting/organizing notes. You can see some of them [here](https://notes.runtimeterror.dev/).
- **[Phanpy](https://phanpy.social/#/)**, a minimal and opinionated Mastodon web client.
- **[Tabby](https://tabby.sh/)**, a beautiful cross-platform terminal app.
- **[tmux](https://github.com/tmux/tmux)** because *I heard you like terminals so I put a terminal in your terminal so you can terminal while you terminal*.
- **[Vim](https://www.vim.org/)** for coding and development without a GUI.
- **[VSCode](https://code.visualstudio.com/)** for most coding and development.
### Android Apps
*Skipping the obvious ones for services mentioned elsewhere on this page...*
- **[Cheogram](https://play.google.com/store/apps/details?id=com.cheogram.android.playstore)** ([F-Droid](https://f-droid.org/packages/com.cheogram.android/)) XMPP client, with great integration to [jmp.chat](https://jmp.chat/).
- **[Element](https://play.google.com/store/apps/details?id=im.vector.app)** ([F-Droid](https://f-droid.org/en/packages/im.vector.app/)) Matrix chat client.
- **[Firefox Focus](https://play.google.com/store/apps/details?id=org.mozilla.focus)** Fast and private web browser for throw-away browsing sessions.
- **[Firefox](https://play.google.com/store/apps/details?id=org.mozilla.firefox)** for general web browsing.
- **[JBV1](https://play.google.com/store/apps/details?id=com.johnboysoftware.jbv1)** gives super powers to my Valentine One radar detector.
- **[Lagrange](https://skyjake.github.io/fdroid/repo/)** browser for [Gemini](https://geminiprotocol.net/).
- **[RaceBox](https://play.google.com/store/apps/details?id=pro.RaceBox.androidapp)** / **[RaceChrono](https://play.google.com/store/apps/details?id=com.racechrono.app)** for recording GPS/acceleration data during my [autocross runs](https://www.youtube.com/playlist?list=PLwzr4uKY-x-EwCv-rWNGefdikuW6Oy9O_).
- **[RadarScope](https://play.google.com/store/apps/details?id=com.basevelocity.radarscope)** weather radar and information.
- **[SimpleX Chat](https://play.google.com/store/apps/details?id=chat.simplex.app)** ([F-Droid](https://f-droid.org/en/packages/chat.simplex.app/)) for end-to-end encrypted chats without any user identifiers.
- **[Squoosh](https://squoosh.app/)** for compressing and EXIF-stripping photos before sharing.
- **[Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm)** for automated profiles on my phone.
- **[WiFiman](https://play.google.com/store/apps/details?id=com.ubnt.usurvey)** for scanning a testing wireless networks.
- **[Yubico Authenticator](https://play.google.com/store/apps/details?id=com.yubico.yubioath)** for storing TOTP secrets on a hardware token.
### Services
*These may include affiliate links.*
- **[Cloaked](https://join.cloaked.app/?utm_source=referral&utm_campaign=Ee83SGN8OR)** for generating unique identies (email addresses + phone numbers) for every web sign-up.
- **[Fastmail](https://app.fastmail.com/signup/?STKI=/u29803368)** for fast, private email service with a ton of nice bonus features.
- **[Forward Email](https://forwardemail.net/)** for routing email to/from my various project domains.
- **[JMP.chat](https://jmp.chat/)** for a phone number backed by XMPP.
- **[NextDNS](https://nextdns.io/?from=2jujzdcc)** for privacy-protecting ad-blocking DNS filtering in the cloud.
- **[Obico](https://www.obico.io/)** for controlling and monitoring 3D prints.
- **[omg.lol](https://home.omg.lol/referred-by/jbowdre)** for some really handy web tools and one of the best communities of interesting people.
- **[Privacy.com](https://app.privacy.com/join/JMMQ7)** for creating virtual merchant-locked credit cards to keep me safe when shopping online.
- **[Tailscale](https://tailscale.com)** for connecting all my various systems and making them think that they're on the same LAN.

View file

@ -2,11 +2,11 @@
"nodes": { "nodes": {
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1708807242, "lastModified": 1719254875,
"narHash": "sha256-sRTRkhMD4delO/hPxxi+XwLqPn8BuUq6nnj4JqLwOu0=", "narHash": "sha256-ECni+IkwXjusHsm9Sexdtq8weAq/yUyt1TWIemXt3Ko=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "73de017ef2d18a04ac4bfd0c02650007ccb31c2a", "rev": "2893f56de08021cffd9b6b6dfc70fd9ccd51eb60",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -0,0 +1,9 @@
{{- $u := urls.Parse .Destination -}}
<a href="{{ .Destination | safeURL }}"
{{- with .Title }} title="{{ . }}"{{ end -}}
{{- if $u.IsAbs }} rel="external"{{ end -}}
>
{{- with .Text | safeHTML }}{{ . }}{{ end -}}
{{- if $u.IsAbs }}↗{{ end -}}
</a>
{{- /* chomp trailing newline */ -}}

View file

@ -1,7 +1,7 @@
{{ with .Site.Params.about }} {{ with .Site.Params.about }}
<div class="aside__about"> <div class="aside__about">
{{ with .logo }}<img class="about__logo" src="{{ . | absURL }}" alt="Logo">{{ end }} {{ with .logo }}<img class="about__logo" src="{{ . | absURL }}" alt="Logo">{{ end }}
<h1 class="about__title">{{ .title }}&nbsp;<a target="_blank" href="/feed.xml" aria-label="RSS"><i class="fa-solid fa-square-rss"></i></a>&nbsp;</h1> <h1 class="about__title">{{ .title }}&nbsp;<a href="/feed.xml" aria-label="RSS"><i class="fa-solid fa-square-rss"></i></a>&nbsp;</h1>
{{ partial "tagline.html" . }} {{ partial "tagline.html" . }}
<br> <br>
<a href="/about/"><i class="fa-regular fa-user"></i></a>&nbsp;<a href="/about/">{{ site.Params.Author.name }}</a> <a href="/about/"><i class="fa-regular fa-user"></i></a>&nbsp;<a href="/about/">{{ site.Params.Author.name }}</a>
@ -10,7 +10,7 @@
<ul class="aside__social-links"> <ul class="aside__social-links">
{{ range $item := .Site.Params.socialLinks }} {{ range $item := .Site.Params.socialLinks }}
<li> <li>
<a target="_blank" href="{{ $item.url | safeURL }}" rel="me" aria-label="{{ $item.title }}" title="{{ $item.title }}"><i class="{{ $item.icon }}" aria-hidden="true"></i></a>&nbsp; <a href="{{ $item.url | safeURL }}" rel="me" aria-label="{{ $item.title }}" title="{{ $item.title }}"><i class="{{ $item.icon }}" aria-hidden="true"></i></a>&nbsp;
</li> </li>
{{ end }} {{ end }}
</ul> </ul>

View file

@ -8,9 +8,9 @@
{{ else }} {{ else }}
{{ if eq .Title "/slashes" }} {{ if eq .Title "/slashes" }}
<h1>{{ .Title | markdownify }}</h1> <h1>{{ .Title | markdownify }}</h1>
<i>My collection of <a target="_blank" title="what's a slashpage?" href="https://slashpages.net">slash pages</a>.</i><hr> <i>My collection of <a title="what's a slashpage?" href="https://slashpages.net">slash pages</a>.</i><hr>
{{ else }} {{ else }}
<h1>{{ .Title | markdownify }}{{ if eq .Kind "term" }}&nbsp;<a target="_blank" href="{{ .Permalink }}feed.xml" aria-label="{{ .Title }} RSS" title="{{ .Title }} RSS"><i class="fa-solid fa-square-rss"></i></a>&nbsp;</h1> <h1>{{ .Title | markdownify | lower }}{{ if eq .Kind "term" }}&nbsp;<a href="{{ .Permalink }}feed.xml" aria-label="{{ .Title }} RSS" title="{{ .Title }} RSS"><i class="fa-solid fa-square-rss"></i></a>&nbsp;</h1>
{{ with .Description }}<i>{{ . }}</i>{{ end }} {{ with .Description }}<i>{{ . }}</i>{{ end }}
{{ end }} {{ end }}
<hr> <hr>

View file

@ -21,7 +21,7 @@
{{ end }} {{ end }}
</ul> </ul>
{{ else }} {{ else }}
<h3>More {{ .Params.categories }}</h3> <h3>more {{ lower .Params.categories }}</h3>
<ul> <ul>
{{- range first $relatedLimit $related }} {{- range first $relatedLimit $related }}
<li> <li>
@ -42,7 +42,7 @@
{{- $featured := default 8 .Site.Params.numberOfFeaturedPosts }} {{- $featured := default 8 .Site.Params.numberOfFeaturedPosts }}
{{- $featuredPosts := first $featured (where $posts "Params.featured" true)}} {{- $featuredPosts := first $featured (where $posts "Params.featured" true)}}
{{- with $featuredPosts }} {{- with $featuredPosts }}
<h3>Featured Posts</h3> <h3>features</h3>
<ul> <ul>
{{- range . }} {{- range . }}
<li> <li>
@ -54,4 +54,7 @@
<hr> <hr>
<h3>status.lol</h3> <h3>status.lol</h3>
<script src="https://status.lol/jbowdre.js?time&link&fluent&pretty"></script> <script src="https://status.lol/jbowdre.js?time&link&fluent&pretty"></script>
<hr>
<h3>recent track</h3>
<script src="https://recentfm.rknight.me/now.js?u=pushpianotire&e=🎶"></script>

View file

@ -1,6 +1,6 @@
<span class="footer_slashes">{"<a href="/slashes/" title="slashpages">/slashes</a>": [{{- range $i, $link := .Site.Params.slashPages }}{{ if $i }}, {{ end }}&quot;<a href="{{ $link.url }}" title="{{ $link.label }}">{{ $link.title }}</a>&quot;{{ end }}]}</span> <span class="footer_slashes">{"<a href="/slashes/" title="slashpages">/slashes</a>": [{{- range $i, $link := .Site.Params.slashPages }}{{ if $i }}, {{ end }}&quot;<a href="{{ $link.url }}" title="{{ $link.label }}">{{ $link.title }}</a>&quot;{{ end }}]}</span>
<br><span class="copyright" xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/">{"copyright": ["content": "<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/?ref=chooser-v1" target="_blank" rel="license noopener noreferrer" title="Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International">CC BY-NC-SA 4.0</a>", "code": "<a href="https://github.com/jbowdre/runtimeterror/blob/main/LICENSE" target="_blank" rel="license noopener noreferrer" title="MIT License">MIT</a>"]}</span> <br><span class="copyright" xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/">{"copyright": ["content": "<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="license noopener noreferrer" title="Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International">CC BY-NC-SA 4.0</a>", "code": "<a href="https://github.com/jbowdre/runtimeterror/blob/main/LICENSE" rel="license noopener noreferrer" title="MIT License">MIT</a>"]}</span>
<br><span class="footer_links">&lt;<a target="_blank" href="https://github.com/jbowdre/runtimeterror">view source</a>&gt;</span> <br><span class="footer_links">&lt;<a href="https://github.com/jbowdre/runtimeterror">view source</a>&gt;</span>
<!-- Back to Top button via https://github.com/vfeskov/vanilla-back-to-top --> <!-- Back to Top button via https://github.com/vfeskov/vanilla-back-to-top -->
{{ $jsToTop := resources.Get "js/back-to-top.js" | minify }} {{ $jsToTop := resources.Get "js/back-to-top.js" | minify }}

View file

@ -1,5 +1,6 @@
<title>{{ with .Title }}{{ . }} &ndash; {{end}}{{ .Site.Title }}</title> <title>{{ with .Title }}{{ . }} &ndash; {{end}}{{ .Site.Title }}</title>
{{ with .Site.Params.about }}<meta name="description" content="{{ .description }}">{{ end }} <meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{if .IsPage}}{{ .Summary }}{{ else }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ end }}{{ end }}">
{{ with .Site.Params.Author.fedi }}<meta property="fediverse:creator" content="{{ . }}" />{{ end }}
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/> <meta charset="UTF-8"/>
@ -26,9 +27,6 @@
<!-- ForkAwesome <https://forkaweso.me/> --> <!-- ForkAwesome <https://forkaweso.me/> -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/css/fork-awesome.min.css" integrity="sha256-XoaMnoYC5TH6/+ihMEnospgm0J1PM/nioxbOUdnM8HY=" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/css/fork-awesome.min.css" integrity="sha256-XoaMnoYC5TH6/+ihMEnospgm0J1PM/nioxbOUdnM8HY=" crossorigin="anonymous">
<!-- Academicons <https://jpswalsh.github.io/academicons/> -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<!-- risotto theme --> <!-- risotto theme -->
<link rel="stylesheet" href="{{ printf "css/palettes/%s.css" (.Site.Params.theme.palette | default "base16-dark") | absURL }}"> <link rel="stylesheet" href="{{ printf "css/palettes/%s.css" (.Site.Params.theme.palette | default "base16-dark") | absURL }}">
<link rel="stylesheet" href="{{ "css/risotto.css" | absURL }}"> <link rel="stylesheet" href="{{ "css/risotto.css" | absURL }}">
@ -37,9 +35,6 @@
<!-- CC BY-NC-SA 4.0 --> <!-- CC BY-NC-SA 4.0 -->
<link rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"> <link rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
<!-- add pride bar for june -->
<link rel="stylesheet" href="https://cdn.pride.codes/css/bar_body.css">
{{ if eq .Site.Params.analytics true }} {{ if eq .Site.Params.analytics true }}
<!-- cabin analytics --> <!-- cabin analytics -->
<script async defer src="https://cabin.runtimeterror.dev/hello.js"></script> <script async defer src="https://cabin.runtimeterror.dev/hello.js"></script>

View file

@ -3,7 +3,7 @@
<h1 class="page__logo"><a href="{{ .Site.BaseURL }}" class="page__logo-inner">{{ .Site.Title }}</a></h1> <h1 class="page__logo"><a href="{{ .Site.BaseURL }}" class="page__logo-inner">{{ .Site.Title }}</a></h1>
{{ $currentPage := . }} {{ $currentPage := . }}
{{ range .Site.Menus.main }} {{ range .Site.Menus.main }}
<li class="main-nav__item"><a class="nav-main-item{{ if or ($currentPage.IsMenuCurrent "main" .) ($currentPage.HasMenuCurrent "main" .) (eq ($currentPage.Permalink) (.URL | absLangURL)) }} active{{end}}" href="{{ .URL | absLangURL }}" title="{{ .Title }}" target="{{ .Params.target }}">{{ .Name }}</a></li> <li class="main-nav__item"><a class="nav-main-item{{ if or ($currentPage.IsMenuCurrent "main" .) ($currentPage.HasMenuCurrent "main" .) (eq ($currentPage.Permalink) (.URL | absLangURL)) }} active{{end}}" href="{{ .URL | absLangURL }}" title="{{ .Title }}">{{ .Name }}</a></li>
{{ end }} {{ end }}
</ul> </ul>
</nav> </nav>

View file

@ -0,0 +1 @@
{{- template "_internal/alias.html" (dict "Permalink" .Params.target) -}}

View file

@ -1,4 +1,4 @@
Sitemap: {{ .Site.BaseURL }}/sitemap.xml Sitemap: {{ .Site.BaseURL }}sitemap.xml
# hello robots [^_^] # hello robots [^_^]
# let's be friends <3 # let's be friends <3

View file

@ -238,6 +238,18 @@ small[style^="opacity: .5"] {
opacity: 1 !important; opacity: 1 !important;
} }
/* recentfm styling */
.recent-played {
background: var(--off-bg) !important;
flex-direction:column;
border-radius: 0.5em;
padding: 0.5em;
}
.recent-played-track {
margin: 0.5em 0;
}
/* code overrides */ /* code overrides */
pre, pre,
code, code,

View file

@ -1,6 +1,6 @@
{ {
"name": "", "name": "runtimeterror",
"short_name": "", "short_name": "runtimeterror",
"icons": [ "icons": [
{ {
"src": "/icons/android-chrome-192x192.png", "src": "/icons/android-chrome-192x192.png",
@ -13,7 +13,7 @@
"type": "image/png" "type": "image/png"
} }
], ],
"theme_color": "#ffffff", "theme_color": "#090909",
"background_color": "#ffffff", "background_color": "#090909",
"display": "standalone" "display": "standalone"
} }