mirror of
https://github.com/jbowdre/runtimeterror.git
synced 2024-11-22 06:52:18 +00:00
Merge branch 'main' into drafts
This commit is contained in:
commit
48c3370fbb
45 changed files with 403 additions and 157 deletions
|
@ -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)
|
|
@ -6,7 +6,7 @@ draft: true
|
||||||
description: "This is a new post about..."
|
description: "This is a new post about..."
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
reply: true
|
||||||
categories: Tips # Backstage, ChromeOS, Code, Self-Hosting, VMware
|
categories: Tips # Backstage, ChromeOS, Code, Self-Hosting, VMware
|
||||||
tags:
|
tags:
|
||||||
- android
|
- android
|
||||||
|
|
|
@ -7,6 +7,7 @@ languageCode = "en"
|
||||||
DefaultContentLanguage = "en"
|
DefaultContentLanguage = "en"
|
||||||
enableInlineShortcodes = true
|
enableInlineShortcodes = true
|
||||||
enableRobotsTXT = true
|
enableRobotsTXT = true
|
||||||
|
capitalizeListTitles = false
|
||||||
|
|
||||||
# define gemini media type
|
# define gemini media type
|
||||||
[mediaTypes]
|
[mediaTypes]
|
||||||
|
|
|
@ -9,21 +9,45 @@
|
||||||
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 = "virtuallypotato"
|
identifier = "backstage"
|
||||||
name = "whereis virtuallypotato"
|
name = "backstage"
|
||||||
url = "/virtuallypotato-runtimeterror/"
|
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
|
weight = 100
|
||||||
|
[[main.params]]
|
||||||
|
target = "_blank"
|
||||||
|
|
|
@ -37,24 +37,8 @@ robots = [
|
||||||
]
|
]
|
||||||
|
|
||||||
# Comments
|
# 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
|
analytics = true
|
||||||
kudos = true
|
reply = true
|
||||||
emailReplies = true
|
|
||||||
|
|
||||||
[author]
|
[author]
|
||||||
name = "John Bowdre"
|
name = "John Bowdre"
|
||||||
|
@ -182,8 +166,8 @@ url = "https://scribbles.jbowdre.lol"
|
||||||
|
|
||||||
[[socialLinks]]
|
[[socialLinks]]
|
||||||
icon = "fa-solid fa-satellite"
|
icon = "fa-solid fa-satellite"
|
||||||
title = "Gemlog"
|
title = "Gemini Capsule"
|
||||||
url = "https://capsule.jbowdre.lol/gemlog/"
|
url = "gemini://capsule.jbowdre.lol"
|
||||||
|
|
||||||
[[socialLinks]]
|
[[socialLinks]]
|
||||||
icon = "fa-solid fa-circle-user"
|
icon = "fa-solid fa-circle-user"
|
||||||
|
@ -200,25 +184,35 @@ icon = "fa-solid fa-envelope"
|
||||||
title = "Email"
|
title = "Email"
|
||||||
url = "mailto:jbowdre@omg.lol"
|
url = "mailto:jbowdre@omg.lol"
|
||||||
|
|
||||||
[[powerLinks]]
|
[[slashPages]]
|
||||||
title = "hugo"
|
title = "/about"
|
||||||
url = "https://gohugo.io"
|
url = "/about"
|
||||||
|
label = "about this site"
|
||||||
|
|
||||||
[[powerLinks]]
|
[[slashPages]]
|
||||||
title = "neocities"
|
title = "/changelog"
|
||||||
url = "https://neocities.org/about"
|
url = "/changelog"
|
||||||
|
label = "recent changes to the site"
|
||||||
|
|
||||||
[[powerLinks]]
|
[[slashPages]]
|
||||||
title = "risotto"
|
title = "/colophon"
|
||||||
url = "https://github.com/joeroe/risotto"
|
url = "/colophon"
|
||||||
|
label = "how this site works"
|
||||||
|
|
||||||
[[powerLinks]]
|
[[slashPages]]
|
||||||
title = "torchlight"
|
title = "/homelab"
|
||||||
url = "https://torchlight.dev"
|
url = "/homelab"
|
||||||
|
label = "my homelab setup"
|
||||||
|
|
||||||
[[powerLinks]]
|
[[slashPages]]
|
||||||
title = "tinylytics"
|
title = "/save"
|
||||||
url = "https://tinylytics.app/home"
|
url = "/save"
|
||||||
|
label = "referral links"
|
||||||
|
|
||||||
|
[[slashPages]]
|
||||||
|
title = "/uses"
|
||||||
|
url = "/uses"
|
||||||
|
label = "stuff i use"
|
||||||
|
|
||||||
[[verifyLinks]]
|
[[verifyLinks]]
|
||||||
title = "omg.lol"
|
title = "omg.lol"
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
comments = true
|
|
||||||
analytics = false
|
analytics = false
|
|
@ -1,2 +1,2 @@
|
||||||
comments = false
|
reply = false
|
||||||
analytics = false
|
analytics = false
|
|
@ -3,7 +3,6 @@ title = "404'd!"
|
||||||
noindex = true
|
noindex = true
|
||||||
timeless = true
|
timeless = true
|
||||||
comments = true
|
comments = true
|
||||||
kudos = false
|
|
||||||
+++
|
+++
|
||||||
|
|
||||||
We're not sure what you were looking for but it's not here.
|
We're not sure what you were looking for but it's not here.
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
+++
|
---
|
||||||
title = "Hi, I'm John."
|
title: "/about"
|
||||||
description = "A brief introduction to me, this blog, and what you're likely to see here."
|
date: "2024-05-26T21:19:08Z"
|
||||||
timeless = true
|
lastmod: "2024-05-29"
|
||||||
comments = false
|
description: "A brief introduction to me, this blog, and what you're likely to see here."
|
||||||
aliases = ["tldr", "bio"]
|
timeless: true
|
||||||
+++
|
toc: false
|
||||||
|
categories: slashes
|
||||||
|
---
|
||||||
|
**Hi, I'm John.**
|
||||||
|
|
||||||
![Me, +/- a few decades](/images/john.jpg)
|
![Me, +/- a few decades](/images/john.jpg)
|
||||||
|
|
||||||
You've (somehow) managed to stumble upon my dark corner of the internet[^1].
|
You've (somehow) managed to stumble upon my dark corner of the internet[^1].
|
||||||
|
|
8
content/categories/slashes/_index.md
Normal file
8
content/categories/slashes/_index.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
title: slashes
|
||||||
|
url: /slashes
|
||||||
|
aliases:
|
||||||
|
- categories/slashes
|
||||||
|
description: >
|
||||||
|
My collection of slashpages.
|
||||||
|
---
|
31
content/changelog.md
Normal file
31
content/changelog.md
Normal 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
24
content/colophon.md
Normal 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
83
content/homelab.md
Normal 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
|
|
@ -6,7 +6,6 @@ description: "Using the power of Home Assistant automations and Ntfy push notifi
|
||||||
featured: true
|
featured: true
|
||||||
alias: automating-security-camera-notifications-with-home-assistant-and-ntfy
|
alias: automating-security-camera-notifications-with-home-assistant-and-ntfy
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
thumbnail: thumbnail.png
|
thumbnail: thumbnail.png
|
||||||
categories: Self-Hosting
|
categories: Self-Hosting
|
||||||
tags:
|
tags:
|
||||||
|
|
|
@ -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."
|
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
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Backstage
|
categories: Backstage
|
||||||
tags:
|
tags:
|
||||||
- cloud
|
- cloud
|
||||||
|
|
|
@ -5,7 +5,6 @@ date: 2024-01-21
|
||||||
description: "Using GitHub Actions to automatically deploy a Hugo website to Neocities."
|
description: "Using GitHub Actions to automatically deploy a Hugo website to Neocities."
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Backstage
|
categories: Backstage
|
||||||
tags:
|
tags:
|
||||||
- cicd
|
- cicd
|
||||||
|
|
|
@ -6,7 +6,6 @@ description: "Using a GitHub Actions workflow to retrieve data from an authentic
|
||||||
featured: false
|
featured: false
|
||||||
thumbnail: "finished-product.png"
|
thumbnail: "finished-product.png"
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Backstage
|
categories: Backstage
|
||||||
tags:
|
tags:
|
||||||
- api
|
- api
|
||||||
|
|
|
@ -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."
|
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
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Tips # Projects, Code
|
categories: Tips # Projects, Code
|
||||||
tags:
|
tags:
|
||||||
- homelab
|
- homelab
|
||||||
|
|
|
@ -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."
|
description: "Using Hugo built-in functions to dynamically generate OpenGraph share images for every post."
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
thumbnail: hugo-logo-wide.png
|
thumbnail: hugo-logo-wide.png
|
||||||
categories: Backstage
|
categories: Backstage
|
||||||
tags:
|
tags:
|
||||||
|
|
|
@ -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."
|
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
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Self-Hosting
|
categories: Self-Hosting
|
||||||
tags:
|
tags:
|
||||||
- android
|
- android
|
||||||
|
|
|
@ -4,7 +4,6 @@ date: 2024-01-19
|
||||||
# lastmod: 2024-01-19
|
# lastmod: 2024-01-19
|
||||||
description: "Never in my life have I seen enabling FIPS *fix* a problem - until now."
|
description: "Never in my life have I seen enabling FIPS *fix* a problem - until now."
|
||||||
featured: false
|
featured: false
|
||||||
comments: true
|
|
||||||
categories: VMware
|
categories: VMware
|
||||||
tags:
|
tags:
|
||||||
- vmware
|
- vmware
|
||||||
|
|
|
@ -5,7 +5,6 @@ lastmod: "2024-04-05T21:07:38Z"
|
||||||
description: "Deploying a Gemini capsule, powered by Agate, gempost, kineto, Tailscale, and GitHub Actions"
|
description: "Deploying a Gemini capsule, powered by Agate, gempost, kineto, Tailscale, and GitHub Actions"
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Self-Hosting
|
categories: Self-Hosting
|
||||||
tags:
|
tags:
|
||||||
- caddy
|
- caddy
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
---
|
---
|
||||||
title: "Prettify Hugo RSS Feeds with XSLT"
|
title: "Prettify Hugo RSS Feeds with XSLT"
|
||||||
date: 2024-04-30
|
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."
|
description: "Making my Hugo-generated RSS XML look as good to human visitors as it does to feed readers."
|
||||||
featured: false
|
featured: false
|
||||||
thumbnail: pretty-feed.png
|
thumbnail: pretty-feed.png
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Backstage
|
categories: Backstage
|
||||||
tags:
|
tags:
|
||||||
- hugo
|
- 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 -}}
|
{{- $pages = $pages | first $limit -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
|
{{- 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"
|
<rss version="2.0"
|
||||||
xmlns:atom="http://www.w3.org/2005/Atom"
|
xmlns:atom="http://www.w3.org/2005/Atom"
|
||||||
xmlns:content="http://purl.org/rss/1.0/modules/content/"
|
xmlns:content="http://purl.org/rss/1.0/modules/content/"
|
||||||
|
|
|
@ -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."
|
description: "Exploring Cloudflare Tunnel as an alternative to Tailscale Funnel for secure public access to internal resources."
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Self-Hosting
|
categories: Self-Hosting
|
||||||
tags:
|
tags:
|
||||||
- cloudflare
|
- cloudflare
|
||||||
|
|
|
@ -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"
|
description: "A hasty Salt state to deploy netdata monitoring and publish it internally on my tailnet with Tailscale Serve"
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Code
|
categories: Code
|
||||||
tags:
|
tags:
|
||||||
- homelab
|
- homelab
|
||||||
|
|
|
@ -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."
|
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
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Backstage
|
categories: Backstage
|
||||||
tags:
|
tags:
|
||||||
- javascript
|
- javascript
|
||||||
|
|
|
@ -5,7 +5,6 @@ date: 2023-10-15
|
||||||
description: "Quick notes on using `systemctl edit` to override a systemd service to delay its startup."
|
description: "Quick notes on using `systemctl edit` to override a systemd service to delay its startup."
|
||||||
featured: false
|
featured: false
|
||||||
toc: false
|
toc: false
|
||||||
comments: true
|
|
||||||
categories: Tips # Projects, Code
|
categories: Tips # Projects, Code
|
||||||
tags:
|
tags:
|
||||||
- crostini
|
- crostini
|
||||||
|
|
|
@ -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"
|
description: "Using Docker Compose to deploy containerized applications and make them available via Tailscale Serve and Tailscale Funnel"
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Self-Hosting
|
categories: Self-Hosting
|
||||||
tags:
|
tags:
|
||||||
- containers
|
- containers
|
||||||
|
|
|
@ -5,7 +5,6 @@ date: 2023-12-20
|
||||||
description: "Exploring some of my favorite Tailscale addon features: SSH, Serve, and Funnel."
|
description: "Exploring some of my favorite Tailscale addon features: SSH, Serve, and Funnel."
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Tips # Projects, Code
|
categories: Tips # Projects, Code
|
||||||
tags:
|
tags:
|
||||||
- homelab
|
- homelab
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
---
|
---
|
||||||
title: "Using a Custom Font with Hugo"
|
title: "Using a Custom Font with Hugo"
|
||||||
date: 2024-04-28
|
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."
|
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
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
comments: true
|
|
||||||
categories: Backstage
|
categories: Backstage
|
||||||
tags:
|
tags:
|
||||||
- bunny
|
- 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.
|
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
|
#### 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
|
```css
|
||||||
/* load preferred font */
|
/* 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'),
|
src: local('Berkeley Mono'),
|
||||||
/* otherwise look at these paths */
|
/* otherwise look at these paths */
|
||||||
url('/fonts/BerkeleyMono.woff2') format('woff2'),
|
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.
|
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.
|
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'),
|
src: local('Berkeley Mono'),
|
||||||
url('/fonts/BerkeleyMono.woff2') format('woff2'), /* [tl! --] */
|
url('/fonts/BerkeleyMono.woff2') format('woff2'), /* [tl! --] */
|
||||||
url('https://cdn.runtimeterror.dev/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;
|
font-display: fallback;
|
||||||
src: local('Berkeley Mono'),
|
src: local('Berkeley Mono'),
|
||||||
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono.woff2') format('woff2'),
|
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono.woff2') format('woff2'),
|
||||||
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono.woff') format('woff')
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ timeless: true
|
||||||
draft: false
|
draft: false
|
||||||
description: "This blog has migrated from virtuallypotato.com to runtimeterror.dev."
|
description: "This blog has migrated from virtuallypotato.com to runtimeterror.dev."
|
||||||
toc: false
|
toc: false
|
||||||
comments: true
|
|
||||||
categories: Backstage
|
categories: Backstage
|
||||||
tags:
|
tags:
|
||||||
- meta
|
- meta
|
||||||
|
|
22
content/save.md
Normal file
22
content/save.md
Normal 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
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
+++
|
+++
|
||||||
comments = false
|
reply = false
|
||||||
toc = false
|
toc = false
|
||||||
usePageBundles = false
|
usePageBundles = false
|
||||||
showDate = false
|
showDate = false
|
||||||
|
|
|
@ -1,19 +1,76 @@
|
||||||
---
|
---
|
||||||
title: "Stuff I Use"
|
title: "/uses"
|
||||||
date: "2024-01-19T04:15:31Z"
|
date: "2024-05-29"
|
||||||
# lastmod: {{ .Date | time.Format "2006-01-02" }}
|
# 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
|
toc: true
|
||||||
draft: true
|
|
||||||
comments: true
|
|
||||||
timeless: 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
|
### 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
|
### 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
|
### 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.
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
{{- $pages = $pages | first $limit -}}
|
{{- $pages = $pages | first $limit -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
|
{{- 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"
|
<rss version="2.0"
|
||||||
xmlns:atom="http://www.w3.org/2005/Atom"
|
xmlns:atom="http://www.w3.org/2005/Atom"
|
||||||
xmlns:content="http://purl.org/rss/1.0/modules/content/"
|
xmlns:content="http://purl.org/rss/1.0/modules/content/"
|
||||||
|
|
|
@ -45,7 +45,12 @@
|
||||||
|
|
||||||
---
|
---
|
||||||
{{ $subject := printf "Re: %s" .Title -}}
|
{{ $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) }}
|
{{ $related := first 3 (where (where .Site.RegularPages.ByDate.Reverse ".Params.tags" "intersect" .Params.tags) "Permalink" "!=" .Permalink) }}
|
||||||
{{ if $related }}
|
{{ if $related }}
|
||||||
## Related articles
|
## Related articles
|
||||||
|
|
|
@ -33,36 +33,23 @@
|
||||||
<div class="content__body">
|
<div class="content__body">
|
||||||
{{ .Content }}
|
{{ .Content }}
|
||||||
</div>
|
</div>
|
||||||
|
{{- $reply := true }}
|
||||||
{{- $showComments := true }}
|
{{- if eq .Site.Params.reply false }}
|
||||||
{{- if eq .Site.Params.comments false }}
|
{{- $reply = false }}
|
||||||
{{- $showComments = false }}
|
{{- else if eq .Params.reply false }}
|
||||||
{{- else if eq .Params.comments false }}
|
{{- $reply = false }}
|
||||||
{{- $showComments = false }}
|
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- if ne $showComments false }}
|
{{- if or (eq $reply true) (eq .Site.Params.analytics "true") }}
|
||||||
<hr>
|
<hr>
|
||||||
{{- $showKudos := true }}
|
{{- if eq .Site.Params.analytics 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) }}
|
|
||||||
<span class="post_kudos"><button class="tinylytics_kudos"></button></span>
|
<span class="post_kudos"><button class="tinylytics_kudos"></button></span>
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- $emailReplies := true }}
|
{{- if (eq $reply true) }}
|
||||||
{{- if eq .Site.Params.emailReplies false }}
|
{{- $path := .Page.RelPermalink | path.Dir }}
|
||||||
{{- $emailReplies = false }}
|
{{- $path := strings.Trim $path "/" }}
|
||||||
{{- else if eq .Params.emailReplies false }}
|
{{- $address := printf "blogreply.%s@%s" $path "runtimeterror.dev" }}
|
||||||
{{- $emailReplies = false }}
|
<span class="post_email_reply"><a href="mailto:{{ $address }}?Subject=Re: {{ .Title }}">📧 Reply by email</a></span>
|
||||||
{{- end }}
|
{{- 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 }}
|
{{- end }}
|
||||||
<footer class="content__footer"></footer>
|
<footer class="content__footer"></footer>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
|
@ -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 }}" rel="me" aria-label="{{ $item.title }}" title="{{ $item.title }}"><i class="{{ $item.icon }}" aria-hidden="true"></i></a>
|
<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>
|
||||||
</li>
|
</li>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -6,8 +6,13 @@
|
||||||
{{ 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" }} <a target="_blank" href="{{ .Permalink }}feed.xml" aria-label="Category RSS"><i class="fa-solid fa-square-rss"></i></a> </h1>
|
{{ if eq .Title "slashes" }}
|
||||||
{{ with .Description }}<i>{{ . }}</i><hr>{{ else }}<br>{{ end }}
|
<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" }} <a target="_blank" href="{{ .Permalink }}feed.xml" aria-label="Category RSS"><i class="fa-solid fa-square-rss"></i></a> </h1>
|
||||||
|
{{ with .Description }}<i>{{ . }}</i><hr>{{ else }}<br>{{ end }}
|
||||||
|
{{ end }}
|
||||||
{{ end }}{{ end }}
|
{{ end }}{{ end }}
|
||||||
{{ .Content }}
|
{{ .Content }}
|
||||||
</header>
|
</header>
|
||||||
|
@ -43,7 +48,26 @@
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- else }}
|
{{- else }}
|
||||||
{{- range (.Paginate $pages).Pages }}
|
{{- 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" }}
|
{{- $postDate := .Date.Format "2006-01-02" }}
|
||||||
{{- $updateDate := .Lastmod.Format "2006-01-02" }}
|
{{- $updateDate := .Lastmod.Format "2006-01-02" }}
|
||||||
<article class="post">
|
<article class="post">
|
||||||
|
@ -54,10 +78,11 @@
|
||||||
</p>
|
</p>
|
||||||
</header>
|
</header>
|
||||||
<section class="post__summary">
|
<section class="post__summary">
|
||||||
{{ .Summary }}
|
{{if .Description }}{{ .Description }}{{ else }}{{ .Summary }}{{ end }}
|
||||||
</section>
|
</section>
|
||||||
<hr>
|
<hr>
|
||||||
</article>
|
</article>
|
||||||
|
{{- end }}
|
||||||
|
{{- template "_internal/pagination.html" . }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- template "_internal/pagination.html" . }}
|
|
||||||
{{- end }}
|
{{- end }}
|
|
@ -10,7 +10,18 @@
|
||||||
{{ if isset .Params "categories" }}
|
{{ if isset .Params "categories" }}
|
||||||
{{$related := where .Site.RegularPages ".Params.categories" "eq" .Params.categories }}
|
{{$related := where .Site.RegularPages ".Params.categories" "eq" .Params.categories }}
|
||||||
{{- $relatedLimit := default 8 .Site.Params.numberOfRelatedPosts }}
|
{{- $relatedLimit := default 8 .Site.Params.numberOfRelatedPosts }}
|
||||||
|
{{ if eq .Params.categories "slashes" }}
|
||||||
<h3>More {{ .Params.categories }}</h3>
|
<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>
|
<ul>
|
||||||
{{- range first $relatedLimit $related }}
|
{{- range first $relatedLimit $related }}
|
||||||
<li>
|
<li>
|
||||||
|
@ -18,11 +29,12 @@
|
||||||
</li>
|
</li>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ if gt (len $related) $relatedLimit }}
|
{{ if gt (len $related) $relatedLimit }}
|
||||||
<li>
|
<li>
|
||||||
<a href="/categories/{{ lower .Params.categories }}/"><i>See all {{ .Params.categories }}</i></a>
|
<a href="/categories/{{ lower .Params.categories }}/"><i>See all {{ .Params.categories }}</i></a>
|
||||||
</li>
|
</li>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</ul>
|
</ul>
|
||||||
|
{{ end }}
|
||||||
<hr>
|
<hr>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
|
|
|
@ -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 }}
|
|
|
@ -1,6 +1,5 @@
|
||||||
{{- partial "lang.html" . -}}
|
|
||||||
<p class="copyright">{{ .Site.Copyright | markdownify }}</p>
|
<p class="copyright">{{ .Site.Copyright | markdownify }}</p>
|
||||||
<p class="powered_by">{"powered_by": [{{- range $i, $link := .Site.Params.powerLinks }}{{ if $i }}, {{ end }}"<a target="_blank" href="{{ $link.url }}">{{ $link.title }}</a>"{{ end }}]}
|
<p class="footer_links">{"<a href="/slashes/" title="slashpages">/slashes</a>": [{{- range $i, $link := .Site.Params.slashPages }}{{ if $i }}, {{ end }}"<a href="{{ $link.url }}" title="{{ $link.label }}">{{ $link.title }}</a>"{{ end }}]}
|
||||||
<br><<a target="_blank" href="https://github.com/jbowdre/runtimeterror">view source</a>></p>
|
<br><<a target="_blank" href="https://github.com/jbowdre/runtimeterror">view source</a>></p>
|
||||||
|
|
||||||
<!-- 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 -->
|
||||||
|
|
10
layouts/partials/header.html
Normal file
10
layouts/partials/header.html
Normal 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>
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
font-display: fallback;
|
font-display: fallback;
|
||||||
src: local('Berkeley Mono'),
|
src: local('Berkeley Mono'),
|
||||||
url('https://cdn.runtimeterror.dev/fonts/BerkeleyMono-Regular.woff2') format('woff2'),
|
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 */
|
/* override page max-width */
|
||||||
|
@ -36,18 +35,18 @@
|
||||||
line-height: 1.3rem;
|
line-height: 1.3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.powered_by {
|
.footer_links {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 1.1rem;
|
line-height: 1.1rem;
|
||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
.powered_by a:link, .powered_by a:visited {
|
.footer_links a:link, .footer_links a:visited {
|
||||||
color: var(--off-fg);
|
color: var(--off-fg);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.powered_by a:hover {
|
.footer_links a:hover {
|
||||||
color: var(--hover);
|
color: var(--hover);
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
@ -393,15 +392,13 @@ hr {
|
||||||
margin-top: 1.5rem;
|
margin-top: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* summary styling */
|
/* no extra space for paragraphs with lists */
|
||||||
details {
|
p:not(:has(+ ol)),
|
||||||
cursor: pointer;
|
p:not(:has(+ ul)) {
|
||||||
|
margin-bottom: 1.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
details.comments_widget summary::before {
|
p:has(+ ol),
|
||||||
content: 'Load ';
|
p:has(+ ul) {
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
details[open].comments_widget summary::before {
|
|
||||||
content: 'Hide ';
|
|
||||||
}
|
|
|
@ -8,7 +8,7 @@
|
||||||
<meta charset="UTF-8"/>
|
<meta charset="UTF-8"/>
|
||||||
<meta name="viewport" content="width=device-width"/>
|
<meta name="viewport" content="width=device-width"/>
|
||||||
<title><xsl:value-of select="rss/channel/title"/> (RSS)</title>
|
<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="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="32x32" href="/icons/favicon-32x32.png" />
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16x16.png" />
|
<link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16x16.png" />
|
||||||
|
|
Loading…
Reference in a new issue