diff --git a/.gitignore b/.gitignore
index c4bb138..3c6f3a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -189,3 +189,5 @@ Icon
Network Trash Folder
Temporary Items
.apdisk
+
+/.quarto/
diff --git a/.prettierrc b/.prettierrc
index 672b6f3..7a778c9 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -7,3 +7,6 @@ overrides:
- files: "*.gotmpl"
options:
parser: "go-template"
+ - files: "*.qmd"
+ options:
+ parser: "markdown"
diff --git a/.zed/settings.json b/.zed/settings.json
index eb5924a..73f67e7 100644
--- a/.zed/settings.json
+++ b/.zed/settings.json
@@ -9,5 +9,5 @@
}
}
},
- "file_types": { "HTML": ["gotmpl"] }
+ "file_types": { "HTML": ["gotmpl"], "Markdown": ["qmd"] }
}
diff --git a/_quarto.yml b/_quarto.yml
new file mode 100644
index 0000000..79b8d68
--- /dev/null
+++ b/_quarto.yml
@@ -0,0 +1,13 @@
+project:
+ type: hugo
+ preview:
+ serve:
+ cmd: "hugo server --port {port} --bind 0.0.0.0 --navigateToChanged"
+ ready: "Web Server is available at"
+
+format:
+ hugo-md:
+ code-fold: true
+
+execute:
+ warning: false
diff --git a/assets/styles/millironx.css b/assets/styles/millironx.css
index 00ad31e..6db0114 100644
--- a/assets/styles/millironx.css
+++ b/assets/styles/millironx.css
@@ -289,6 +289,15 @@ article > p {
line-height: 1.5em;
}
+h2#references ~ p {
+ font-size: 1rem;
+ text-justify: unset;
+ text-align: left;
+ hyphens: none;
+ line-height: 1rem;
+ text-indent: 2ch hanging;
+}
+
article h1 + p,
article h2 + p,
article h3 + p,
@@ -337,6 +346,10 @@ figure:has(blockquote) > figcaption {
font-size: 80%;
}
+figure > img {
+ max-width: 100%;
+}
+
footer {
display: flex;
flex-direction: column;
diff --git a/assets/styles/mix-twbs.scss b/assets/styles/mix-twbs.scss
new file mode 100644
index 0000000..536f92e
--- /dev/null
+++ b/assets/styles/mix-twbs.scss
@@ -0,0 +1,179 @@
+$web-font-path: "/fonts/nunito-sans/index.css";
+
+@import "bootstrap/functions";
+@import "bootswatch/lux/variables";
+@import "bootstrap/bootstrap";
+@import "bootswatch/lux/bootswatch";
+
+$peek-height: 25rem;
+
+.blurred-container {
+ position: relative;
+ width: 100%;
+ min-height: 35vh;
+ height: $peek-height;
+ top: 0;
+ left: 0;
+}
+
+.blurred-container .motto {
+ color: #fff;
+ font-size: 76px;
+ font-weight: 600;
+ text-align: center;
+ text-shadow: 0 0 10px rgba(0, 0, 0, 0.33);
+ text-transform: uppercase;
+ top: 7.5vh;
+ z-index: 3;
+ display: block;
+ margin: 0 auto;
+ position: relative;
+ width: 60%;
+ height: 0;
+}
+
+.motto h1 {
+ background: #0000007d;
+ -webkit-text-stroke: 0.3px $gray-100;
+ line-height: 1;
+}
+
+.blurred-container .img-src {
+ position: fixed;
+ width: 100%;
+ min-height: 35vh;
+ height: $peek-height;
+ background-repeat: no-repeat;
+ background-size: cover;
+ background-position: center center;
+}
+
+.list-main {
+ position: relative;
+ background-color: #fff;
+ padding-bottom: calc(1rem + 95px);
+ padding-top: 1rem;
+}
+
+.footer-contents {
+ position: relative;
+ background-color: $gray-200;
+}
+
+/* Gives me greater control over fonts */
+.font-serif {
+ font-family: Georgia, "Times New Roman", Times, serif;
+}
+
+.font-sans {
+ font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+.font-mono {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+
+.font-small-caps {
+ font-variant-caps: small-caps;
+}
+
+.strikethrough {
+ text-decoration: line-through;
+}
+
+.sfTable {
+ margin: 0 auto;
+}
+
+.text-align-left {
+ text-align: left;
+}
+
+.text-align-right {
+ text-align: right;
+}
+
+.float-left {
+ float: left;
+}
+
+.float-right {
+ float: right;
+}
+
+.media-object {
+ max-height: 100%;
+ max-width: 100%;
+}
+
+@media (min-width: 768px) {
+ .pull-left {
+ max-width: 25%;
+ }
+
+ .w-md-50 {
+ width: 50%;
+ }
+}
+
+h1 small {
+ font-size: 60%;
+ color: #9a9a9a;
+ font-weight: 300;
+ line-height: 1.5;
+}
+
+h1 {
+ font-weight: 400;
+ margin: 30px 0 15px;
+}
+
+.dogear {
+ clip-path: polygon(0 0, 0 100%, 100% 100%, 100% 25%, 75% 0);
+}
+
+.fa-stack-top {
+ vertical-align: top;
+}
+
+.table-condensed th {
+ padding: 0.5rem;
+}
+
+.table-condensed td {
+ padding: 0.5rem;
+}
+
+@media (min-width: map-get($grid-breakpoints, md)) {
+ .fixed-bottom {
+ left: 25%;
+ }
+
+ .md-max-width-33 {
+ max-width: 33%;
+ }
+}
+
+.card-link {
+ white-space: nowrap;
+}
+
+.category-button {
+ position: absolute;
+ top: 1em;
+ right: 1em;
+ display: grid;
+}
+
+.card-title {
+ margin-right: 2.25em;
+}
+
+.thumb-icon-wrapper {
+ display: flex;
+ justify-content: center;
+}
+
+.thumb-icon-badge {
+ font-size: xx-large;
+}
diff --git a/config.toml b/config.toml
index 8a730b3..50bda13 100644
--- a/config.toml
+++ b/config.toml
@@ -1,6 +1,7 @@
baseURL = "https://millironx.com"
languageCode = "en-us"
title = "Milliron X"
+ignoreFiles = ["\\.qmd$", "\\.ipynb$", "\\.py$"]
[pagination]
pagerSize = 5
@@ -51,6 +52,9 @@ notAlternative = "true"
[markup.goldmark.parser.attribute]
block = true
+[markup.goldmark.renderer]
+unsafe = true
+
[markup.goldmark.renderHooks]
[markup.goldmark.renderHooks.link]
diff --git a/content/people/thomas-a.-christensen-ii/_index.md b/content/people/thomas-a.-christensen-ii/_index.md
index c09d89d..54b7090 100644
--- a/content/people/thomas-a.-christensen-ii/_index.md
+++ b/content/people/thomas-a.-christensen-ii/_index.md
@@ -106,8 +106,8 @@ couldn't tell by the pictures). I've worn a lot of different hats:
| | |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| First and foremost | ✝️ {{< abbr "Born again, fundamentalist, dispensationalist, King James Bible-believing, independent Baptist" >}}Christian{{< /abbr >}} |
-| Location | 🏇 {{< abbr "I want to keep claiming Wyoming, but they're pretty strict about residency there, and I don't want to repeat the Liz Cheney fishing license incident" >}}Wyomingite{{< /abbr >}} sojourning in 🦬 {{< abbr "Yah, youbetcha!" >}}North Dakota{{< /abbr >}} (this ought to be interesting) |
+| Location | 🦬 {{< abbr "I want to keep claiming Wyoming, but they're pretty strict about residency there, and I don't want to repeat the Liz Cheney fishing license incident" >}}Wyomingite{{< /abbr >}} sojourning in 🌻 {{< abbr "Yes, Toto, we are in Kansas now" >}}Kansas{{< /abbr >}} (this ought to be interesting) |
| Education | 📐 {{< abbr "noun. A person who cannot build cool things like airplanes or bridges, but can blow up an entire neighborhood and kill dozens of children by misplacing a decimal point. See also: self-hating chemist" >}}Chemical Engineer{{< /abbr >}} |
-| Profession | 🧬 {{< abbr "I do genetics and computers" >}}Bioinformatician{{< /abbr >}} and 🐄🩺 {{< abbr "I can't rope well enough to be a cowboy, so being a cow doctor will have to suffice" >}}Veterinarian{{< /abbr >}} |
+| Profession | 🧬 {{< abbr "I do genetics and computers" >}}Bioinformatician{{< /abbr >}} and 🐄🩺 {{< abbr "I can't rope well enough to be a cowboy, so being a cow doctor will have to suffice" >}}Veterinarian{{< /abbr >}} (soon!) |
| Politics | 🗽 {{< abbr "Refers to the belief in natural social and political laws created by God that are as inflexible as the laws of physics" >}}Juris naturalist{{< /abbr >}} |
| Hobbies | 🎥 {{< abbr "Storytelling at 24 frames per second" >}}Filmmaker{{< /abbr >}} and 💃🏻 {{< abbr "Square dancing is more musically rigid and is standardized across the country. Swing dancing is more freeform and differs regionally. It's like the difference between classical music and jazz. I like both." >}}Square/swing dancer{{< /abbr >}} |
diff --git a/content/posts/gave-up-github/.gitignore b/content/posts/gave-up-github/.gitignore
new file mode 100644
index 0000000..fc0ab8a
--- /dev/null
+++ b/content/posts/gave-up-github/.gitignore
@@ -0,0 +1 @@
+index.md
diff --git a/content/posts/gave-up-github/ballmergatesaustinpowers.jpg b/content/posts/gave-up-github/ballmergatesaustinpowers.jpg
new file mode 100644
index 0000000..76d2a39
Binary files /dev/null and b/content/posts/gave-up-github/ballmergatesaustinpowers.jpg differ
diff --git a/content/posts/gave-up-github/index.qmd b/content/posts/gave-up-github/index.qmd
new file mode 100644
index 0000000..f5e21f2
--- /dev/null
+++ b/content/posts/gave-up-github/index.qmd
@@ -0,0 +1,88 @@
+---
+title: I gave up Github (and more)
+subtitle: Starting on a self-hosted blog
+date: 2025-11-01
+tags:
+ - blog
+featured: true
+categories:
+ - blog
+---
+
+If you are reading this post, then I have migrated most of my online services
+over to a VPS to the point where I feel confident enough to host a blog on them.
+Yay for me! It has been my goal for nearly six years now to be able to have an
+_interesting_ corner of the internet, filled with interconnected links that try
+to tell the story of what I've done, who I've done it with, and where to find
+it, and this is the result.
+
+I wanted to take the first post and indulge myself in explaining my motivation
+for going self-hosted, show off my tech stack just a little bit, and lay out
+some ground rules for myself for the posts ahead.
+
+## My motivation
+
+Microsoft is evil. There you have it. End of story. Thank you for coming to my
+TED Talk.
+
+
+
+Okay, but in all seriousness, the changes after Github was acquired by Microsoft
+were annoying, and showed that Microsoft was prioritizing the wrong things, and
+going back to their old ways of
+[embrace, extend, exterminate](https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish).
+
+1. [A page redesign for phones](https://github.com/Kira-NT/GitHub-Defreshed)
+2. An "Achievements" system that gamified risky behavior
+3. An integrated CI/CD pipeline system that is
+ [terribly designed](https://youtu.be/9qljpi5jiMQ) and
+ [way too easy to use insecurely](https://docs.zizmor.sh/)[^*]
+4. Finally, ahem, ARTIFICIAL INTELLIGENCE, with illegal scraping of repos and
+ reproduction of code without proper license compliance
+
+I got into programming using Visual Basic .NET, writing automatic Punnet square
+solvers and gestation calculators with Windows Forms, and designing websites
+using ASP.NET MVC with Razor pages. Programming with Visual Basic was fun! At
+least it was until Microsoft put
+[someone who'd rather talk about her hip replacement than Visual Basic](https://www.dotnetrocks.com/details/1691)
+in charge of development. When I started to see the same attitudes creeping
+into Github, Github Actions, and Visual Studio Code, I made the decision to
+move.
+
+The fact is, if you are the kind of person who I expect to be reading this blog,
+then you probably know more of the drama around Github than I do. That, or
+you're the kind of person who is not affected by Github whatsoever. Either way,
+I'll leave you with a collection of links I've found to be varying levels of
+insightful on the whole subject, and leave it at that.
+
+### Microsoft's behavior
+
+- [Microsoft, there is a way to win our trust](https://davelane.nz/microsoft-there-way-win-our-trust)
+- [Can we trust Microsoft with open source?](https://dusted.codes/can-we-trust-microsoft-with-open-source)
+- [Visual Studio Code is designed to fracture](https://ghuntley.com/fracture/)
+
+### Github-specific complaints
+
+- [Give Up Github Campaign - Software Freedom Conservancy](https://sfconservancy.org/GiveUpGitHub/)
+- [Why not Github?](https://sanctum.geek.nz/why-not-github.html)
+- [We need to talk about your Github addiction](https://ploum.net/2023-02-22-leaving-github.html)
+- [Why I won't use Github for any new projects](https://raccoon.onyxbits.de/blog/why-not-use-github/)
+
+### Github Actions
+
+- [Github Actions feels bad](https://youtu.be/9qljpi5jiMQ)
+- [The pain that is Github Actions](https://www.feldera.com/blog/the-pain-that-is-github-actions)
+- [Github Actions could be so much better](https://blog.yossarian.net/2023/09/22/GitHub-Actions-could-be-so-much-better)z
+- [Github Actions are a problem](https://felix-knorr.net/posts/2023-11-11-github-actions.html)
+
+### The problem in general
+
+- [Free software hasn't won](https://dorotac.eu/posts/fosswon/)
+
+[^*]:
+ Lumping Github Actions here might seem strange, but for context, I wrote and
+ maintained the
+ [nf-core/setup-nextflow](https://github.com/nf-core/setup-nextflow) Github
+ Action. Trying to make something coherent out of the Github Actions
+ ecosystem was harrowing, and convinced me more than anything else that
+ Github is just part of the embrace, extend, exterminate strategy.
diff --git a/flake.lock b/flake.lock
index 0a20125..594570b 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,16 +20,16 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1737597992,
- "narHash": "sha256-FECKBxkd+w5I/fhsquthDiw/r/MdCpqmKikBU9yQGug=",
+ "lastModified": 1762756533,
+ "narHash": "sha256-HiRDeUOD1VLklHeOmaKDzf+8Hb7vSWPVFcWwaTrpm+U=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "d0bb4699177f691c8e558b32b3bdc38bc112f76f",
+ "rev": "c2448301fb856e351aab33e64c33a3fc8bcf637d",
"type": "github"
},
"original": {
"owner": "nixos",
- "ref": "nixos-unstable-small",
+ "ref": "nixos-25.05",
"repo": "nixpkgs",
"type": "github"
}
diff --git a/flake.nix b/flake.nix
index 79685b8..0d20c3f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,13 +1,13 @@
{
inputs = {
- nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable-small";
+ nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
- buildInputs = with pkgs; [ hugo nodejs ];
+ buildInputs = with pkgs; [ hugo nodejs quarto julia-bin ];
in with pkgs; {
devShells.default = mkShell { inherit buildInputs; };
packages.default = stdenvNoCC.mkDerivation {
diff --git a/layouts/_default/index.html b/layouts/_default/index.html
index 6ed49b1..4342466 100644
--- a/layouts/_default/index.html
+++ b/layouts/_default/index.html
@@ -1,19 +1,6 @@
{{ define "extraCss" }}
{{ $scrollCss := resources.Get "styles/scrolling-header.css" | minify }}
-
- {{ range where $.Site.Pages "Title" "Thomas A. Christensen II" }}
- {{ with .Params.accounts }}
- {{ range $account, $username := . }}
- {{ partial "account.html" (dict
- "targetType" "link"
- "account" $account
- "username" $username
- "isMe" true)
- }}
- {{ end }}
- {{ end }}
- {{ end }}
{{ end }}
{{ define "main" }}
diff --git a/layouts/partials/account.html b/layouts/partials/account.html
index 2920bcc..bd6514a 100644
--- a/layouts/partials/account.html
+++ b/layouts/partials/account.html
@@ -39,14 +39,10 @@
{{ $userURL := print $urlBase .username }}
-{{ if eq .targetType "a" }}
- {{ partial "fa.html" $icon }}
-{{ end }}
-{{ if and (eq .targetType "link") .isMe }}
-
-{{ end }}
+
+{{ partial "fa.html" $icon }}
diff --git a/layouts/partials/scrolling-image-header.html b/layouts/partials/scrolling-image-header.html
index 57950b6..60d5187 100644
--- a/layouts/partials/scrolling-image-header.html
+++ b/layouts/partials/scrolling-image-header.html
@@ -1,6 +1,6 @@
{{ $thumbnailImage := .Resources.GetMatch "*thumbnail*" }}
{{ with $thumbnailImage }}
- {{ $croppedImage := $thumbnailImage.Fill "960x320 center" }}
+ {{ $croppedImage := $thumbnailImage.Fill "1500x500 center" }}