41554 blogs · [ { "id": "01a087e1-4fc7-721c-b603-4fa7fb1e4afe", "title": "Agentic Playwright testing with Nix", "url": "https://simonshine.dk/articles/agentic-playwright-testing-with-nix/", "published_at": "2026-08-15T19:31:07+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd16811be", "title": "Hashpinning", "url": "https://simonshine.dk/articles/hashpinning/", "published_at": "2026-08-07T23:59:35+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd17226e7", "title": "Git config-based hooks with hk-nix", "url": "https://simonshine.dk/articles/git-config-based-hooks-with-hk-nix/", "published_at": "2026-07-31T23:00:00+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd236b65e", "title": "Using sops-nix templates to support passwords in legacy configs", "url": "https://simonshine.dk/articles/sops-nix-templates/", "published_at": "2026-07-05T20:51:02+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd2a98b7b", "title": "Authenticating Tailscale non-interactively via API with sops-nix", "url": "https://simonshine.dk/articles/tailscale-api-authentication-sops-nix/", "published_at": "2026-07-05T19:01:12+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd37463c2", "title": "A dendritic sops-nix flake template", "url": "https://simonshine.dk/articles/dendritic-sops-nix-flake-template/", "published_at": "2026-07-05T00:35:37+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd37a07f5", "title": "Dendritic flake partitions", "url": "https://simonshine.dk/articles/dendritic-flake-partitions/", "published_at": "2026-06-21T11:39:00+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd46d599b", "title": "Managing Secrets privately with sops-nix", "url": "https://simonshine.dk/articles/managing-secrets-privately-with-sops-nix/", "published_at": "2026-05-15T00:37:41+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd46eafdf", "title": "Is the novelty budget dead?", "url": "https://simonshine.dk/articles/is-the-novelty-budget-dead/", "published_at": "2026-04-24T10:25:31+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd48a1744", "title": "NixOS runners on Forgejo Actions", "url": "https://simonshine.dk/articles/forgejo-actions-nixos-runners/", "published_at": "2026-04-23T20:06:40+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd4ad4179", "title": "Three levels of Nix", "url": "https://simonshine.dk/articles/three-levels-of-nix/", "published_at": "2026-03-15T11:34:52+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd578b617", "title": "Vendored theme workflow after one month", "url": "https://simonshine.dk/articles/vendored-theme-workflow-after-one-month/", "published_at": "2026-03-07T22:03:24+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd5d4f97a", "title": "Using lefthook and treefmt with Nix", "url": "https://simonshine.dk/articles/lefthook-treefmt-direnv-nix/", "published_at": "2026-03-07T20:47:14+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd6a5126c", "title": "Dendritic Nix With nixos-shell", "url": "https://simonshine.dk/articles/dendritic-nix-with-nixos-shell/", "published_at": "2026-03-01T13:03:12+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd7708467", "title": "Learning about AutoAgents by benchmarking Claude Code vs. OpenCode", "url": "https://simonshine.dk/articles/autoagents-claude-vs-opencode/", "published_at": "2026-02-22T22:22:30+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd7eb99bc", "title": "nixos-anywhere on Hetzner", "url": "https://simonshine.dk/articles/nixos-anywhere-on-hetzner/", "published_at": "2026-02-19T23:55:22+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd898bd81", "title": "Vaultwarden on NixOS", "url": "https://simonshine.dk/articles/vaultwarden-on-nixos/", "published_at": "2026-02-19T07:51:15+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dd9905253", "title": "A git primer for future colleagues", "url": "https://simonshine.dk/articles/git-primer/", "published_at": "2026-02-14T14:56:43+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dda2bcee8", "title": "Vendoring Hugo themes with Nix and Git", "url": "https://simonshine.dk/articles/vendoring-hugo-themes-with-nix-and-git/", "published_at": "2026-02-07T12:44:17+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddb0ac3b5", "title": "Speeding up CI more with Nix", "url": "https://simonshine.dk/articles/speeding-up-ci-more-with-nix/", "published_at": "2026-02-01T23:44:38+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddb82953f", "title": "Speeding up CI with Nix", "url": "https://simonshine.dk/articles/speeding-up-ci-with-nix/", "published_at": "2026-01-25T11:28:38+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddbad069f", "title": "zsh config for NixOS + nix-darwin", "url": "https://simonshine.dk/articles/nix-darwin-zsh/", "published_at": "2026-01-25T00:11:55+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddbf73a35", "title": "Maintaining libraries with Claude", "url": "https://simonshine.dk/articles/maintaining-libraries-with-claude/", "published_at": "2026-01-14T22:38:11+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddc640ff2", "title": "Using NixOS for Exam Computers", "url": "https://simonshine.dk/articles/nixos-exam-computers/", "published_at": "2026-01-13T15:20:48+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddcaced57", "title": "Kubernetes-valgfaget der ikke blev til noget", "url": "https://simonshine.dk/articles/kubernetes-valgfag/", "published_at": "2026-01-07T12:53:14+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddd5dd5aa", "title": "End of teaching retrospective", "url": "https://simonshine.dk/articles/end-of-teaching-retrospective/", "published_at": "2026-01-01T08:30:15+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddde8a8e8", "title": "Funktionel datamodellering", "url": "https://simonshine.dk/articles/funktionel-datamodellering/", "published_at": "2025-12-31T23:00:00+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dde240907", "title": "Animating the NixOS logo", "url": "https://simonshine.dk/articles/nixos-logo/", "published_at": "2025-12-30T02:23:47+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dde4f8ccb", "title": "Design Patterns i popkultur", "url": "https://simonshine.dk/articles/design-patterns-popkultur/", "published_at": "2025-09-04T09:34:00+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dde9a5230", "title": "JSON Schema in Haskell using AutoDoCodec", "url": "https://simonshine.dk/articles/json-schema-haskell-autodocodec/", "published_at": "2025-07-26T15:00:57+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddf8d3761", "title": "Just: En bedre Makefile", "url": "https://simonshine.dk/articles/just-en-bedre-makefile/", "published_at": "2025-07-21T23:24:15+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575ddf968aed", "title": "Claude Code og git-bug: Når AI har brug for issue tracking", "url": "https://simonshine.dk/articles/claude-code-git-bug/", "published_at": "2025-07-21T13:03:06+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de04fa7fd", "title": "Hvordan understøtter man europæisk cloud i undervisningen?", "url": "https://simonshine.dk/articles/europaeisk-cloud-i-undervisning/", "published_at": "2025-05-06T13:03:06+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de1079ea3", "title": "Hvorfor blev jeg datamatiker-lærer?", "url": "https://simonshine.dk/articles/hvorfor-blev-jeg-datamatiker-laerer/", "published_at": "2025-04-17T15:41:46+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de1fe735d", "title": "Om at blive rekursivt beruset med monoider", "url": "https://simonshine.dk/articles/rekursivt-beruset-med-monoider/", "published_at": "2025-04-13T20:26:14+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de2ccf06f", "title": "Deploying a Rust web service on NixOS", "url": "https://simonshine.dk/articles/deploy-rust-webservice-nixos/", "published_at": "2025-04-10T11:31:54+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de3cb70a1", "title": "Corne Split Keyboard Layout", "url": "https://simonshine.dk/articles/corne-split-keyboard-layout/", "published_at": "2025-04-10T08:57:09+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de434f46c", "title": "Packaging open-source projects with Nix", "url": "https://simonshine.dk/articles/packaging-foss-example/", "published_at": "2025-04-07T13:33:50+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de4376cbe", "title": "Hvad er \"datamatik\"?", "url": "https://simonshine.dk/articles/hvad-er-datamatik/", "published_at": "2025-03-06T22:58:01+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de4b6685a", "title": "Setting up a Hugo static website with Nix", "url": "https://simonshine.dk/articles/hugo-static-site-setup/", "published_at": "2025-02-24T00:00:00+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de4ef70b7", "title": "Minimal Sufficient Groups", "url": "https://simonshine.dk/articles/minimal-sufficient-groups/", "published_at": "2025-02-02T15:11:57+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de4eff198", "title": "Why you should be careful with the Default trait/typeclass", "url": "https://simonshine.dk/articles/why-you-should-be-careful-with-the-default-trait-typeclass/", "published_at": "2022-10-25T15:13:28+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de55e4167", "title": "A review of JSON Schema libraries for Haskell", "url": "https://simonshine.dk/articles/a-review-of-json-schema-libraries-for-haskell/", "published_at": "2022-04-10T15:14:27+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de5a2ff73", "title": "Has-style traits in Rust", "url": "https://simonshine.dk/articles/has-style-traits-in-rust/", "published_at": "2022-03-31T15:16:50+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de64e3bd4", "title": "Writing code on doors", "url": "https://simonshine.dk/articles/writing-code-on-doors/", "published_at": "2022-03-29T15:20:20+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de6f00a8b", "title": "A Terraform DNS moment", "url": "https://simonshine.dk/articles/a-terraform-dns-moment/", "published_at": "2022-01-29T15:21:50+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de7e25ad1", "title": "Fiat Currencies Are Not One Thing", "url": "https://simonshine.dk/articles/fiat-currencies-are-not-one-thing/", "published_at": "2021-12-10T15:25:17+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de8091ae3", "title": "Jq Hack 2 Curling the Right Binary on Github", "url": "https://simonshine.dk/articles/jq-hack-2-curling-the-right-binary-on-github/", "published_at": "2021-12-04T15:26:20+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de892055c", "title": "Why rewriting version control history matters", "url": "https://simonshine.dk/articles/why-rewriting-version-control-history-matters/", "published_at": "2021-11-25T15:27:18+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de96df84a", "title": "Efficient Probability Testing", "url": "https://simonshine.dk/articles/efficient-probability-testing/", "published_at": "2021-09-21T15:02:16+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575de9bb6eab", "title": "Baking metaphors in the imperative/declarative programming debate", "url": "https://simonshine.dk/articles/baking-metaphors-in-the-imperative-declarative-programming-debate/", "published_at": "2021-09-17T15:33:16+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dea7c14e4", "title": "Extracting the KUBECONFIG for a DigitalOcean Kubernetes cluster from a Terraform .tfstate", "url": "https://simonshine.dk/articles/extracting-the-kubeconfig-for-a-digitalocean-kubernetes-cluster-from-a-terraform-tfstate/", "published_at": "2021-07-10T15:34:07+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dea890596", "title": "Getting recursively drunk with monoids", "url": "https://simonshine.dk/articles/getting-recursively-drunk-with-monoids/", "published_at": "2020-10-04T15:05:52+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575deac28c2d", "title": "Jq Hack 1 Colored Less", "url": "https://simonshine.dk/articles/jq-hack-1-colored-less/", "published_at": "2020-09-28T15:37:28+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575deb02c5a0", "title": "What if, when you grep, it goes into pager mode when results don't fit one screen?", "url": "https://simonshine.dk/articles/grep-pager-mode/", "published_at": "2020-09-28T15:35:50+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575debb1fefc", "title": "'Parse, don't validate' using ViewPatterns", "url": "https://simonshine.dk/articles/parse-don-t-validate-using-viewpatterns/", "published_at": "2020-09-14T15:38:44+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dec147a7f", "title": "Aggressive refactoring with Haskell", "url": "https://simonshine.dk/articles/aggressive-refactoring/", "published_at": "2020-09-12T15:10:02+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575dec2f4f2a", "title": "Hvorfor må jeg ikke eje en svensker?", "url": "https://simonshine.dk/articles/hvorfor-maa-jeg-ikke-eje-en-svensker/", "published_at": "2003-01-01T09:14:48+00:00" }, { "id": "01a087e1-4fc8-71c3-90e4-575decd30795", "title": null, "url": "https://simonshine.dk/about/", "published_at": null }, { "id": "01a087e1-4fc8-71c3-90e4-575ded0771cc", "title": null, "url": "https://simonshine.dk/contact/", "published_at": null }, { "id": "01a087e1-4fc8-71c3-90e4-575ded8fedb7", "title": null, "url": "https://simonshine.dk/links/", "published_at": null } ] posts Claim your blog
Back to Simon Shine
Blog · corpus.blog/blogs/simonshine.dk/posts

Simon Shine

simonshine.dk

2026

2025

2022

2021

2020

2003

Undated