<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Home on Omid Farhang</title><link>https://omid.dev/</link><description>Recent content in Home on Omid Farhang</description><image><title>Omid Farhang</title><url>https://omid.dev/images/bio-photo-150x150.jpg</url><link>https://omid.dev/images/bio-photo-150x150.jpg</link></image><generator>Hugo -- 0.165.0</generator><language>en-US</language><copyright>2026 Omid Farhang | All rights reserved.</copyright><lastBuildDate>Tue, 20 Oct 2026 09:00:00 +0330</lastBuildDate><atom:link href="https://omid.dev/index.xml" rel="self" type="application/rss+xml"/><atom:link href="https://pubsubhubbub.appspot.com/" rel="hub"/><item><title>Per-User Cloud OAuth on One Host</title><link>https://omid.dev/2026/10/20/per-user-cloud-oauth-on-one-host/</link><pubDate>Tue, 20 Oct 2026 09:00:00 +0330</pubDate><guid>https://omid.dev/2026/10/20/per-user-cloud-oauth-on-one-host/</guid><description>App credentials are site-wide, but refresh tokens are not shared in .env. Each user connects their own Dropbox or Drive account, and CLI maps to one user.</description></item><item><title>WebAuthn and TOTP Without a Framework</title><link>https://omid.dev/2026/10/18/webauthn-and-totp-in-frameworkless-php/</link><pubDate>Sun, 18 Oct 2026 20:00:00 +0330</pubDate><guid>https://omid.dev/2026/10/18/webauthn-and-totp-in-frameworkless-php/</guid><description>Passkeys and authenticator apps in plain PHP: relying-party identity, session ceremonies, trusted-device cookies, recovery codes, and an explicit CLI exception.</description></item><item><title>Operating yt-dlp on a Self-Hosted Box in 2026</title><link>https://omid.dev/2026/10/16/operating-yt-dlp-on-a-self-hosted-box/</link><pubDate>Fri, 16 Oct 2026 20:00:00 +0330</pubDate><guid>https://omid.dev/2026/10/16/operating-yt-dlp-on-a-self-hosted-box/</guid><description>The hard part of hosting yt-dlp is not the CLI call—it is Deno in the image, cookie handling, path confinement, and owning the operational risk.</description></item><item><title>Background Jobs Without a Queue: PHP, Apache, and fastcgi_finish_request</title><link>https://omid.dev/2026/10/14/background-jobs-without-a-queue-php-apache/</link><pubDate>Wed, 14 Oct 2026 20:00:00 +0330</pubDate><guid>https://omid.dev/2026/10/14/background-jobs-without-a-queue-php-apache/</guid><description>On Apache, background exec() children often die with the request. A small private host can still run long work with post-response PHP, durable job rows, and retry on the next hit.</description></item><item><title>How to Evaluate a Supplement or Medicine</title><link>https://omid.dev/2026/10/12/how-to-evaluate-a-supplement-or-medicine/</link><pubDate>Mon, 12 Oct 2026 14:00:00 +0330</pubDate><guid>https://omid.dev/2026/10/12/how-to-evaluate-a-supplement-or-medicine/</guid><description>A reusable method for checking a product&amp;#39;s purpose, evidence, dose, quality, interactions, and duplicate ingredients before deciding whether to use it.</description></item><item><title>How I Decide What to Do When I'm Sick</title><link>https://omid.dev/2026/10/11/how-i-decide-what-to-do-when-im-sick/</link><pubDate>Sun, 11 Oct 2026 14:00:00 +0330</pubDate><guid>https://omid.dev/2026/10/11/how-i-decide-what-to-do-when-im-sick/</guid><description>A practical way to choose between monitoring, supportive care, medication, and medical help—and to know when the plan should change.</description></item><item><title>Treat the Illness, Not the Habit</title><link>https://omid.dev/2026/10/10/treat-the-illness-not-the-habit/</link><pubDate>Sat, 10 Oct 2026 14:00:00 +0330</pubDate><guid>https://omid.dev/2026/10/10/treat-the-illness-not-the-habit/</guid><description>A practical framework for evaluating treatment decisions, based on what I got wrong about colds, antibiotics, probiotics, and familiar remedies.</description></item><item><title>update-cursor</title><link>https://omid.dev/tools/update-cursor/</link><pubDate>Fri, 09 Oct 2026 19:30:00 +0330</pubDate><guid>https://omid.dev/tools/update-cursor/</guid><description>Install or update Cursor IDE from the official stable AppImage API on Linux — skip download when already current, force reinstall, or uninstall cleanly.</description></item><item><title>update-nvm</title><link>https://omid.dev/tools/update-nvm/</link><pubDate>Fri, 09 Oct 2026 19:30:00 +0330</pubDate><guid>https://omid.dev/tools/update-nvm/</guid><description>Update every installed Node major via nvm, refresh global npm packages, upgrade npm, and enable corepack.</description></item><item><title>Playground</title><link>https://omid.dev/playground/</link><pubDate>Thu, 01 Oct 2026 22:43:51 +0330</pubDate><guid>https://omid.dev/playground/</guid><description>Live companion demos and interactive labs for omid.dev articles — open a working example in the browser, then read the post for the full walkthrough.</description></item><item><title>Coding Agents Are Becoming CI Workers. Start Sandboxing Them Like It.</title><link>https://omid.dev/2026/09/29/coding-agents-are-ci-workers-sandbox-them/</link><pubDate>Tue, 29 Sep 2026 13:30:00 +0330</pubDate><guid>https://omid.dev/2026/09/29/coding-agents-are-ci-workers-sandbox-them/</guid><description>The real developer-AI upgrade isn&amp;#39;t a smarter model. It&amp;#39;s a sandbox, short-lived credentials, telemetry, and a kill switch. A layered guide with copy-paste examples.</description></item><item><title>After Generation: Where the Product Lives</title><link>https://omid.dev/2026/09/23/after-generation-where-the-product-lives/</link><pubDate>Wed, 23 Sep 2026 16:00:00 +0330</pubDate><guid>https://omid.dev/2026/09/23/after-generation-where-the-product-lives/</guid><description>Cheap generation gets you a demo. Pick the easy host to build on — a platform your users already use, a small box you run, or a runtime you rent.</description></item><item><title>Angular Router Resources: Route Data on the Same Graph as the Screen</title><link>https://omid.dev/2026/09/22/angular-router-resources-route-data-as-a-graph/</link><pubDate>Tue, 22 Sep 2026 23:40:00 +0330</pubDate><guid>https://omid.dev/2026/09/22/angular-router-resources-route-data-as-a-graph/</guid><description>Router Resources (Angular 22.2, developer preview) load independent route data as a parallel resource graph. Blocking routes hand over finished values; non-blocking routes hand over Resource inputs the template can render.</description></item><item><title>Obsidian on a Git Research Vault</title><link>https://omid.dev/2026/09/22/obsidian-on-a-git-research-vault/</link><pubDate>Tue, 22 Sep 2026 02:00:00 +0330</pubDate><guid>https://omid.dev/2026/09/22/obsidian-on-a-git-research-vault/</guid><description>Open the research repo as an Obsidian vault if you want links and a graph. Git still holds the Markdown. If a note matters, it must still read in a terminal, an editor, and a diff.</description></item><item><title>Essential Skills When Generation Is Cheap</title><link>https://omid.dev/2026/09/14/essential-skills-when-generation-is-cheap/</link><pubDate>Mon, 14 Sep 2026 00:40:00 +0330</pubDate><guid>https://omid.dev/2026/09/14/essential-skills-when-generation-is-cheap/</guid><description>The skill list did not get a new bubble called AI. The senior job changed: you own output you did not type, you review at a higher altitude, and you decide where generation does not belong.</description></item><item><title>Linux VXLAN and Why CNI Exists</title><link>https://omid.dev/2026/09/10/linux-vxlan-and-why-cni/</link><pubDate>Thu, 10 Sep 2026 12:00:00 +0330</pubDate><guid>https://omid.dev/2026/09/10/linux-vxlan-and-why-cni/</guid><description>Ethernet does not stretch across hosts by itself. VXLAN is one overlay; CNI is the contract that plugs a pod into whatever network the cluster actually uses.</description></item><item><title>I Interview Frontend Hires for Other Companies</title><link>https://omid.dev/2026/09/09/i-interview-frontend-hires-for-other-companies/</link><pubDate>Wed, 09 Sep 2026 03:00:00 +0330</pubDate><guid>https://omid.dev/2026/09/09/i-interview-frontend-hires-for-other-companies/</guid><description>How I interview frontend candidates for a team that is not mine — intake with their lead, choosing the real level, and why I now weigh architecture, ownership, and AI judgment over syntax recall.</description></item><item><title>Linux Network Namespaces and Virtual Links</title><link>https://omid.dev/2026/09/04/linux-network-namespaces-and-virtual-links/</link><pubDate>Fri, 04 Sep 2026 21:00:00 +0330</pubDate><guid>https://omid.dev/2026/09/04/linux-network-namespaces-and-virtual-links/</guid><description>Isolate network stacks with netns, connect them with veth, and choose bridge vs macvlan vs ipvlan — the kernel primitives containers reuse.</description></item><item><title>Linux as a Router: Forwarding, Policy Routing, and nftables</title><link>https://omid.dev/2026/09/01/linux-as-a-router/</link><pubDate>Tue, 01 Sep 2026 21:00:00 +0330</pubDate><guid>https://omid.dev/2026/09/01/linux-as-a-router/</guid><description>Linux leaves the bridge domain: IP forwarding, policy routing for two uplinks, and nftables input vs forward.</description></item><item><title>One AI Chat Is Not a Research Workspace</title><link>https://omid.dev/2026/08/29/one-ai-chat-is-not-a-research-workspace/</link><pubDate>Sat, 29 Aug 2026 00:25:01 +0330</pubDate><guid>https://omid.dev/2026/08/29/one-ai-chat-is-not-a-research-workspace/</guid><description>Long-form research does not fit in one ChatGPT conversation. A Git repo of messy Markdown — inbox, concepts, counterarguments — lets ideas stay contradictory until you are ready to write.</description></item></channel></rss>