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

CSS Anchor Positioning: How to Build Tooltips and Popovers Without JavaScript

CSS Anchor Positioning is a browser-native feature that lets you position any absolutely-placed element relative to another element in the document - no JavaScript required. Using the anchor() function, position-anchor property, and @position-try rules, you can build fully interactive tooltips, dropdown menus, and context menus in pure CSS and HTML. As of early 2026, it works in Chrome 125+, Firefox 132+, and Safari 18.2+, covering roughly 91% of browser traffic. Combined with the HTML popover attribute (Baseline 2024), you get show/hide toggling, keyboard dismissal, and top-layer stacking for free. The JavaScript tooltip library is effectively dead for most use cases.

How to Implement Feature Flags from Scratch

You can build a fully functional feature flag system using a JSON configuration file, environment variable overrides, and a single evaluation function in roughly 100 lines of Python. This gives you gradual rollouts, kill switches, and per-environment toggles without paying for LaunchDarkly , Unleash , or any other SaaS platform. The core pattern is straightforward: define each flag with a name, a boolean or percentage-based rule, and a list of target environments, then evaluate it at runtime through a thin SDK you own and control completely.

How to Recover Deleted Files on Linux from ext4 and Btrfs

If you just ran rm on something important and you are reading this in a panic - stop what you are doing on that filesystem right now. Run mount -o remount,ro /dev/sdX to remount the partition read-only before anything else. Every write operation that hits the disk after deletion reduces your chances of getting those files back. With that out of the way, here is a direct answer: for ext4, use extundelete or debugfs as your first recovery attempt, and PhotoRec as a fallback. For Btrfs, roll back a snapshot if you have one, or use btrfs restore if you do not. The details matter quite a bit depending on your situation, so read on.

How to Set Up Tailscale for Mesh Networking Across All Your Devices

Tailscale creates a private WireGuard -based mesh VPN across all your devices with almost no configuration. You install the client on each machine, authenticate with your identity provider, and every device gets a stable 100.x.y.z IP that works regardless of NAT, firewalls, or network changes. As of early 2026, Tailscale v1.96 supports ACL tags for device-level policy, exit nodes for routing all traffic through a specific machine, subnet routers for exposing entire LANs, and MagicDNS for hostname resolution. For homelabbers, it is the simplest way to securely connect a homelab server, cloud VPS, phone, and laptop into one unified network.

Build Powerful TUI Apps in Python with Textual and Rich

Terminal apps used to mean raw curses calls and a lot of pain. Today, Python’s Textual and Rich libraries have flipped that experience entirely. In under 50 lines of Python you can have a full-screen app with styled layouts, interactive widgets, keyboard navigation, and live data updates - no web browser, no Electron, no JavaScript. This post walks through both libraries, shows you how they fit together, and builds up to a complete working example you can extend immediately.

Gemini CLI: Google's Free AI Coding Agent with 1,000 Requests Per Day

Gemini CLI is Google’s open-source (Apache 2.0) terminal AI coding agent, and its defining feature is a free tier that no competitor matches: 1,000 requests per day and 60 requests per minute using nothing more than a personal Google account. No credit card required, no API key, no trial period that expires after 30 days. This persistent free tier, combined with a 1M token context window and Gemini 3 Flash as the default model, has driven Gemini CLI to roughly 97K GitHub stars - making it the most-starred AI coding CLI on the platform. The catch is code quality: Gemini 3 Flash gets things right on the first try about 50-60% of the time on complex tasks, well behind Claude Code’s 95%. That trade-off defines who should and should not use it.

How to Migrate from X11 to Wayland on an Existing Linux Install

You can switch your existing Linux installation from X11 to Wayland without reinstalling anything. The migration boils down to selecting a Wayland session at your display manager’s login screen, then working through three categories of follow-up: Xwayland compatibility for legacy X11 applications, input device configuration via libinput instead of xorg.conf, and environment variable tweaks so that toolkits like Qt, GTK, and Electron render natively through Wayland instead of falling back to X11. Most people can finish the whole process in an afternoon, keeping an X11 session as a fallback until they are satisfied everything works.

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.