Solo infrastructure sounds romantic until state files argue back. You want repeatable deploys, drift detection, and a single brainload on Friday night. Terraform (and OpenTofu where relevant) owns the declarative HCL mind-share; Pulumi lets you describe cloud resources with TypeScript, Python, Go, or C#. Both orchestrate the same APIs; the argument is how much language power you want versus how much convention you will trade for it.
The Terraform comfort zone
HCL is opinionated and limited—on purpose. Modules compose predictably; `terraform plan` reads like a ritual. The ecosystem is enormous: providers, policies, enterprise tooling, hiring familiarity. For a solo operator who values copy-paste community answers and minimal abstraction layers, Terraform remains the default handshake with the cloud.

Where Pulumi pulls ahead
If your infra bleeds into application logic—dynamic loops, shared libraries with your backend, tests that actually run—embedding resources in a real language pays rent. You can unit-test pieces, reuse types, and avoid templating YAML with string hacks. Pulumi’s model shines when stacks are small but gnarly, not when you need the thinnest possible layer over a static topology.

State and collaboration realities
Solo today might be team tomorrow. Terraform remote state patterns are well-documented; Pulumi offers similar backends with its own ergonomics. Neither deletes the need for lockfiles, secrets hygiene, and CI runners that do not leak `.env` into logs. Pick tooling that your future self—or coworker—can grep.
CI pipelines: the real product
Infrastructure code without automated plans and applies is just a fancy text file. GitHub Actions, GitLab CI, or a self-hosted runner must store credentials safely, pin provider versions, and fail loudly on drift. Both ecosystems integrate cleanly; the difference is how much logic you push into the pipeline versus the stack. Solo operators often over-automate early—ship a manual `apply` with a checklist before you orchestrate a matrix of environments nobody asked for yet.
Vendor noise and lock-in
Pulumi wraps providers; Terraform does too. The cloud lock-in lives in APIs, not DSLs. Watch for hidden costs in proprietary platforms versus pure OSS runners—especially when budgets tighten.
A pragmatic split
- Stay on Terraform/OpenTofu when your graphs are mostly static, modules cover your needs, and you want maximum community overlap.
- Reach for Pulumi when TypeScript (or Python) tests make your infrastructure safer than prose, or when you maintain libraries shared between app and cloud.
- Skip both for a single VPS if bash plus Ansible is genuinely enough—glamorous stacks need honest workloads.
When migration cost should stop you
Rewriting working Terraform for the sake of TypeScript is a hobby, not a migration. If HCL annoys you but does not break you, bank the sleep. Consider Pulumi for greenfield services or net-new modules where tests justify the switch.
Closing
Solo infra is about clarity under stress. Pulumi and Terraform both work; the best choice is the one you will still understand after a pager wakes you at 2 a.m. Boring can be a feature—just make sure it is the right kind of boring.