{"baseURL":"https://www.wiki.jodisand.me/","llms":"https://www.wiki.jodisand.me/llms.txt","pages":[{"description":"Write Bash scripts that survive spaces, empty values and failures: quoting, strict mode, parameter expansion, arrays, traps and debugging.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"quoting","level":2,"title":"Quoting"},{"id":"strict-mode","level":2,"title":"Strict mode"},{"id":"parameter-expansion","level":2,"title":"Parameter expansion"},{"id":"tests","level":2,"title":"Tests"},{"id":"loops","level":2,"title":"Loops"},{"id":"arrays","level":2,"title":"Arrays"},{"id":"functions","level":2,"title":"Functions"},{"id":"traps-and-cleanup","level":2,"title":"Traps and cleanup"},{"id":"options-and-input","level":2,"title":"Options and input"},{"id":"redirection","level":2,"title":"Redirection"},{"id":"long-options","level":2,"title":"Long options"},{"id":"here-documents-and-here-strings","level":2,"title":"Here-documents and here-strings"},{"id":"process-substitution-and-coproc","level":2,"title":"Process substitution and coproc"},{"id":"printf","level":2,"title":"printf"},{"id":"shell-options","level":2,"title":"Shell options"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"debugging-a-script","level":2,"title":"Debugging a script"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/bash/index.md","related":["/jq/","/systemd/","/git/","/ssh/"],"reviewed":"2026-09-24","title":"Bash","url":"/bash/"},{"description":"Inspect and debug services, query the journal, write and override units, schedule timers and apply cgroup resource limits with systemd.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"a-failing-service","level":2,"title":"A failing service"},{"id":"inspecting-units","level":2,"title":"Inspecting units"},{"id":"journal","level":2,"title":"Journal"},{"id":"writing-a-unit","level":2,"title":"Writing a unit"},{"id":"overriding-a-packaged-unit","level":2,"title":"Overriding a packaged unit"},{"id":"timers","level":2,"title":"Timers"},{"id":"resource-control","level":2,"title":"Resource control"},{"id":"boot-problems","level":2,"title":"Boot problems"},{"id":"socket-activation","level":2,"title":"Socket activation"},{"id":"sandboxing","level":2,"title":"Sandboxing"},{"id":"user-units","level":2,"title":"User units"},{"id":"journald-configuration","level":2,"title":"journald configuration"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"}],"markdown":"/systemd/index.md","related":["/linux-performance/","/bash/","/docker/"],"reviewed":"2026-09-24","title":"systemd","url":"/systemd/"},{"description":"Select, filter, reshape and aggregate JSON with jq, pass shell values in safely and emit output that other shell tools can consume.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-a-jq-program-runs","level":2,"title":"How a jq program runs"},{"id":"look-at-the-shape-first","level":2,"title":"Look at the shape first"},{"id":"selecting","level":2,"title":"Selecting"},{"id":"filtering","level":2,"title":"Filtering"},{"id":"reshaping-and-editing","level":2,"title":"Reshaping and editing"},{"id":"aggregating","level":2,"title":"Aggregating"},{"id":"output-for-the-shell","level":2,"title":"Output for the shell"},{"id":"arguments-and-exit-codes","level":2,"title":"Arguments and exit codes"},{"id":"large-inputs","level":2,"title":"Large inputs"},{"id":"reduce-and-foreach","level":2,"title":"reduce and foreach"},{"id":"paths","level":2,"title":"Paths"},{"id":"strings-regex-and-dates","level":2,"title":"Strings, regex and dates"},{"id":"errors-try-and-defaults","level":2,"title":"Errors, try and defaults"},{"id":"arguments-the-environment-and-modules","level":2,"title":"Arguments, the environment and modules"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/jq/index.md","related":["/bash/","/kubernetes/","/aws/","/terraform/"],"reviewed":"2026-09-24","title":"jq","url":"/jq/"},{"description":"Find whether CPU, memory, disk or network is the bottleneck on a Linux host with a first-minute checklist, the USE method and per-resource tools.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"the-first-minute","level":2,"title":"The first minute"},{"id":"use-per-resource","level":2,"title":"USE, per resource"},{"id":"cpu","level":2,"title":"CPU"},{"id":"memory","level":2,"title":"Memory"},{"id":"disk","level":2,"title":"Disk"},{"id":"network","level":2,"title":"Network"},{"id":"tracing","level":2,"title":"Tracing"},{"id":"perf","level":2,"title":"perf"},{"id":"bpftrace","level":2,"title":"bpftrace"},{"id":"cgroup-accounting","level":2,"title":"cgroup accounting"},{"id":"memory-pressure","level":2,"title":"Memory pressure"},{"id":"io-latency","level":2,"title":"I/O latency"},{"id":"where-to-look-first","level":2,"title":"Where to look first"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting-the-tools","level":2,"title":"Troubleshooting the tools"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/linux-performance/index.md","related":["/systemd/","/iproute2/","/kubernetes/","/prometheus/"],"reviewed":"2026-09-24","title":"Linux performance","url":"/linux-performance/"},{"description":"Diagnose and configure Linux links, addresses, routes, policy routing, namespaces, tunnels, bridges and sockets with ip, ss, bridge and tc.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"a-connectivity-problem","level":2,"title":"A connectivity problem"},{"id":"links","level":2,"title":"Links"},{"id":"addresses","level":2,"title":"Addresses"},{"id":"routes","level":2,"title":"Routes"},{"id":"policy-routing","level":2,"title":"Policy routing"},{"id":"neighbours","level":2,"title":"Neighbours"},{"id":"sockets-with-ss","level":2,"title":"Sockets with ss"},{"id":"namespaces","level":2,"title":"Namespaces"},{"id":"bridges","level":2,"title":"Bridges"},{"id":"tunnels","level":2,"title":"Tunnels"},{"id":"traffic-control","level":2,"title":"Traffic control"},{"id":"classful-tc-htb-filters-and-ingress","level":2,"title":"Classful tc: HTB, filters and ingress"},{"id":"two-uplinks-with-policy-routing","level":2,"title":"Two uplinks with policy routing"},{"id":"vlans-bonds-and-bridges","level":2,"title":"VLANs, bonds and bridges"},{"id":"namespaces-for-testing","level":2,"title":"Namespaces for testing"},{"id":"json-output-and-scripting","level":2,"title":"JSON output and scripting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/iproute2/index.md","related":["/linux-performance/","/dns/","/cilium/","/docker/"],"reviewed":"2026-09-24","title":"iproute2","url":"/iproute2/"},{"description":"Keep shells alive across SSH drops, split a terminal into panes, copy text without a mouse and script sessions from Bash.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"the-server-sessions-windows-and-panes","level":2,"title":"The server, sessions, windows and panes"},{"id":"windows-and-panes","level":2,"title":"Windows and panes"},{"id":"prefix-and-key-tables","level":2,"title":"Prefix and key tables"},{"id":"copy-mode","level":2,"title":"Copy mode"},{"id":"clipboard","level":2,"title":"Clipboard"},{"id":"tmuxconf-essentials","level":2,"title":".tmux.conf essentials"},{"id":"scripting-tmux-from-bash","level":2,"title":"Scripting tmux from Bash"},{"id":"remote-persistence-with-ssh","level":2,"title":"Remote persistence with SSH"},{"id":"nested-sessions","level":2,"title":"Nested sessions"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/tmux/index.md","related":["/ssh/","/bash/","/systemd/"],"reviewed":"2026-09-24","title":"tmux","url":"/tmux/"},{"description":"Edit with operators, motions and text objects, run substitutions over ranges, record macros, manage buffers and windows, and fix paste, swap and startup problems.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"modes","level":2,"title":"Modes"},{"id":"operators-motions-and-text-objects","level":2,"title":"Operators, motions and text objects"},{"id":"registers","level":2,"title":"Registers"},{"id":"macros","level":2,"title":"Macros"},{"id":"search-and-replace","level":2,"title":"Search and replace"},{"id":"buffers-windows-and-tabs","level":2,"title":"Buffers, windows and tabs"},{"id":"marks-and-jumps","level":2,"title":"Marks and jumps"},{"id":"a-minimal-sane-vimrc","level":2,"title":"A minimal sane vimrc"},{"id":"neovim-differences","level":2,"title":"Neovim differences"},{"id":"vimdiff","level":2,"title":"vimdiff"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/vim/index.md","related":["/git/","/bash/","/tmux/"],"reviewed":"2026-09-24","title":"Vim","url":"/vim/"},{"description":"Filter, edit and summarise text from the shell with grep, sed, awk, sort, uniq, cut, tr, paste, column and xargs, and build log-analysis pipelines that hold up.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"which-tool","level":2,"title":"Which tool"},{"id":"grep","level":2,"title":"grep"},{"id":"sed","level":2,"title":"sed"},{"id":"substitution","level":3,"title":"Substitution"},{"id":"addresses","level":3,"title":"Addresses"},{"id":"other-commands","level":3,"title":"Other commands"},{"id":"in-place-editing-gnu-versus-bsd","level":3,"title":"In-place editing: GNU versus BSD"},{"id":"awk","level":2,"title":"awk"},{"id":"arrays","level":3,"title":"Arrays"},{"id":"printf-and-formatting","level":3,"title":"printf and formatting"},{"id":"sort-uniq-and-friends","level":2,"title":"sort, uniq and friends"},{"id":"xargs","level":2,"title":"xargs"},{"id":"log-analysis-pipelines","level":2,"title":"Log-analysis pipelines"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/text-processing/index.md","related":["/regex/","/bash/","/files/","/oneliners/","/jq/"],"reviewed":"2026-09-24","title":"grep, sed and awk","url":"/text-processing/"},{"description":"Write patterns that match what you mean across grep, PCRE, Go, Python and JavaScript, avoid catastrophic backtracking and test them from the shell.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"flavours","level":2,"title":"Flavours"},{"id":"anchors-and-boundaries","level":2,"title":"Anchors and boundaries"},{"id":"character-classes","level":2,"title":"Character classes"},{"id":"quantifiers-and-greediness","level":2,"title":"Quantifiers and greediness"},{"id":"groups-and-backreferences","level":2,"title":"Groups and backreferences"},{"id":"lookaround","level":2,"title":"Lookaround"},{"id":"flags-and-modes","level":2,"title":"Flags and modes"},{"id":"unicode","level":2,"title":"Unicode"},{"id":"catastrophic-backtracking","level":2,"title":"Catastrophic backtracking"},{"id":"tested-patterns","level":2,"title":"Tested patterns"},{"id":"testing-from-the-shell","level":2,"title":"Testing from the shell"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/regex/index.md","related":["/bash/","/jq/","/python/","/go/","/typescript/"],"reviewed":"2026-09-24","title":"Regular expressions","url":"/regex/"},{"description":"Find, copy, sync, archive and watch files on Linux with find, fd, rsync, tar, zstd, du, lsof and inotifywait, and handle permissions and hostile filenames safely.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"the-model-inodes-names-and-links","level":2,"title":"The model: inodes, names and links"},{"id":"find","level":2,"title":"find"},{"id":"fd","level":2,"title":"fd"},{"id":"rsync","level":2,"title":"rsync"},{"id":"archives-and-compression","level":2,"title":"Archives and compression"},{"id":"disk-usage","level":2,"title":"Disk usage"},{"id":"open-files-and-busy-mounts","level":2,"title":"Open files and busy mounts"},{"id":"watching-for-changes","level":2,"title":"Watching for changes"},{"id":"permissions-ownership-and-umask","level":2,"title":"Permissions, ownership and umask"},{"id":"hard-links-and-symlinks","level":2,"title":"Hard links and symlinks"},{"id":"odd-filenames","level":2,"title":"Odd filenames"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/files/index.md","related":["/bash/","/storage/","/ssh/","/scp/","/systemd/","/regex/"],"reviewed":"2026-09-24","title":"Files and directories","url":"/files/"},{"description":"Partition, format, mount, encrypt and grow Linux block storage with lsblk, parted, LVM, ext4, XFS, Btrfs, mdadm and cryptsetup, and diagnose full or slow disks.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"the-stack","level":2,"title":"The stack"},{"id":"partitioning","level":2,"title":"Partitioning"},{"id":"filesystems","level":2,"title":"Filesystems"},{"id":"btrfs-subvolumes-and-snapshots","level":3,"title":"Btrfs subvolumes and snapshots"},{"id":"lvm","level":2,"title":"LVM"},{"id":"fstab-and-mount-options","level":2,"title":"fstab and mount options"},{"id":"swap","level":2,"title":"Swap"},{"id":"smart","level":2,"title":"SMART"},{"id":"io-performance","level":2,"title":"IO performance"},{"id":"mdadm","level":2,"title":"mdadm"},{"id":"luks-with-cryptsetup","level":2,"title":"LUKS with cryptsetup"},{"id":"growing-a-vm-disk-end-to-end","level":2,"title":"Growing a VM disk end to end"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/storage/index.md","related":["/files/","/linux-performance/","/systemd/","/proxmox/","/libvirt/","/oneliners/"],"reviewed":"2026-09-24","title":"Disks and storage","url":"/storage/"},{"description":"Manage accounts, groups and sudo rules, read and fix file modes, ACLs and capabilities, and decode SELinux denials on Fedora and RHEL.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-access-is-decided","level":2,"title":"How access is decided"},{"id":"accounts","level":2,"title":"Accounts"},{"id":"passwords-and-ageing","level":3,"title":"Passwords and ageing"},{"id":"groups","level":3,"title":"Groups"},{"id":"sudo","level":2,"title":"sudo"},{"id":"file-modes-and-ownership","level":2,"title":"File modes and ownership"},{"id":"shared-directories","level":3,"title":"Shared directories"},{"id":"acls","level":2,"title":"ACLs"},{"id":"capabilities","level":2,"title":"Capabilities"},{"id":"pam","level":2,"title":"PAM"},{"id":"selinux","level":2,"title":"SELinux"},{"id":"file-contexts","level":3,"title":"File contexts"},{"id":"ports","level":3,"title":"Ports"},{"id":"booleans","level":3,"title":"Booleans"},{"id":"reading-a-denial","level":3,"title":"Reading a denial"},{"id":"writing-a-local-module","level":3,"title":"Writing a local module"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/users/index.md","related":["/ssh/","/systemd/","/idm/","/bash/","/docker/"],"reviewed":"2026-09-24","title":"Users, permissions and SELinux","url":"/users/"},{"description":"Open, forward, NAT, rate-limit and log traffic on Linux with firewalld zones and rich rules, native nftables rulesets, and iptables translation, without breaking containers.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"one-kernel-three-front-ends","level":2,"title":"One kernel, three front ends"},{"id":"firewalld","level":2,"title":"firewalld"},{"id":"rich-rules","level":3,"title":"Rich rules"},{"id":"masquerade-and-port-forwarding","level":3,"title":"Masquerade and port forwarding"},{"id":"policies","level":3,"title":"Policies"},{"id":"logging-denied-packets","level":3,"title":"Logging denied packets"},{"id":"direct-rules-and-the-nftables-backend","level":3,"title":"Direct rules and the nftables backend"},{"id":"nftables","level":2,"title":"nftables"},{"id":"a-complete-host-ruleset","level":3,"title":"A complete host ruleset"},{"id":"nat-for-vms-and-containers","level":3,"title":"NAT for VMs and containers"},{"id":"sets-verdict-maps-and-counters","level":3,"title":"Sets, verdict maps and counters"},{"id":"tracing-a-packet","level":3,"title":"Tracing a packet"},{"id":"iptables-and-translation","level":2,"title":"iptables and translation"},{"id":"common-patterns","level":2,"title":"Common patterns"},{"id":"docker-podman-and-libvirt","level":2,"title":"Docker, Podman and libvirt"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/firewall/index.md","related":["/iproute2/","/ssh/","/docker/","/podman/","/tcpdump/","/systemd/"],"reviewed":"2026-09-24","title":"firewalld, nftables and iptables","url":"/firewall/"},{"description":"Capture the right packets with BPF filters, read tcpdump output, capture in containers and over SSH, script with tshark, and diagnose retransmissions, MTU, TLS and DNS faults in Wireshark.","group":"Linux","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-capture-works","level":2,"title":"How capture works"},{"id":"bpf-capture-filter-syntax","level":2,"title":"BPF capture filter syntax"},{"id":"header-byte-matching","level":3,"title":"Header byte matching"},{"id":"reading-the-output","level":2,"title":"Reading the output"},{"id":"writing-and-rotating-captures","level":2,"title":"Writing and rotating captures"},{"id":"capturing-in-containers-vms-and-remotely","level":2,"title":"Capturing in containers, VMs and remotely"},{"id":"tshark","level":2,"title":"tshark"},{"id":"wireshark","level":2,"title":"Wireshark"},{"id":"diagnosing-common-faults","level":2,"title":"Diagnosing common faults"},{"id":"retransmissions-and-slow-transfers","level":3,"title":"Retransmissions and slow transfers"},{"id":"mtu-and-path-mtu-discovery","level":3,"title":"MTU and path MTU discovery"},{"id":"tls-handshakes","level":3,"title":"TLS handshakes"},{"id":"dns-problems","level":3,"title":"DNS problems"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/tcpdump/index.md","related":["/iproute2/","/dns/","/tls/","/http/","/firewall/","/docker/","/kubernetes/"],"reviewed":"2026-09-24","title":"tcpdump and Wireshark","url":"/tcpdump/"},{"description":"Inspect workloads with kubectl, understand the object model behind them and find why a pod is not running, ready or reachable.","group":"Kubernetes","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"start-with-a-failing-workload","level":2,"title":"Start with a failing workload"},{"id":"how-the-control-plane-reconciles-state","level":2,"title":"How the control plane reconciles state"},{"id":"kubectl-contexts-queries-and-applies","level":2,"title":"kubectl contexts, queries and applies"},{"id":"workloads-and-rollouts","level":2,"title":"Workloads and rollouts"},{"id":"probes-and-graceful-shutdown","level":2,"title":"Probes and graceful shutdown"},{"id":"resource-requests-limits-and-qos-classes","level":2,"title":"Resource requests, limits and QoS classes"},{"id":"poddisruptionbudgets","level":2,"title":"PodDisruptionBudgets"},{"id":"horizontal-pod-autoscaler","level":2,"title":"Horizontal Pod Autoscaler"},{"id":"node-affinity-taints-and-topology-spread","level":2,"title":"Node affinity, taints and topology spread"},{"id":"jobs-and-cronjobs","level":2,"title":"Jobs and CronJobs"},{"id":"services-and-networking","level":2,"title":"Services and networking"},{"id":"storage","level":2,"title":"Storage"},{"id":"configmaps-and-secrets","level":2,"title":"ConfigMaps and Secrets"},{"id":"rbac-and-service-accounts","level":2,"title":"RBAC and service accounts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"}],"markdown":"/kubernetes/index.md","related":["/helm/","/argocd/","/cilium/","/gateway-api/","/docker/"],"reviewed":"2026-09-24","title":"Kubernetes","url":"/kubernetes/"},{"description":"Render, install, upgrade and roll back Helm releases, and understand the template and values behaviour behind most chart surprises.","group":"Kubernetes","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"render-before-installing","level":2,"title":"Render before installing"},{"id":"installing-and-upgrading-releases","level":2,"title":"Installing and upgrading releases"},{"id":"rolling-back-a-release","level":2,"title":"Rolling back a release"},{"id":"when-a-release-is-stuck","level":2,"title":"When a release is stuck"},{"id":"writing-a-chart","level":2,"title":"Writing a chart"},{"id":"chart-dependencies","level":2,"title":"Chart dependencies"},{"id":"named-templates-and-helpers","level":2,"title":"Named templates and helpers"},{"id":"hooks-and-tests","level":2,"title":"Hooks and tests"},{"id":"oci-registries","level":2,"title":"OCI registries"},{"id":"values-schema","level":2,"title":"Values schema"},{"id":"rendering-for-a-target-cluster","level":2,"title":"Rendering for a target cluster"},{"id":"helm-with-gitops","level":2,"title":"Helm with GitOps"},{"id":"troubleshooting-helm-releases","level":2,"title":"Troubleshooting Helm releases"},{"id":"oneliners","level":2,"title":"Oneliners"}],"markdown":"/helm/index.md","related":["/kubernetes/","/argocd/","/git/"],"reviewed":"2026-09-24","title":"Helm","url":"/helm/"},{"description":"Diagnose Argo CD Applications that will not sync or stay healthy, and control drift, sync order, pruning and multi-tenant access.","group":"Kubernetes","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"an-application-that-will-not-sync","level":2,"title":"An Application that will not sync"},{"id":"application-spec","level":2,"title":"Application spec"},{"id":"diffing-and-drift","level":2,"title":"Diffing and drift"},{"id":"app-of-apps-and-applicationsets","level":2,"title":"App of apps and ApplicationSets"},{"id":"sync-phases-waves-and-hooks","level":2,"title":"Sync phases, waves and hooks"},{"id":"projects-and-access","level":2,"title":"Projects and access"},{"id":"health-checks-and-custom-resources","level":2,"title":"Health checks and custom resources"},{"id":"applicationset-generators","level":2,"title":"ApplicationSet generators"},{"id":"app-of-apps-in-practice","level":2,"title":"App of apps in practice"},{"id":"resource-level-sync-options","level":2,"title":"Resource-level sync options"},{"id":"rbac","level":2,"title":"RBAC"},{"id":"cli-operations","level":2,"title":"CLI operations"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/argocd/index.md","related":["/kubernetes/","/helm/","/git/"],"reviewed":"2026-09-24","title":"Argo CD","url":"/argocd/"},{"description":"Configure GatewayClass, Gateway and Route objects, know which team owns each, and find why a route receives no traffic.","group":"Kubernetes","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"a-route-that-is-not-receiving-traffic","level":2,"title":"A route that is not receiving traffic"},{"id":"the-resource-model","level":2,"title":"The resource model"},{"id":"a-gateway","level":2,"title":"A Gateway"},{"id":"an-httproute","level":2,"title":"An HTTPRoute"},{"id":"cross-namespace-references","level":2,"title":"Cross-namespace references"},{"id":"filters","level":2,"title":"Filters"},{"id":"matching-in-detail","level":2,"title":"Matching in detail"},{"id":"tls-modes","level":2,"title":"TLS modes"},{"id":"traffic-splitting-and-progressive-delivery","level":2,"title":"Traffic splitting and progressive delivery"},{"id":"grpcroute","level":3,"title":"GRPCRoute"},{"id":"timeouts-and-retries","level":2,"title":"Timeouts and retries"},{"id":"policy-attachment","level":2,"title":"Policy attachment"},{"id":"migrating-from-ingress","level":2,"title":"Migrating from Ingress"},{"id":"troubleshooting-gateway-api","level":2,"title":"Troubleshooting Gateway API"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"}],"markdown":"/gateway-api/index.md","related":["/kubernetes/","/cilium/","/tls/","/http/","/traefik/"],"reviewed":"2026-09-24","title":"Gateway API","url":"/gateway-api/"},{"description":"Understand Cilium's identity-based policy and eBPF datapath, then trace dropped or misrouted flows with cilium-dbg and Hubble.","group":"Kubernetes","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-cilium-sees-the-cluster","level":2,"title":"How Cilium sees the cluster"},{"id":"datapath-and-ipam","level":2,"title":"Datapath and IPAM"},{"id":"kube-proxy-replacement","level":2,"title":"kube-proxy replacement"},{"id":"network-policy","level":2,"title":"Network policy"},{"id":"policy-examples-by-layer","level":3,"title":"Policy examples by layer"},{"id":"hubble-flow-observability","level":2,"title":"Hubble flow observability"},{"id":"hubble-cli-filters","level":3,"title":"Hubble CLI filters"},{"id":"cluster-mesh","level":2,"title":"Cluster Mesh"},{"id":"datapath-troubleshooting","level":2,"title":"Datapath troubleshooting"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"}],"markdown":"/cilium/index.md","related":["/kubernetes/","/gateway-api/","/iproute2/","/dns/","/linux-performance/"],"reviewed":"2026-09-24","title":"Cilium","url":"/cilium/"},{"description":"Run, build, inspect and clean up containers, images, volumes and networks on a single Docker daemon, and diagnose containers that exit or cannot connect.","group":"Containers and IaC","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"start-with-a-container-problem","level":2,"title":"Start with a container problem"},{"id":"containers","level":2,"title":"Containers"},{"id":"images-and-layers","level":2,"title":"Images and layers"},{"id":"dockerfile","level":2,"title":"Dockerfile"},{"id":"multi-stage-builds","level":2,"title":"Multi-stage builds"},{"id":"buildkit-cache-mounts","level":2,"title":"BuildKit cache mounts"},{"id":"healthchecks","level":2,"title":"Healthchecks"},{"id":"logging-drivers","level":2,"title":"Logging drivers"},{"id":"resource-limits","level":2,"title":"Resource limits"},{"id":"security-options","level":2,"title":"Security options"},{"id":"volumes-and-bind-mounts","level":2,"title":"Volumes and bind mounts"},{"id":"networks-and-published-ports","level":2,"title":"Networks and published ports"},{"id":"logs-and-debugging","level":2,"title":"Logs and debugging"},{"id":"registries-and-multi-platform-builds","level":2,"title":"Registries and multi-platform builds"},{"id":"cleaning-up-disk-space","level":2,"title":"Cleaning up disk space"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/docker/index.md","related":["/docker-compose/","/kubernetes/","/linux-performance/","/iproute2/"],"reviewed":"2026-09-24","title":"Docker","url":"/docker/"},{"description":"Run and debug multi-container stacks with Compose v2: commands, the compose.yaml keys that matter, and how recreation, dependencies and overrides behave.","group":"Containers and IaC","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-compose-decides-what-to-change","level":2,"title":"How Compose decides what to change"},{"id":"lifecycle-commands","level":2,"title":"Lifecycle commands"},{"id":"composeyaml-reference","level":2,"title":"compose.yaml reference"},{"id":"environment-files-and-interpolation","level":2,"title":"Environment files and interpolation"},{"id":"overrides-merging-and-profiles","level":2,"title":"Overrides, merging and profiles"},{"id":"profiles","level":2,"title":"Profiles"},{"id":"include-and-extends","level":2,"title":"include and extends"},{"id":"depends_on-conditions-in-practice","level":2,"title":"depends_on conditions in practice"},{"id":"environment-precedence","level":2,"title":"Environment precedence"},{"id":"hardening-and-resource-keys","level":2,"title":"Hardening and resource keys"},{"id":"running-commands-in-services","level":2,"title":"Running commands in services"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/docker-compose/index.md","related":["/docker/","/kubernetes/","/traefik/","/postgresql/"],"reviewed":"2026-09-24","title":"Docker Compose","url":"/docker-compose/"},{"description":"Plan and apply safely, structure modules and variables, refactor and repair state, and recover from drift, lock and provider errors in Terraform.","group":"Containers and IaC","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-plan-and-apply-work","level":2,"title":"How plan and apply work"},{"id":"configuration-and-providers","level":2,"title":"Configuration and providers"},{"id":"resources-and-meta-arguments","level":2,"title":"Resources and meta-arguments"},{"id":"variables-outputs-and-precedence","level":2,"title":"Variables, outputs and precedence"},{"id":"keeping-secrets-out-of-state","level":2,"title":"Keeping secrets out of state"},{"id":"modules","level":2,"title":"Modules"},{"id":"refactoring-and-repairing-state","level":2,"title":"Refactoring and repairing state"},{"id":"moved-import-and-removed-in-depth","level":2,"title":"moved, import and removed in depth"},{"id":"state-surgery","level":2,"title":"State surgery"},{"id":"workspaces-vs-directories","level":2,"title":"Workspaces vs directories"},{"id":"tests","level":2,"title":"Tests"},{"id":"provider-lock-and-installation","level":2,"title":"Provider lock and installation"},{"id":"expressions-worth-knowing","level":2,"title":"Expressions worth knowing"},{"id":"workspaces-and-environment-layout","level":2,"title":"Workspaces and environment layout"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/terraform/index.md","related":["/aws/","/ansible/","/vault/","/git/"],"reviewed":"2026-09-24","title":"Terraform","url":"/terraform/"},{"description":"Write idempotent Ansible playbooks, resolve inventory and variable precedence, dry-run with check mode, and debug plays that fail or change the wrong thing.","group":"Containers and IaC","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-a-play-runs","level":2,"title":"How a play runs"},{"id":"dry-run-first","level":2,"title":"Dry run first"},{"id":"inventory","level":2,"title":"Inventory"},{"id":"dynamic-inventory","level":3,"title":"Dynamic inventory"},{"id":"variable-precedence","level":2,"title":"Variable precedence"},{"id":"playbook-structure-and-rolling-updates","level":2,"title":"Playbook structure and rolling updates"},{"id":"roles","level":2,"title":"Roles"},{"id":"writing-idempotent-tasks","level":2,"title":"Writing idempotent tasks"},{"id":"templates-facts-and-conditionals","level":2,"title":"Templates, facts and conditionals"},{"id":"filters-and-tests","level":2,"title":"Filters and tests"},{"id":"async-and-long-running-tasks","level":2,"title":"Async and long-running tasks"},{"id":"secrets-with-ansible-vault","level":2,"title":"Secrets with Ansible Vault"},{"id":"configuration-and-performance","level":2,"title":"Configuration and performance"},{"id":"testing-with-molecule","level":2,"title":"Testing with Molecule"},{"id":"ansible-lint","level":2,"title":"ansible-lint"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/ansible/index.md","related":["/ssh/","/terraform/","/vault/","/netauto/","/python/"],"reviewed":"2026-09-24","title":"Ansible","url":"/ansible/"},{"description":"Resolve AWS CLI v2 credentials and profiles, filter output, and run and debug common EC2, S3, IAM, logs, RDS, Lambda and EKS operations.","group":"Containers and IaC","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"credentials-and-identity","level":2,"title":"Credentials and identity"},{"id":"output-queries-and-pagination","level":2,"title":"Output, queries and pagination"},{"id":"jmespath-patterns","level":3,"title":"JMESPath patterns"},{"id":"ec2-and-systems-manager","level":2,"title":"EC2 and Systems Manager"},{"id":"systems-manager-beyond-sessions","level":3,"title":"Systems Manager beyond sessions"},{"id":"s3","level":2,"title":"S3"},{"id":"iam-policy-evaluation","level":2,"title":"IAM policy evaluation"},{"id":"policy-patterns","level":3,"title":"Policy patterns"},{"id":"cloudwatch-logs-and-cloudtrail","level":2,"title":"CloudWatch Logs and CloudTrail"},{"id":"logs-insights-recipes","level":3,"title":"Logs Insights recipes"},{"id":"rds-lambda-and-eks","level":2,"title":"RDS, Lambda and EKS"},{"id":"eks-operations-from-the-cli","level":3,"title":"EKS operations from the CLI"},{"id":"cost-checks","level":2,"title":"Cost checks"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/aws/index.md","related":["/terraform/","/kubernetes/","/jq/","/ssh/"],"reviewed":"2026-09-24","title":"AWS","url":"/aws/"},{"description":"Run rootless containers and pods with Podman, mount volumes past SELinux, and manage them as systemd services with Quadlet and auto-update.","group":"Containers and IaC","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"rootless-and-how-it-differs-from-docker","level":2,"title":"Rootless and how it differs from Docker"},{"id":"images-and-registries","level":2,"title":"Images and registries"},{"id":"running-containers","level":2,"title":"Running containers"},{"id":"volumes-and-selinux-labels","level":2,"title":"Volumes and SELinux labels"},{"id":"networks-and-dns-between-containers","level":2,"title":"Networks and DNS between containers"},{"id":"pods","level":2,"title":"Pods"},{"id":"quadlet-systemd-units","level":2,"title":"Quadlet systemd units"},{"id":"auto-update","level":2,"title":"Auto-update"},{"id":"podman-compose","level":2,"title":"podman compose"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/podman/index.md","related":["/docker/","/docker-compose/","/systemd/","/users/","/caddy/"],"reviewed":"2026-09-24","title":"Podman","url":"/podman/"},{"description":"Write GitHub Actions workflows that are fast, least-privilege and hard to exploit: triggers, matrices, caching, reusable workflows, OIDC and debugging failed runs with gh.","group":"Containers and IaC","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-a-run-happens","level":2,"title":"How a run happens"},{"id":"triggers-and-filters","level":2,"title":"Triggers and filters"},{"id":"jobs-steps-and-matrices","level":2,"title":"Jobs, steps and matrices"},{"id":"expressions-and-contexts","level":2,"title":"Expressions and contexts"},{"id":"secrets-permissions-and-github_token","level":2,"title":"Secrets, permissions and GITHUB_TOKEN"},{"id":"caching-and-artifacts","level":2,"title":"Caching and artifacts"},{"id":"reusable-workflows-and-composite-actions","level":2,"title":"Reusable workflows and composite actions"},{"id":"oidc-to-aws","level":2,"title":"OIDC to AWS"},{"id":"concurrency-and-environments","level":2,"title":"Concurrency and environments"},{"id":"gh-cli-for-runs-and-logs","level":2,"title":"gh CLI for runs and logs"},{"id":"self-hosted-runners","level":2,"title":"Self-hosted runners"},{"id":"example-workflows","level":2,"title":"Example workflows"},{"id":"go-test-and-release","level":3,"title":"Go test and release"},{"id":"container-build-and-push","level":3,"title":"Container build and push"},{"id":"hugo-deploy-to-github-pages","level":3,"title":"Hugo deploy to GitHub Pages"},{"id":"security-pitfalls","level":2,"title":"Security pitfalls"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/github-actions/index.md","related":["/git/","/go/","/docker/","/aws/","/bash/"],"reviewed":"2026-09-24","title":"GitHub Actions","url":"/github-actions/"},{"description":"Write Makefiles that rebuild only what changed and justfiles that run project commands: rules, variables, pattern rules, parallel builds and the tab bugs.","group":"Containers and IaC","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-make-decides-what-to-run","level":2,"title":"How make decides what to run"},{"id":"variables","level":2,"title":"Variables"},{"id":"automatic-variables","level":2,"title":"Automatic variables"},{"id":"pattern-and-static-pattern-rules","level":2,"title":"Pattern and static pattern rules"},{"id":"functions","level":2,"title":"Functions"},{"id":"includes-directories-and-recursion","level":2,"title":"Includes, directories and recursion"},{"id":"silent-parallel-and-the-special-targets","level":2,"title":"Silent, parallel and the special targets"},{"id":"a-makefile-for-a-go-project","level":2,"title":"A Makefile for a Go project"},{"id":"a-makefile-for-a-container-project","level":2,"title":"A Makefile for a container project"},{"id":"justfile","level":2,"title":"justfile"},{"id":"when-to-use-which","level":2,"title":"When to use which"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/make/index.md","related":["/bash/","/go/","/docker/","/github-actions/"],"reviewed":"2026-09-24","title":"Make and just","url":"/make/"},{"description":"Write PromQL for incidents, read counters and histograms correctly, write alerting and recording rules, and keep series cardinality under control.","group":"Observability","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"instant-and-range-vectors","level":2,"title":"Instant and range vectors"},{"id":"counters-gauges-and-histograms","level":2,"title":"Counters, gauges and histograms"},{"id":"selectors-and-aggregation","level":2,"title":"Selectors and aggregation"},{"id":"joins-with-on-and-group_left","level":2,"title":"Joins with on and group_left"},{"id":"promql-recipes","level":2,"title":"PromQL recipes"},{"id":"alerting-rules","level":2,"title":"Alerting rules"},{"id":"alertmanager-routing","level":2,"title":"Alertmanager routing"},{"id":"service-discovery-and-relabelling","level":2,"title":"Service discovery and relabelling"},{"id":"remote-write-and-long-term-storage","level":2,"title":"Remote write and long-term storage"},{"id":"recording-rules","level":2,"title":"Recording rules"},{"id":"cardinality","level":2,"title":"Cardinality"},{"id":"http-api-checks","level":2,"title":"HTTP API checks"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/prometheus/index.md","related":["/opentelemetry/","/kubernetes/","/linux-performance/","/jq/"],"reviewed":"2026-09-24","title":"Prometheus","url":"/prometheus/"},{"description":"Configure OpenTelemetry SDKs and Collector pipelines, propagate trace context, choose a sampling strategy and find where telemetry is lost.","group":"Observability","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"signals-resources-and-context","level":2,"title":"Signals, resources and context"},{"id":"sdk-configuration-with-environment-variables","level":2,"title":"SDK configuration with environment variables"},{"id":"manual-spans","level":2,"title":"Manual spans"},{"id":"sdk-setup-in-go","level":2,"title":"SDK setup in Go"},{"id":"sdk-setup-in-python","level":2,"title":"SDK setup in Python"},{"id":"semantic-conventions","level":2,"title":"Semantic conventions"},{"id":"exporting-to-jaeger-tempo-and-prometheus","level":2,"title":"Exporting to Jaeger, Tempo and Prometheus"},{"id":"dropping-and-sampling-in-the-collector","level":2,"title":"Dropping and sampling in the Collector"},{"id":"collector-configuration","level":2,"title":"Collector configuration"},{"id":"deployment-patterns","level":2,"title":"Deployment patterns"},{"id":"sampling","level":2,"title":"Sampling"},{"id":"sending-a-test-span","level":2,"title":"Sending a test span"},{"id":"collector-checks","level":2,"title":"Collector checks"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/opentelemetry/index.md","related":["/prometheus/","/kubernetes/","/http/","/go/"],"reviewed":"2026-09-24","title":"OpenTelemetry","url":"/opentelemetry/"},{"description":"Provision Grafana datasources, dashboards and alerts as code, drive it through the HTTP API, and ship, query and tune logs in Loki with LogQL and logcli.","group":"Observability","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"provisioning-as-code","level":2,"title":"Provisioning as code"},{"id":"dashboard-json-essentials","level":2,"title":"Dashboard JSON essentials"},{"id":"variables-and-templating","level":2,"title":"Variables and templating"},{"id":"alert-rules","level":2,"title":"Alert rules"},{"id":"useful-panel-patterns","level":2,"title":"Useful panel patterns"},{"id":"the-http-api-with-curl","level":2,"title":"The HTTP API with curl"},{"id":"loki-architecture","level":2,"title":"Loki architecture"},{"id":"shipping-logs-with-promtail-and-alloy","level":2,"title":"Shipping logs with Promtail and Alloy"},{"id":"logql","level":2,"title":"LogQL"},{"id":"logcli","level":2,"title":"logcli"},{"id":"retention-and-deletion","level":2,"title":"Retention and deletion"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/grafana/index.md","related":["/prometheus/","/opentelemetry/","/kubernetes/","/docker-compose/"],"reviewed":"2026-09-24","title":"Grafana and Loki","url":"/grafana/"},{"description":"Resolve and trace names with dig and resolvectl, read the answer, reason about TTLs and caching, and debug search domains and Kubernetes DNS.","group":"Networking","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"a-name-that-will-not-resolve","level":2,"title":"A name that will not resolve"},{"id":"reading-dig-output","level":2,"title":"Reading dig output"},{"id":"dig-drill-and-delv","level":2,"title":"dig, drill and delv"},{"id":"record-types","level":2,"title":"Record types"},{"id":"zone-files","level":2,"title":"Zone files"},{"id":"ttl-and-caching","level":2,"title":"TTL and caching"},{"id":"search-domains-and-ndots","level":2,"title":"Search domains and ndots"},{"id":"systemd-resolved","level":2,"title":"systemd-resolved"},{"id":"kubernetes-dns","level":2,"title":"Kubernetes DNS"},{"id":"dnssec","level":2,"title":"DNSSEC"},{"id":"split-horizon","level":2,"title":"Split horizon"},{"id":"running-a-resolver","level":2,"title":"Running a resolver"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/dns/index.md","related":["/http/","/tls/","/iproute2/","/kubernetes/","/systemd/"],"reviewed":"2026-09-24","title":"DNS","url":"/dns/"},{"description":"Use curl to test HTTP endpoints, break request time into DNS, TCP, TLS and server phases, script calls safely, and read what status codes mean.","group":"Networking","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"a-request-that-is-failing","level":2,"title":"A request that is failing"},{"id":"timing","level":2,"title":"Timing"},{"id":"useful-flags","level":2,"title":"Useful flags"},{"id":"sending-data","level":2,"title":"Sending data"},{"id":"tls-checks","level":2,"title":"TLS checks"},{"id":"proxies","level":2,"title":"Proxies"},{"id":"redirects","level":2,"title":"Redirects"},{"id":"caching","level":2,"title":"Caching"},{"id":"cors","level":2,"title":"CORS"},{"id":"authentication","level":2,"title":"Authentication"},{"id":"http2-and-http3","level":2,"title":"HTTP/2 and HTTP/3"},{"id":"cookies","level":2,"title":"Cookies"},{"id":"status-codes-in-practice","level":2,"title":"Status codes in practice"},{"id":"using-curl-in-scripts","level":2,"title":"Using curl in scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/http/index.md","related":["/dns/","/tls/","/squid/","/traefik/","/bash/"],"reviewed":"2026-09-24","title":"HTTP and curl","url":"/http/"},{"description":"Configure OpenSSH clients and servers, manage keys and agents, forward ports through bastions and read the debug output that names the real failure.","group":"Networking","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-an-ssh-connection-is-set-up","level":2,"title":"How an SSH connection is set up"},{"id":"client-configuration","level":2,"title":"Client configuration"},{"id":"match-include-and-proxycommand","level":2,"title":"Match, Include and ProxyCommand"},{"id":"keys-and-the-agent","level":2,"title":"Keys and the agent"},{"id":"certificates","level":2,"title":"Certificates"},{"id":"port-forwarding","level":2,"title":"Port forwarding"},{"id":"server-configuration","level":2,"title":"Server configuration"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"file-transfer-over-ssh","level":2,"title":"File transfer over SSH"},{"id":"sftp","level":2,"title":"SFTP"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/ssh/index.md","related":["/scp/","/git/","/tls/","/systemd/"],"reviewed":"2026-09-24","title":"SSH","url":"/ssh/"},{"description":"Copy files over SSH with scp, understand its SFTP-based transfer since OpenSSH 9.0, and know when rsync, sftp or tar is the better tool.","group":"Networking","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-scp-transfers-files","level":2,"title":"How scp transfers files"},{"id":"syntax","level":2,"title":"Syntax"},{"id":"when-not-to-use-scp","level":2,"title":"When not to use scp"},{"id":"sftp","level":2,"title":"sftp"},{"id":"rsync","level":2,"title":"rsync"},{"id":"batching-many-files","level":2,"title":"Batching many files"},{"id":"resuming-and-verifying","level":2,"title":"Resuming and verifying"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/scp/index.md","related":["/ssh/","/bash/"],"reviewed":"2026-09-24","title":"SCP","url":"/scp/"},{"description":"Diagnose and configure Cisco IOS and IOS XE devices: show commands, interfaces, VLANs, OSPF, BGP, ACLs and changes that roll back if they lock you out.","group":"Networking","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-ios-configuration-works","level":2,"title":"How IOS configuration works"},{"id":"getting-oriented","level":2,"title":"Getting oriented"},{"id":"show-commands-by-question","level":3,"title":"Show commands by question"},{"id":"etherchannel-first-hop-redundancy-and-port-security","level":2,"title":"EtherChannel, first-hop redundancy and port security"},{"id":"management-hardening","level":2,"title":"Management hardening"},{"id":"configuration-backup","level":2,"title":"Configuration backup"},{"id":"interfaces","level":2,"title":"Interfaces"},{"id":"vlans-and-spanning-tree","level":2,"title":"VLANs and spanning tree"},{"id":"routing","level":2,"title":"Routing"},{"id":"acls","level":2,"title":"ACLs"},{"id":"recovery-and-change-safety","level":2,"title":"Recovery and change safety"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/cisco/index.md","related":["/netauto/","/ssh/","/iproute2/","/dns/"],"reviewed":"2026-09-24","title":"Cisco IOS","url":"/cisco/"},{"description":"Collect device state, parse CLI output into data and push configuration changes safely with Netmiko, NAPALM, Nornir and Ansible.","group":"Networking","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"choosing-the-interface","level":2,"title":"Choosing the interface"},{"id":"connecting-and-collecting-with-netmiko","level":2,"title":"Connecting and collecting with Netmiko"},{"id":"many-devices-with-nornir","level":2,"title":"Many devices with Nornir"},{"id":"vendor-neutral-state-with-napalm","level":2,"title":"Vendor-neutral state with NAPALM"},{"id":"parsing-cli-output","level":2,"title":"Parsing CLI output"},{"id":"configuration-changes","level":2,"title":"Configuration changes"},{"id":"napalm-load-diff-commit","level":3,"title":"NAPALM: load, diff, commit"},{"id":"netmiko-send-commands","level":3,"title":"Netmiko: send commands"},{"id":"ansible-declarative-with-check-mode","level":3,"title":"Ansible: declarative with check mode"},{"id":"configuration-diff-and-rollback","level":2,"title":"Configuration diff and rollback"},{"id":"idempotence-and-templates","level":2,"title":"Idempotence and templates"},{"id":"bulk-operations-safely","level":2,"title":"Bulk operations safely"},{"id":"discovery-and-verification","level":2,"title":"Discovery and verification"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/netauto/index.md","related":["/cisco/","/ansible/","/python/","/ssh/"],"reviewed":"2026-09-24","title":"Network automation","url":"/netauto/"},{"description":"Configure Traefik v3 entrypoints, routers, middlewares and services from Docker, Kubernetes or files, and debug a route that does not match.","group":"Proxies and routing","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-traefik-routes-a-request","level":2,"title":"How Traefik routes a request"},{"id":"static-configuration","level":2,"title":"Static configuration"},{"id":"routers-and-rules","level":2,"title":"Routers and rules"},{"id":"services","level":2,"title":"Services"},{"id":"middlewares","level":2,"title":"Middlewares"},{"id":"middleware-catalogue","level":3,"title":"Middleware catalogue"},{"id":"tls-options","level":2,"title":"TLS options"},{"id":"dynamic-configuration-in-files","level":2,"title":"Dynamic configuration in files"},{"id":"kubernetes","level":2,"title":"Kubernetes"},{"id":"the-crd-set","level":3,"title":"The CRD set"},{"id":"docker-labels","level":2,"title":"Docker labels"},{"id":"dashboard-and-api","level":2,"title":"Dashboard and API"},{"id":"observability","level":2,"title":"Observability"},{"id":"running-more-than-one-instance","level":2,"title":"Running more than one instance"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/traefik/index.md","related":["/gateway-api/","/tls/","/http/","/docker-compose/","/kubernetes/"],"reviewed":"2026-09-24","title":"Traefik","url":"/traefik/"},{"description":"Run and debug a Squid forward proxy: http_access rule order, ACLs, caching, authentication, parent proxies and access.log analysis.","group":"Proxies and routing","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"first-checks-for-a-failing-proxy","level":2,"title":"First checks for a failing proxy"},{"id":"how-a-request-is-decided","level":2,"title":"How a request is decided"},{"id":"acl-types","level":2,"title":"ACL types"},{"id":"minimal-working-configuration","level":2,"title":"Minimal working configuration"},{"id":"caching","level":2,"title":"Caching"},{"id":"authentication","level":2,"title":"Authentication"},{"id":"transparent-and-reverse-modes","level":2,"title":"Transparent and reverse modes"},{"id":"upstream-proxies","level":2,"title":"Upstream proxies"},{"id":"logs-and-monitoring","level":2,"title":"Logs and monitoring"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"cache-tuning","level":2,"title":"Cache tuning"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/squid/index.md","related":["/http/","/tls/","/dns/","/systemd/","/linux-performance/"],"reviewed":"2026-09-24","title":"Squid","url":"/squid/"},{"description":"Configure Nginx as a reverse proxy, TLS terminator and static file server, understand which server and location handle a request, and read the logs when it returns 502.","group":"Proxies and routing","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-a-request-is-handled","level":2,"title":"How a request is handled"},{"id":"server-selection","level":2,"title":"Server selection"},{"id":"location-matching","level":2,"title":"Location matching"},{"id":"reverse-proxy","level":2,"title":"Reverse proxy"},{"id":"tls-http2-and-http3","level":2,"title":"TLS, HTTP/2 and HTTP/3"},{"id":"static-files-and-caching","level":2,"title":"Static files and caching"},{"id":"rate-limiting-access-control-and-basic-auth","level":2,"title":"Rate limiting, access control and basic auth"},{"id":"redirects-and-rewrites","level":2,"title":"Redirects and rewrites"},{"id":"upstreams-and-load-balancing","level":2,"title":"Upstreams and load balancing"},{"id":"logs","level":2,"title":"Logs"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/nginx/index.md","related":["/caddy/","/traefik/","/tls/","/http/","/dns/","/systemd/"],"reviewed":"2026-09-24","title":"Nginx","url":"/nginx/"},{"description":"Write a Caddyfile that proxies, serves files and issues its own certificates, run Caddy in a container, drive it through the admin API and fix ACME and upstream failures.","group":"Proxies and routing","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-caddy-is-configured","level":2,"title":"How Caddy is configured"},{"id":"automatic-https","level":2,"title":"Automatic HTTPS"},{"id":"wildcard-certificates-with-dns-plugins","level":2,"title":"Wildcard certificates with DNS plugins"},{"id":"reverse-proxy","level":2,"title":"Reverse proxy"},{"id":"load-balancing-and-health-checks","level":2,"title":"Load balancing and health checks"},{"id":"static-files-redirects-and-matchers","level":2,"title":"Static files, redirects and matchers"},{"id":"basic-auth-and-access-control","level":2,"title":"Basic auth and access control"},{"id":"snippets-imports-and-reuse","level":2,"title":"Snippets, imports and reuse"},{"id":"running-in-docker-or-podman","level":2,"title":"Running in Docker or Podman"},{"id":"admin-api","level":2,"title":"Admin API"},{"id":"logs","level":2,"title":"Logs"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/caddy/index.md","related":["/nginx/","/traefik/","/tls/","/dns/","/docker-compose/","/podman/"],"reviewed":"2026-09-24","title":"Caddy","url":"/caddy/"},{"description":"Diagnose a slow or blocked PostgreSQL database: psql, query plans, indexes, locks, vacuum and bloat, pooling, replication and backups.","group":"Data","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"a-slow-or-stuck-database","level":2,"title":"A slow or stuck database"},{"id":"psql","level":2,"title":"psql"},{"id":"reading-a-plan","level":2,"title":"Reading a plan"},{"id":"indexes","level":2,"title":"Indexes"},{"id":"locks-and-blocking","level":2,"title":"Locks and blocking"},{"id":"vacuum-and-bloat","level":2,"title":"Vacuum and bloat"},{"id":"connections-and-pooling","level":2,"title":"Connections and pooling"},{"id":"replication-and-backups","level":2,"title":"Replication and backups"},{"id":"maintenance-queries","level":2,"title":"Maintenance queries"},{"id":"roles-and-grants","level":2,"title":"Roles and grants"},{"id":"partitioning","level":2,"title":"Partitioning"},{"id":"logical-replication","level":2,"title":"Logical replication"},{"id":"major-version-upgrades","level":2,"title":"Major version upgrades"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/postgresql/index.md","related":["/vault/","/redis/","/linux-performance/","/kubernetes/"],"reviewed":"2026-09-24","title":"PostgreSQL","url":"/postgresql/"},{"description":"Inspect and fix a slow or full Redis: data structure costs, eviction, persistence, keyspace scans, locks, replication and cluster checks.","group":"Data","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"first-checks-for-a-slow-instance","level":2,"title":"First checks for a slow instance"},{"id":"the-model","level":2,"title":"The model"},{"id":"data-structures-and-their-costs","level":2,"title":"Data structures and their costs"},{"id":"ttl-and-eviction","level":2,"title":"TTL and eviction"},{"id":"persistence","level":2,"title":"Persistence"},{"id":"keyspace-inspection","level":2,"title":"Keyspace inspection"},{"id":"locks-and-atomicity","level":2,"title":"Locks and atomicity"},{"id":"replication-and-cluster","level":2,"title":"Replication and cluster"},{"id":"streams-and-consumer-groups","level":2,"title":"Streams and consumer groups"},{"id":"transactions-pipelines-and-lua","level":2,"title":"Transactions, pipelines and Lua"},{"id":"sentinel","level":2,"title":"Sentinel"},{"id":"monitoring","level":2,"title":"Monitoring"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/redis/index.md","related":["/postgresql/","/linux-performance/","/kubernetes/","/docker/"],"reviewed":"2026-09-24","title":"Redis","url":"/redis/"},{"description":"Check cluster health, fix unassigned shards, write mappings, queries and aggregations, and tune slow search or indexing in Elasticsearch.","group":"Data","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"connecting-with-curl","level":2,"title":"Connecting with curl"},{"id":"health-and-shards","level":2,"title":"Health and shards"},{"id":"disk-watermarks","level":3,"title":"Disk watermarks"},{"id":"indexing-and-mapping","level":2,"title":"Indexing and mapping"},{"id":"mapping-parameters","level":3,"title":"Mapping parameters"},{"id":"analysers","level":2,"title":"Analysers"},{"id":"searching","level":2,"title":"Searching"},{"id":"query-dsl-examples","level":3,"title":"Query DSL examples"},{"id":"aggregations","level":3,"title":"Aggregations"},{"id":"reindex-aliases-and-lifecycle","level":2,"title":"Reindex, aliases and lifecycle"},{"id":"reindex-options","level":3,"title":"Reindex options"},{"id":"ilm-policies","level":3,"title":"ILM policies"},{"id":"cat-apis","level":2,"title":"cat APIs"},{"id":"performance","level":2,"title":"Performance"},{"id":"snapshots","level":2,"title":"Snapshots"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/elasticsearch/index.md","related":["/jq/","/http/","/opentelemetry/","/kubernetes/"],"reviewed":"2026-09-24","title":"Elasticsearch","url":"/elasticsearch/"},{"description":"Write correct SQL across PostgreSQL, MySQL and SQLite: joins, window functions, CTEs, upserts, indexes, isolation levels, NULL rules and reusable queries.","group":"Data","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-a-query-executes","level":2,"title":"How a query executes"},{"id":"joins","level":2,"title":"Joins"},{"id":"aggregation-and-having","level":2,"title":"Aggregation and HAVING"},{"id":"window-functions","level":2,"title":"Window functions"},{"id":"ctes-and-recursive-ctes","level":2,"title":"CTEs and recursive CTEs"},{"id":"subqueries-versus-joins","level":2,"title":"Subqueries versus joins"},{"id":"upsert","level":2,"title":"UPSERT"},{"id":"indexes-and-reading-explain","level":2,"title":"Indexes and reading EXPLAIN"},{"id":"transactions-and-isolation-levels","level":2,"title":"Transactions and isolation levels"},{"id":"null-semantics","level":2,"title":"NULL semantics"},{"id":"date-and-time-handling","level":2,"title":"Date and time handling"},{"id":"pagination","level":2,"title":"Pagination"},{"id":"anti-patterns","level":2,"title":"Anti-patterns"},{"id":"reusable-queries","level":2,"title":"Reusable queries"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/sql/index.md","related":["/postgresql/","/mysql/","/sqlite/","/go/","/python/"],"reviewed":"2026-09-24","title":"SQL","url":"/sql/"},{"description":"Use SQLite well: the sqlite3 shell, type affinity, WAL mode and pragmas, locking, JSON and FTS5, backups, tuning, and safe access from Go and Python.","group":"Data","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"what-sqlite-is-and-is-not","level":2,"title":"What SQLite is and is not"},{"id":"the-sqlite3-shell","level":2,"title":"The sqlite3 shell"},{"id":"types-and-affinity","level":2,"title":"Types and affinity"},{"id":"wal-mode-and-pragmas","level":2,"title":"WAL mode and pragmas"},{"id":"transactions-and-locking","level":2,"title":"Transactions and locking"},{"id":"json","level":2,"title":"JSON"},{"id":"full-text-search-with-fts5","level":2,"title":"Full-text search with FTS5"},{"id":"backup-restore-and-vacuum","level":2,"title":"Backup, restore and vacuum"},{"id":"performance","level":2,"title":"Performance"},{"id":"from-go","level":2,"title":"From Go"},{"id":"from-python","level":2,"title":"From Python"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/sqlite/index.md","related":["/sql/","/postgresql/","/go/","/python/","/files/"],"reviewed":"2026-09-24","title":"SQLite","url":"/sqlite/"},{"description":"Operate MySQL 8.4 and MariaDB 11.4: client, users and grants, InnoDB, EXPLAIN, slow log, indexes, dumps and mariadb-backup, replication, my.cnf and lock diagnosis.","group":"Data","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"first-look-at-a-struggling-server","level":2,"title":"First look at a struggling server"},{"id":"the-client","level":2,"title":"The client"},{"id":"users-authentication-and-grants","level":2,"title":"Users, authentication and grants"},{"id":"databases-tables-and-character-sets","level":2,"title":"Databases, tables and character sets"},{"id":"innodb-essentials","level":2,"title":"InnoDB essentials"},{"id":"explain","level":2,"title":"EXPLAIN"},{"id":"slow-query-log","level":2,"title":"Slow query log"},{"id":"indexes","level":2,"title":"Indexes"},{"id":"backups","level":2,"title":"Backups"},{"id":"replication","level":2,"title":"Replication"},{"id":"mycnf-essentials","level":2,"title":"my.cnf essentials"},{"id":"performance-schema-and-process-list","level":2,"title":"Performance schema and process list"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/mysql/index.md","related":["/sql/","/postgresql/","/sqlite/","/linux-performance/","/systemd/"],"reviewed":"2026-09-24","title":"MySQL and MariaDB","url":"/mysql/"},{"description":"Operate Apache Kafka: topics, partitions and consumer groups, the shell tools, offset resets, lag, retention, compaction, producer and consumer tuning, and what to check when it misbehaves.","group":"Data","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"topics-partitions-offsets-and-groups","level":2,"title":"Topics, partitions, offsets and groups"},{"id":"kraft-mode","level":2,"title":"KRaft mode"},{"id":"topics-and-configuration","level":2,"title":"Topics and configuration"},{"id":"console-producer-and-consumer","level":2,"title":"Console producer and consumer"},{"id":"consumer-groups-lag-and-offset-resets","level":2,"title":"Consumer groups, lag and offset resets"},{"id":"retention-and-compaction","level":2,"title":"Retention and compaction"},{"id":"producer-settings","level":2,"title":"Producer settings"},{"id":"consumer-rebalancing","level":2,"title":"Consumer rebalancing"},{"id":"schema-registry","level":2,"title":"Schema registry"},{"id":"running-locally-with-a-container","level":2,"title":"Running locally with a container"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/kafka/index.md","related":["/docker/","/kubernetes/","/prometheus/","/elasticsearch/"],"reviewed":"2026-09-24","title":"Kafka","url":"/kafka/"},{"description":"Inspect and verify certificate chains with OpenSSL, issue keys and CSRs, install trust anchors, configure servers and diagnose failed TLS handshakes.","group":"Security and identity","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"the-chain-of-trust","level":2,"title":"The chain of trust"},{"id":"reading-certificates","level":2,"title":"Reading certificates"},{"id":"keys-and-csrs","level":2,"title":"Keys and CSRs"},{"id":"a-private-ca","level":2,"title":"A private CA"},{"id":"trust-stores","level":2,"title":"Trust stores"},{"id":"formats","level":2,"title":"Formats"},{"id":"testing-a-server","level":2,"title":"Testing a server"},{"id":"cipher-suites-and-security-levels","level":2,"title":"Cipher suites and security levels"},{"id":"server-configuration","level":2,"title":"Server configuration"},{"id":"mutual-tls","level":2,"title":"Mutual TLS"},{"id":"acme-and-certbot","level":2,"title":"ACME and certbot"},{"id":"cert-manager","level":2,"title":"cert-manager"},{"id":"certificate-lifecycle","level":2,"title":"Certificate lifecycle"},{"id":"expiry-and-revocation-checks","level":3,"title":"Expiry and revocation checks"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/tls/index.md","related":["/http/","/dns/","/vault/","/ssh/","/traefik/"],"reviewed":"2026-09-24","title":"TLS and certificates","url":"/tls/"},{"description":"Operate HashiCorp Vault: seal state, tokens, auth methods, policies, KV, dynamic credentials, PKI and transit, and why a request is denied.","group":"Security and identity","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"a-request-that-is-denied","level":2,"title":"A request that is denied"},{"id":"seal-unseal-and-tokens","level":2,"title":"Seal, unseal and tokens"},{"id":"auth-methods","level":2,"title":"Auth methods"},{"id":"kubernetes-auth","level":3,"title":"Kubernetes auth"},{"id":"oidc","level":3,"title":"OIDC"},{"id":"identity","level":3,"title":"Identity"},{"id":"userpass-and-ldap","level":3,"title":"Userpass and LDAP"},{"id":"approle","level":3,"title":"AppRole"},{"id":"policies","level":2,"title":"Policies"},{"id":"templated-policies-and-parameter-constraints","level":3,"title":"Templated policies and parameter constraints"},{"id":"kv-secrets","level":2,"title":"KV secrets"},{"id":"versions-check-and-set-and-retention","level":3,"title":"Versions, check-and-set and retention"},{"id":"dynamic-secrets","level":2,"title":"Dynamic secrets"},{"id":"static-roles-and-root-rotation","level":3,"title":"Static roles and root rotation"},{"id":"pki","level":2,"title":"PKI"},{"id":"root-and-intermediate","level":3,"title":"Root and intermediate"},{"id":"acme","level":3,"title":"ACME"},{"id":"transit","level":2,"title":"Transit"},{"id":"audit-devices","level":2,"title":"Audit devices"},{"id":"vault-agent","level":2,"title":"Vault Agent"},{"id":"raft-storage-operations","level":2,"title":"Raft storage operations"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/vault/index.md","related":["/tls/","/kubernetes/","/postgresql/","/terraform/","/aws/"],"reviewed":"2026-09-24","title":"Vault","url":"/vault/"},{"description":"Identity, Kerberos, host enrolment, DNS and certificates in one domain, with the commands for enrolment, RBAC and replication problems.","group":"Security and identity","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"what-the-pieces-are","level":2,"title":"What the pieces are"},{"id":"kerberos-tickets","level":2,"title":"Kerberos tickets"},{"id":"users-and-groups","level":2,"title":"Users and groups"},{"id":"hosts-and-services","level":2,"title":"Hosts and services"},{"id":"dns","level":2,"title":"DNS"},{"id":"certificates","level":2,"title":"Certificates"},{"id":"access-control","level":2,"title":"Access control"},{"id":"replication","level":2,"title":"Replication"},{"id":"keycloak-and-oidc","level":2,"title":"Keycloak and OIDC"},{"id":"client-troubleshooting","level":2,"title":"Client troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/idm/index.md","related":["/dns/","/tls/","/ssh/","/systemd/"],"reviewed":"2026-09-24","title":"FreeIPA / Red Hat IdM","url":"/idm/"},{"description":"Technique notes for authorised offensive testing, arranged by ATT\u0026CK phase, with the tooling and the telemetry each step leaves behind.","group":"Security and identity","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"ground-rules","level":2,"title":"Ground rules"},{"id":"scoping-and-authorisation","level":2,"title":"Scoping and authorisation"},{"id":"reconnaissance","level":2,"title":"Reconnaissance"},{"id":"initial-access","level":2,"title":"Initial access"},{"id":"execution-and-persistence","level":2,"title":"Execution and persistence"},{"id":"privilege-escalation","level":2,"title":"Privilege escalation"},{"id":"credential-access","level":2,"title":"Credential access"},{"id":"discovery-and-lateral-movement","level":2,"title":"Discovery and lateral movement"},{"id":"command-and-control","level":2,"title":"Command and control"},{"id":"exfiltration-testing","level":2,"title":"Exfiltration testing"},{"id":"reporting","level":2,"title":"Reporting"},{"id":"tooling-reference","level":2,"title":"Tooling reference"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"further-reading","level":2,"title":"Further reading"},{"id":"defensive-counterpart","level":2,"title":"Defensive counterpart"}],"markdown":"/redteam/index.md","related":["/idm/","/aws/","/kubernetes/","/dns/"],"reviewed":"2026-09-24","title":"Red team","url":"/redteam/"},{"description":"Run VMs and containers on Proxmox VE from the shell: qm, pct, pvesm, pvecm, vzdump, cloud-init templates, SDN and the API, plus fixes for locked guests and lost quorum.","group":"Virtualisation","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"the-model","level":2,"title":"The model"},{"id":"vms-with-qm","level":2,"title":"VMs with qm"},{"id":"clone-template-disk","level":3,"title":"Clone, template, disk"},{"id":"snapshots","level":3,"title":"Snapshots"},{"id":"migration","level":3,"title":"Migration"},{"id":"containers-with-pct","level":2,"title":"Containers with pct"},{"id":"bind-mounts-and-devices","level":3,"title":"Bind mounts and devices"},{"id":"storage-and-pvesm","level":2,"title":"Storage and pvesm"},{"id":"networking","level":2,"title":"Networking"},{"id":"sdn","level":3,"title":"SDN"},{"id":"cloud-init-templates","level":2,"title":"Cloud-init templates"},{"id":"backups","level":2,"title":"Backups"},{"id":"proxmox-backup-server","level":3,"title":"Proxmox Backup Server"},{"id":"clustering-and-quorum","level":2,"title":"Clustering and quorum"},{"id":"high-availability","level":2,"title":"High availability"},{"id":"updating","level":2,"title":"Updating"},{"id":"the-api-and-pvesh","level":2,"title":"The API and pvesh"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/proxmox/index.md","related":["/libvirt/","/systemd/","/ssh/","/linux-performance/","/ansible/"],"reviewed":"2026-09-24","title":"Proxmox VE","url":"/proxmox/"},{"description":"Run KVM guests with virsh and virt-install: cloud-image builds with cloud-init, snapshots, storage, NAT and bridged networking, PCI passthrough, live migration and the usual failures.","group":"Virtualisation","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"the-model","level":2,"title":"The model"},{"id":"domains-with-virsh","level":2,"title":"Domains with virsh"},{"id":"building-a-guest-from-a-cloud-image","level":2,"title":"Building a guest from a cloud image"},{"id":"console-and-access","level":2,"title":"Console and access"},{"id":"storage-pools-and-volumes","level":2,"title":"Storage pools and volumes"},{"id":"disk-images-with-qemu-img","level":2,"title":"Disk images with qemu-img"},{"id":"snapshots","level":2,"title":"Snapshots"},{"id":"networking","level":2,"title":"Networking"},{"id":"cpu-memory-and-performance-settings","level":2,"title":"CPU, memory and performance settings"},{"id":"device-passthrough","level":2,"title":"Device passthrough"},{"id":"live-migration","level":2,"title":"Live migration"},{"id":"editing-xml","level":2,"title":"Editing XML"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"scripts","level":2,"title":"Scripts"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/libvirt/index.md","related":["/proxmox/","/iproute2/","/ssh/","/systemd/","/users/","/ansible/"],"reviewed":"2026-09-24","title":"libvirt and KVM","url":"/libvirt/"},{"description":"Idioms for errors, concurrency and interfaces, the toolchain commands worth memorising, and the traps that survive code review.","group":"Languages","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"errors","level":2,"title":"Errors"},{"id":"context","level":2,"title":"Context"},{"id":"concurrency","level":2,"title":"Concurrency"},{"id":"interfaces-and-structure","level":2,"title":"Interfaces and structure"},{"id":"slices-maps-and-strings","level":2,"title":"Slices, maps and strings"},{"id":"http-services","level":2,"title":"HTTP services"},{"id":"testing","level":2,"title":"Testing"},{"id":"modules-and-builds","level":2,"title":"Modules and builds"},{"id":"profiling","level":2,"title":"Profiling"},{"id":"generics","level":2,"title":"Generics"},{"id":"goroutine-patterns","level":2,"title":"Goroutine patterns"},{"id":"go-test-flags","level":2,"title":"go test flags"},{"id":"workspaces-build-tags-and-embed","level":2,"title":"Workspaces, build tags and embed"},{"id":"golangci-lint","level":2,"title":"golangci-lint"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"snippets","level":2,"title":"Snippets"}],"markdown":"/go/index.md","related":["/rust/","/python/","/testing/","/http/"],"reviewed":"2026-09-24","title":"Go","url":"/go/"},{"description":"Write operational Python scripts that fail safely: subprocess, paths, logging, HTTP, configuration, concurrency, uv packaging and troubleshooting.","group":"Languages","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"a-script-worth-keeping","level":2,"title":"A script worth keeping"},{"id":"running-commands-with-subprocess","level":2,"title":"Running commands with subprocess"},{"id":"paths-and-files","level":2,"title":"Paths and files"},{"id":"logging","level":2,"title":"Logging"},{"id":"http-clients-timeouts-and-retries","level":2,"title":"HTTP clients, timeouts and retries"},{"id":"configuration-and-secrets","level":2,"title":"Configuration and secrets"},{"id":"data-handling","level":2,"title":"Data handling"},{"id":"concurrency-threads-asyncio-or-processes","level":2,"title":"Concurrency: threads, asyncio or processes"},{"id":"packaging-with-uv","level":2,"title":"Packaging with uv"},{"id":"uv-workflows","level":2,"title":"uv workflows"},{"id":"typing","level":2,"title":"Typing"},{"id":"dataclasses-and-pydantic","level":2,"title":"Dataclasses and pydantic"},{"id":"asyncio","level":2,"title":"asyncio"},{"id":"logging-configuration","level":2,"title":"Logging configuration"},{"id":"pytest-fixtures-and-parametrize","level":2,"title":"pytest fixtures and parametrize"},{"id":"useful-one-liners","level":2,"title":"Useful one-liners"},{"id":"snippets","level":2,"title":"Snippets"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"}],"markdown":"/python/index.md","related":["/testing/","/bash/","/go/","/typescript/"],"reviewed":"2026-09-24","title":"Python","url":"/python/"},{"description":"Ownership and borrowing in practice, error handling, async, and the cargo commands that matter day to day.","group":"Languages","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"ownership-in-practice","level":2,"title":"Ownership in practice"},{"id":"errors","level":2,"title":"Errors"},{"id":"options-and-iterators","level":2,"title":"Options and iterators"},{"id":"structs-traits-and-generics","level":2,"title":"Structs, traits and generics"},{"id":"shared-state-and-concurrency","level":2,"title":"Shared state and concurrency"},{"id":"async","level":2,"title":"Async"},{"id":"tests","level":2,"title":"Tests"},{"id":"cargo-and-builds","level":2,"title":"Cargo and builds"},{"id":"lifetimes-and-smart-pointers","level":2,"title":"Lifetimes and smart pointers"},{"id":"iterator-patterns","level":2,"title":"Iterator patterns"},{"id":"trait-design","level":2,"title":"Trait design"},{"id":"workspaces-and-features","level":2,"title":"Workspaces and features"},{"id":"clippy","level":2,"title":"Clippy"},{"id":"tokio-basics","level":2,"title":"Tokio basics"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"oneliners","level":2,"title":"Oneliners"},{"id":"snippets","level":2,"title":"Snippets"}],"markdown":"/rust/index.md","related":["/go/","/testing/","/python/"],"reviewed":"2026-09-24","title":"Rust","url":"/rust/"},{"description":"Type-check TypeScript with tsc 7, narrow and validate untrusted data, pick tsconfig flags that catch real bugs, and fix common compiler errors.","group":"Languages","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"compiler-versions-typescript-6-and-7","level":2,"title":"Compiler versions: TypeScript 6 and 7"},{"id":"types-describe-compile-time-only","level":2,"title":"Types describe compile time only"},{"id":"narrowing","level":2,"title":"Narrowing"},{"id":"generics","level":2,"title":"Generics"},{"id":"tsconfig","level":2,"title":"tsconfig"},{"id":"running-typescript-in-node","level":2,"title":"Running TypeScript in Node"},{"id":"async-and-errors","level":2,"title":"Async and errors"},{"id":"structuring-types","level":2,"title":"Structuring types"},{"id":"environment-variables-and-configuration","level":2,"title":"Environment variables and configuration"},{"id":"utility-types","level":2,"title":"Utility types"},{"id":"esm-and-commonjs","level":2,"title":"ESM and CommonJS"},{"id":"node-scripts","level":2,"title":"Node scripts"},{"id":"zod","level":2,"title":"zod"},{"id":"vitest","level":2,"title":"vitest"},{"id":"useful-commands","level":2,"title":"Useful commands"},{"id":"snippets","level":2,"title":"Snippets"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"slow-type-checking","level":3,"title":"Slow type-checking"}],"markdown":"/typescript/index.md","related":["/testing/","/design/","/python/","/go/"],"reviewed":"2026-09-24","title":"TypeScript","url":"/typescript/"},{"description":"Inspect history, undo changes safely, rebase and resolve conflicts, recover lost work, and understand the object model behind each Git command.","group":"Practice","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"how-git-stores-history","level":2,"title":"How Git stores history"},{"id":"inspecting","level":2,"title":"Inspecting"},{"id":"undoing","level":2,"title":"Undoing"},{"id":"reflog-recovering-lost-commits","level":2,"title":"Reflog: recovering lost commits"},{"id":"branches","level":2,"title":"Branches"},{"id":"rebase-and-merge","level":2,"title":"Rebase and merge"},{"id":"conflicts","level":2,"title":"Conflicts"},{"id":"stash-and-worktrees","level":2,"title":"Stash and worktrees"},{"id":"remotes-and-authentication","level":2,"title":"Remotes and authentication"},{"id":"tags","level":2,"title":"Tags"},{"id":"bisect","level":2,"title":"Bisect"},{"id":"hooks-and-configuration","level":2,"title":"Hooks and configuration"},{"id":"log-formatting","level":2,"title":"Log formatting"},{"id":"sparse-checkout","level":2,"title":"Sparse checkout"},{"id":"submodules","level":2,"title":"Submodules"},{"id":"signing","level":2,"title":"Signing"},{"id":"large-repositories","level":2,"title":"Large repositories"},{"id":"gh-cli","level":2,"title":"gh CLI"},{"id":"useful-one-liners","level":2,"title":"Useful one-liners"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"}],"markdown":"/git/index.md","related":["/ssh/","/bash/","/testing/","/design/"],"reviewed":"2026-09-24","title":"Git","url":"/git/"},{"description":"Latency and capacity numbers, scaling, caching, load balancing, resilience, data and API decisions, and the failure mode each one introduces.","group":"Practice","headings":[{"id":"numbers-to-reason-with","level":2,"title":"Numbers to reason with"},{"id":"latency-throughput-saturation","level":2,"title":"Latency, throughput, saturation"},{"id":"scaling","level":2,"title":"Scaling"},{"id":"caching","level":2,"title":"Caching"},{"id":"load-balancing","level":2,"title":"Load balancing"},{"id":"resilience","level":2,"title":"Resilience"},{"id":"data","level":2,"title":"Data"},{"id":"apis","level":2,"title":"APIs"},{"id":"asynchronous-work","level":2,"title":"Asynchronous work"},{"id":"multi-tenancy","level":2,"title":"Multi-tenancy"},{"id":"api-patterns-in-detail","level":2,"title":"API patterns in detail"},{"id":"idempotency","level":2,"title":"Idempotency"},{"id":"retries-and-timeouts","level":2,"title":"Retries and timeouts"},{"id":"queues-in-practice","level":2,"title":"Queues in practice"},{"id":"schema-migration","level":2,"title":"Schema migration"},{"id":"observability","level":2,"title":"Observability"},{"id":"troubleshooting-design-symptoms","level":2,"title":"Troubleshooting design symptoms"},{"id":"reviewing-a-design","level":2,"title":"Reviewing a design"}],"markdown":"/design/index.md","related":["/http/","/redis/","/postgresql/","/prometheus/","/testing/"],"reviewed":"2026-09-24","title":"System design","url":"/design/"},{"description":"Choose the right test layer, write fast deterministic tests, use fakes and fixtures, and run, isolate and de-flake tests in pytest, Go and Vitest.","group":"Practice","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"what-each-test-layer-is-for","level":2,"title":"What each test layer is for"},{"id":"what-makes-a-good-test","level":2,"title":"What makes a good test"},{"id":"test-doubles","level":2,"title":"Test doubles"},{"id":"fixtures-and-test-data","level":2,"title":"Fixtures and test data"},{"id":"controlling-time","level":2,"title":"Controlling time"},{"id":"integration-tests","level":2,"title":"Integration tests"},{"id":"contract-tests","level":2,"title":"Contract tests"},{"id":"end-to-end-tests","level":2,"title":"End-to-end tests"},{"id":"coverage-and-mutation-testing","level":2,"title":"Coverage and mutation testing"},{"id":"flakes","level":2,"title":"Flakes"},{"id":"shaping-the-pyramid","level":2,"title":"Shaping the pyramid"},{"id":"property-based-testing","level":2,"title":"Property-based testing"},{"id":"mocking-guidance","level":2,"title":"Mocking guidance"},{"id":"contract-tests-in-practice","level":2,"title":"Contract tests in practice"},{"id":"snapshot-and-golden-tests","level":2,"title":"Snapshot and golden tests"},{"id":"ci-gating","level":2,"title":"CI gating"},{"id":"running-tests-in-ci","level":2,"title":"Running tests in CI"},{"id":"troubleshooting-test-runs","level":2,"title":"Troubleshooting test runs"}],"markdown":"/testing/index.md","related":["/python/","/go/","/typescript/","/design/","/docker-compose/"],"reviewed":"2026-09-24","title":"Testing","url":"/testing/"},{"description":"Call the Anthropic and OpenAI APIs: models, streaming, tool use, structured output, caching, rate limits, errors and key handling.","group":"Practice","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"current-anthropic-models","level":2,"title":"Current Anthropic models"},{"id":"request-shape","level":2,"title":"Request shape"},{"id":"streaming","level":2,"title":"Streaming"},{"id":"structured-output-and-tool-use","level":2,"title":"Structured output and tool use"},{"id":"prompt-patterns-that-earn-their-place","level":2,"title":"Prompt patterns that earn their place"},{"id":"cost","level":2,"title":"Cost"},{"id":"errors-and-rate-limits","level":2,"title":"Errors and rate limits"},{"id":"prompt-patterns-in-practice","level":2,"title":"Prompt patterns in practice"},{"id":"tool-use-in-go-and-curl","level":2,"title":"Tool use in Go and curl"},{"id":"structured-output-with-curl","level":2,"title":"Structured output with curl"},{"id":"streaming-in-go-and-against-openai","level":2,"title":"Streaming in Go and against OpenAI"},{"id":"message-batches","level":2,"title":"Message Batches"},{"id":"cost-control","level":2,"title":"Cost control"},{"id":"evaluation","level":2,"title":"Evaluation"},{"id":"openai-compatible-endpoints","level":2,"title":"OpenAI-compatible endpoints"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"keys-and-data","level":2,"title":"Keys and data"},{"id":"oneliners","level":2,"title":"Oneliners"}],"markdown":"/llm-apis/index.md","related":["/python/","/http/","/jq/","/vault/","/typescript/"],"reviewed":"2026-09-24","title":"LLM APIs","url":"/llm-apis/"},{"description":"Copy-pasteable one-line commands for files, processes, disk, network, DNS, systemd, Git, containers, Kubernetes, SSH, TLS, JSON and archives on a Linux host.","group":"Scripts","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"files-and-text","level":2,"title":"Files and text"},{"id":"processes","level":2,"title":"Processes"},{"id":"disk-and-memory","level":2,"title":"Disk and memory"},{"id":"network-and-ports","level":2,"title":"Network and ports"},{"id":"dns-and-http","level":2,"title":"DNS and HTTP"},{"id":"users-and-sessions","level":2,"title":"Users and sessions"},{"id":"systemd-and-journal","level":2,"title":"systemd and journal"},{"id":"git","level":2,"title":"Git"},{"id":"docker-and-podman","level":2,"title":"Docker and Podman"},{"id":"kubernetes","level":2,"title":"Kubernetes"},{"id":"ssh","level":2,"title":"SSH"},{"id":"tls-certificates","level":2,"title":"TLS certificates"},{"id":"dates-and-maths","level":2,"title":"Dates and maths"},{"id":"json-and-yaml","level":2,"title":"JSON and YAML"},{"id":"archives","level":2,"title":"Archives"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/oneliners/index.md","related":["/bash/","/scripts/","/jq/","/iproute2/","/systemd/","/git/","/docker/","/kubernetes/","/ssh/","/tls/"],"reviewed":"2026-09-24","title":"Shell one-liners","url":"/oneliners/"},{"description":"Complete Bash and Python scripts for disk alerts, certificate expiry, health checks, backups, cleanup, audits, metrics export and parallel SSH, ready to drop into cron or a timer.","group":"Scripts","headings":[{"id":"cheatsheet","level":2,"title":"Cheatsheet"},{"id":"disk-usage-alert","level":2,"title":"Disk usage alert"},{"id":"certificate-expiry-checker","level":2,"title":"Certificate expiry checker"},{"id":"http-health-check","level":2,"title":"HTTP health check"},{"id":"log-rotation-and-compression","level":2,"title":"Log rotation and compression"},{"id":"rsync-backup-with-retention","level":2,"title":"rsync backup with retention"},{"id":"kubernetes-stale-resource-cleanup","level":2,"title":"Kubernetes stale resource cleanup"},{"id":"container-image-prune-report","level":2,"title":"Container image prune report"},{"id":"port-and-service-reachability-sweep","level":2,"title":"Port and service reachability sweep"},{"id":"systemd-unit-failure-report","level":2,"title":"systemd unit failure report"},{"id":"git-repository-bulk-update","level":2,"title":"Git repository bulk update"},{"id":"s3-bucket-sync-with-checks","level":2,"title":"S3 bucket sync with checks"},{"id":"user-account-audit","level":2,"title":"User account audit"},{"id":"wait-for-dependency","level":2,"title":"Wait for dependency"},{"id":"prometheus-textfile-collector","level":2,"title":"Prometheus textfile collector"},{"id":"parallel-ssh-command-runner","level":2,"title":"Parallel SSH command runner"},{"id":"troubleshooting","level":2,"title":"Troubleshooting"},{"id":"further-reading","level":2,"title":"Further reading"}],"markdown":"/scripts/index.md","related":["/bash/","/oneliners/","/python/","/systemd/","/kubernetes/","/docker/","/ssh/","/tls/","/aws/","/prometheus/"],"reviewed":"2026-09-24","title":"Operations scripts","url":"/scripts/"},{"description":"Small Go functions for slices, strings and maths, each with a short explanation and an example call.","group":"Snippets","headings":[],"markdown":"/snippets/go/index.md","related":["/go/","/testing/"],"reviewed":"2026-09-24","title":"Go snippets","url":"/snippets/go/"},{"description":"Small Python functions for lists, dictionaries, strings, maths and dates, each with a short explanation and an example call.","group":"Snippets","headings":[],"markdown":"/snippets/python/index.md","related":["/python/","/testing/"],"reviewed":"2026-09-24","title":"Python snippets","url":"/snippets/python/"},{"description":"Small JavaScript functions for arrays, objects, strings, dates and the browser DOM, each with a short explanation and an example call.","group":"Snippets","headings":[],"markdown":"/snippets/javascript/index.md","related":["/typescript/","/testing/"],"reviewed":"2026-09-24","title":"JavaScript snippets","url":"/snippets/javascript/"},{"description":"React components such as accordions, modals and data tables, and hooks for state, events and browser APIs, each with an example use.","group":"Snippets","headings":[],"markdown":"/snippets/react/index.md","related":["/typescript/","/testing/"],"reviewed":"2026-09-24","title":"React snippets","url":"/snippets/react/"},{"description":"Small C# methods for collections, strings, maths and dates, each with a short explanation and an example call.","group":"Snippets","headings":[],"markdown":"/snippets/csharp/index.md","related":["/design/","/testing/"],"reviewed":"2026-09-24","title":"C# snippets","url":"/snippets/csharp/"}],"search":"https://www.wiki.jodisand.me/search/?q={query}","site":"Software Engineering Wiki"}