sethserver.com

Programming

Programming

What's the Differences Between Relational, NoSQL, Vectors, and Caches

Updated: September 17, 2026

Your app still has one job: store data, fetch it fast, and stay honest about "correct." The modern "database" is a stack-primary store, a few specialists, plus cache-so you don't melt your main DB. This post walks through Postgres, MySQL, Mongo, vectors, and Redis, then lands on a boring 2026 default for most SaaS: Postgres + JSONB + pgvector + Redis. read on »

Programming

Git and Source Control in AI Land

Updated: September 17, 2026

AI can crank out code fast. Then you blink, and nobody remembers what changed or why. This post argues that Git-not your assistant-is the real memory: commits as checkpoints, branches as experiments, PRs as the paper trail. It also breaks down where to host your repo (GitHub, GitLab, Bitbucket, or self-hosted) and what actually matters if you want AI speed without AI chaos. read on »

Programming

Domains, DNS, and why it feels fragile

Updated: September 17, 2026

Buying a domain feels like ownership until you touch DNS and learn you're renting a name glued together by caches. This post breaks down registrars vs registries, the DNS record types that matter, why TTLs make "propagation" feel random, and the silent failures that take down email or login with zero warnings. Includes a practical pre-change checklist and a clear look at what Cloudflare adds beyond basic DNS. read on »

Programming

Containers vs VMs: Docker and friends

Updated: September 17, 2026

You can tell how a team ships software by how they talk about servers. VMs are "the server": heavy, isolated, and long-lived. Containers are "spin up another instance": fast, repeatable, and disposable. This post breaks down the real tradeoffs, shows a minimal Flask Dockerfile, and explains why predictable environments, loud failures, and easy rollbacks matter more than ideology. read on »

Programming

Kubernetes: What is it, When to use it, and why?

Updated: September 17, 2026

Kubernetes gets recommended like a vitamin, but it's closer to a chainsaw: great for real operational problems, a mess for small apps. This post breaks down what K8s actually does, the core objects that trip people up, when it earns its keep, and when you should pick something boring like Cloud Run or ECS. It also covers why AI-generated YAML can speed you up-or ship an outage-if you don't understand probes, resource limits, and basic `kubectl` debugging. read on »

Programming

Going From Vibe‑Coding Agents to Production‑Grade AI Security

Updated: September 17, 2026

Built an MCP server in a weekend? Cool. Now check whether you also built an eager little agent with access to your prod database, your `.env`, and a log trail full of secrets. This post is the Monday-after triage: rotate keys, purge git history, put a proxy in front of model + tools, kill "run arbitrary SQL," shrink tool scopes, and treat logs like toxic waste. Shipping the demo is easy. Owning what happens next is the job. read on »

Programming

What Does CI/CD Actually Buy Us

Updated: September 17, 2026

SSH deploys and "git pull" aren't DevOps. They're a ritual that turns one person into a production bottleneck. This post breaks down CI as the boring gate that saves your weekends, CD as the path to repeatable, auditable releases, and why AI-written tests only matter if a pipeline enforces them. If deploys still feel scary, you're missing the seatbelt. read on »

Programming

Terraform and AI are a Match Made in BitHeaven

Updated: September 17, 2026

Terraform isn't hard. It's just painfully specific. Pair it with an LLM and you stop doing "lookup work" (argument names, nested blocks, list vs set) and start doing "review work." The model isn't your architect. It's your fast typist. You still run fmt/validate/plan, read the diff, and keep the blast radius small. read on »

Programming

Why I Only Use UTC and Why You Should Too

Updated: September 17, 2026

UTC in the backend is the fastest way to delete a whole class of bugs-especially the twice-a-year chaos of DST. Store timestamps as aware UTC datetimes, keep timezone names (not offsets) as user preferences, and convert only at the last display step. Your cron jobs, logs, billing, and incident timelines will stay boring, sortable, and sane. read on »

Programming

AWS LightSail: The Final Piece of the Replit to Production Puzzle

Updated: September 17, 2026

Friday deploys shouldn't depend on one person, one SSH session, and a lucky sequence of commands. This post shows a boring (good) deployment loop: push a timestamp tag, let GitHub Actions build and ship a Docker image, and run it on AWS Lightsail with health checks and easy rollback. Tags become the big red button-and production stops being a fragile ritual. read on »

Programming

Building Your First MCP Server

Updated: September 17, 2026

Stop writing five slightly-wrong S3 helpers and call it "platform." This post walks you through building a first MCP server that gives agents safe, audited, policy-based access to S3-backed unstructured data-without turning your buckets into a panic factory. We'll start with the boring (logs, auth, limits, predictable errors), sketch a tiny FastAPI endpoint, and cover the guardrails future-you will demand the moment compliance shows up. read on »

Programming

Insanely Rapid AI-Assisted Development with Replit

Updated: September 17, 2026

Replit is my go-to antidote for the "environment setup ate my entire day" problem. Open a browser, write code, run it, and let the built-in AI handle the boring parts so you can ship something real. It's perfect for MVPs and internal tools, a little spicy for serious production, and a great way for startups to move fast before the market moves on without them. read on »

Programming

The Five Deadly Sins of Deployments

Updated: September 17, 2026

Deployments rarely kill startups. But sloppy deployments will quietly eat your runway while you argue about tools, chase ghost bugs, and "fix forward" through outages. In this post, I break down five common deployment sins-staging drift, leaked secrets, fake staging tests, backups you never restore, and rollbacks that don't exist-and how to avoid wasting weeks on problems you can prevent in a day. Also: remember the ants. Two words: fire ants. read on »

Programming

SQLite Is Probably Enough

Updated: September 17, 2026

Most startups pick Postgres "for scale" the way people buy a tour bus for a commute: it feels responsible, right up until you're paying for problems you don't have. SQLite is boring, fast, and removes a whole category of database drama. The real catch is write contention (one writer at a time), but with WAL mode, short transactions, and sane access patterns, it'll carry you further than your architecture diagrams suggest. Use SQLite now, design for a clean swap later, and let production-not vibes-tell you when it's time to upgrade. read on »

Programming

Sending Push Notifications from Replit with Firebase

Updated: September 17, 2026

Background jobs finish on their own schedule, which means your users either spam refresh like it's 2004... or you tell them when the work is done. In this post, I'll show you how to send Firebase Cloud Messaging (FCM) push notifications from a Replit backend using either TypeScript (Node) or Python-plus the real-world gotchas around service account JSON, Replit Secrets, IAM permissions, and device tokens that expire purely out of spite. read on »

Programming

I'm renaming vibe-coding, sorry not sorry.

Updated: September 17, 2026

"Vibe-coding" is trying to sound like a new craft, but most of the time it's just a shortcut with better branding. I'm renaming it: vibe-coding is when you delegate both the code and the judgment to an AI, then ship it without understanding, testing, or ownership. Using AI to draft code is fine. Shipping unverified output because it "felt right" is how you end up with a very efficient failure-and a very long conversation with your CEO. read on »

Programming

When to write an MCP and When to Write a Tool

Updated: January 15, 2026

If you're building with LLMs, you'll hit the "MCP server or tool?" fork in the road. Tools are fast, local, and easy to test. MCP servers are for shared capabilities, centralized auth/policy, and anything that touches "scary data." Pick wrong and nothing explodes-but your codebase will slowly turn into a museum of regrettable decisions. read on »

Newsletter

One email, once a week.

Notes on databases, systems, and the occasional strong opinion about Python. No spam, unsubscribe anytime.