Merge branch 'main' into drafts

This commit is contained in:
John Bowdre 2024-05-30 16:06:02 -05:00
commit 48c3370fbb
45 changed files with 403 additions and 157 deletions

View file

@ -1 +1 @@
[![Deployment Status](https://github.com/jbowdre/runtimeterror/actions/workflows/deploy-to-prod.yml/badge.svg)](https://github.com/jbowdre/runtimeterror/actions/workflows/deploy-to-prod.yml)
[![Deployment Status](https://github.com/jbowdre/runtimeterror/actions/workflows/deploy-prod.yml/badge.svg)](https://github.com/jbowdre/runtimeterror/actions/workflows/deploy-prod.yml)

View file

@ -6,7 +6,7 @@ draft: true
description: "This is a new post about..."
featured: false
toc: true
comments: true
reply: true
categories: Tips # Backstage, ChromeOS, Code, Self-Hosting, VMware
tags:
- android

View file

@ -7,6 +7,7 @@ languageCode = "en"
DefaultContentLanguage = "en"
enableInlineShortcodes = true
enableRobotsTXT = true
capitalizeListTitles = false
# define gemini media type
[mediaTypes]

View file

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

View file

@ -37,24 +37,8 @@ robots = [
]
# Comments
comments = true
giscusCategory = "Announcements"
giscusCategoryId = "DIC_kwDOKKEGD84CcG89"
giscusCrossOrigin = "anonymous"
giscusEmitMetadata = "0"
giscusInputPosition = "bottom"
giscusLang = "en"
giscusLoading = "lazy"
giscusMapping = "og:title"
giscusReactions = "0"
giscusRepo = "jbowdre/site-comments"
giscusRepoId = "R_kgDOKKEGDw"
giscusStrict = "0"
giscusTheme = "noborder_gray"
analytics = true
kudos = true
emailReplies = true
reply = true
[author]
name = "John Bowdre"
@ -182,8 +166,8 @@ url = "https://scribbles.jbowdre.lol"
[[socialLinks]]
icon = "fa-solid fa-satellite"
title = "Gemlog"
url = "https://capsule.jbowdre.lol/gemlog/"
title = "Gemini Capsule"
url = "gemini://capsule.jbowdre.lol"
[[socialLinks]]
icon = "fa-solid fa-circle-user"
@ -200,25 +184,35 @@ icon = "fa-solid fa-envelope"
title = "Email"
url = "mailto:jbowdre@omg.lol"
[[powerLinks]]
title = "hugo"
url = "https://gohugo.io"
[[slashPages]]
title = "/about"
url = "/about"
label = "about this site"
[[powerLinks]]
title = "neocities"
url = "https://neocities.org/about"
[[slashPages]]
title = "/changelog"
url = "/changelog"
label = "recent changes to the site"
[[powerLinks]]
title = "risotto"
url = "https://github.com/joeroe/risotto"
[[slashPages]]
title = "/colophon"
url = "/colophon"
label = "how this site works"
[[powerLinks]]
title = "torchlight"
url = "https://torchlight.dev"
[[slashPages]]
title = "/homelab"
url = "/homelab"
label = "my homelab setup"
[[powerLinks]]
title = "tinylytics"
url = "https://tinylytics.app/home"
[[slashPages]]
title = "/save"
url = "/save"
label = "referral links"
[[slashPages]]
title = "/uses"
url = "/uses"
label = "stuff i use"
[[verifyLinks]]
title = "omg.lol"

View file

@ -1,2 +1 @@
comments = true
analytics = false

View file

@ -1,2 +1,2 @@
comments = false
reply = false
analytics = false

View file

@ -3,7 +3,6 @@ title = "404'd!"
noindex = true
timeless = true
comments = true
kudos = false
+++
We're not sure what you were looking for but it's not here.

View file

@ -1,10 +1,14 @@
+++
title = "Hi, I'm John."
description = "A brief introduction to me, this blog, and what you're likely to see here."
timeless = true
comments = false
aliases = ["tldr", "bio"]
+++
---
title: "/about"
date: "2024-05-26T21:19:08Z"
lastmod: "2024-05-29"
description: "A brief introduction to me, this blog, and what you're likely to see here."
timeless: true
toc: false
categories: slashes
---
**Hi, I'm John.**
![Me, +/- a few decades](/images/john.jpg)
You've (somehow) managed to stumble upon my dark corner of the internet[^1].

View file

@ -0,0 +1,8 @@
---
title: slashes
url: /slashes
aliases:
- categories/slashes
description: >
My collection of slashpages.
---

31
content/changelog.md Normal file
View file

@ -0,0 +1,31 @@
---
title: "/changelog"
date: "2024-05-26T21:19:08Z"
lastmod: "2024-05-30"
description: "Maybe I should keep a log of all my site-related tinkering?"
featured: false
toc: false
timeless: true
categories: slashes
---
*High-level list of config/layout changes to the site.*
**2024-05-30:**
- Fix broken styling for taxonomy (categories/tags) feeds
- Open "notes" header link in new tab since it's an external link
- Misc improvements for handling /slashes
**2024-05-29:**
- Display post descriptions (if set) on archive pages; otherwise fall back to summaries
- Add /slashes archive page
- Add /slashes to top menu, add /about
**2024-05-27:**
- Replace "powered by" links with slashpages
**2024-05-26:**
- Begin changelog
- Simplify logic for displaying kudos and post reply buttons
- Reduce gap for paragraphs followed by lists
The full changelog is of course [on GitHub](https://github.com/jbowdre/runtimeterror/commits/main/).

24
content/colophon.md Normal file
View file

@ -0,0 +1,24 @@
---
title: "/colophon"
date: "2024-05-26T22:30:58Z"
lastmod: "2024-05-28"
description: "There's a lot that goes into this site. Let me tell you how it works."
featured: false
toc: true
timeless: true
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`.*
### This site...
- is built with [Hugo](https://gohugo.io/) using 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/)).
- 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/).
- leverages [tinylytics](https://tinylytics.app/) for privacy-friendly analytics and cute kudos buttons.
- uses [bunny.net](https://bunny.net) for DNS and CDN services.
- is published to / hosted by [Neocities](https://neocities.org) with a GitHub Actions workflow ([details](/deploy-hugo-neocities-github-actions/)).
- 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).
Look behind the scenes at [github.com/jbowdre/runtimeterror](https://github.com/jbowdre/runtimeterror).

83
content/homelab.md Normal file
View file

@ -0,0 +1,83 @@
---
title: "/homelab"
date: "2024-05-26T21:30:51Z"
lastmod: "2024-05-28"
aliases:
- playground
description: "The systems I use for fun and enrichment."
featured: false
toc: true
timeless: true
categories: slashes
---
*I enjoy tinkering with small technology projects, and I learn a ton from these experiments. I also self-host a number of apps/services from my home as well as various cloud environments. This page describes some of my technical playground.*
Everything is connected to my [Tailscale](https://tailscale.com) tailnet, with a GitOps-managed ACL to allow access as needed. This lets me access and manage systems without really caring if they're local or remote. [Tailscale is magic](/secure-networking-made-simple-with-tailscale/).
### On Premise
**Proxmox VE 8 Cluster**
- 1x [Intel NUC 9 Extreme (NUC9i9QNX)](https://www.amazon.com/Intel-Extreme-NUC9i9QNX-Single-Model/dp/B0851JV4R8)
- 9th Gen Intel® Core™ i9-9980HK (8 cores @ 2.40GHz)
- 64GB RAM
- 1x 512GB NVMe system drive
- 2x 1TB NVMe drives (ZFS)
- 2x [HP Elite Mini 800 G9](https://www.hp.com/us-en/shop/pdp/hp-elite-mini-800-g9-desktop-pc-p-88u16ua-aba-1)
- 12th Gen Intel® Core™ i7-12700 (8 cores @ 2.10GHz, 4 cores @ 1.60GHz)
- 96GB RAM
- 1x 512GB NVMe system drive
- 1x 2TB NVMe drive (ZFS)
- [Unifi USW Flex XG 10GbE Switch](https://store.ui.com/us/en/collections/unifi-switching-utility-10-gbps-ethernet/products/unifi-flex-xg)
The Proxmox cluster hosts a number of VMs and LXC containers:
- `doc`: Ubuntu 22.04 Docker host for various on-prem container workloads, served via [Tailscale Serve](/tailscale-ssh-serve-funnel/#tailscale-serve) / [Cloudflare Tunnel](/publish-services-cloudflare-tunnel/):
- [Calibre Web](https://github.com/janeczku/calibre-web) for managing my ebooks
- [Crowdsec](https://www.crowdsec.net/) log processor
- [Cyberchef](https://github.com/gchq/CyberChef), the Cyber Swiss Army Knife
- [Hashicorp Vault](https://www.vaultproject.io/) for secrets management
- [Miniflux](https://miniflux.app/) feed reader
- [Tailscale Golink](https://github.com/tailscale/golink), a private shortlink service ([post](/tailscale-golink-private-shortlinks-tailnet/))
- `files`: Ubuntu 20.04 file server. Serves (selected) files semi-publicly through [Tailscale Funnel](/tailscale-ssh-serve-funnel/#tailscale-funnel)
- `hassos`: [Home Assistant OS](https://www.home-assistant.io/installation/), manages all my "smart home" stuff ([post](/automating-camera-notifications-home-assistant-ntfy/))
- `immich`: Ubuntu 22.04 [Immich](https://immich.app/) server
- `ipam`: Ubuntu 20.04 [phpIPAM](https://phpipam.net/) server ([post](/integrating-phpipam-with-vrealize-automation-8/#step-0-phpipam-installation-and-base-configuration))
- `salt`: Ubuntu 20.04 [Salt](https://saltproject.io/) Master server for configuration management
- `unifi`: UniFi Network Application. Manages the Unifi switch.
**Hashicorp Nomad Cluster (WIP)**
- 3x [Zima Blade 7700](https://shop.zimaboard.com/products/zimablade-single-board-server-for-cyber-native)
- Intel® Celeron® N3450 (4 cores @ 1.10GHz)
- 16GB RAM
- 1x 32GB eMMC
- 1x 1TB SATA SSD
- [TP-Link TL-SG108E 1GbE Switch](https://www.tp-link.com/us/home-networking/8-port-switch/tl-sg108e/)
This triad of cute little single-board computers will *eventually* be a combination Nomad + Consul + Vault cluster, fully managed with Salt.
**[PiAware](https://www.flightaware.com/adsb/piaware/build) ADS-B/MLAT Receiver**
- Raspberry Pi 2 Model B
- 2x [RTL-SDR Blog V3 R860 RTL2832U 1PPM TCXO SMA Dongle](https://www.amazon.com/gp/product/B0129EBDS2)
- [SIGNALPLUS 1090MHz 12dBi 1.1m ADS-B Antenna](https://www.amazon.com/gp/product/B08XYRMG3V/)
I like to know what's flying overhead, and I'm also feeding flight data to [flightaware.com](https://flightaware.com) and [adsb.fi](https://adsb.fi).
### Cloud
**[Oracle Cloud Infrastructure](https://www.oracle.com/cloud/free/)**
- `git`: Ubuntu 22.04 [Forgejo](https://forgejo.org/) server for [git.bowdre.net](https://git.bowdre.net/explore/repos)
- `smp2`: Ubuntu 22.04 [SimpleX](/simplex/) server
**[Google Cloud Platform](https://cloud.google.com/free/docs/free-cloud-features)**
- `smp`: Ubuntu 22.04 [SimpleX](/simplex/) server
- `smp1`: Ubuntu 22.04 [SimpleX](/simplex/) server
**[Vultr](https://www.vultr.com)**
- `volly`: Ubuntu 22.04 Docker host for various workloads, served either through [Caddy](https://caddyserver.com/) or [Cloudflare Tunnel](/publish-services-cloudflare-tunnel/):
- [Agate](https://github.com/mbrubeck/agate) Gemini server ([post](/gemini-capsule-gempost-github-actions/))
- [Crowdsec](https://www.crowdsec.net) security engine
- [Kineto](https://github.com/beelux/kineto) Gemini-to-HTTP proxy ([post](/gemini-capsule-gempost-github-actions/))
- [Linkding](https://github.com/sissbruecker/linkding) bookmark manager serving [links.bowdre.net](https://links.bowdre.net/bookmarks/shared)
- [ntfy](https://ntfy.sh/) notification service ([post](/easy-push-notifications-with-ntfy/))
- [SearXNG](https://docs.searxng.org/) self-hosted metasearch engine serving [grep.vpota.to](https://grep.vpota.to) ([post](https://scribbles.jbowdre.lol/post/self-hosting-a-search-engine-iyjdlk6y))
- [Uptime Kuma](https://github.com/louislam/uptime-kuma) for monitoring internal services (via Tailscale)
- [vault-unseal](https://github.com/lrstanley/vault-unseal) to auto-unseal my on-prem Vault instance

View file

@ -6,7 +6,6 @@ description: "Using the power of Home Assistant automations and Ntfy push notifi
featured: true
alias: automating-security-camera-notifications-with-home-assistant-and-ntfy
toc: true
comments: true
thumbnail: thumbnail.png
categories: Self-Hosting
tags:

View file

@ -5,7 +5,6 @@ lastmod: "2024-04-14T02:21:57Z"
description: "Using Hugo to politely ask AI bots to not steal my content - and then configuring Cloudflare's WAF to actively block them, just to be sure."
featured: false
toc: true
comments: true
categories: Backstage
tags:
- cloud

View file

@ -5,7 +5,6 @@ date: 2024-01-21
description: "Using GitHub Actions to automatically deploy a Hugo website to Neocities."
featured: false
toc: true
comments: true
categories: Backstage
tags:
- cicd

View file

@ -6,7 +6,6 @@ description: "Using a GitHub Actions workflow to retrieve data from an authentic
featured: false
thumbnail: "finished-product.png"
toc: true
comments: true
categories: Backstage
tags:
- api

View file

@ -4,7 +4,6 @@ date: 2023-11-24
description: "I moved my homelab from VMware vSphere to Proxmox VE, and my only regret is that I didn't make this change sooner."
featured: false
toc: true
comments: true
categories: Tips # Projects, Code
tags:
- homelab

View file

@ -5,7 +5,6 @@ date: "2024-02-19T04:12:27Z"
description: "Using Hugo built-in functions to dynamically generate OpenGraph share images for every post."
featured: false
toc: true
comments: true
thumbnail: hugo-logo-wide.png
categories: Backstage
tags:

View file

@ -5,7 +5,6 @@ lastmod: 2023-12-22
description: "Deploying and configuring a self-hosted pub-sub notification handler, getting another server to send a notifcation when it boots, and integrating the notification handler into Home Assistant."
featured: false
toc: true
comments: true
categories: Self-Hosting
tags:
- android

View file

@ -4,7 +4,6 @@ date: 2024-01-19
# lastmod: 2024-01-19
description: "Never in my life have I seen enabling FIPS *fix* a problem - until now."
featured: false
comments: true
categories: VMware
tags:
- vmware

View file

@ -5,7 +5,6 @@ lastmod: "2024-04-05T21:07:38Z"
description: "Deploying a Gemini capsule, powered by Agate, gempost, kineto, Tailscale, and GitHub Actions"
featured: false
toc: true
comments: true
categories: Self-Hosting
tags:
- caddy

View file

@ -1,11 +1,11 @@
---
title: "Prettify Hugo RSS Feeds with XSLT"
date: 2024-04-30
lastmod: "2024-05-30"
description: "Making my Hugo-generated RSS XML look as good to human visitors as it does to feed readers."
featured: false
thumbnail: pretty-feed.png
toc: true
comments: true
categories: Backstage
tags:
- hugo
@ -96,7 +96,7 @@ All I really need to do to get this XML ready to be styled is just link in a sty
{{- $pages = $pages | first $limit -}}
{{- end -}}
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
{{ printf "<?xml-stylesheet type=\"text/xsl\" href=\"xml/feed.xsl\" media=\"all\"?>" | safeHTML }} <!-- [tl! ++ ] -->
{{ printf "<?xml-stylesheet type=\"text/xsl\" href=\"/xml/feed.xsl\" media=\"all\"?>" | safeHTML }} <!-- [tl! ++ ] -->
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:content="http://purl.org/rss/1.0/modules/content/"

View file

@ -5,7 +5,6 @@ date: 2024-01-15
description: "Exploring Cloudflare Tunnel as an alternative to Tailscale Funnel for secure public access to internal resources."
featured: false
toc: true
comments: true
categories: Self-Hosting
tags:
- cloudflare

View file

@ -5,7 +5,6 @@ lastmod: 2024-02-03
description: "A hasty Salt state to deploy netdata monitoring and publish it internally on my tailnet with Tailscale Serve"
featured: false
toc: true
comments: true
categories: Code
tags:
- homelab

View file

@ -5,7 +5,6 @@ lastmod: 2023-11-13
description: "Syntax highlighting powered by the Torchlight.dev API makes it easier to dress up code blocks. Here's an overview of what I did to replace this blog's built-in Hugo highlighter (Chroma) with Torchlight."
featured: false
toc: true
comments: true
categories: Backstage
tags:
- javascript

View file

@ -5,7 +5,6 @@ date: 2023-10-15
description: "Quick notes on using `systemctl edit` to override a systemd service to delay its startup."
featured: false
toc: false
comments: true
categories: Tips # Projects, Code
tags:
- crostini

View file

@ -5,7 +5,6 @@ lastmod: 2024-02-07
description: "Using Docker Compose to deploy containerized applications and make them available via Tailscale Serve and Tailscale Funnel"
featured: false
toc: true
comments: true
categories: Self-Hosting
tags:
- containers

View file

@ -5,7 +5,6 @@ date: 2023-12-20
description: "Exploring some of my favorite Tailscale addon features: SSH, Serve, and Funnel."
featured: false
toc: true
comments: true
categories: Tips # Projects, Code
tags:
- homelab

View file

@ -1,11 +1,10 @@
---
title: "Using a Custom Font with Hugo"
date: 2024-04-28
# lastmod: 2024-04-23
lastmod: "2024-05-01T13:29:30Z"
description: "Installing a custom font on a Hugo site, and taking steps to protect the paid font files from unauthorized distribution. Plus a brief exploration of a pair of storage CDNs, and using Tailscale in a GitHub Actions workflow."
featured: false
toc: true
comments: true
categories: Backstage
tags:
- bunny
@ -56,7 +55,7 @@ And that would be the end of things if I could expect that everyone who visited
That provides a few more options to fall back to if the preferred font isn't available. But let's see about making that font available.
#### Hosted Locally
I can use a `@font-face` rule to tell the browser how to find the `.woff2`/`.woff` files for my preferred web font, and I could just set the `src: url` parameter to point to a local path in my Hugo environment:
I can use a `@font-face` rule to tell the browser how to find the `.woff2` file for my preferred web font, and I could just set the `src: url` parameter to point to a local path in my Hugo environment:
```css
/* load preferred font */
@ -68,10 +67,15 @@ I can use a `@font-face` rule to tell the browser how to find the `.woff2`/`.wof
src: local('Berkeley Mono'),
/* otherwise look at these paths */
url('/fonts/BerkeleyMono.woff2') format('woff2'),
url('/fonts/BerkeleyMono.woff') format('woff')
}
```
{{% notice note "WOFF2 vs WOFF(1)" %}}
A previous version of this post also included the `.woff` file in addition to `.woff2`. A kind reader let me know that [basically everything](https://caniuse.com/?search=woff2) supports `.woff2`, and since `.woff2` offers much better compression than first-generation `.woff` there *really* isn't any reason to offer a font in `.woff` format in this modern age. I can just offer `.woff2` on its own.
I've updated this post, my CSS, and the contents of my CDN storage accordingly.
{{% /notice %}}
And that would work just fine... but it *would* require storing those web font files in the (public) [GitHub repo](https://github.com/jbowdre/runtimeterror) which powers my site, and I'd rather not store any paid font files there.
So instead, I opted to try using a [Content Delivery Network (CDN)](https://en.wikipedia.org/wiki/Content_delivery_network) to host the font files. This would allow for some degree of access control, help me learn more about a web technology I hadn't played with much, and make use of a cool `cdn.*` subdomain in the process.
@ -112,8 +116,6 @@ Then I just needed to update the `@font-face` rule accordingly:
src: local('Berkeley Mono'),
url('/fonts/BerkeleyMono.woff2') format('woff2'), /* [tl! --] */
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono.woff2') format('woff2'), /* [tl! ++] */
url('/fonts/BerkeleyMono.woff') format('woff') /* [tl! --] */
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono.woff') format('woff') /* [tl! ++] */
}
```
@ -143,7 +145,6 @@ I made sure to use the same paths as I had on Cloudflare so I didn't need to upd
font-display: fallback;
src: local('Berkeley Mono'),
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono.woff2') format('woff2'),
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono.woff') format('woff')
}
```

View file

@ -6,7 +6,6 @@ timeless: true
draft: false
description: "This blog has migrated from virtuallypotato.com to runtimeterror.dev."
toc: false
comments: true
categories: Backstage
tags:
- meta

22
content/save.md Normal file
View file

@ -0,0 +1,22 @@
---
title: "/save"
date: "2024-05-28T00:25:51Z"
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,5 +1,5 @@
+++
comments = false
reply = false
toc = false
usePageBundles = false
showDate = false

View file

@ -1,19 +1,76 @@
---
title: "Stuff I Use"
date: "2024-01-19T04:15:31Z"
title: "/uses"
date: "2024-05-29"
# lastmod: {{ .Date | time.Format "2006-01-02" }}
description: "The hardware, software, and services which keep me going."
description: "The hardware, software, services, and gear which I use (almost) daily."
toc: true
draft: true
comments: true
timeless: true
categories: slashes
---
Here's the stuff I use and how I use it.
*Here's some of the stuff I use and how I use it.*
### Hardware
- **[Framework Laptop Chromebook Edition](https://frame.work/products/laptop-chromebook-12-gen-intel)** (i5-1240P | 32GB RAM | 1TB NVMe). This is my primary personal computing device. Yep, it's an overpowered Chromebook, and I make full use of the [Linux Development Environment](https://www.chromium.org/chromium-os/developer-library/guides/containers/containers-and-vms/) to Do Things. I love it.
-
*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://scribbles.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 pockets/backpack?*
- **[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://scribbles.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.
- **[Ti EDC Backpack](https://bigidesign.com/pages/ti-edc-backpack-landing-page)** for carrying my stuff.
- **[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

@ -11,7 +11,7 @@
{{- $pages = $pages | first $limit -}}
{{- end -}}
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
{{ printf "<?xml-stylesheet type=\"text/xsl\" href=\"xml/feed.xsl\" media=\"all\"?>" | safeHTML }}
{{ printf "<?xml-stylesheet type=\"text/xsl\" href=\"/xml/feed.xsl\" media=\"all\"?>" | safeHTML }}
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:content="http://purl.org/rss/1.0/modules/content/"

View file

@ -45,7 +45,12 @@
---
{{ $subject := printf "Re: %s" .Title -}}
=> mailto:blog@runtimeterror.dev?subject={{ urlquery $subject | replaceRE `\+` "%20" }} 📧 Reply via email
{{ $subject := urlquery $subject | replaceRE `\+` "%20" }}
{{ $path := .Page.RelPermalink | path.Dir -}}
{{ $path := strings.Trim $path "/" -}}
{{ $address := printf "blogreply.%s@%s" $path "runtimeterror.dev" -}}
=> mailto:{{ $address }}?subject={{ $subject }} 📧 Reply by email
{{ $related := first 3 (where (where .Site.RegularPages.ByDate.Reverse ".Params.tags" "intersect" .Params.tags) "Permalink" "!=" .Permalink) }}
{{ if $related }}
## Related articles

View file

@ -33,36 +33,23 @@
<div class="content__body">
{{ .Content }}
</div>
{{- $showComments := true }}
{{- if eq .Site.Params.comments false }}
{{- $showComments = false }}
{{- else if eq .Params.comments false }}
{{- $showComments = false }}
{{- $reply := true }}
{{- if eq .Site.Params.reply false }}
{{- $reply = false }}
{{- else if eq .Params.reply false }}
{{- $reply = false }}
{{- end }}
{{- if ne $showComments false }}
{{- if or (eq $reply true) (eq .Site.Params.analytics "true") }}
<hr>
{{- $showKudos := true }}
{{- if eq .Site.Params.kudos false }}
{{- $showKudos = false }}
{{- else if eq .Params.kudos false }}
{{- $showKudos = false }}
{{- end }}
{{- if and (eq .Site.Params.analytics true) (ne $showKudos false) }}
{{- if eq .Site.Params.analytics true }}
<span class="post_kudos"><button class="tinylytics_kudos"></button></span>
{{- end }}
{{- $emailReplies := true }}
{{- if eq .Site.Params.emailReplies false }}
{{- $emailReplies = false }}
{{- else if eq .Params.emailReplies false }}
{{- $emailReplies = false }}
{{- if (eq $reply true) }}
{{- $path := .Page.RelPermalink | path.Dir }}
{{- $path := strings.Trim $path "/" }}
{{- $address := printf "blogreply.%s@%s" $path "runtimeterror.dev" }}
<span class="post_email_reply"><a href="mailto:{{ $address }}?Subject=Re: {{ .Title }}">📧 Reply by email</a></span>
{{- end }}
{{- if and (eq .Site.Params.comments true) (ne $emailReplies false) }}
<span class="post_email_reply"><a href="mailto:blogreply-{{ .Title | truncate 40 | urlize}}@runtimeterror.dev?Subject=Re: {{ .Title }}">📧 Reply by email</a></span>
{{- end }}
<br><details class="comments_widget"><summary>Comments</summary>
{{- partial "comments" . }}
</details>
{{- end }}
<footer class="content__footer"></footer>
{{ end }}

View file

@ -10,7 +10,7 @@
<ul class="aside__social-links">
{{ range $item := .Site.Params.socialLinks }}
<li>
<a target="_blank" href="{{ $item.url }}" rel="me" aria-label="{{ $item.title }}" title="{{ $item.title }}"><i class="{{ $item.icon }}" aria-hidden="true"></i></a>&nbsp;
<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;
</li>
{{ end }}
</ul>

View file

@ -6,8 +6,13 @@
{{ if .IsHome }}
<h1>{{ site.Params.indexTitle | markdownify }}</h1>
{{ else }}
{{ if eq .Title "slashes" }}
<h1>/slashes</h1>
<i>My collection of <a target="_blank" title="what's a slashpage?" href="https://slashpages.net">slashpages</a>.</i><hr>
{{ 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>
{{ with .Description }}<i>{{ . }}</i><hr>{{ else }}<br>{{ end }}
{{ end }}
{{ end }}{{ end }}
{{ .Content }}
</header>
@ -43,6 +48,25 @@
{{ end }}
{{- end }}
{{- else }}
{{- if eq .Title "slashes" }}
{{- $sortedSlashes := sort $pages "Title" }}
{{- range $sortedSlashes }}
{{- $postDate := .Date.Format "2006-01-02" }}
{{- $updateDate := .Lastmod.Format "2006-01-02" }}
<article class="post">
<header class="post__header">
<h1><a href="{{ .Permalink }}">{{ .Title | markdownify }}</a></h1>
<p class="post__meta">
<span class="date">["{{- $postDate }}"{{- if ne $postDate $updateDate }}, "{{ $updateDate }}"{{ end }}]</span>
</p>
</header>
<section class="post__summary">
{{ .Description }}
</section>
<hr>
</article>
{{- end }}
{{- else }}
{{- range (.Paginate $pages).Pages }}
{{- $postDate := .Date.Format "2006-01-02" }}
{{- $updateDate := .Lastmod.Format "2006-01-02" }}
@ -54,10 +78,11 @@
</p>
</header>
<section class="post__summary">
{{ .Summary }}
{{if .Description }}{{ .Description }}{{ else }}{{ .Summary }}{{ end }}
</section>
<hr>
</article>
{{- end }}
{{- template "_internal/pagination.html" . }}
{{- end }}
{{- end }}

View file

@ -10,7 +10,18 @@
{{ if isset .Params "categories" }}
{{$related := where .Site.RegularPages ".Params.categories" "eq" .Params.categories }}
{{- $relatedLimit := default 8 .Site.Params.numberOfRelatedPosts }}
{{ if eq .Params.categories "slashes" }}
<h3>More {{ .Params.categories }}</h3>
{{ $sortedPosts := sort $related "Title" }}
<ul>
{{- range $sortedPosts }}
<li>
<a href="{{ .Permalink }}" title="{{ .Title }}">{{ .Title | markdownify }}</a>
</li>
{{ end }}
</ul>
{{ else }}
<h3>More /slashes</h3>
<ul>
{{- range first $relatedLimit $related }}
<li>
@ -21,8 +32,9 @@
<li>
<a href="/categories/{{ lower .Params.categories }}/"><i>See all {{ .Params.categories }}</i></a>
</li>
{{ end }}
{{ end }}
</ul>
{{ end }}
<hr>
{{ end }}

View file

@ -1,20 +0,0 @@
{{ if isset site.Params "giscusrepo" }}
<div class="post_comments">
<script src="https://giscus.runtimeterror.dev/client.js"
data-repo="{{ .Site.Params.giscusRepo }}"
data-repo-id="{{ .Site.Params.giscusRepoId }}"
data-category="{{ .Site.Params.giscusCategory }}"
data-category-id="{{ .Site.Params.giscusCategoryId }}"
data-mapping="{{ .Site.Params.giscusMapping }}"
data-strict="{{ .Site.Params.giscusStrict }}"
data-reactions-enabled="{{ .Site.Params.giscusReactions }}"
data-emit-metadata="{{ .Site.Params.giscusEmitMetadata }}"
data-input-position="{{ .Site.Params.giscusInputPosition }}"
data-theme="{{ .Site.Params.giscusTheme }}"
data-lang="{{ .Site.Params.giscusLang }}"
data-loading="{{ .Site.Params.giscusLoading }}"
crossorigin="{{ .Site.Params.giscusCrossOrigin }}"
async>
</script>
</div>
{{ end }}

View file

@ -1,6 +1,5 @@
{{- partial "lang.html" . -}}
<p class="copyright">{{ .Site.Copyright | markdownify }}</p>
<p class="powered_by">{"powered_by": [{{- range $i, $link := .Site.Params.powerLinks }}{{ if $i }}, {{ end }}&quot;<a target="_blank" href="{{ $link.url }}">{{ $link.title }}</a>&quot;{{ end }}]}
<p class="footer_links">{"<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 }}]}
<br>&lt;<a target="_blank" href="https://github.com/jbowdre/runtimeterror">view source</a>&gt;</p>
<!-- Back to Top button via https://github.com/vfeskov/vanilla-back-to-top -->

View file

@ -0,0 +1,10 @@
<nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="{{ .Site.BaseURL }}" class="page__logo-inner">{{ .Site.Title }}</a></h1>
{{ $currentPage := . }}
{{ 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>
{{ end }}
</ul>
</nav>

View file

@ -12,7 +12,6 @@
font-display: fallback;
src: local('Berkeley Mono'),
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono-Regular.woff2') format('woff2'),
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono-Regular.woff') format('woff')
}
/* override page max-width */
@ -36,18 +35,18 @@
line-height: 1.3rem;
}
.powered_by {
.footer_links {
font-size: 12px;
line-height: 1.1rem;
color: var(--muted);
}
.powered_by a:link, .powered_by a:visited {
.footer_links a:link, .footer_links a:visited {
color: var(--off-fg);
text-decoration: none;
}
.powered_by a:hover {
.footer_links a:hover {
color: var(--hover);
text-decoration: underline;
}
@ -393,15 +392,13 @@ hr {
margin-top: 1.5rem;
}
/* summary styling */
details {
cursor: pointer;
/* no extra space for paragraphs with lists */
p:not(:has(+ ol)),
p:not(:has(+ ul)) {
margin-bottom: 1.5em;
}
details.comments_widget summary::before {
content: 'Load ';
}
details[open].comments_widget summary::before {
content: 'Hide ';
p:has(+ ol),
p:has(+ ul) {
margin-bottom: 0;
}

View file

@ -8,7 +8,7 @@
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width"/>
<title><xsl:value-of select="rss/channel/title"/> (RSS)</title>
<style><![CDATA[html{margin:0;padding:0;}body{color:font-size:1.1rem;line-height:1.4;margin:5%;max-width:35rem;padding:0;}input{min-width:20rem;margin-left:.2rem;padding-left:.2rem;padding-right:.2rem;}h2{font-size:22px;font-weight:inherit;}h3:before{content:"" !important;}]]></style>
<style><![CDATA[html{margin:0;padding:0;}body{color:font-size:1.1rem;line-height:1.4;margin:5%;max-width:35rem;padding:0;}input{min-width:35rem;margin-left:.2rem;padding-left:.2rem;padding-right:.2rem;}h2{font-size:22px;font-weight:inherit;}h3:before{content:"" !important;}]]></style>
<link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16x16.png" />