Practical guides on Linux, AI, self-hosting, and developer tools

How to Harden Your Docker Images: A Container Security Checklist

Hardening a Docker image means eliminating the attack surface at every layer. Start from a minimal base image like distroless or Alpine, run as a non-root user, set the filesystem read-only, drop all Linux capabilities and add back only what the application actually needs, pin dependency versions with verified checksums, and scan images with Trivy or Grype before pushing to a registry. Each layer of this checklist is independently valuable. You can adopt them incrementally without rewriting existing Dockerfiles, and every single item you check off reduces your exposure to real-world container exploits.

How to Implement OAuth 2.0 Login from Scratch

You implement OAuth 2.0 login by using the Authorization Code flow with PKCE (Proof Key for Code Exchange). Your web app redirects the user to the provider’s authorization endpoint with a code_challenge, the user authenticates and consents, the provider redirects back with an authorization code, and your backend exchanges that code along with the code_verifier for an access token. PKCE is mandatory for all OAuth 2.0 clients under the OAuth 2.1 draft specification (currently at draft-ietf-oauth-v2-1-15) and eliminates the need for a client secret in public clients. Building this from scratch - without Auth0, Clerk, or NextAuth - takes roughly 200 lines of code and teaches you exactly how token exchange, session management, and token refresh actually work.

Why Is My USB-C Charger So Slow? Understanding USB Power Delivery

USB Power Delivery (USB-PD) is supposed to be the universal charging standard that ends cable chaos. In practice, plugging in the wrong cable or charger gives you a device that charges at 5W instead of 100W - or refuses to charge at all. The root cause is almost always one of three things: a cable rated below what the device needs, a charger that advertises high wattage but only supports a narrow set of voltage profiles, or confusion between USB-PD and the half-dozen proprietary fast-charging protocols that coexist with it.

How to Deploy with Docker Compose and Traefik in Production

Deploy a production-ready stack by running Traefik v3 as a Docker container that automatically discovers your services through Docker labels, provisions and renews Let’s Encrypt TLS certificates via the ACME protocol, and routes incoming HTTPS traffic to the correct backend container. Everything lives in a single docker-compose.yml file with no separate Nginx or Apache configs to maintain. Traefik’s Docker provider watches the Docker socket for container start and stop events, reads routing rules from labels like traefik.http.routers.myapp.rule=Host('app.example.com'), and reconfigures itself in real time. Combined with middleware for rate limiting, authentication, and security headers, this gives you a self-managing reverse proxy that handles multi-service deployments on a single VPS with zero manual certificate management.

How to Set Up Wildcard SSL Certificates with Let's Encrypt and DNS

A wildcard SSL certificate for *.example.com from Let’s Encrypt covers every single-level subdomain - app.example.com, git.example.com, status.example.com - under one certificate. You obtain it by running Certbot with the DNS-01 challenge, which requires creating a TXT record at _acme-challenge.example.com to prove domain ownership. A DNS plugin like certbot-dns-cloudflare or certbot-dns-route53 automates this by creating and cleaning up the TXT record through your DNS provider’s API. Once issued, a single wildcard cert replaces the need to manage individual certificates for every self-hosted service behind your reverse proxy.

How to Turn Tmux Into a Terminal IDE with Sessions, Scripts, and Plugins

Tmux already handles pane splitting and window management well enough out of the box, but most people stop there. The real productivity gains come from treating tmux as infrastructure: scripting your session layouts so a single command rebuilds your entire development environment, persisting sessions across reboots so you never lose context, and installing plugins that add clipboard integration, fuzzy finding, and pattern matching to your workflow. With tmux 3.6a (the current stable release) and a handful of well-chosen plugins, your terminal becomes something closer to a persistent, scriptable IDE than a simple multiplexer.

Manage Your Dev Environment with Nix Shells (No Docker Required)

If you have ever handed a new team member a README full of “install Node 22, then Python 3.12, then make sure your openssl headers match” instructions, you already know the problem. Nix flakes solve it at the root: instead of documenting what to install, you declare the exact toolchain in a flake.nix file, commit it alongside your code, and every developer runs nix develop to get an identical environment - same compiler, same CLI versions, same system libraries. In 2026, Nix flakes are stable, the Nixpkgs repository holds over 100,000 packages, and the ecosystem around flakes has matured to the point where the learning curve is manageable even for teams with no prior Nix experience.

MiniMax M2.7: Model That Almost Matches Claude Opus 4.6

MiniMax M2.7 , released in April 2026, is a 230B-parameter open-weights reasoning model (Mixture-of-Experts, 10B active, 8 of 256 experts routed per token) that scores 50 on the Artificial Analysis Intelligence Index. That lands it on par with Sonnet 4.6 across coding and agent benchmarks and within a couple of points of Claude Opus 4.6. Weights are on HuggingFace at MiniMaxAI/MiniMax-M2.7 , the hosted API runs $0.30 / $1.20 per million input/output tokens (roughly a tenth of Opus), and if you have a 128GB-unified-memory Mac Studio, an AMD Strix Halo box, or an NVIDIA DGX Spark , you can run it offline with zero token bills. Two big asterisks: the M2.7 license is not the permissive M2.5 license (commercial use is restricted), and there is no multimodal support. For homelabbers and agent builders who are text-only and non-commercial, M2.7 is the best locally runnable Opus-class option shipped so far.