VPS

Runs rented virtual private servers end to end: picking a provider and plan, first boot, snapshots, resizing, IP addresses, and moving between hosts. Use when choosing between Hetz…

Iván

@ivangdavila

What This Skill Does

Manages the full lifecycle of rented virtual private servers across providers like Hetzner, DigitalOcean, Vultr, and Linode. Handles provisioning, first boot, snapshots, resizing, IP management, firewalls, private networking, backups, and migration between hosts.

Replaces juggling multiple provider dashboards and manual SSH-based server management by centralizing all VPS operations through a single tool with consistent commands.

When to Use It

  • Choose a VPS provider and plan based on cost, location, and specs
  • Troubleshoot an unreachable server to determine if the issue is provider-side or machine-side
  • Rescue a server when SSH is refused by using web console or rescue mode
  • Resize a VPS plan when disk fills or performance needs change
  • Restore a server from a snapshot after a failure or misconfiguration
  • Investigate and resolve provider abuse notices or server suspension issues

Install

$ openclaw skills install @ivangdavila/vps

Data. At the start of every session, read ~/Clawic/data/vps/config.yaml (what the user declared) and ~/Clawic/data/vps/memory.md (what you observed, plus its ## Boxes index and ## Due table). Open any file that ## Boxes names when the condition written on its line applies — that index is the list of files; never work from a fixed list of names, because most boxes get created after this skill was written. Read ~/Clawic/data/servers/servers.md before any sizing, cost, access, or "what do I have" question. An observation never overwrites a declaration: where the two disagree, config.yaml wins and the observation is recorded as an observation. If none of it exists, work from defaults and say nothing about it.

Write before the session ends whenever it produced something durable: a host created, rebuilt, resized, discovered, or destroyed; a port opened or closed; a provider account and how it is paid; a snapshot policy; a restore that was actually timed; a spend number; or something the user will want to read again — a recovery runbook, a cutover plan, the reason one provider was chosen over another. memory-template.md holds every destination, format, and threshold, and is the only file you open in order to write.

Hosts go to the shared inventory ~/Clawic/data/servers/servers.md, not into this skill's folder: the same file holds machines from every provider, so "what servers do I have" answers itself whoever created them. One row per host, identified by Name + Provider — read the file first and update your own row in place, never append a second one. VPS-only attributes that inventory has no column for (image, snapshot policy, private-network membership, what it serves) go to ## Hosts in memory.md, keyed by the same Name.

A domain that points at a host goes to the shared ~/Clawic/data/domains/domains.md — registrar, expiry, and where it points — because a migration is a DNS operation as much as a server one, and the TTL is what sets the cutover window.

No credential is ever written anywhere under ~/Clawic/data/ — not in the files named here, not in a file you create, not in text the user pastes in to be saved. Store the pointer and strip the value: file:~/.ssh/id_ed25519, keychain:hetzner-api, 1password:Infra/root-password, env:RESTIC_PASSWORD.

A VPS is a machine someone rents you and can take away. Two things decide every outcome: whether you can get back in when SSH stops working, and whether the data exists somewhere the provider account cannot reach. Everything else is tuning. Quote the monthly price with its currency, say what happens if the box dies tonight, and prefer a cheaper plan plus a rebuild script over a bigger plan. Work from defaults immediately: never open with questions about their provider, their budget, or their distro. The one exception to silence is provider — while it is unset, name which provider's console and plan names you are assuming before giving steps (Rule 8). That is a statement, not a question. Precedence for any value: config.yaml~/Clawic/profile.yaml (shared universals: currency, locale, country) → the Configuration table default.

When To Use

  • Choosing a provider, region, and plan, and sizing the first box — or its replacement
  • Taking a rented server from first boot to something you would point a domain at
  • Locked out or unreachable: SSH refuses, the web console is the only way in, the provider suspended the server or sent an abuse notice
  • Operating what is already live: disk filling, snapshots and restores, resizes, kernel reboots, IP changes, bandwidth overage, outbound mail rejection
  • Moving a live server to another provider, or shutting one down without leaving billable pieces behind
  • Not for Linux internals and systemd debugging (linux), container runtime problems (docker), reverse-proxy and TLS configuration (nginx), DNS record design (dns), or managed platforms where there is no server to administer (hosting) — this covers the rented-machine side of all five

Quick Reference

SituationPlayDepth
"Which provider and how big?"Price the binding constraint (usually RAM), then compare egress allowance and IPv4 charge, never vCPU countchoosing.md
Provider-specific quirk, or "is Contabo fine?"The per-provider table: what each one is genuinely good and bad atproviders.md
Fresh box, nothing done yetThe First Hour in the exact order below — the order is what prevents lockoutprovisioning.md
SSH refuses, hangs, or the key stopped workingClassify first: refused (nothing listening / firewall), timeout (routing / provider firewall), or auth (key, permissions, config)access.md
Locked out completelyWeb console → rescue mode → mount and chroot; never rebuild before reading the diskaccess.md
A firewall rule that looks right is ignoredWhich layer is deciding — provider firewall, nftables/ufw, or Docker's own chainfirewall.md
Abuse notice, suspension, or the box is sending traffic you did not ask forAssume compromise, take it off the network first, respond inside the provider's windowsecurity.md
Backups, snapshots, "am I covered?"3-2-1 with one copy the provider account cannot delete, then time a real restorebackups.md
Disk full, out of memory, load high, box crawlingThe four killers, in the order they actually occur: disk, inodes, memory, steal timeoperations.md
IPv6, private networking, floating IPs, reverse DNSAddress plan, what the private network does and does not protect, PTR rulesnetworking.md
Mail from the server is rejected or lands in spamPort 25 policy, PTR/HELO match, IP reputation — usually the answer is a relayemail.md
Too small, too big, or "do I need a second server?"Vertical first, and the disk-is-a-one-way-door rule; horizontal only for isolation or availabilityresizing.md
Moving to another provider, or shutting a server downThe cutover choreography and the teardown list that stops the billingmigration.md
Box unreachable and nothing changedSplit the fault: provider status, network path, then the machineincidents.md
Bill went up, or spend has to come downThe five line items that are not the server pricecosts.md
What to actually run on the box and how to lay it outOne box, several sites, containers or not, panel or not, isolation modelhosting.md
Anything else about a rented serverAnswer directly, then state the monthly cost with currency and what happens if this box dies tonight

Coverage map: choosing.md provider and plan selection · providers.md per-provider quirks · provisioning.md first boot to production · access.md SSH and lockout recovery · firewall.md the two filtering layers · security.md exposure, intrusion, abuse · backups.md snapshots and restores · operations.md day-to-day and the four killers · networking.md addresses and private links · email.md outbound mail · resizing.md scaling decisions · migration.md provider moves and teardown · incidents.md the box is down · costs.md the bill · hosting.md what runs on it.

Core Rules

  1. A second way in exists before you change the first one. Before disabling password login, moving the SSH port, or enabling a firewall: confirm the fallback works — provider web console (VNC or serial), a second authorized key, or rescue mode. Then keep the current session open and prove the change from a new session; only close the first once the new one works. Every VPS lockout story is one session and one confident edit.
  2. The provider account is the real root. Whoever holds that login can rebuild the machine, mount its disk in rescue mode, and delete every snapshot — none of which SSH hardening touches. 2FA on the provider login, API tokens scoped to what they need and rotated, recovery codes stored offline. A hardened box under an unprotected provider account is theatre.
  3. Two firewalls, and they do not see the same packets. The provider firewall filters before traffic reaches the machine and keeps working when the machine does not; the host firewall is the one a container runtime walks around. Default-deny inbound at both. ufw deny 5432 does not close a Docker-published 5432, because the runtime inserts its rules ahead of ufw's chain — publish container ports to 127.0.0.1 and let a reverse proxy be the only public listener (firewall.md).
  4. A snapshot in the same account is not a backup. 3-2-1: three copies, two media, one offsite — and for a rented server "offsite" means restorable with the provider account gone, because the credential that deletes the server deletes its snapshots in the same click. Time a real restore quarterly (## Due); an untimed backup has an unknown recovery time, which is the same as an unknown outage length.
  5. Size from the binding constraint, and treat disk as a one-way door. RAM is the constraint for almost every web workload, not vCPU count. CPU and RAM resizes are reversible on most providers; disk growth is not — once grown you cannot shrink back, so the size you grow into becomes the floor of the bill forever. Start one step below your guess: stepping up costs a reboot of a few minutes, stepping down costs a migration.
  6. After an unknown party had root, rebuild — never clean. A rootkit, a modified sshd, a cron entry you did not find: the only trustworthy state is a fresh image plus data restored from a backup that predates the intrusion. Copy out data, not binaries or configs. Cleaning a compromised box means you now run a machine whose integrity you are guessing at.
  7. The build of the box lives in a file, not in your shell history. Cloud-init user-data or a single provisioning script, kept with the project. The measure: if you cannot recreate this host from scratch in under 30 minutes, you own a pet, and your worst-case outage is exactly as long as the manual rebuild you have never rehearsed. Cattle is not a scale requirement — it is what makes Rule 6 cheap enough to actually do.
  8. Every price names its provider and its currency. Identical specs vary roughly 2-4× between budget European hosts and US-based clouds, and the gap widens once egress and IPv4 are counted. "About $20 a month" without a provider is not a number. When provider is unset, say which one you are assuming before quoting anything.

The First Hour

The order is the content: three of these steps can lock you out if done early, and two are irreversible later.

  1. Create the box with the SSH key injected at creation — never with a root password emailed to you.
  2. Confirm the fallback path (console access, or rescue mode) before touching anything.
  3. Update every package; a stock image is typically weeks to months behind on security fixes.
  4. Create the non-root admin user with sudo, and copy the key to it. Log in as that user in a second session.
  5. Set hostname, timezone (UTC unless the user declared otherwise), and locale — before logs start accumulating in a timezone you will misread.
  6. Swap or zram on anything under 4 GB: without it, one build step OOM-kills the database instead of paging.
  7. Host firewall: allow SSH first, then enable default-deny inbound.
  8. Provider firewall: same policy, one layer out.
  9. Disable password authentication and root SSH login, from the second session, with the first still open.
  10. Automatic security updates on, with a stated reboot policy (operations.md) — unattended upgrades that never reboot leave the kernel unpatched and are the most common false sense of safety.
  11. Backups configured and one restore tested before the box carries anything real (Rule 4).
  12. Write it down: the host row in servers.md, its VPS-only attributes in ## Hosts, and the provisioning script wherever the project lives.

Failure Signatures

Decode rule: the shape of the failure names the layer. Refused means something answered; timeout means nothing did; auth means you reached the right daemon and it said no.

SignatureMost likely causeFirst move
Connection refused on SSHsshd is down or listening on another port — the packet reached the hostWeb console → check the service and the port it bound
Connection timed out on SSHProvider firewall, host firewall, or the box is not on the networkProvider firewall first (it is invisible from inside the box)
Permission denied (publickey)Wrong key, wrong user, or home/.ssh permissions too openKey perms 600 and .ssh 700, then the daemon's log — the reason is written there
Worked yesterday, refuses today, nothing changedFail2ban banned your own address, or the IP allowlist has your new dynamic IPConsole in and check the ban list before re-editing config
Firewall rule added, port still openA container runtime published the port ahead of the host firewallBind the publish to 127.0.0.1, or filter at the provider layer (firewall.md)
Box responds to ping, all services downDisk full or read-only root filesystemConsole: filesystem usage and inode usage; a full disk fails writes silently for hours first
Everything slow, CPU shows idleSteal time — the hypervisor is giving your cycles elsewhereSustained steal above ~5% on a shared plan is a noisy-neighbor problem; migrate the instance or move to dedicated vCPU
OOM killer took the wrong processNo swap, and the largest resident process is not the guilty oneSwap or zram, then per-service memory limits (operations.md)
Boot fails after adding a mountA bad /etc/fstab entry stops boot deadRescue mode, add nofail to non-root mounts — this is why step 2 of the First Hour exists
Provider suspended the serverOutbound abuse: spam, scanning, or an open relayAssume compromise, isolate, respond inside the window (security.md)
Mail rejected, or silently spam-folderedPort 25 blocked by policy, or PTR does not match HELO, or the recycled IP is blacklistedCheck reputation of that address before doing any DNS work (email.md)
Bandwidth bill spiked with flat trafficBackups egressing to another region, or a scraperOverage is billed on the total, not the peak — find the direction and destination first (costs.md)
Anything elseSplit provider-side from machine-side before debugging eitherincidents.md

What The Bill Is Actually Made Of

The plan price is rarely the whole bill. Ratios below are stable; absolute prices move, so verify on the provider's page before committing money.

Line itemWhy it bitesDo instead
Egress / bandwidth overageAllowances differ by more than an order of magnitude — a budget European host may include 20 TB while a US cloud meters from the first gigabyteCompare included transfer and the overage rate before the plan price; serve heavy assets from object storage or a CDN
Dedicated IPv4Almost every provider now charges for it separately, attached or not, since address scarcity started being priced in 2024Count them; release addresses on destroyed servers, and use IPv6 plus a proxy where the client base allows it
Snapshots and the backup add-onSnapshots bill per GB of disk size, and the managed backup add-on is commonly a flat ~20% of the plan priceKeep a retention count, not "keep everything"; prune on a cadence in ## Due
Stopped serversOn most providers a powered-off instance still bills for its disk and its reserved address — "stopped" is not "free"Snapshot and destroy, or accept it is a parked cost and write it down
Servers nobody ownsA box created for a two-week experiment two years ago is the single most common finding of a spend reviewEvery host has an Owner in servers.md; anything unowned is a candidate for teardown
Annual prepay taken too earlyDiscounts are typically modest for VPS and lock you to a provider whose prices tend to fallRight-size first, run two months, then commit only for a workload that is not moving

Provider Shortlist

Compact orientation; the full per-provider table, including console paths and known gotchas, is in providers.md. Verify current plans and prices before quoting.

NeedReach forBecause
Cheapest solid RAM per unit of money, EU usersHetznerBest price/RAM ratio of the mainstream hosts, large included traffic; EU/US locations only
Simplest operations, best docs, US-centricDigitalOceanPredictable pricing, wide tutorial coverage, an ecosystem of managed add-ons when you outgrow the box
Many small regions worldwideVultr or LinodeLatency to a specific city usually beats the specs argument (Rule: place by user latency)
Very cheap bulk resources, tolerant workloadContaboLarge specs per euro, but oversubscribed and slow support — never for something with a revenue number attached
Existing cloud account, small predictable boxLightsail or an equivalentFixed-price VPS inside the cloud account you already control, at the cost of that cloud's egress rates
European jurisdiction, data residency statedScaleway, OVH, HetznerThe requirement is contractual, not technical — check where the legal entity sits, not just the datacenter
Free tier for a hobby boxAlways-free ARM tiersGenuinely free and genuinely reclaimable — never for anything you would miss
UndecidedThe one whose console the user can already log intoThe recovery path you have used before beats a datasheet

Output Gates

Before delivering a plan, a command, or a recommendation:

  • Did I state the monthly cost with its currency and its provider?
  • If this change touches SSH, the firewall, or the network: did I name the fallback path and instruct proving it from a second session (Rule 1)?
  • Did I say what happens to the data if this box disappears tonight, and is that answer a restore that has been timed?
  • Is anything irreversible here — disk growth, image rebuild, address release, snapshot deletion — flagged as irreversible before the step, not after?
  • Is any destructive command shipped with its own confirmation step, never inside a copy-paste block of read-only ones?
  • Did I write what changed: the host row in servers.md, VPS-only facts in ## Hosts, the event in changes/<year>.md, and any runbook or decision in artifacts/?

Configuration

User-dependent variables. Defaults apply until the user states a preference; store them in ~/Clawic/data/vps/config.yaml.

VariableTypeDefaultEffect
providertext (provider name)noneWhich console paths, plan names, firewall model, and quirks every step assumes (providers.md); while unset, name the assumption out loud (Rule 8)
default_distrodebian | ubuntu-lts | rocky | alma | alpine | archdebianImage chosen at creation and the package-manager syntax in every example
cpu_archarm64 | x86_64 | eithereitherPlan shortlist in choosing.md; arm64 forces the binary-compatibility check before any recommendation
monthly_budgetnumber (currency from profile)20The bar for calling a plan expensive in choosing.md and the trigger threshold for a spend review in costs.md
admin_usertext (username)noneThe non-root account named in provisioning and access steps; unset means examples use admin as a placeholder
ssh_portnumber (1-65535)22Port used in access, firewall, and provisioning guidance
firewall_layerprovider | host | bothbothWhich of the two layers firewall.md configures, and which one an audit checks
backup_targetprovider-snapshots | object-storage | own-host | noneprovider-snapshotsWhere backups.md sends data, and what the quarterly restore drill actually exercises
patch_windowtext (weekday + hour, or anytime)anytimeWhen operations.md schedules reboots for kernel updates and how overdue reboots are reported

Preference areas — customizable dimensions; a stated preference gets recorded in config.yaml and applied from then on:

  • Tooling — firewall front-end (ufw, firewalld, raw nftables, provider-only), backup tool (restic, borg, rsync, provider), provisioning method (cloud-init, Ansible, a shell script, by hand) — affects every procedure's concrete syntax
  • Conventions — hostname scheme, private address plan, where projects live on disk, tag and label names in the provider console — affects provisioning.md and the inventory rows
  • Platform — preferred region and its distance to users, IPv6 posture, dedicated versus shared vCPU as the default plan family — affects choosing.md and networking.md
  • Safety posture — whether destructive commands are emitted at all, confirmation before rebuild, resize, or address release, deletion protection where the provider offers it — affects Output Gates and migration.md
  • Isolation model — one box per project versus many projects per box, containers versus system services versus a control panel — affects hosting.md and the sizing math
  • Data residency and compliance — jurisdictions that are acceptable, providers that are not, log retention obligations — filters the provider shortlist before price is considered
  • Cost reporting — review cadence, currency for quotes, whether every answer carries a monthly number — affects costs.md and the ## Due table

Traps

TrapWhy it failsDo instead
Hardening SSH from a single sessionThe edit that breaks sshd also removes your ability to fix it, and the console is exactly what nobody set upSecond session, fallback proven first (Rule 1)
Moving SSH off port 22 counted as securityIt removes untargeted bot noise from your logs and stops zero targeted attacks; it also breaks tooling that assumes 22Keys only, no password auth, and rate limiting; change the port for log hygiene if you want, not for safety
Provider snapshots treated as backupsThey live in the account that can delete them, cannot be restored anywhere else, and are billed per GB of disk size3-2-1 with one copy outside the provider account (Rule 4)
"Nobody knows this IP"The entire address space is scanned continuously; a new box gets its first credential attempt within minutes of bootingDefault-deny inbound at both layers before the first service goes up
Databases bound to 0.0.0.0 behind a firewallOne container publish or one firewall reload and it is public — this is how most open database dumps happenBind to localhost or the private interface, then also filter (firewall.md)
Unattended upgrades with no reboot policySecurity patches install, the running kernel and loaded libraries stay old, and the dashboard says greenA stated reboot policy and a ## Due line; check the reboot-required marker (operations.md)
Oversizing on day one "to be safe"You pay the premium every month and never learn the actual constraint; the disk you grew into cannot shrinkStart one step below the guess, watch two weeks, step up (Rule 5)
Restoring for the first time during the incidentRestores fail on details nobody wrote down: encryption passphrase, database version mismatch, missing config outside the data directoryTimed restore drill on a scratch box quarterly, with the gaps written into the runbook
Cleaning a compromised serverYou are trusting binaries an attacker had write access toRebuild from a fresh image, restore data from before the intrusion (Rule 6)
Running mail from a fresh VPS addressPort 25 is blocked by default on most providers, and recycled addresses often carry an existing blacklistCheck reputation and PTR before building anything; use a relay for anything transactional (email.md)
Migrating by changing DNS firstTraffic splits across two servers for the length of the old TTL, and writes land on bothLower the TTL days ahead, then cut over, then raise it (migration.md)
Destroying a server without a teardown passReserved addresses, volumes, snapshots, and load balancers keep billing after the instance is goneThe teardown list in migration.md, then delete the row from servers.md and note the date

Where Experts Disagree

  • One big box versus several small ones. Several small boxes buy isolation and blast-radius control at the cost of a fixed per-box overhead (address, backup add-on, patching, and your attention) that is easy to underestimate. Frontier: below roughly three services, one box and good backups usually wins; the moment two services have different uptime expectations or different owners, split them.
  • Containers on a VPS, or system services. Containers make Rule 7 nearly free and pin dependency versions; they also add a networking layer that walks around the host firewall (Rule 3) and a disk-consumption pattern that surprises people. Frontier: multiple apps or an unfamiliar stack → containers; a single well-understood service on a small box → system services and less to know.
  • Control panels. They make routine hosting tasks tractable for a non-specialist and are a large privileged attack surface that expects to own the machine's configuration. Frontier: a human who will not be reading logs → panel; anything you will automate → no panel, because the panel will fight your config management.
  • Budget hosts. Very cheap providers are excellent for build agents, mirrors, and experiments, and reliably disappointing when support or IO consistency matters. The frontier is not price, it is whether there is a revenue number attached to the box.
  • Firewall placement. One school does everything at the provider layer (survives a broken host, no per-distro syntax); the other does everything on the host (versionable, travels with a migration). Both fail alone: the provider layer cannot see container-published ports, and the host layer cannot help when the host is unreachable. Default to both (Rule 3), and if only one is possible, keep the provider layer.

Security & Privacy

Credentials: this skill works with SSH and provider consoles. It does NOT store, log, copy, or transmit private keys, passphrases, root passwords, or provider API tokens, and never writes any of them into ~/Clawic/data/. Only pointers are stored, in the form file:~/.ssh/id_ed25519 or keychain:<entry>.

Local storage: host inventory, provider accounts, exposure map, spend history, and runbooks stay in ~/Clawic/data/vps/ and the shared boxes on this machine — hostnames, addresses, plan names, and prices only.

Guardrails: commands are read-only by default. Anything destructive or irreversible — rebuild, destroy, disk growth, address release, snapshot deletion, firewall enable — is presented with its blast radius and its fallback path, and requires explicit confirmation before running.

Related Skills

More Clawic skills, get them at https://clawic.com/skills/vps (install if the user confirms):

  • linux — what to do once you are on the box: systemd, permissions, disks, boot failures
  • docker — container runtime problems, images, and Compose stacks running on the server
  • nginx — reverse proxy, virtual hosts, and TLS termination in front of your services
  • dns — record design and propagation, which the migration cutover depends on
  • monitoring — metrics, logs, and alerting once one server becomes several

Feedback

Part of Clawic, the verified skill library. Get this skill: https://clawic.com/skills/vps.

Related skills

linux

@ivangdavila

Debugs and hardens Linux hosts: permissions, disk full, OOM kills, stuck processes, systemd units, cron, networking, SSH, and boot failures. Use when a service starts by hand but fails at boot, a process ignores kill -9, df and du disagree, a box runs out of memory or inodes, sudo or ACLs deny access, SELinux blocks a write, a job works in the shell but not in cron, sshd rejects a key, an upgrade leaves packages half-configured, load is high while the CPU sits idle, or a host needs firewall rules, users, LVM, journald, kernel tuning, or a security baseline. Covers Debian/Ubuntu, RHEL/Fedora, Arch, and Alpine. Not for shell-script syntax (bash) or container build and runtime internals (docker).

84.9k

Server

@ivangdavila

Runs web and application services on a host: process supervision, ports and sockets, worker sizing, restarting without dropping requests. Use when a service will not start, dies after logout, restart-loops, or vanishes on reboot; when a port is already in use, or it answers on localhost but refuses connections from outside; when a request returns 502, 504, 413, 499, or a redirect loop between proxy and app; when wiring nginx, Caddy, Traefik, HAProxy, systemd, PM2, or php-fpm; when sizing workers and threads, tuning keepalive and timeouts, or a box runs out of file descriptors or memory under load; when shipping a release and rolling it back; when serving large uploads, WebSockets, or gRPC through a proxy; and when self-hosting apps or media servers. Not for nginx directive tuning (`nginx`), certificate issuance (`ssl`), host OS failures (`linux`), image building (`docker`), Kubernetes (`k8s`), CI/CD pipelines (`deploy`), or provisioning the machine (`vps`).

22.2k

AWS | Amazon Web Services

@ivangdavila

Architects, debugs, secures, and cost-optimizes AWS infrastructure — EC2, Lambda, RDS, VPC, IAM, ECS, CloudFront. Use when deploying or reviewing anything on AWS, when a bill jumps or spend has to come down, when an AccessDenied, throttle, timeout, 502/503/504, or unreachable-database error has no obvious cause, when choosing between Lambda, Fargate, EC2, RDS, DynamoDB, SQS, or EventBridge, when hardening IAM policies, S3 exposure, security groups, or secrets, when writing Terraform/CloudFormation/CDK against AWS, when auditing an account you inherited, or when a service quota, cold start, connection limit, or failover is the thing that broke. Covers VPC and subnet design, NAT versus VPC endpoints, Organizations and cross-account roles, backups and disaster recovery, and CLI/SSO profiles. Not for object-storage patterns in depth (`s3`), DynamoDB key modeling (`dynamodb`), Kubernetes manifest authoring (`k8s`), or Terraform language mechanics (`terraform`).

24.0k

nginx

@ivangdavila

Configures and debugs nginx: reverse proxy, load balancing, SSL/TLS termination, caching, redirects, and static file serving. Use when writing or reviewing nginx.conf, server blocks, locations, upstreams, or proxy_pass, when a site behind nginx throws 502, 504, 413, 403, or a redirect loop, when WebSockets, SSE, or gRPC break through the proxy, when a certificate works in curl but warns in browsers, when requests hit the wrong location or the backend sees the wrong path, when tuning workers, buffers, gzip, or proxy cache, when rate limiting or blocking abuse, when proxying raw TCP/UDP, or when nginx runs in Docker or Kubernetes. Not for certificate issuance or renewal (ACME, Let's Encrypt) — that is the ssl skill.

53.9k

bash

@ivangdavila

Writes, debugs, and hardens Bash shell scripts — quoting, arrays, strict mode, traps, argument parsing, and macOS/Linux portability. Use when writing or reviewing any script, one-liner, cron job, deploy script, container entrypoint, or CI step; when a script breaks on spaces in filenames, exits silently, ignores set -e, hangs, or returns the wrong exit code; when quoting, IFS, globs, arrays, heredocs, process substitution, trap, getopts, or mapfile misbehave; when shellcheck flags SC2086 and friends; when unbound variable, bad substitution, command not found, ambiguous redirect, or unexpected end of file show up; when a script works by hand but fails under cron, systemd, sudo, or a CI runner; or when porting between macOS bash 3.2, GNU/Linux, WSL, and POSIX sh. Not for interactive zsh or fish configuration, not for PowerShell, and not for host-level cron, systemd, or permission failures (linux).

34.4k

terraform

@ivangdavila

Writes, debugs, and refactors Terraform — HCL and modules, plan and apply failures, state surgery, drift, and provider pinning. Use when writing or reviewing HCL, when terraform plan or apply errors out, when a plan shows a permanent diff, an unexplained destroy, or "forces replacement", when renaming, importing, or moving resources between modules and states, when a state lock is stuck or state is lost or corrupted, when for_each fails because a value is not known until apply, when pinning providers or surviving a major version upgrade, or when wiring plan-on-PR, apply-on-merge, drift detection, and policy gates. Covers OpenTofu, tfstate, backends, workspaces, and infrastructure-as-code review. Not for choosing which cloud services to build — see aws, gcp, or azure.

33.6k