<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Phaustin Karani</title>
    <description>The latest articles on Forem by Phaustin Karani (@karaniph).</description>
    <link>https://forem.com/karaniph</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1150173%2F3d980c29-7154-4bcf-bc8d-15ad2e0a1fc3.png</url>
      <title>Forem: Phaustin Karani</title>
      <link>https://forem.com/karaniph</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/karaniph"/>
    <language>en</language>
    <item>
      <title>AWS IAM Security Best Practices in 2026: A Complete Guide</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Sat, 07 Mar 2026 06:01:00 +0000</pubDate>
      <link>https://forem.com/karaniph/aws-iam-security-best-practices-in-2026-a-complete-guide-o14</link>
      <guid>https://forem.com/karaniph/aws-iam-security-best-practices-in-2026-a-complete-guide-o14</guid>
      <description>&lt;p&gt;Identity is the new perimeter.&lt;/p&gt;

&lt;p&gt;Before cloud-native infrastructure, security teams could draw a physical boundary around their systems. Today, your perimeter is a set of credentials — and attackers know it.&lt;/p&gt;

&lt;p&gt;AWS Identity and Access Management (IAM) is the backbone of access control in AWS. It answers two fundamental questions: &lt;strong&gt;who&lt;/strong&gt; can access your cloud environment (developers, SREs, CI/CD pipelines, third-party services), and &lt;strong&gt;what&lt;/strong&gt; they can do once inside (read an S3 bucket, invoke a Lambda function, spin up an EC2 instance).&lt;/p&gt;

&lt;p&gt;Get IAM wrong, and a single compromised credential can cascade into a full account takeover. Get it right, and you've closed off the most common attack vector in cloud breaches.&lt;/p&gt;

&lt;p&gt;This guide covers the IAM security best practices every team should have in place in 2026 — from foundational hygiene to advanced guardrails.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📘 &lt;strong&gt;Want hands-on practice?&lt;/strong&gt; This article covers the &lt;em&gt;why&lt;/em&gt; — if you want to master the &lt;em&gt;how&lt;/em&gt;, check out &lt;strong&gt;&lt;a href="https://trk.udemy.com/X4YEeX" rel="noopener noreferrer"&gt;Learn AWS Identity Management with AWS IAM, SSO &amp;amp; Federation&lt;/a&gt;&lt;/strong&gt; on Udemy. It covers AWS IAM, Organizations, Directory Service, SSO, and Federation end-to-end, fully updated for 2026.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Use Federated Identity for Human Access
&lt;/h2&gt;

&lt;p&gt;Never create long-term IAM users for human access.&lt;/p&gt;

&lt;p&gt;Instead, require all humans — developers, SREs, data engineers, auditors — to authenticate through a federated identity provider (IdP) such as Okta, Azure AD, Google Workspace, or AWS IAM Identity Center (formerly AWS SSO).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why federation matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Centralized user management&lt;/strong&gt;: Onboarding and offboarding happens in one place. When an employee leaves, disabling their IdP account revokes access to all connected systems instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced password fatigue&lt;/strong&gt;: Users authenticate once and access multiple systems through SSO, reducing the temptation to reuse passwords.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smaller attack surface&lt;/strong&gt;: Fewer systems store credentials, meaning fewer places for attackers to target.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit-ready logs&lt;/strong&gt;: Federated sessions tie CloudTrail events back to a specific identity in your IdP, making forensic investigation and compliance reporting straightforward.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Federated users receive short-lived, automatically expiring session tokens — not permanent access keys. This dramatically reduces the blast radius of any single credential compromise.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 note&lt;/strong&gt;: AWS IAM Identity Center now supports automated provisioning (SCIM) with all major IdPs. If your team hasn't migrated off IAM users for human access yet, this is the year to do it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Enforce Multi-Factor Authentication (MFA)
&lt;/h2&gt;

&lt;p&gt;MFA is non-negotiable.&lt;/p&gt;

&lt;p&gt;It combines something you know (your password) with something you have (a TOTP app, hardware key, or passkey). Even if a password is phished or leaked in a breach, MFA prevents it from being used alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enforce MFA on:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The root account — always, without exception&lt;/li&gt;
&lt;li&gt;All IAM users with console access (if you still have any)&lt;/li&gt;
&lt;li&gt;Highly privileged roles and break-glass accounts&lt;/li&gt;
&lt;li&gt;Sensitive operations like disabling CloudTrail or modifying SCP policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can enforce MFA conditions in IAM policies like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"BoolIfExists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"aws:MultiFactorAuthPresent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For privileged accounts, use &lt;strong&gt;hardware security keys&lt;/strong&gt; (FIDO2/WebAuthn, e.g., YubiKey). Unlike TOTP apps, they are fully phishing-resistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Protect and Restrict the Root User
&lt;/h2&gt;

&lt;p&gt;Your AWS root user has unrestricted access to everything — billing, account settings, IAM itself — and cannot be constrained by IAM policies. That makes it uniquely dangerous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root user hygiene checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable MFA immediately, preferably with a hardware key&lt;/li&gt;
&lt;li&gt;Store credentials in a secrets vault or a physically secured location&lt;/li&gt;
&lt;li&gt;Never create access keys for the root user&lt;/li&gt;
&lt;li&gt;Only use it for the &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/root-user-tasks.html" rel="noopener noreferrer"&gt;small set of tasks that require it&lt;/a&gt;, like closing the account or changing the support plan&lt;/li&gt;
&lt;li&gt;Set up a CloudWatch or GuardDuty alert to notify your team any time the root user is used at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In multi-account AWS Organizations setups, use Service Control Policies (SCPs) to block sensitive actions by member account root users.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Apply the Principle of Least Privilege
&lt;/h2&gt;

&lt;p&gt;Grant every identity — human or machine — the minimum permissions required for its specific job, and nothing more.&lt;/p&gt;

&lt;p&gt;This limits what an attacker can do if they compromise a credential. It also limits damage from insider threats and misconfigured automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with AWS managed policies, then refine with customer-managed policies as access patterns become clearer&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;IAM Access Analyzer's policy generation&lt;/strong&gt; to analyze CloudTrail logs and generate a minimal policy based on what a role actually used&lt;/li&gt;
&lt;li&gt;Prefer resource-level permissions (specific bucket ARNs, function ARNs) over wildcard &lt;code&gt;*&lt;/code&gt; resources&lt;/li&gt;
&lt;li&gt;Avoid &lt;code&gt;AdministratorAccess&lt;/code&gt; except for dedicated break-glass roles&lt;/li&gt;
&lt;li&gt;Scope &lt;code&gt;iam:PassRole&lt;/code&gt; tightly — it's one of the most common privilege escalation paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Permission boundaries&lt;/strong&gt; are underused but powerful. They define the maximum permissions an identity can ever receive, even if a more permissive policy is attached later. Use them to safely delegate IAM management to teams without risking privilege escalation.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use Temporary Credentials for Workloads
&lt;/h2&gt;

&lt;p&gt;Applications, Lambda functions, EC2 instances, and containers should never use long-term access keys embedded in code, environment variables, or config files.&lt;/p&gt;

&lt;p&gt;Hardcoded keys accidentally pushed to a public GitHub repo is still one of the most common causes of cloud breaches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use IAM roles instead:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attach a role to your EC2 instance, ECS task, Lambda function, or EKS service account&lt;/li&gt;
&lt;li&gt;The AWS SDK automatically retrieves short-lived credentials from the instance metadata service (IMDS)&lt;/li&gt;
&lt;li&gt;Credentials expire and rotate automatically — no manual rotation needed&lt;/li&gt;
&lt;li&gt;Nothing to distribute, store, or accidentally commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For on-premises or hybrid workloads&lt;/strong&gt;, use &lt;strong&gt;IAM Roles Anywhere&lt;/strong&gt;. It issues short-lived AWS credentials to on-prem servers using X.509 certificates — no long-term keys required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For CI/CD pipelines&lt;/strong&gt; (GitHub Actions, GitLab CI, etc.), use OIDC federation to obtain short-lived credentials scoped to only what that specific pipeline run needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Eliminate and Rotate Long-Term Credentials
&lt;/h2&gt;

&lt;p&gt;If you still have IAM users with access keys, audit them now.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;IAM Credential Reports&lt;/strong&gt; to identify keys unused for 90+ days — deactivate and delete them&lt;/li&gt;
&lt;li&gt;Rotate active keys on a regular schedule; use the &lt;code&gt;access-keys-rotated&lt;/code&gt; AWS Config rule to enforce a maximum key age&lt;/li&gt;
&lt;li&gt;Never embed access keys in source code — use AWS Secrets Manager or Parameter Store (SecureString) for runtime credentials&lt;/li&gt;
&lt;li&gt;Set up Config or Security Hub alerts for keys older than your policy threshold&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is a &lt;strong&gt;zero-standing-credentials model&lt;/strong&gt;: no persistent long-term keys anywhere, only short-lived credentials generated on demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Regularly Audit and Remove Unused Access
&lt;/h2&gt;

&lt;p&gt;IAM drift is real. Over time, roles accumulate permissions they no longer need, users go inactive, and policies are attached "just in case." This bloat silently expands your attack surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build a regular IAM hygiene process:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;IAM Access Advisor&lt;/strong&gt; to see the last time each service permission was used — permissions idle for 90+ days are strong candidates for removal&lt;/li&gt;
&lt;li&gt;Review unused IAM roles using the &lt;code&gt;GetServiceLastAccessedDetails&lt;/code&gt; API&lt;/li&gt;
&lt;li&gt;Delete IAM users who've been replaced by federation&lt;/li&gt;
&lt;li&gt;Replace inline policies with managed policies (they're easier to audit and reuse)&lt;/li&gt;
&lt;li&gt;Review group memberships quarterly to reflect current team structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automate this with AWS Config rules, Security Hub findings, or a CSPM tool. Make it a recurring process, not a one-time cleanup.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Detect External and Cross-Account Access with IAM Access Analyzer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;IAM Access Analyzer&lt;/strong&gt; continuously monitors your resource-based policies — on S3 buckets, KMS keys, SQS queues, Lambda functions, IAM roles — and generates findings whenever a resource is accessible from outside your AWS account or organization.&lt;/p&gt;

&lt;p&gt;It answers a critical question: &lt;em&gt;can someone outside my account access this resource?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Enable Access Analyzer at the &lt;strong&gt;organization level&lt;/strong&gt; so it catches cross-account access patterns across your entire AWS estate. A public S3 bucket or an overly permissive role trust policy can be an entry point for a supply chain compromise — and you want to know about it immediately, not in a post-incident review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New in 2025–2026&lt;/strong&gt;: Access Analyzer now includes &lt;strong&gt;unused access findings&lt;/strong&gt;, identifying roles and policies with permissions that haven't been exercised. This combines external access detection and least-privilege auditing into a single tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Establish Permission Guardrails with SCPs and Resource Control Policies
&lt;/h2&gt;

&lt;p&gt;In a multi-account AWS Organization, &lt;strong&gt;Service Control Policies (SCPs)&lt;/strong&gt; define maximum permission boundaries at the account or OU level.&lt;/p&gt;

&lt;p&gt;Think of them as a constitutional layer. Even if an admin in a member account attaches &lt;code&gt;AdministratorAccess&lt;/code&gt; to a role, an SCP can still block them from disabling CloudTrail, creating IAM users, or operating outside approved regions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common SCP guardrails to implement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deny creation of IAM users or access keys (enforce federation org-wide)&lt;/li&gt;
&lt;li&gt;Deny disabling of GuardDuty, CloudTrail, or Security Hub&lt;/li&gt;
&lt;li&gt;Restrict workloads to approved AWS regions&lt;/li&gt;
&lt;li&gt;Deny disabling S3 Block Public Access&lt;/li&gt;
&lt;li&gt;Block root user activity in all member accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resource Control Policies (RCPs)&lt;/strong&gt;, introduced in late 2024, complement SCPs by controlling resource-based policies directly. Use RCPs to build a &lt;strong&gt;data perimeter&lt;/strong&gt; — ensuring only trusted identities from within your organization can access sensitive resources, regardless of what individual account policies say.&lt;/p&gt;

&lt;p&gt;Together, SCPs and RCPs give you defense in depth at scale and help satisfy compliance frameworks like SOC 2, ISO 27001, and PCI DSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Monitor, Alert, and Respond
&lt;/h2&gt;

&lt;p&gt;A strong IAM posture isn't just about configuration — it requires continuous monitoring.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS CloudTrail&lt;/strong&gt;: Logs every IAM action. Enable it with log file validation and ship logs to a locked-down S3 bucket in a separate security account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon GuardDuty&lt;/strong&gt;: Detects anomalous IAM activity — credential exfiltration, unusual API calls from unexpected geos, root credential use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Security Hub&lt;/strong&gt;: Aggregates findings from GuardDuty, Access Analyzer, and Config into a unified dashboard with CIS AWS Foundations Benchmark scoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EventBridge rules&lt;/strong&gt;: Trigger automated remediation — revoke a session, page the on-call team, isolate a role — when high-severity findings fire.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set up dedicated alerts for: root user login, console sign-ins from new locations, disabling of security services, and creation of new admin-level roles or policies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Practice&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Use federated identity for all human access&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enforce MFA, especially on privileged accounts&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lock down and rarely use the root user&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apply least privilege and use permission boundaries&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use IAM roles and temporary credentials for workloads&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eliminate long-term access keys&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit and remove unused access quarterly&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable IAM Access Analyzer at org level&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implement SCPs and RCPs as guardrails&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitor with CloudTrail, GuardDuty, and Security Hub&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;AWS IAM is powerful — but power without discipline creates risk. These practices aren't one-time checkboxes. They're habits. The teams with the strongest cloud security postures are the ones who've made IAM hygiene a continuous, automated, team-wide process rather than an afterthought.&lt;/p&gt;

&lt;p&gt;Start with the critical items, automate what you can, and build from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to Go Deeper?
&lt;/h2&gt;

&lt;p&gt;This article covers the security side of AWS IAM, but there's a lot more to master — from hands-on identity federation setup, to AWS Organizations and Directory Service, to building SSO across complex multi-account environments.&lt;/p&gt;

&lt;p&gt;If you want to go from understanding best practices to actually implementing them, check out &lt;strong&gt;&lt;a href="https://trk.udemy.com/X4YEeX" rel="noopener noreferrer"&gt;Learn AWS Identity Management with AWS IAM, SSO &amp;amp; Federation&lt;/a&gt;&lt;/strong&gt; on Udemy.&lt;/p&gt;

&lt;p&gt;The course covers AWS IAM, AWS Organizations, Directory Service, SSO, and Federation end-to-end — and it's fully updated for 2026. Whether you're preparing for an AWS certification or hardening a production environment, it's one of the most comprehensive resources available on the topic.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>iam</category>
      <category>identity</category>
      <category>security</category>
    </item>
    <item>
      <title>60+ Bash Commands for Cloud Architects &amp; Engineers (AWS, Azure, GCP &amp; More)</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Thu, 26 Feb 2026 14:37:00 +0000</pubDate>
      <link>https://forem.com/karaniph/60-bash-commands-for-cloud-architects-engineers-aws-azure-gcp-more-lmm</link>
      <guid>https://forem.com/karaniph/60-bash-commands-for-cloud-architects-engineers-aws-azure-gcp-more-lmm</guid>
      <description>&lt;p&gt;When I first got into cloud computing some 5yrs ago, I avoided the CLI like it owed me money. I'd click around the console, doing things the slow way, telling myself the GUI was "just as good." It wasn't.&lt;/p&gt;

&lt;p&gt;The truth is, if you're serious about working in the cloud  whether you're provisioning infrastructure with Terraform, debugging a failing container at 2am, or automating deployments with Ansible you need to be comfortable in the terminal. &lt;/p&gt;

&lt;p&gt;The CLI isn't just faster, it's often the &lt;em&gt;only&lt;/em&gt; way.&lt;/p&gt;

&lt;p&gt;The good news? Bash has a smaller learning curve than most programming languages. it would take you a short amount of time to become a pro in Bash than it would Python.&lt;/p&gt;

&lt;p&gt;This guide is designed to take you from nervous about the terminal to actually preferring it. &lt;/p&gt;

&lt;p&gt;We'll cover the essential commands grouped by category, with real-world cloud examples alongside each one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; These are bash commands, native to Linux. If you're using Azure Cloud Shell in PowerShell mode, some of these won't apply directly  switch to bash mode or check the Azure CLI equivalents.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Before We Start: The Golden Rules of the CLI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The CLI is case-sensitive.&lt;/strong&gt; &lt;code&gt;ls&lt;/code&gt; and &lt;code&gt;LS&lt;/code&gt; are completely different. Stick to lowercase unless told otherwise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Ctrl + C&lt;/code&gt;&lt;/strong&gt; breaks any continuously running process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Ctrl + Z&lt;/code&gt;&lt;/strong&gt; suspends a process (sends it to background).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Tab&lt;/code&gt;&lt;/strong&gt; auto-completes commands and file paths — use it constantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;↑&lt;/code&gt; arrow&lt;/strong&gt; cycles through your command history.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Navigation &amp;amp; Directory Management
&lt;/h2&gt;

&lt;p&gt;These are the commands you'll type hundreds of times a day.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Print Working Directory.&lt;/strong&gt; Shows exactly where you are in the file system. Run this whenever you're disoriented.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists the contents of the current directory. One of the most-used commands in existence.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Long-format listing. Shows file type, permissions, owner, size, and timestamp. Essential for auditing files on a cloud VM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists files sorted by &lt;strong&gt;timestamp&lt;/strong&gt; (newest first). Useful for finding what recently changed on a server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists files sorted by &lt;strong&gt;size&lt;/strong&gt; (largest first). Great for hunting down what's eating up your disk.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists &lt;strong&gt;all&lt;/strong&gt; files including hidden ones (files that start with &lt;code&gt;.&lt;/code&gt;). You'll use this constantly — things like &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.ssh&lt;/code&gt;, and &lt;code&gt;.bashrc&lt;/code&gt; are all hidden.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Change Directory.&lt;/strong&gt; Use &lt;code&gt;cd ..&lt;/code&gt; to go up one level, &lt;code&gt;cd ~&lt;/code&gt; to return to your home directory, and &lt;code&gt;cd -&lt;/code&gt; to go back to the previous directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Make Directory.&lt;/strong&gt; Creates a new folder. Use &lt;code&gt;mkdir -p /parent/child/grandchild&lt;/code&gt; to create nested directories in one shot — very handy when scaffolding project structures.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rmdir &lt;/span&gt;empty-folder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Removes an &lt;em&gt;empty&lt;/em&gt; directory. For non-empty directories, use &lt;code&gt;rm -rf&lt;/code&gt; (carefully!).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrkiw96zlvuurmbd9uzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrkiw96zlvuurmbd9uzy.png" alt=" " width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Working with Files
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;filename.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prints the entire file content to your terminal. Perfect for quick checks on config files, log snippets, or cloud-init scripts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 20 filename.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows the &lt;strong&gt;first 20 lines&lt;/strong&gt; of a file. Swap &lt;code&gt;20&lt;/code&gt; for any number. Great for peeking at the start of large log files without loading the whole thing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 50 filename.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows the &lt;strong&gt;last 50 lines&lt;/strong&gt; of a file. Indispensable for checking recent log entries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/syslog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Follows&lt;/strong&gt; a file in real time — new lines print as they're written. The go-to command for watching live logs on a running server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;less filename.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Opens a file one page at a time. Better than &lt;code&gt;cat&lt;/code&gt; for large files. Navigation keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Space&lt;/code&gt; — next page&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b&lt;/code&gt; — previous page&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;↑ / ↓&lt;/code&gt; — line by line&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;q&lt;/code&gt; — quit
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;source.txt destination.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Copy&lt;/strong&gt; a file. Use &lt;code&gt;cp -r source-dir/ dest-dir/&lt;/code&gt; to copy an entire directory recursively — useful when duplicating configuration directories.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;oldname.txt newname.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Move or rename&lt;/strong&gt; a file. Moving files between directories or renaming config files before applying changes is a daily task in cloud work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm &lt;/span&gt;filename.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Permanently delete&lt;/strong&gt; a file. Use &lt;code&gt;rm -rf directory/&lt;/code&gt; to delete a directory and everything inside it. &lt;strong&gt;There's no recycle bin — double-check before running this.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;newfile.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates an empty file, or updates the timestamp of an existing one. Often used to create placeholder files or trigger file-watching scripts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /path/to/original linkname
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates a &lt;strong&gt;symbolic link&lt;/strong&gt; (shortcut). Useful for pointing multiple config locations to a single source of truth.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file mystery-file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tells you what type a file is regardless of its extension. Handy when you get an undocumented artifact from a pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Searching &amp;amp; Filtering
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Searches a file and returns every line containing the string "error". One of the most powerful commands for log analysis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"DATABASE_URL"&lt;/span&gt; /etc/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Recursive search&lt;/strong&gt; through an entire directory. Use this to find where a config value is set across a server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"warning"&lt;/span&gt; app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Case-&lt;strong&gt;insensitive&lt;/strong&gt; search. Catches "Warning", "WARNING", "warning" all at once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"timeout"&lt;/span&gt; nginx.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns matching lines with their &lt;strong&gt;line numbers&lt;/strong&gt;. Makes it easy to jump straight to the problem in an editor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"DEBUG"&lt;/span&gt; app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Inverts&lt;/strong&gt; the match — returns lines that do &lt;em&gt;not&lt;/em&gt; contain "DEBUG". Useful for filtering out noisy log entries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find /var/log &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.log"&lt;/span&gt; &lt;span class="nt"&gt;-mtime&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Find&lt;/strong&gt; all &lt;code&gt;.log&lt;/code&gt; files in &lt;code&gt;/var/log&lt;/code&gt; modified in the last 1 day. The &lt;code&gt;find&lt;/code&gt; command is incredibly powerful for locating files by name, type, size, age, or permissions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find / &lt;span class="nt"&gt;-size&lt;/span&gt; +100M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find all files larger than 100MB. Run this when your disk is full and you need to know why.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;locate filename
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Faster than &lt;code&gt;find&lt;/code&gt; — uses a pre-built index. Update the index with &lt;code&gt;sudo updatedb&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;which python3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows the full path to an executable. Use this to confirm which version of a tool is actually being used when you have multiple installed.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Piping &amp;amp; Redirection
&lt;/h2&gt;

&lt;p&gt;Piping is where bash gets truly powerful. It lets you chain commands together, feeding the output of one into the input of the next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;command1 | command2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;pipe&lt;/strong&gt; &lt;code&gt;|&lt;/code&gt; sends the output of &lt;code&gt;command1&lt;/code&gt; as input to &lt;code&gt;command2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt; Find all error lines in a log and count them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt; app.log | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Another example:&lt;/strong&gt; List running processes and filter for a specific one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; output.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Redirects&lt;/strong&gt; output to a file, overwriting it. Use &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; to &lt;strong&gt;append&lt;/strong&gt; instead of overwrite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;command &lt;/span&gt;2&amp;gt; errors.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Redirects &lt;strong&gt;stderr&lt;/strong&gt; (error output) to a file. Useful for capturing errors from scripts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; output.txt 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Redirects both stdout and stderr to the same file. The standard pattern for capturing all output from a cron job or automated script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sort &lt;/span&gt;filename.txt | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A classic pipe chain: sort lines → count unique occurrences → sort by count descending. Great for finding the most frequent entries in a log.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Permissions &amp;amp; Ownership
&lt;/h2&gt;

&lt;p&gt;Understanding permissions is critical when deploying on cloud VMs or managing shared resources.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;644 config.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Change permissions&lt;/strong&gt; of a file. &lt;code&gt;644&lt;/code&gt; means owner can read/write, group and others can only read. The classic permission for config files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/id_rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restricts your SSH private key so only you can read it. &lt;strong&gt;SSH will refuse to use a key file with too-open permissions.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Makes a script &lt;strong&gt;executable&lt;/strong&gt;. You'll do this every time you create a new bash script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chown &lt;/span&gt;ubuntu:ubuntu /var/www/html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Change ownership&lt;/strong&gt; of a file or directory. Specify &lt;code&gt;user:group&lt;/code&gt;. Use &lt;code&gt;chown -R&lt;/code&gt; to apply recursively to a whole directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Review the permission string: &lt;code&gt;-rwxr-xr--&lt;/code&gt; breaks down as: file type, owner perms (rwx), group perms (r-x), others perms (r--).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;umask &lt;/span&gt;022
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sets the &lt;strong&gt;default permissions&lt;/strong&gt; for newly created files. &lt;code&gt;022&lt;/code&gt; means files are created as &lt;code&gt;644&lt;/code&gt; and directories as &lt;code&gt;755&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Users, Sessions &amp;amp; Sudo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prints your current username. Run this first when you SSH into an unfamiliar server to confirm who you're logged in as.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo command&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Superuser do.&lt;/strong&gt; Runs a command with root/admin privileges without switching users. Most system-level operations require this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switches you to the &lt;strong&gt;root user&lt;/strong&gt; session entirely. Use with caution — you can do irreversible damage as root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;su - otheruser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Switch user&lt;/strong&gt; to another account, loading their environment. Use &lt;code&gt;exit&lt;/code&gt; to return to your original session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change your password. Admins can change any user's password with &lt;code&gt;passwd username&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows your user ID (UID), group ID (GID), and all group memberships. Useful for debugging permission issues.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;last
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows the login history for all users. Use this to audit who has been accessing a server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;w
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows who is currently logged in and what they're doing. A quick security check.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Process Management
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists &lt;strong&gt;all running processes&lt;/strong&gt; on the system with detailed info including user, CPU%, memory%, and command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find a specific process by name. The standard way to check if a service is running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;top
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real-time, interactive process viewer. Shows CPU and memory usage live. Press &lt;code&gt;q&lt;/code&gt; to quit, &lt;code&gt;k&lt;/code&gt; to kill a process by PID.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;htop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A better, more visual version of &lt;code&gt;top&lt;/code&gt;. Install it with &lt;code&gt;sudo apt-get install htop&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;kill &lt;/span&gt;1234
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Send a termination signal to process with PID &lt;code&gt;1234&lt;/code&gt;. Get the PID from &lt;code&gt;ps aux&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="nt"&gt;-9&lt;/span&gt; 1234
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Force kill&lt;/strong&gt; a process — non-ignorable. Use this when a regular &lt;code&gt;kill&lt;/code&gt; doesn't work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkill nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kill processes by name instead of PID. More convenient when you know the service name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;nohup&lt;/span&gt; ./script.sh &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runs a script in the &lt;strong&gt;background&lt;/strong&gt; and keeps it running even after you log out. The &lt;code&gt;&amp;amp;&lt;/code&gt; puts it in the background, &lt;code&gt;nohup&lt;/code&gt; prevents it from dying when your session ends.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;jobs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists background jobs running in the current session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;bg&lt;/span&gt; %1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resume a suspended job in the &lt;strong&gt;background&lt;/strong&gt;. Use &lt;code&gt;fg %1&lt;/code&gt; to bring it back to the foreground.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Networking &amp;amp; Connectivity
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tests basic network connectivity and measures latency. The first thing to run when troubleshooting connectivity on a cloud VM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fetches just the &lt;strong&gt;HTTP headers&lt;/strong&gt; from a URL. Use this to check if a web service is responding and what status code it returns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.example.com/endpoint &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"key": "value"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make an HTTP POST request with JSON data. Essential for testing APIs and webhooks directly from the command line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://example.com/file.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Downloads a file from the internet. Unlike &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;wget&lt;/code&gt; saves to disk by default and supports resuming interrupted downloads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;netstat &lt;span class="nt"&gt;-tuln&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows all &lt;strong&gt;open ports and listening services&lt;/strong&gt;. Use this to confirm your app is bound to the right port after deployment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-tuln&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The modern replacement for &lt;code&gt;netstat&lt;/code&gt;. Faster and more detailed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;traceroute google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Traces the network path to a destination, showing every hop. Invaluable for diagnosing where a network issue is occurring.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nslookup myapp.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DNS lookup — resolves a hostname to an IP. Use this to verify DNS propagation after updating records.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig myapp.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More detailed DNS lookup than &lt;code&gt;nslookup&lt;/code&gt;. Shows TTLs, record types, and the responding nameserver.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ifconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows network interface configuration (IP addresses, etc.). On newer systems, use &lt;code&gt;ip addr&lt;/code&gt; instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip addr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The modern way to view network interfaces and IP addresses.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. SSH &amp;amp; Key Management
&lt;/h2&gt;

&lt;p&gt;SSH is how you access virtually every cloud VM. Know these commands cold.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh ubuntu@203.0.113.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect to a remote server. Replace &lt;code&gt;ubuntu&lt;/code&gt; with your username and the IP with your instance's public IP.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/mykey.pem ubuntu@203.0.113.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect using a &lt;strong&gt;specific private key file&lt;/strong&gt; — required for AWS EC2 instances and others that use key-pair authentication.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate a new &lt;strong&gt;SSH key pair&lt;/strong&gt;. &lt;code&gt;ed25519&lt;/code&gt; is the modern, recommended algorithm. Your public key goes on the server; your private key stays on your machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;View your &lt;strong&gt;public key&lt;/strong&gt; so you can copy it to a server's &lt;code&gt;authorized_keys&lt;/code&gt; or paste it into a cloud provider's console.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-copy-id ubuntu@203.0.113.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copies your public key to a remote server's authorized keys automatically. Much easier than doing it manually.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp file.txt ubuntu@203.0.113.10:/home/ubuntu/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Securely copy&lt;/strong&gt; a file to a remote server over SSH. Use &lt;code&gt;scp -r&lt;/code&gt; for directories.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-L&lt;/span&gt; 8080:localhost:80 ubuntu@203.0.113.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SSH tunneling / port forwarding.&lt;/strong&gt; Forwards your local port &lt;code&gt;8080&lt;/code&gt; to port &lt;code&gt;80&lt;/code&gt; on the remote server. Incredibly useful for accessing services that aren't publicly exposed (databases, internal dashboards).&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Package Management (apt)
&lt;/h2&gt;

&lt;p&gt;For Debian/Ubuntu-based systems — the most common Linux distros you'll encounter on AWS, GCP, and Azure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Refreshes the package list&lt;/strong&gt; from repositories. Always run this before installing anything. It doesn't install or upgrade anything — it just updates the metadata.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Upgrades all installed packages&lt;/strong&gt; to their latest versions. Run &lt;code&gt;update&lt;/code&gt; first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Installs a package by name. You'll use this constantly when provisioning new servers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get remove nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Removes a package but &lt;strong&gt;leaves its config files&lt;/strong&gt; in place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get purge nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Removes a package &lt;strong&gt;and its config files&lt;/strong&gt;. Use this for a clean uninstall.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get autoremove
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Removes packages that were installed as dependencies but are no longer needed. Good for keeping VMs lean.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt-cache search keyword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Search available packages by keyword without installing anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. System Monitoring &amp;amp; Disk
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows &lt;strong&gt;disk usage&lt;/strong&gt; of all mounted filesystems in human-readable format (GB, MB). The first thing to check when you get a "disk full" alert.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/log/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows the &lt;strong&gt;total size&lt;/strong&gt; of a specific directory. Use &lt;code&gt;du -sh *&lt;/code&gt; inside a directory to see sizes of all subdirectories at once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows &lt;strong&gt;memory usage&lt;/strong&gt; (total, used, free, cached) in human-readable format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uptime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows how long the system has been running and the &lt;strong&gt;load average&lt;/strong&gt; over 1, 5, and 15 minutes. A quick health check.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prints system information: kernel version, architecture, OS. Useful when you're not sure exactly what you're running on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsblk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists all &lt;strong&gt;block devices&lt;/strong&gt; (disks and partitions). Use this after attaching a new EBS volume (AWS) or persistent disk (GCP) to see it appear.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mount /dev/sdb1 /mnt/data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mounts a disk partition to a directory. You'll do this after attaching and formatting new cloud storage volumes.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Text Processing &amp;amp; Editing
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello, World!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prints text to the terminal. Use with redirection to write to files: &lt;code&gt;echo "export PATH=$PATH:/usr/local/bin" &amp;gt;&amp;gt; ~/.bashrc&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano filename.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple, beginner-friendly text editor. Use &lt;code&gt;Ctrl+O&lt;/code&gt; to save, &lt;code&gt;Ctrl+X&lt;/code&gt; to exit. Good for quick edits on remote servers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vim filename.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A powerful but steep-learning-curve editor. &lt;code&gt;i&lt;/code&gt; to enter insert mode, &lt;code&gt;Esc&lt;/code&gt; then &lt;code&gt;:wq&lt;/code&gt; to save and quit. Worth learning the basics.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/old-value/new-value/g'&lt;/span&gt; config.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stream editor&lt;/strong&gt; — find and replace text in a file without opening an editor. The &lt;code&gt;-i&lt;/code&gt; flag edits in-place. Extremely useful in deployment scripts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1, $3}'&lt;/span&gt; data.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A powerful text-processing tool. This example prints the 1st and 3rd columns. Great for parsing log files and extracting specific fields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; filename.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Word count&lt;/strong&gt; — counts lines, words, or characters. &lt;code&gt;wc -l&lt;/code&gt; counts lines. Use it to count log entries: &lt;code&gt;grep "ERROR" app.log | wc -l&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sort &lt;/span&gt;filename.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sorts lines alphabetically. Use &lt;code&gt;sort -n&lt;/code&gt; for numerical sort, &lt;code&gt;sort -r&lt;/code&gt; for reverse.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; sorted.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Counts &lt;strong&gt;duplicate adjacent lines&lt;/strong&gt; — always pair with &lt;code&gt;sort&lt;/code&gt; first. Classic pattern for frequency analysis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;,3 data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extracts specific &lt;strong&gt;columns&lt;/strong&gt; from delimited files. Perfect for parsing CSV exports from cloud billing or logs.&lt;/p&gt;




&lt;h2&gt;
  
  
  13. Environment &amp;amp; Shell
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists all &lt;strong&gt;environment variables&lt;/strong&gt; currently set. Use this to verify that your secrets and config values loaded correctly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;MY_VAR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"hello"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sets an environment variable for the current session and any child processes. Use this for passing config to scripts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$MY_VAR&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prints the value of an environment variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reloads your shell config file. Run this after editing &lt;code&gt;.bashrc&lt;/code&gt; or &lt;code&gt;.bash_profile&lt;/code&gt; so changes take effect without logging out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;history&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows your command history. Use &lt;code&gt;history | grep ssh&lt;/code&gt; to find a previously used SSH command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;!&lt;/span&gt;42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Re-runs command number &lt;code&gt;42&lt;/code&gt; from your history. Use &lt;code&gt;!!&lt;/code&gt; to repeat the last command (common pattern: &lt;code&gt;sudo !!&lt;/code&gt; to re-run the last command with sudo).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ls -la'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates a &lt;strong&gt;shortcut&lt;/strong&gt; for a command. Add your aliases to &lt;code&gt;~/.bashrc&lt;/code&gt; to make them permanent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crontab &lt;span class="nt"&gt;-e&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Opens the &lt;strong&gt;cron job editor&lt;/strong&gt; to schedule recurring tasks. This is how you automate backups, cleanup scripts, and health checks on cloud VMs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shutdown &lt;span class="nt"&gt;-h&lt;/span&gt; +10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shuts down the system in 10 minutes. Use &lt;code&gt;shutdown -r now&lt;/code&gt; to reboot immediately. Always requires root/sudo.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpiisklkogz7ie41e2aiu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpiisklkogz7ie41e2aiu.png" alt=" " width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud Provider Quick Reference
&lt;/h2&gt;

&lt;p&gt;All major cloud providers offer a browser-based &lt;strong&gt;Cloud Shell&lt;/strong&gt; that drops you straight into a bash environment — no SSH setup required.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Cloud Shell Access&lt;/th&gt;
&lt;th&gt;CLI Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;CloudShell in Console&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;aws&lt;/code&gt; CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud&lt;/td&gt;
&lt;td&gt;Cloud Shell button (top nav)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;gcloud&lt;/code&gt; CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;Cloud Shell icon (top nav)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;az&lt;/code&gt; CLI (bash or PowerShell)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud&lt;/td&gt;
&lt;td&gt;Cloud Shell in Console&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;oci&lt;/code&gt; CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IBM Cloud&lt;/td&gt;
&lt;td&gt;Cloud Shell button&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ibmcloud&lt;/code&gt; CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Handy Cloud CLI Examples
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS — List all S3 buckets:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws s3 &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AWS — Copy a file to S3:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws s3 &lt;span class="nb"&gt;cp &lt;/span&gt;myfile.txt s3://my-bucket/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GCP — List Compute Engine instances:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud compute instances list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GCP — SSH into an instance:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud compute ssh my-instance &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-central1-a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Azure — List resource groups:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az group list &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Azure — Show VM status:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az vm show &lt;span class="nt"&gt;-g&lt;/span&gt; MyResourceGroup &lt;span class="nt"&gt;-n&lt;/span&gt; MyVM &lt;span class="nt"&gt;--show-details&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Putting It All Together: A Real Workflow
&lt;/h2&gt;

&lt;p&gt;Here's what a typical cloud debugging session might look like using the commands above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. SSH into your instance&lt;/span&gt;
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/prod-key.pem ubuntu@203.0.113.10

&lt;span class="c"&gt;# 2. Check who you are and system status&lt;/span&gt;
&lt;span class="nb"&gt;whoami
uptime
&lt;/span&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;

&lt;span class="c"&gt;# 3. Find what's eating disk space&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/log/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check if your app process is running&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;myapp

&lt;span class="c"&gt;# 5. Watch live logs&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/myapp/app.log

&lt;span class="c"&gt;# 6. Count errors in the last hour's log&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt; /var/log/myapp/app.log | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# 7. Check which ports are listening&lt;/span&gt;
ss &lt;span class="nt"&gt;-tuln&lt;/span&gt;

&lt;span class="c"&gt;# 8. Restart a service if needed&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The CLI felt intimidating to me at first too. Now I reach for it before the console almost every time  it's faster, scriptable, and forces you to actually understand what's happening on your infrastructure rather than clicking through abstractions.&lt;/p&gt;

&lt;p&gt;Start with the navigation and file commands until they're muscle memory. Then move to grep, pipes, and permissions. Once those click, the rest follows naturally.&lt;/p&gt;

&lt;p&gt;The best way to get comfortable? Stop avoiding the CLI and use it for everything  even when the GUI would be faster at first. The short-term friction pays off fast.&lt;/p&gt;

&lt;p&gt;If there are specific command categories you'd like me to expand on, drop a comment below.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>gcp</category>
      <category>azure</category>
      <category>bash</category>
    </item>
    <item>
      <title>I gave OpenClaw its own computer and a Telegram Bot. Here's What Happened</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Fri, 13 Feb 2026 14:53:55 +0000</pubDate>
      <link>https://forem.com/karaniph/i-gave-openclaw-its-own-computer-and-a-telegram-bot-heres-what-happened-1lm6</link>
      <guid>https://forem.com/karaniph/i-gave-openclaw-its-own-computer-and-a-telegram-bot-heres-what-happened-1lm6</guid>
      <description>&lt;p&gt;Quick thing before we get into it: if you're thinking about running OpenClaw yourself, skip putting it on your home or work machine for security reasons, of course. Get a cheap VPS.&lt;/p&gt;

&lt;p&gt;I used AWS because I work in the cloud daily and know how to keep costs in check, but for most people, especially if you've never managed cloud infrastructure before, AWS bills can sneak up on you fast. That's why I'd point non-cloud users straight to &lt;a href="https://www.tkqlhce.com/click-100854911-17240674" rel="noopener noreferrer"&gt;Hostinger Open Claw VPS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Their VPS plans are simple, predictably priced, and you won't wake up to a surprise bill because you forgot to set a budget alert.&lt;/p&gt;

&lt;p&gt;Okay. Now the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenClaw Actually Is (Because Most People Get This Wrong)
&lt;/h2&gt;

&lt;p&gt;It's not a chatbot. It's not a SaaS dashboard. It's not another wrapper around GPT with a monthly subscription slapped on it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openclaw.ai" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt; is an open-source personal AI assistant that runs on your own machine or server, connects to whichever AI model you choose, and talks to you through whatever chat app you already use. &lt;/p&gt;

&lt;p&gt;Telegram, WhatsApp, Discord, iMessage, Slack. You message it like a contact. It does things.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf11zqb5qzshhaaenqqj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf11zqb5qzshhaaenqqj.jpg" alt=" " width="720" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because it runs on your infrastructure and not someone else's servers, your data stays yours. &lt;/p&gt;

&lt;p&gt;You pick the model from a list of various top models like DeepSeek Claude, GPT-5.2, or local models if you want. You control what it can access. And since it's fully open source, you can extend it however you need to.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OpenClaw was built by Peter Steinberger and a growing community of contributors. It's only a few months old and moves fast — new capabilities show up regularly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Setup
&lt;/h2&gt;

&lt;p&gt;Ubuntu 24.04 VPS on AWS Lightsail &lt;strong&gt;costs $12/per month&lt;/strong&gt;. Mistral, as the AI backbone, routed through a Vercel API gateway I set up as an abstraction layer, makes it easier to swap models later without touching every config file. Telegram for delivery.&lt;/p&gt;

&lt;p&gt;I configured it to send me a structured morning report at 7:00 AM East Africa Time every day. For the last week, it has worked exactly as intended. Getting there, though, was a different story.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Thing I Got Wrong: Claude Opus 4.6 Ate My Credits
&lt;/h2&gt;

&lt;p&gt;When I first installed OpenClaw, I defaulted to Claude Opus 4.6 as the model. Makes sense in theory, best output, most capable, why not start with the best?&lt;/p&gt;

&lt;p&gt;My credit balance had other opinions.&lt;/p&gt;

&lt;p&gt;Opus 4.6 is an incredible model. It's also priced like one. For a daily scheduled task firing the same structured request every morning, using Opus is like going swimming in the local pool with full scuba diving equipment. &lt;/p&gt;

&lt;p&gt;What is the output quality difference compared to a cheaper model on this kind of repetitive, well-defined task? Honestly negligible. The price difference? Not negligible at all.&lt;/p&gt;

&lt;p&gt;I switched to Mistral after the first few hours and haven't looked back. The reports are just as useful. The bill is much easier to live with.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; match the model to the task. Opus-level models are worth it for complex, nuanced, one-off reasoning. For structured daily reports pulling from consistent data, use something cheaper and cache what you can.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  On Caching: Seriously, Do This
&lt;/h3&gt;

&lt;p&gt;If you're running OpenClaw for repetitive scheduled tasks, look into caching your API calls. &lt;/p&gt;

&lt;p&gt;Any part of your prompt that doesn't change between runs, system instructions, static context, or your data schema doesn't need to be re-sent and re-processed every single time. &lt;/p&gt;

&lt;p&gt;Most major AI APIs support prompt caching in some form, and the cost savings on high-frequency tasks are real.&lt;/p&gt;

&lt;p&gt;The general principle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Expensive model + no caching + daily repetitive task = you will regret it&lt;/li&gt;
&lt;li&gt;✅ Cheaper model + cached static context + well-structured prompt = same job, fraction of the cost&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I'm on AWS But Suggesting Hostinger for Most People
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1ca62e8tt7hm88o1sdx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1ca62e8tt7hm88o1sdx.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I work in the cloud professionally. Setting up billing alerts, IAM permissions, configuring CloudWatch dashboards, monitoring resource usage, and watching for cost anomalies is just part of how I operate every day. So AWS Lightsail made sense for me. &lt;/p&gt;

&lt;p&gt;I knew how to keep it under control.&lt;/p&gt;

&lt;p&gt;I’ve watched people with no cloud background spin up resources, forget they even exist, and then get blindsided by a massive bill weeks later. &lt;/p&gt;

&lt;p&gt;A quick scroll through the Google Cloud subreddit is all it takes. The horror stories from mismanaged infrastructure are a reminder that in the cloud, what you forget can cost you&lt;/p&gt;

&lt;p&gt;AWS is powerful precisely because it has so many knobs to turn, and if you don't know which ones matter, that flexibility becomes a liability.&lt;/p&gt;

&lt;p&gt;For anyone who doesn't live in cloud infrastructure, I'd genuinely recommend starting with &lt;a href="https://www.tkqlhce.com/click-100854911-17240674" rel="noopener noreferrer"&gt;Hostinger's Openclaw VPS plans&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Clean Ubuntu setup, predictable flat-rate pricing, no need to understand reserved instances, Route 53 or any of the things that make AWS bills confusing. You get a server, it costs what it says it costs, you SSH in and get to work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A basic 2 GB RAM instance is more than enough&lt;/strong&gt; for what OpenClaw needs, but &lt;strong&gt;Hostinger is even more generous and gives you an 8GB RAM 2vCPU and 8TB bandwidth at $7.99/mon&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are already familiar with AWS or GCP, use what you're comfortable with. &lt;/p&gt;

&lt;p&gt;If you don't, don't learn cloud infrastructure and OpenClaw at the same time. That's just unnecessary pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Days 1 and 2: The Part Nobody Writes About
&lt;/h2&gt;

&lt;p&gt;Every write-up about a new tool skips straight to "and then it worked great." So let me be the one to actually tell you what the first 48 hours looked like.&lt;/p&gt;

&lt;h3&gt;
  
  
  The cron job that was definitely running (it wasn't)
&lt;/h3&gt;

&lt;p&gt;My plan: schedule the morning report with a cron job. Simple. Except nothing happened. No error. No log. No indication that anything had been attempted. Just silence.&lt;/p&gt;

&lt;p&gt;Turned out to be three things piling on each other simultaneously:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Environment variables set in my normal shell session weren't available to the cron environment&lt;/li&gt;
&lt;li&gt;The virtual environment path wasn't being activated correctly inside the cron command&lt;/li&gt;
&lt;li&gt;I'd set the schedule for &lt;code&gt;7 AM&lt;/code&gt; without accounting for the server running UTC, not EAT. I needed &lt;code&gt;04:00 UTC&lt;/code&gt;, not &lt;code&gt;07:00&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these is hard to fix once you know what's wrong. Finding all three without clear error messages at 11 PM was a different experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Always add logging to your cron jobs from day one.&lt;/strong&gt; Redirect output to a file. Silent failures are the worst kind.&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-command &amp;gt;&amp;gt; /home/user/openclaw/cron.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Manual requests: educational, but a grind
&lt;/h3&gt;

&lt;p&gt;While the cron issue was unresolved, I was testing by firing requests manually from the terminal. Run the command. Watch the output. Tweak something. Run again.&lt;/p&gt;

&lt;p&gt;It works as a debugging method. As a workflow, it's a bumper, especially when you're used to just typing in Telegram and having things happen.&lt;/p&gt;

&lt;p&gt;The upside: by the time the scheduler was working, I understood every layer of the system. The manual phase taught me OpenClaw better than any documentation would have.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 3, 7:02 AM
&lt;/h3&gt;

&lt;p&gt;Telegram notification. Report there. Automated. No manual intervention.&lt;/p&gt;

&lt;p&gt;The relief was disproportionate to the actual achievement, but completely understandable given the previous 48 hours. It's been delivering every morning since.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Else People Are Doing With This Thing
&lt;/h2&gt;

&lt;p&gt;My scheduled report is a pretty narrow use case. Looking at what the broader community has built: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email triage and sending, calendar management&lt;/strong&gt; — all from a WhatsApp or Telegram message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote coding sessions&lt;/strong&gt; via Claude Code or OpenAI Codex — kick off a task from your phone, get results in chat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image generation&lt;/strong&gt; through Nano Banana — request visuals in chat, receive them without switching apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser control&lt;/strong&gt; for automated form filling, flight check-ins, and data extraction from sites without APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health and biometric tracking&lt;/strong&gt; — WHOOP, Oura, and other wearables connected and queryable in chat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obsidian and personal knowledge base integration&lt;/strong&gt; — builds your second brain from conversations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart home control&lt;/strong&gt; — lights, air purifiers, environmental conditions managed against defined goals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom audio content&lt;/strong&gt; — one person had it write meditation scripts, convert to TTS, add ambient sound, and deliver the finished file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out open claw subreddits for ideas of tasks you can automate with openclaw&lt;/p&gt;

&lt;p&gt;The pattern across all of these is the same: friction that used to require opening multiple apps gets compressed into one message in a chat thread you already have open. &lt;/p&gt;

&lt;p&gt;That's the value proposition, and once you feel it working, it's hard to go back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honestly? I'm Kind of Hooked.
&lt;/h2&gt;

&lt;p&gt;I didn't expect to feel this way about infrastructure software. But there's something genuinely satisfying about a system that works while you're not working, the report arrives before I've opened a browser, before the noise of the day starts. &lt;/p&gt;

&lt;p&gt;Information I specifically configured to matter to me, already processed, already waiting.&lt;/p&gt;

&lt;p&gt;And the thing about OpenClaw is that you start building around it almost immediately. Within a few days, I was already thinking about the next automation, the next friction point that a scheduled task could eliminate. &lt;/p&gt;

&lt;p&gt;That's a different relationship than most software creates.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's coming next for my setup
&lt;/h3&gt;

&lt;p&gt;I'm adding the &lt;strong&gt;Gemini API&lt;/strong&gt; alongside Mistral, specifically Gemini Nano for lightweight, fast tasks that don't need heavy models. Paired with &lt;strong&gt;Nano Banana&lt;/strong&gt; for image generation, I can start building visual content workflows directly from Telegram without switching tools.&lt;/p&gt;

&lt;p&gt;The one I'm most excited about: &lt;strong&gt;OpenAI API with Codex access&lt;/strong&gt;. Triggering remote coding sessions from my phone, having OpenClaw run code, fix tests, open PRs, and report back while I'm doing something else is exactly the kind of async workflow this thing is built for. Community members are already doing this, and the demos I see on Discord are wild.&lt;/p&gt;

&lt;p&gt;Beyond specific APIs: a broader daily automation layer. Not just one morning report, but a set of scheduled and on-demand tasks that handle the routine stuff, email triage, content summarisation, task reminders with context, all through Telegram. Fewer context switches, not more tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should You Try This?
&lt;/h2&gt;

&lt;p&gt;If you're comfortable with a terminal and patient enough to debug environment issues, yes. The first two days will test you. Day three makes it worth it.&lt;/p&gt;

&lt;p&gt;A few things that'll save you time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't start with the most expensive model.&lt;/strong&gt; Mistral Devstral or Qwen3 is fine for most scheduled tasks. Move up when you actually need to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache your static prompt content from the start.&lt;/strong&gt; Your system instructions aren't changing between runs — don't pay to send them every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match model to task complexity.&lt;/strong&gt; Daily structured reports don't need Opus or GPT 5.3. Complex one-off reasoning might. Know the difference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add logging to cron jobs immediately.&lt;/strong&gt; Future you will be grateful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set UTC times for everything server-side.&lt;/strong&gt; Convert locally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to run this without cloud billing anxiety, &lt;a href="https://www.hostinger.com/YOUR-AFFILIATE-LINK" rel="noopener noreferrer"&gt;Hostinger's VPS plans&lt;/a&gt; are the low-drama option —flat pricing, Ubuntu setup in under 20 minutes, no surprise bills. Once the server is live, everything else follows from the &lt;a href="https://docs.openclaw.ai/getting-started" rel="noopener noreferrer"&gt;OpenClaw docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Set aside two to three days for initial setup. Give yourself permission to find the first 48 hours frustrating.&lt;/p&gt;

&lt;p&gt;Day three is worth it.&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Backing Up GitHub Repositories to Amazon S3 (What Nobody Warns You About)</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Tue, 13 Jan 2026 14:05:49 +0000</pubDate>
      <link>https://forem.com/karaniph/backing-up-github-repositories-to-amazon-s3-what-nobody-warns-you-about-5bmh</link>
      <guid>https://forem.com/karaniph/backing-up-github-repositories-to-amazon-s3-what-nobody-warns-you-about-5bmh</guid>
      <description>&lt;p&gt;I didn’t start backing up my GitHub repositories because I distrusted GitHub.&lt;/p&gt;

&lt;p&gt;I started because I realized something uncomfortable: &lt;strong&gt;GitHub had become a single point of failure for work I actually cared about&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Between long-lived projects, experiments I might want years later, and repositories that quietly became important, I didn’t like the idea that a deleted repo, a locked account, or a bad force-push could wipe everything out.&lt;/p&gt;

&lt;p&gt;I wanted an &lt;strong&gt;off-platform, boring, automated backup&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Amazon S3 fit that mental model perfectly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Independent of GitHub&lt;/li&gt;
&lt;li&gt;Cheap&lt;/li&gt;
&lt;li&gt;Extremely durable&lt;/li&gt;
&lt;li&gt;Built for long-term storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What sounded simple turned out to be &lt;strong&gt;very easy to get wrong&lt;/strong&gt;.&lt;br&gt;
This article documents the approach that finally worked — including the mistakes.&lt;/p&gt;
&lt;h2&gt;
  
  
  What this article covers
&lt;/h2&gt;

&lt;p&gt;This guide shows how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Back up &lt;strong&gt;multiple GitHub repositories&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Run backups &lt;strong&gt;weekly&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Preserve &lt;strong&gt;full Git history&lt;/strong&gt; (branches + tags)&lt;/li&gt;
&lt;li&gt;Avoid &lt;strong&gt;AWS access keys&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;OIDC + temporary credentials&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Store backups safely in &lt;strong&gt;Amazon S3&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a ZIP download tutorial.&lt;br&gt;
This is a &lt;strong&gt;real backup&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  High-level architecture (correct model)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Architecture flow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;GitHub Actions runs on a schedule&lt;/li&gt;
&lt;li&gt;GitHub issues an &lt;strong&gt;OIDC identity token&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;AWS STS validates the token&lt;/li&gt;
&lt;li&gt;AWS issues &lt;strong&gt;temporary credentials&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The workflow uploads backups to S3&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No IAM users.&lt;br&gt;
No static secrets.&lt;br&gt;
Nothing long-lived.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkzg7fy906k77h0zhs0t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkzg7fy906k77h0zhs0t.png" alt=" " width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why &lt;code&gt;git bundle&lt;/code&gt; (and not ZIP files)
&lt;/h2&gt;

&lt;p&gt;ZIP files look tempting  until you need to restore.&lt;/p&gt;

&lt;p&gt;ZIP backups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Lose commit history&lt;/li&gt;
&lt;li&gt;❌ Drop branches and tags&lt;/li&gt;
&lt;li&gt;❌ Are painful to restore correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;strong&gt;git bundle&lt;/strong&gt; is different. It contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All commits&lt;/li&gt;
&lt;li&gt;All branches&lt;/li&gt;
&lt;li&gt;All tags&lt;/li&gt;
&lt;li&gt;In a single portable file&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Creating a bundle
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git bundle create repo-backup.bundle &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If your backup can’t restore history, it’s not a backup.&lt;/p&gt;
&lt;h2&gt;
  
  
  The IAM problem that caused most of the pain
&lt;/h2&gt;

&lt;p&gt;The hardest part wasn’t GitHub Actions.&lt;br&gt;
It was &lt;strong&gt;AWS permissions&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  The confusing part
&lt;/h3&gt;

&lt;p&gt;AWS uses two different policy types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy type&lt;/th&gt;
&lt;th&gt;Used for&lt;/th&gt;
&lt;th&gt;Requires &lt;code&gt;Principal&lt;/code&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IAM role policy&lt;/td&gt;
&lt;td&gt;Identity permissions&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 bucket policy&lt;/td&gt;
&lt;td&gt;Resource permissions&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;They look similar.&lt;br&gt;
They behave very differently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fau9i19ri4vkww8uabx6p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fau9i19ri4vkww8uabx6p.png" alt=" " width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why “invalid principal” kept appearing
&lt;/h2&gt;

&lt;p&gt;At one point, everything &lt;em&gt;looked&lt;/em&gt; correct  but AWS kept returning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invalid principal&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The reason:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;IAM policy&lt;/strong&gt; was pasted into an &lt;strong&gt;S3 bucket policy&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Or the principal ARN didn’t match the actual role&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The rule that finally made it click
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;IAM role policies &lt;strong&gt;never&lt;/strong&gt; define a Principal&lt;/li&gt;
&lt;li&gt;S3 bucket policies &lt;strong&gt;must&lt;/strong&gt; define who is allowed access&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  S3 authorization model (the missing mental model)
&lt;/h2&gt;

&lt;p&gt;This diagram explains the core issue that caused most confusion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw8r9s221mrqm9u2j118.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw8r9s221mrqm9u2j118.png" alt=" " width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Key idea
&lt;/h3&gt;

&lt;p&gt;An S3 upload succeeds &lt;strong&gt;only if BOTH are true&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The IAM role policy allows the action&lt;/li&gt;
&lt;li&gt;The S3 bucket policy allows the same role&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If either side denies it → &lt;strong&gt;AccessDenied&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The GitHub Actions workflow (clean and boring)
&lt;/h2&gt;

&lt;p&gt;Once the security model was clear, the workflow itself became simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Weekly S3 Repo Backup&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0"&lt;/span&gt;   &lt;span class="c1"&gt;# Weekly&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout full history&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create git bundle&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;set -e&lt;/span&gt;
          &lt;span class="s"&gt;REPO_NAME="${GITHUB_REPOSITORY#*/}"&lt;/span&gt;
          &lt;span class="s"&gt;TS="$(date -u +%Y-%m-%dT%H-%M-%SZ)"&lt;/span&gt;
          &lt;span class="s"&gt;mkdir -p backups&lt;/span&gt;
          &lt;span class="s"&gt;git bundle create "backups/${REPO_NAME}-${TS}.bundle" --all&lt;/span&gt;
          &lt;span class="s"&gt;sha256sum "backups/${REPO_NAME}-${TS}.bundle" &amp;gt; "backups/${REPO_NAME}-${TS}.sha256"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Configure AWS credentials (OIDC)&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/configure-aws-credentials@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;role-to-assume&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;IAM_ROLE_ARN&amp;gt;&lt;/span&gt;
          &lt;span class="na"&gt;aws-region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;AWS_REGION&amp;gt;&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload to S3&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;aws s3 cp backups/ \&lt;/span&gt;
            &lt;span class="s"&gt;s3://&amp;lt;bucket-name&amp;gt;/github-backups/${GITHUB_REPOSITORY}/ \&lt;/span&gt;
            &lt;span class="s"&gt;--recursive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing clever.&lt;br&gt;
Nothing hidden.&lt;br&gt;
That’s intentional.&lt;/p&gt;


&lt;h2&gt;
  
  
  Terraform setup (AWS side)
&lt;/h2&gt;

&lt;p&gt;This is a &lt;strong&gt;minimal Terraform configuration&lt;/strong&gt; — no extras.&lt;/p&gt;
&lt;h3&gt;
  
  
  GitHub OIDC provider
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_openid_connect_provider"&lt;/span&gt; &lt;span class="s2"&gt;"github"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://token.actions.githubusercontent.com"&lt;/span&gt;

  &lt;span class="nx"&gt;client_id_list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;"sts.amazonaws.com"&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;thumbprint_list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;"6938fd4d98bab03faadb97b34396831e3780aea1"&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  IAM role for GitHub Actions
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role"&lt;/span&gt; &lt;span class="s2"&gt;"github_backup"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github-actions-s3-backup"&lt;/span&gt;

  &lt;span class="nx"&gt;assume_role_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;Version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;
    &lt;span class="nx"&gt;Statement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Allow"&lt;/span&gt;
      &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sts:AssumeRoleWithWebIdentity"&lt;/span&gt;
      &lt;span class="nx"&gt;Principal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Federated&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_openid_connect_provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;Condition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;StringLike&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"token.actions.githubusercontent.com:sub"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"repo:*/*:*"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  IAM role policy (write-only S3 access)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role_policy"&lt;/span&gt; &lt;span class="s2"&gt;"s3_backup"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;github_backup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;

  &lt;span class="nx"&gt;policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;Version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;
    &lt;span class="nx"&gt;Statement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Allow"&lt;/span&gt;
        &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"s3:ListBucket"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nx"&gt;Resource&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:s3:::example-backup-bucket"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Allow"&lt;/span&gt;
        &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="s2"&gt;"s3:PutObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"s3:AbortMultipartUpload"&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nx"&gt;Resource&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:s3:::example-backup-bucket/*"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Restoring from a backup
&lt;/h2&gt;

&lt;p&gt;Restoring is refreshingly simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone repo-backup.bundle restored-repo
&lt;span class="nb"&gt;cd &lt;/span&gt;restored-repo
git push &lt;span class="nt"&gt;--all&lt;/span&gt; origin
git push &lt;span class="nt"&gt;--tags&lt;/span&gt; origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No GitHub API.&lt;br&gt;
No special tooling.&lt;br&gt;
Just Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sketch trust relationships &lt;strong&gt;before&lt;/strong&gt; writing policies&lt;/li&gt;
&lt;li&gt;Don’t trust AWS error messages blindly&lt;/li&gt;
&lt;li&gt;Never use &lt;code&gt;root&lt;/code&gt; as a bucket principal&lt;/li&gt;
&lt;li&gt;Test with one repo before scaling&lt;/li&gt;
&lt;li&gt;Keep backups boring&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;This setup isn’t flashy and that’s the point.&lt;/p&gt;

&lt;p&gt;A good backup system is something you forget about until the day you need it.&lt;br&gt;
And when that day comes, it should just work.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>github</category>
      <category>githubactions</category>
      <category>s3</category>
    </item>
    <item>
      <title>I built an actual companion right in your IDE.</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Thu, 08 Jan 2026 05:09:47 +0000</pubDate>
      <link>https://forem.com/karaniph/i-built-an-actual-companion-right-in-your-ide-32l4</link>
      <guid>https://forem.com/karaniph/i-built-an-actual-companion-right-in-your-ide-32l4</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/karaniph" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1150173%2F3d980c29-7154-4bcf-bc8d-15ad2e0a1fc3.png" alt="karaniph"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/karaniph/what-your-aws-and-gcp-python-code-is-really-doing-i-built-a-vs-code-extension-to-find-out-103p" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I Built a Spy for My Python Code: It Was Secretly Calling AWS 40x More Than I Thought&lt;/h2&gt;
      &lt;h3&gt;Phaustin Karani ・ Jan 4&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#vscode&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#cursor&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>python</category>
      <category>programming</category>
      <category>vscode</category>
      <category>cursor</category>
    </item>
    <item>
      <title>Best solution to vibecoded sites</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Sun, 04 Jan 2026 16:19:54 +0000</pubDate>
      <link>https://forem.com/karaniph/best-solution-to-vibecoded-sites-p03</link>
      <guid>https://forem.com/karaniph/best-solution-to-vibecoded-sites-p03</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/karaniph" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1150173%2F3d980c29-7154-4bcf-bc8d-15ad2e0a1fc3.png" alt="karaniph"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/karaniph/the-best-web-hosting-for-vibecoded-sites-speed-without-the-headache-1dip" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Best Web Hosting for Vibecoded Sites: Speed Without the Headache&lt;/h2&gt;
      &lt;h3&gt;Phaustin Karani ・ Nov 21 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#vibecoding&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>vibecoding</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>ai</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Sun, 04 Jan 2026 16:18:33 +0000</pubDate>
      <link>https://forem.com/karaniph/-2154</link>
      <guid>https://forem.com/karaniph/-2154</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/karaniph" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1150173%2F3d980c29-7154-4bcf-bc8d-15ad2e0a1fc3.png" alt="karaniph"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/karaniph/what-your-aws-and-gcp-python-code-is-really-doing-i-built-a-vs-code-extension-to-find-out-103p" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;What Your AWS and GCP Python Code Is Really Doing (I Built a VS Code Extension to Find Out)&lt;/h2&gt;
      &lt;h3&gt;Phaustin Karani ・ Jan 4&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#vscode&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#cursor&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>python</category>
      <category>programming</category>
      <category>vscode</category>
      <category>cursor</category>
    </item>
    <item>
      <title>I Built a Spy for My Python Code: It Was Secretly Calling AWS 40x More Than I Thought</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Sun, 04 Jan 2026 12:32:42 +0000</pubDate>
      <link>https://forem.com/karaniph/what-your-aws-and-gcp-python-code-is-really-doing-i-built-a-vs-code-extension-to-find-out-103p</link>
      <guid>https://forem.com/karaniph/what-your-aws-and-gcp-python-code-is-really-doing-i-built-a-vs-code-extension-to-find-out-103p</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Python Code Mentor is the only VS Code extension that provides AI-powered explanations for AWS, Google Cloud, and multi-cloud Python code patterns. It goes beyond syntax highlighting to explain how serverless architectures &lt;em&gt;actually&lt;/em&gt; behave in the real world.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Current Code Analysis Tools
&lt;/h2&gt;

&lt;p&gt;Most VS Code extensions are good at helping you &lt;em&gt;write&lt;/em&gt; Python. Some go a step further and focus on a single cloud provider. But almost none of them explain what your cloud code is actually doing — or why it’s structured the way it is.&lt;/p&gt;

&lt;p&gt;So you end up context-switching constantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Googling &lt;em&gt;“how does Lambda work with S3”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Comparing &lt;em&gt;Cloud Functions vs Lambda&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Jumping between docs, Google AI Overviews, or ChatGPT just to understand why a Firestore query is slow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of understanding the code in front of you, you’re stitching together mental models from AI summaries and documentation tabs.&lt;/p&gt;

&lt;p&gt;That gap is what pushed me to build Python Code Mentor.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes Python Code Mentor Different
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Multi-Cloud Intelligence&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This extension understands &lt;strong&gt;AWS and Google Cloud in the same codebase&lt;/strong&gt; — something I couldn’t find in existing tools.&lt;/p&gt;

&lt;p&gt;It automatically detects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS patterns&lt;/strong&gt;: Lambda handlers, boto3 calls, S3 and DynamoDB interactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GCP patterns&lt;/strong&gt;: Cloud Functions, Google Cloud SDK usage, Firestore and BigQuery operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mixed environments&lt;/strong&gt;: Codebases that touch both clouds (very common in real-world systems)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you select code, the extension knows whether you’re dealing with AWS Lambda or Google Cloud Functions and explains it in the right context.&lt;/p&gt;

&lt;p&gt;No generic answers. No cloud-agnostic fluff.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Serverless Function Tracing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Most tools stop at syntax. This one focuses on &lt;em&gt;execution&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s3_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Select this code, hit Ctrl+Shift+W
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of a shallow explanation, the extension generates realistic S3 trigger events and walks through the function step-by-step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how the event is structured,&lt;/li&gt;
&lt;li&gt;how boto3 calls are executed,&lt;/li&gt;
&lt;li&gt;what gets returned to AWS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Google Cloud Functions Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@functions_framework.http&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;firestore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# Select this code, hit Ctrl+Alt+F
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, it simulates real HTTP requests and explains how Cloud Functions handle them — including cold starts, Firestore access, and response handling.&lt;/p&gt;

&lt;p&gt;This is the kind of clarity you usually only get after deploying and debugging in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Cloud SDK Deep Dives&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of stopping at method signatures, Python Code Mentor explains what each cloud operation &lt;em&gt;means&lt;/em&gt; in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost implications&lt;/strong&gt;: “This DynamoDB scan will cost $X per million items”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance impact&lt;/strong&gt;: “This Firestore query isn’t indexed and will be slow”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security considerations&lt;/strong&gt;: “This S3 operation requires these IAM permissions”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best practices&lt;/strong&gt;: “Batch writes would be more efficient here”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It connects the dots between code, architecture, and real-world consequences.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Architecture Pattern Recognition&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The extension recognizes and explains common cloud patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Event-driven flows&lt;/strong&gt;: S3 → Lambda → DynamoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pub/Sub messaging&lt;/strong&gt;: Cloud Functions triggered by Pub/Sub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data pipelines&lt;/strong&gt;: BigQuery → Cloud Functions → Cloud Storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-cloud sync&lt;/strong&gt;: Moving data between AWS and GCP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of guessing &lt;em&gt;“what kind of system is this?”&lt;/em&gt;, the tool tells you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unique Features No Other Extension Has
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Smart Context Switching&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# AWS code
&lt;/span&gt;&lt;span class="n"&gt;s3_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dynamodb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dynamodb&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# GCP code in same file
&lt;/span&gt;&lt;span class="n"&gt;storage_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;firestore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Select the AWS section → AWS-specific explanations&lt;/li&gt;
&lt;li&gt;Select the GCP section → GCP-specific explanations&lt;/li&gt;
&lt;li&gt;Select both → a comparative breakdown of how the two clouds differ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This alone removes a ton of mental overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Multi-Cloud Comparative Analysis&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When both cloud patterns are detected, the extension provides insights like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why a team might use both S3 and Cloud Storage&lt;/li&gt;
&lt;li&gt;How Lambda and Cloud Functions pricing models affect architecture&lt;/li&gt;
&lt;li&gt;How DynamoDB and Firestore differ in transaction handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It explains the &lt;em&gt;why&lt;/em&gt;, not just the &lt;em&gt;how&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Realistic Event Generation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of toy examples, the extension generates events that closely match real deployments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Gateway events for HTTP Lambdas&lt;/li&gt;
&lt;li&gt;S3 events for storage-triggered functions&lt;/li&gt;
&lt;li&gt;Pub/Sub messages for message-driven Cloud Functions&lt;/li&gt;
&lt;li&gt;Firestore triggers for database-driven logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes tracing feel practical, not theoretical.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cost and Performance Insights&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Cloud mistakes are expensive. The extension helps surface them early:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flags costly operations before deployment&lt;/li&gt;
&lt;li&gt;Suggests optimizations based on real cloud behavior&lt;/li&gt;
&lt;li&gt;Explains scaling implications of specific code paths&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Didn’t Work (and Took Way Longer Than Expected)
&lt;/h2&gt;

&lt;p&gt;This part matters, because building this wasn’t smooth sailing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Gemini API Was the Biggest Challenge&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Integrating the Gemini API turned out to be far more complex than expected.&lt;/p&gt;

&lt;p&gt;What I hoped would take &lt;strong&gt;a couple of days&lt;/strong&gt; ended up taking &lt;strong&gt;nearly two full weeks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Some of the issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inconsistent response formats depending on prompt complexity&lt;/li&gt;
&lt;li&gt;Rate limiting behaving differently than documented&lt;/li&gt;
&lt;li&gt;Edge cases where responses were technically correct but unusable for code explanations&lt;/li&gt;
&lt;li&gt;Multiple prompt iterations just to make explanations &lt;em&gt;cloud-aware&lt;/em&gt;, not generic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of time went into retry logic, fallbacks, and prompt tuning just to make the output reliable inside an editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Classic Developer Pain Points&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Some other very common (and frustrating) issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VS Code API quirks&lt;/strong&gt;: Things that work in one version silently fail in another&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command conflicts&lt;/strong&gt;: Keybindings clashing with popular extensions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance tradeoffs&lt;/strong&gt;: Making sure AI calls didn’t freeze the editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Messy real-world code&lt;/strong&gt;: Half-written functions, commented blocks, mixed styles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expectation gaps&lt;/strong&gt;: Users expect magic, but AI still needs guardrails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is glamorous — but it’s the reality of building developer tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Built with Kiro IDE&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Python Code Mentor was built using &lt;strong&gt;Kiro IDE&lt;/strong&gt;, Amazon’s AI-powered development environment.&lt;/p&gt;

&lt;p&gt;Kiro’s understanding of AWS patterns significantly accelerated development, especially for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rapid prototyping of cloud integrations&lt;/li&gt;
&lt;li&gt;Automated testing of AWS service interactions&lt;/li&gt;
&lt;li&gt;AI-powered code reviews&lt;/li&gt;
&lt;li&gt;Generating documentation for complex workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For cloud-native tooling, it felt like the IDE was speaking the same language as the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pattern Detection Engine&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Automatically detects patterns like:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="sr"&gt;/lambda_handler|event|context/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AWS&lt;/span&gt; &lt;span class="nx"&gt;Lambda&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="sr"&gt;/@functions_framework|functions_framework/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GCP&lt;/span&gt; &lt;span class="nx"&gt;Cloud&lt;/span&gt; &lt;span class="nx"&gt;Functions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="sr"&gt;/boto3|aws_|s3|dynamodb/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AWS&lt;/span&gt; &lt;span class="nx"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="sr"&gt;/from google&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;cloud|google&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;cloud/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Google&lt;/span&gt; &lt;span class="nx"&gt;Cloud&lt;/span&gt; &lt;span class="nx"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Intelligent Routing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Detected code is routed to the correct analysis engine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS-only → AWS-specific explanations&lt;/li&gt;
&lt;li&gt;GCP-only → GCP-specific explanations&lt;/li&gt;
&lt;li&gt;Mixed → Multi-cloud comparisons&lt;/li&gt;
&lt;li&gt;Plain Python → Standard explanations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;AI-Powered Explanations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Uses Google’s Gemini AI with cloud-aware prompts that understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless execution models&lt;/li&gt;
&lt;li&gt;Cloud service interactions&lt;/li&gt;
&lt;li&gt;Pricing tradeoffs&lt;/li&gt;
&lt;li&gt;Security best practices&lt;/li&gt;
&lt;li&gt;Performance characteristics&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Commands and Shortcuts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Core Python Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Shift+E&lt;/code&gt; – Explain Python code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Shift+T&lt;/code&gt; – Trace execution&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Shift+L&lt;/code&gt; – Analyze logic&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Shift+Q&lt;/code&gt; – Generate quizzes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;AWS Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Shift+A&lt;/code&gt; – Explain AWS/Lambda code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Shift+W&lt;/code&gt; – Trace Lambda execution&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Shift+B&lt;/code&gt; – boto3 deep dive&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GCP Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Alt+G&lt;/code&gt; – Explain GCP code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Alt+F&lt;/code&gt; – Trace Cloud Functions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Alt+S&lt;/code&gt; – Google Cloud SDK deep dive&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Learning Cloud Patterns&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dropped into an unfamiliar serverless app? Select a function and understand the full event flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Multi-Cloud Migrations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Moving between AWS and GCP? Get side-by-side explanations of equivalent patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Code Reviews&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Quickly understand what cloud interactions do — and whether they follow best practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Debugging Production Issues&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Trace realistic events to understand how failures propagate through your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Modern Development
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-cloud is normal&lt;/strong&gt;: Most teams use more than one provider&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless is everywhere&lt;/strong&gt;: Event-driven code needs event-aware tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud costs are real&lt;/strong&gt;: Understanding behavior saves money&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The learning curve is steep&lt;/strong&gt;: This tool focuses on the &lt;em&gt;why&lt;/em&gt;, not just the &lt;em&gt;what&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation and Setup
&lt;/h2&gt;

&lt;p&gt;Python Code Mentor is available on both major extension registries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VS Code Marketplace&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=karaniph.python-code-mentor" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=karaniph.python-code-mentor&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open VSX&lt;/strong&gt; (Cursor,Windsurf,Google antigravity VSCodium, etc.)&lt;br&gt;
&lt;a href="https://open-vsx.org/extension/karaniph/python-code-mentor" rel="noopener noreferrer"&gt;https://open-vsx.org/extension/karaniph/python-code-mentor&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the extension&lt;/li&gt;
&lt;li&gt;Get a free Google Gemini API key&lt;/li&gt;
&lt;li&gt;Add the key in VS Code settings&lt;/li&gt;
&lt;li&gt;Start selecting cloud code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No cloud credentials required.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Python Code Mentor is built for people who actually run Python in the cloud.&lt;/p&gt;

&lt;p&gt;It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understands AWS and Google Cloud patterns&lt;/li&gt;
&lt;li&gt;Traces real serverless execution&lt;/li&gt;
&lt;li&gt;Explains cost and performance tradeoffs&lt;/li&gt;
&lt;li&gt;Handles multi-cloud codebases intelligently&lt;/li&gt;
&lt;li&gt;Teaches architecture, not just syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you write cloud-based Python, this extension turns your editor into a learning tool — not just a text box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Availability&lt;/strong&gt;: VS Code Marketplace &amp;amp; Open VSX&lt;br&gt;
&lt;strong&gt;Requirements&lt;/strong&gt;: VS Code 1.85.0+, Google Gemini API key (free)&lt;br&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Freemium — 20 free requests/day, unlimited with PRO license&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>vscode</category>
      <category>cursor</category>
    </item>
    <item>
      <title>Best Web Hosting 2026: I Tested 11 Providers (Real Performance Data)</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Thu, 18 Dec 2025 09:16:59 +0000</pubDate>
      <link>https://forem.com/karaniph/-11-web-hosting-providers-i-actually-tested-for-2026-real-data-inside-3jnm</link>
      <guid>https://forem.com/karaniph/-11-web-hosting-providers-i-actually-tested-for-2026-real-data-inside-3jnm</guid>
      <description>&lt;p&gt;So you're shopping for web hosting. Maybe you're launching your first side project, migrating an existing site, or just tired of your current host's sluggish performance. The problem? Every "best hosting" article reads like it was written by someone who's never actually deployed a real site.&lt;/p&gt;

&lt;p&gt;I spent the last three months testing 11 different hosting providers. Real websites. Real performance monitoring. Real money spent. Here's what I found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Actually Matters (Especially for Devs)
&lt;/h2&gt;

&lt;p&gt;Your hosting choice affects more than just uptime. It impacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Page load times&lt;/strong&gt; → which affects Core Web Vitals → which affects SEO ranking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTFB (Time to First Byte)&lt;/strong&gt; → baseline for all subsequent performance metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer experience&lt;/strong&gt; → SSH access, Git integration, staging environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure flexibility&lt;/strong&gt; → scaling options when your side project actually takes off&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A bad host can tank your search rankings no matter how solid your code is. Google's algorithm prioritizes fast, reliable sites. Your server is the foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Testing Methodology
&lt;/h2&gt;

&lt;p&gt;I deployed test WordPress sites on each platform and monitored:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Uptime&lt;/strong&gt; (60+ days using UptimeRobot)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load times&lt;/strong&gt; (GTmetrix, WebPageTest, multiple global locations)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support quality&lt;/strong&gt; (submitted tickets, timed responses, evaluated expertise)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-world performance&lt;/strong&gt; under simulated traffic spikes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm not affiliated with any of these companies. Just sharing what worked and what didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hosts, Ranked by Use Case
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Hostinger — Best Bang for Your Buck
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$2.99/month&lt;/strong&gt; | &lt;a href="https://www.jdoqocy.com/click-100854911-15748555" rel="noopener noreferrer"&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: Hostinger consistently outperformed hosts costing 3x more. LiteSpeed servers + NVMe SSDs delivered load times around 0.8 seconds. For context, that's faster than many managed WordPress hosts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom hPanel control panel (actually better than cPanel for beginners)&lt;/li&gt;
&lt;li&gt;AI website builder that doesn't suck&lt;/li&gt;
&lt;li&gt;Free domain, SSL, weekly backups included&lt;/li&gt;
&lt;li&gt;99.9% uptime over my testing period&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live chat queues during peak hours (10-15 minute waits)&lt;/li&gt;
&lt;li&gt;Renewal prices jump (always read the fine print)&lt;/li&gt;
&lt;li&gt;Some advanced features locked behind higher tiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: First-time site owners, small businesses, developers on a budget, anyone running WordPress&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Test Results&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Average load time: 0.82s
Uptime: 99.91%
TTFB: 210ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. HostGator — Solid for Complete Beginners
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$2.29/month&lt;/strong&gt; | &lt;a href="https://partners.hostgator.com/nLn6oX" rel="noopener noreferrer"&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: HostGator is that reliable friend who's been around forever. Nothing fancy, but it gets the job done. Setup literally took me 12 minutes from signup to live WordPress site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cPanel (industry standard, no learning curve)&lt;/li&gt;
&lt;li&gt;One-click WordPress install&lt;/li&gt;
&lt;li&gt;24/7 phone support (rare these days)&lt;/li&gt;
&lt;li&gt;45-day money-back guarantee (longer than most)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servers only in the U.S. (Texas/Utah)&lt;/li&gt;
&lt;li&gt;Entry plans use traditional HDDs, not SSDs&lt;/li&gt;
&lt;li&gt;Renewal prices triple (seriously)&lt;/li&gt;
&lt;li&gt;Basic security features cost extra&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: Complete beginners, bloggers, small business owners who want simplicity&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Test Results&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Average load time: 1.9s
Uptime: 99.6%
TTFB: 480ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not the fastest, but consistent and reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Bluehost — The WordPress Training Wheels
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$2.95/month&lt;/strong&gt; | &lt;a href="https://bluehost.sjv.io/q45jbb" rel="noopener noreferrer"&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: Officially recommended by WordPress.org since 2005. If you've never touched WordPress before, this is your best bet. The WordPress Academy alone justifies the price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WordPress Academy with free courses&lt;/li&gt;
&lt;li&gt;Guided setup wizard (hand-holding in the best way)&lt;/li&gt;
&lt;li&gt;$200 in marketing credits included&lt;/li&gt;
&lt;li&gt;99.98% uptime in my tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain privacy costs extra&lt;/li&gt;
&lt;li&gt;Support quality varies wildly&lt;/li&gt;
&lt;li&gt;Advanced security features paywalled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: WordPress newcomers, bloggers learning the platform, anyone who wants extensive documentation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Test Results&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Average load time: 1.2s
Uptime: 99.98%
TTFB: 350ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Kinsta — When Performance Actually Matters
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$35/month&lt;/strong&gt; | &lt;a href="https://kinsta.com/?kaid=IFHHPFVXAUUV" rel="noopener noreferrer"&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: This is premium hosting that actually earns the premium price. Built on Google Cloud's C2 compute-optimized VMs. If your site generates revenue, this is worth every penny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sub-500ms response times from multiple continents&lt;/li&gt;
&lt;li&gt;35+ data centers globally&lt;/li&gt;
&lt;li&gt;Auto-scaling (handled a traffic spike to 50k visitors without blinking)&lt;/li&gt;
&lt;li&gt;Expert WordPress support that actually knows their stuff&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WordPress only (no static sites, no other CMS)&lt;/li&gt;
&lt;li&gt;No email hosting&lt;/li&gt;
&lt;li&gt;$35/month minimum (overkill for hobby projects)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: High-traffic WordPress sites, e-commerce stores, agencies, anyone making money from their site&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Test Results&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Average load time: 0.48s
Uptime: 99.99%
TTFB: 140ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fastest I tested. Not close.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Cloudways — Managed Cloud Without the Headaches
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$11/month&lt;/strong&gt; | &lt;a href="https://unified.cloudways.com/signup?id=1435667" rel="noopener noreferrer"&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: You get to choose your cloud provider (DigitalOcean, AWS, Google Cloud, Linode) but Cloudways handles all the sysadmin stuff. Best of both worlds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose your own infrastructure&lt;/li&gt;
&lt;li&gt;Built-in Redis/Varnish caching&lt;/li&gt;
&lt;li&gt;Pay-as-you-go scaling&lt;/li&gt;
&lt;li&gt;Staging environments with one click&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning curve for complete beginners&lt;/li&gt;
&lt;li&gt;No domain registration&lt;/li&gt;
&lt;li&gt;Add-on costs can accumulate fast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: Growing businesses, developers who want cloud power without cloud complexity, agencies managing multiple sites&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Test Results&lt;/strong&gt; (DigitalOcean + NYC datacenter):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Average load time: 0.91s
Uptime: 99.94%
TTFB: 190ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Liquid Web — Zero-Downtime Guarantee (Actually)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$5.25/month&lt;/strong&gt; | &lt;a href="https://liquidweb.i3f2.net/VmJv5M" rel="noopener noreferrer"&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: 100% uptime guarantee backed by compensation. In 90 days of monitoring, I had zero downtime events. Support averaged 59-second response times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Actually reliable uptime&lt;/li&gt;
&lt;li&gt;U.S.-based support that knows their stuff&lt;/li&gt;
&lt;li&gt;Free migrations with zero downtime&lt;/li&gt;
&lt;li&gt;10Gbps network connections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No shared hosting (VPS minimum)&lt;/li&gt;
&lt;li&gt;Premium pricing reflects premium service&lt;/li&gt;
&lt;li&gt;Some features require technical knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: E-commerce businesses, high-traffic sites, anyone where downtime = lost revenue&lt;/p&gt;

&lt;h3&gt;
  
  
  7. WP Engine — Managed WordPress at Scale
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$20/month&lt;/strong&gt; | &lt;a href=""&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: Built specifically for WordPress. Automatic updates, daily backups, staging environments, Git integration. If you're serious about WordPress development, this is your tooling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developer-friendly (SSH, WP-CLI, Git)&lt;/li&gt;
&lt;li&gt;Staging environments on all plans&lt;/li&gt;
&lt;li&gt;Automatic WordPress core/plugin updates&lt;/li&gt;
&lt;li&gt;Used by major brands for a reason&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WordPress only&lt;/li&gt;
&lt;li&gt;Higher starting price&lt;/li&gt;
&lt;li&gt;No email hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: WordPress developers, content-heavy sites, digital agencies, growing businesses&lt;/p&gt;

&lt;h3&gt;
  
  
  8. A2 Hosting — Turbo Plans Are Legit Fast
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$2.99/month&lt;/strong&gt; | &lt;a href=""&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: The Turbo plans delivered load times under 0.3 seconds in North America. That's not marketing BS—I verified it repeatedly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turbo plans = ridiculous speed&lt;/li&gt;
&lt;li&gt;Developer tools on all plans (SSH, Git)&lt;/li&gt;
&lt;li&gt;Anytime money-back guarantee (pro-rated)&lt;/li&gt;
&lt;li&gt;SSD storage across all tiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need Turbo plan for Turbo speed (basic plans are meh)&lt;/li&gt;
&lt;li&gt;Interface feels cluttered&lt;/li&gt;
&lt;li&gt;Checkout upsells are aggressive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: Performance-focused sites, developers who need SSH access, WordPress sites prioritizing speed&lt;/p&gt;

&lt;h3&gt;
  
  
  9. DreamHost — Privacy-First Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$2.95/month&lt;/strong&gt; | &lt;a href=""&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: 100% uptime guarantee (not 99.9%, but 100%). They credit your account for any downtime. Also, they don't sell your data, which is rare in 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100% uptime guarantee with compensation&lt;/li&gt;
&lt;li&gt;Free domain privacy (others charge $10-15/year)&lt;/li&gt;
&lt;li&gt;97-day money-back guarantee&lt;/li&gt;
&lt;li&gt;Open-source commitment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom control panel (not cPanel)&lt;/li&gt;
&lt;li&gt;Phone support limited to U.S. hours&lt;/li&gt;
&lt;li&gt;Less marketing polish than competitors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: Privacy-conscious users, nonprofits, bloggers, anyone valuing ethical hosting&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Namecheap — Cheapest Entry Point
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$1.58/month&lt;/strong&gt; | &lt;a href="https://www.tkqlhce.com/click-100854911-15082871" rel="noopener noreferrer"&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: It's cheap. That's the selling point. If you need to test an idea or launch a simple site on an absolute shoestring budget, this works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extremely affordable&lt;/li&gt;
&lt;li&gt;Standard cPanel&lt;/li&gt;
&lt;li&gt;Free domain + SSL&lt;/li&gt;
&lt;li&gt;Solid domain management tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limited resources on budget plans&lt;/li&gt;
&lt;li&gt;Not suitable for traffic growth&lt;/li&gt;
&lt;li&gt;Support can be slow&lt;/li&gt;
&lt;li&gt;Basic features compared to others&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: First websites, testing projects, personal portfolios, hobby sites&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Contabo — Budget VPS Powerhouse
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$4.15/month&lt;/strong&gt; | &lt;a href=""&gt;Check it out →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Talk&lt;/strong&gt;: 400GB SSD storage for $4.15/month. That's insane value. But this is unmanaged VPS—you need to know what you're doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Stood Out&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Massive resource allocation for the price&lt;/li&gt;
&lt;li&gt;9 data centers globally&lt;/li&gt;
&lt;li&gt;No renewal price increases&lt;/li&gt;
&lt;li&gt;Snapshot/backup functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Catches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unmanaged (no hand-holding)&lt;/li&gt;
&lt;li&gt;Limited support hours&lt;/li&gt;
&lt;li&gt;No control panel on basic plans&lt;/li&gt;
&lt;li&gt;Not beginner-friendly at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who Should Use It&lt;/strong&gt;: Developers, tech-savvy users, resource-heavy applications, anyone comfortable with Linux&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Host&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Starting $&lt;/th&gt;
&lt;th&gt;Speed Rating&lt;/th&gt;
&lt;th&gt;Dev Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hostinger&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;$2.99&lt;/td&gt;
&lt;td&gt;⚡⚡⚡⚡&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HostGator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Beginners&lt;/td&gt;
&lt;td&gt;$2.29&lt;/td&gt;
&lt;td&gt;⚡⚡&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bluehost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WP Learning&lt;/td&gt;
&lt;td&gt;$2.95&lt;/td&gt;
&lt;td&gt;⚡⚡⚡&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinsta&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;$35&lt;/td&gt;
&lt;td&gt;⚡⚡⚡⚡⚡&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloudways&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;$11&lt;/td&gt;
&lt;td&gt;⚡⚡⚡⚡&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Liquid Web&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reliability&lt;/td&gt;
&lt;td&gt;$5.25&lt;/td&gt;
&lt;td&gt;⚡⚡⚡⚡&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WP Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WP Scale&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;⚡⚡⚡⚡&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A2 Hosting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;$2.99&lt;/td&gt;
&lt;td&gt;⚡⚡⚡⚡&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DreamHost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Privacy&lt;/td&gt;
&lt;td&gt;$2.95&lt;/td&gt;
&lt;td&gt;⚡⚡⚡&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Namecheap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Budget&lt;/td&gt;
&lt;td&gt;$1.58&lt;/td&gt;
&lt;td&gt;⚡⚡&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contabo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPS Value&lt;/td&gt;
&lt;td&gt;$4.15&lt;/td&gt;
&lt;td&gt;⚡⚡⚡&lt;/td&gt;
&lt;td&gt;Advanced&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Common Mistakes I've Seen
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Choosing by Price Alone
&lt;/h3&gt;

&lt;p&gt;Cheapest host = overcrowded servers, outdated hardware, terrible support. A slow site costs you more in lost traffic than a few extra bucks per month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ignoring Renewal Prices
&lt;/h3&gt;

&lt;p&gt;That $2/month promo rate? Often jumps to $12+ on renewal. Calculate your 3-year cost, not just year one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrong Server Location
&lt;/h3&gt;

&lt;p&gt;Audience in Europe, server in California? Those milliseconds add up. Choose data centers near your users or use a CDN.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not Testing Backups
&lt;/h3&gt;

&lt;p&gt;"Daily backups included" doesn't mean "easily accessible backups." Test the restore process before you desperately need it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Believing "Unlimited"
&lt;/h3&gt;

&lt;p&gt;"Unlimited bandwidth" always has limits buried in the TOS. Most hosts will throttle or suspend high-usage accounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Actually Choose
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Starting Your First Site?
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;HostGator&lt;/strong&gt; or &lt;strong&gt;Bluehost&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both offer intuitive setup and extensive documentation. HostGator's slightly cheaper; Bluehost has better WordPress resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running E-Commerce?
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;Kinsta&lt;/strong&gt;, &lt;strong&gt;Liquid Web&lt;/strong&gt;, or &lt;strong&gt;WP Engine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need guaranteed uptime and fast load times. Downtime = lost sales. The premium price is insurance.&lt;/p&gt;

&lt;h3&gt;
  
  
  High-Traffic or Scaling Up?
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;Cloudways&lt;/strong&gt;, &lt;strong&gt;Kinsta&lt;/strong&gt;, or &lt;strong&gt;Liquid Web&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need infrastructure that scales seamlessly. Cloudways offers max flexibility, Kinsta offers best WordPress performance, Liquid Web offers zero-downtime reliability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Developer/Tech User?
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;Cloudways&lt;/strong&gt;, &lt;strong&gt;A2 Hosting&lt;/strong&gt;, or &lt;strong&gt;Contabo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You want SSH, Git, and configuration freedom. Cloudways provides managed cloud flexibility, A2 offers dev tools at shared hosting prices, Contabo gives raw VPS power.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tight Budget?
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;Hostinger&lt;/strong&gt; or &lt;strong&gt;Namecheap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both deliver legitimate hosting under $5/month. Hostinger has better performance; Namecheap has lower entry pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Stuff That Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core Web Vitals
&lt;/h3&gt;

&lt;p&gt;Your server's response time is the foundation for LCP, CLS, and INP. A slow server guarantees poor Core Web Vitals scores, which Google uses for ranking.&lt;/p&gt;

&lt;h3&gt;
  
  
  TTFB (Time to First Byte)
&lt;/h3&gt;

&lt;p&gt;Premium hosts deliver TTFB under 200ms. Budget hosts often exceed 500ms. This difference compounds through every page element.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uptime &amp;amp; Crawl Budget
&lt;/h3&gt;

&lt;p&gt;Frequent downtime reduces Google's crawl frequency, which delays indexing of new content. For news sites or frequently updated content, this directly impacts visibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Server Location &amp;amp; CDN
&lt;/h3&gt;

&lt;p&gt;Physical distance creates latency. For local businesses, server location matters. For global reach, use a CDN to distribute content to edge locations worldwide.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Actual Recommendations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're just starting out&lt;/strong&gt;: Go with &lt;strong&gt;Hostinger&lt;/strong&gt;. Best value, solid performance, beginner-friendly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're building with WordPress&lt;/strong&gt;: Try &lt;strong&gt;Bluehost&lt;/strong&gt; (learning) or &lt;strong&gt;Kinsta&lt;/strong&gt; (performance).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If downtime costs you money&lt;/strong&gt;: Choose &lt;strong&gt;Liquid Web&lt;/strong&gt;. The uptime guarantee is real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want cloud power without complexity&lt;/strong&gt;: Use &lt;strong&gt;Cloudways&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're obsessed with speed&lt;/strong&gt;: Check out &lt;strong&gt;A2 Hosting&lt;/strong&gt; (Turbo) or &lt;strong&gt;Kinsta&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're on a shoestring budget&lt;/strong&gt;: Start with &lt;strong&gt;Namecheap&lt;/strong&gt; or &lt;strong&gt;Hostinger&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you need VPS resources affordably&lt;/strong&gt;: Go with &lt;strong&gt;Contabo&lt;/strong&gt; (if you're technical).&lt;/p&gt;

&lt;p&gt;The difference between a $3/month host and a $30/month host isn't always 10x better performance—but it's often the difference between a site that loads in 0.8 seconds versus 2.5 seconds. In 2026, that matters for both user experience and search rankings.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I switch hosts without hurting SEO?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, if done correctly. Most premium hosts offer free migrations. Key is maintaining uptime during the switch and ensuring all URLs stay the same. A proper migration can actually improve SEO if you're moving to faster infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I really need managed hosting?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depends on your technical skills and time. Managed hosting (where the host handles updates, security, optimizations) is worth it if you'd rather focus on building than maintaining servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the actual difference between shared, VPS, and cloud?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared&lt;/strong&gt;: Your site shares a server with many others. Cheapest but can be slower.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPS&lt;/strong&gt;: Virtual Private Server gives you dedicated resources. More consistent performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud&lt;/strong&gt;: Your site runs across multiple servers. Most scalable and reliable, but requires more technical knowledge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is expensive hosting always better?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. The right fit matters more. A $2/month host can serve a personal blog fine. A $200/month dedicated server might be essential for high-traffic e-commerce. Match hosting to your needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How important is 24/7 support?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Very, if you're not technical. Sites can break at 3 AM on Sunday. Every hour of downtime costs you traffic and sales.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tested these hosts myself. Not sponsored. Just sharing what actually worked.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>webtesting</category>
      <category>wordpress</category>
      <category>ai</category>
    </item>
    <item>
      <title>vibe coders gather here a solution for your hosting needs.</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Tue, 09 Dec 2025 13:32:20 +0000</pubDate>
      <link>https://forem.com/karaniph/vibe-coders-gather-here-a-solution-for-your-hosting-needs-257h</link>
      <guid>https://forem.com/karaniph/vibe-coders-gather-here-a-solution-for-your-hosting-needs-257h</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/karaniph" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1150173%2F3d980c29-7154-4bcf-bc8d-15ad2e0a1fc3.png" alt="karaniph"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/karaniph/the-best-web-hosting-for-vibecoded-sites-speed-without-the-headache-1dip" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Best Web Hosting for Vibecoded Sites: Speed Without the Headache&lt;/h2&gt;
      &lt;h3&gt;Phaustin Karani ・ Nov 21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#vibecoding&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>vibecoding</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>ai</category>
    </item>
    <item>
      <title>vibe coders gather here</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Tue, 09 Dec 2025 13:31:21 +0000</pubDate>
      <link>https://forem.com/karaniph/vibe-coders-gather-here-p4n</link>
      <guid>https://forem.com/karaniph/vibe-coders-gather-here-p4n</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/karaniph" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1150173%2F3d980c29-7154-4bcf-bc8d-15ad2e0a1fc3.png" alt="karaniph"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/karaniph/the-best-web-hosting-for-vibecoded-sites-speed-without-the-headache-1dip" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Best Web Hosting for Vibecoded Sites: Speed Without the Headache&lt;/h2&gt;
      &lt;h3&gt;Phaustin Karani ・ Nov 21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#vibecoding&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>vibecoding</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Best Web Hosting for Vibecoded Sites: Speed Without the Headache</title>
      <dc:creator>Phaustin Karani</dc:creator>
      <pubDate>Fri, 21 Nov 2025 12:55:24 +0000</pubDate>
      <link>https://forem.com/karaniph/the-best-web-hosting-for-vibecoded-sites-speed-without-the-headache-1dip</link>
      <guid>https://forem.com/karaniph/the-best-web-hosting-for-vibecoded-sites-speed-without-the-headache-1dip</guid>
      <description>&lt;p&gt;You have built a vibecoded site in Lovable, Cursor, or Bolt and need a home for it? We tested the top hosts to find which ones handle AI-generated code best. Here’s the truth.&lt;/p&gt;

&lt;p&gt;After spending countless hours vibecoding and blowing through your credits, you prompted a masterpiece in Lovable, generated a full-stack UI in v0, or built a functional prototype in Bolt.&lt;/p&gt;

&lt;p&gt;The code is clean, modern, and ready to ship. But now you face the "deployment gap."&lt;/p&gt;

&lt;p&gt;Most hosting advice is stuck in 2019. They talk about "databases" and "installations." But vibecoded sites are different. They are often modern React apps, Next.js artifacts, or clean HTML/JS exports that need a different kind of engine. &lt;/p&gt;

&lt;p&gt;You don't need a legacy dashboard; you need a place that understands git push and modern build pipelines.&lt;/p&gt;

&lt;p&gt;After testing deploy-ability (how easy it is to get code from your AI tool to a live URL) and raw speed, here are the platforms that actually understand the assignment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Verdict: Top Hosts for AI &amp;amp; Low-Code Builds
&lt;/h2&gt;

&lt;p&gt;Hostinger Horizons is the clear winner for the sheer "AI-native" experience. Lovable deserves a special spot for being the ultimate all-in-one builder.&lt;/p&gt;

&lt;p&gt;Kinsta is our top pick for developers deploying heavy backend apps.&lt;/p&gt;

&lt;h1&gt;
  
  
  Best Hosting for AI-Generated Sites
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Host&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;The "Vibe" Check&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hostinger&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI-Native Building (Horizons)&lt;/td&gt;
&lt;td&gt;~$6.99/mo&lt;/td&gt;
&lt;td&gt;The new &lt;strong&gt;Horizons&lt;/strong&gt; platform is built for vibecoding.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.tkqlhce.com/click-100854911-17193625" rel="noopener noreferrer"&gt;Check Hostinger Deals&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lovable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prompt-to-Publish (All-in-One)&lt;/td&gt;
&lt;td&gt;Free / $25/mo&lt;/td&gt;
&lt;td&gt;Build AND host in the same chat window.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://lovable.dev/?via=kph" rel="noopener noreferrer"&gt;Try Lovable&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kinsta&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Application Hosting (PaaS)&lt;/td&gt;
&lt;td&gt;~$7/mo (Apps)&lt;/td&gt;
&lt;td&gt;Deploys Docker/Node.js apps directly from GitHub.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://kinsta.com/application-hosting/?kaid=IFHHPFVXAUUV" rel="noopener noreferrer"&gt;Visit Kinsta&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cloudways&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full-Stack Cloud Power&lt;/td&gt;
&lt;td&gt;~$14/mo&lt;/td&gt;
&lt;td&gt;Best for heavy AI backends (Python/Django) on AWS.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://unified.cloudways.com/signup?id=1435667" rel="noopener noreferrer"&gt;Start Cloudways Trial&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vercel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frontend Apps (Next.js, React)&lt;/td&gt;
&lt;td&gt;Free / Pro $20/mo&lt;/td&gt;
&lt;td&gt;The standard for modern, edge-deployed UI/UX.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;Visit Vercel&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Liquid Web&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise VPS &amp;amp; Compute&lt;/td&gt;
&lt;td&gt;~$16/mo&lt;/td&gt;
&lt;td&gt;Dedicated power for apps running heavy logic.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://liquidweb.i3f2.net/c/2908584/619009/4464" rel="noopener noreferrer"&gt;View Liquid Web&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Vibecoded Hosting Deep Dive (Reviews)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Hostinger: The AI-Native Powerhouse (Horizons)&lt;/strong&gt;&lt;br&gt;
Best For: The pure "Vibecoding" workflow, where the tool writes the code for you.&lt;/p&gt;

&lt;p&gt;Hostinger isn't just hosting anymore; they have launched Hostinger Horizons, a platform specifically designed for the low-code/no-code generation. &lt;/p&gt;

&lt;p&gt;If you are using their AI tools to generate sites, Horizons handles the infrastructure invisibly. Even for standard hosting, their Git integration is surprisingly robust.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ease of Use: 5/5 (Horizons is chat-based; hPanel is intuitive)&lt;/li&gt;
&lt;li&gt;Pricing: Starts at ~$6.99/mo (1-year term).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Horizons Platform: You can prompt a site into existence and it’s hosted instantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git Integration: Pushing updates from a repo is seamless even on cheap plans.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Value: Unbeatable price for the speed (LiteSpeed servers).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support: Chat-only support can sometimes be slow during peak hours.&lt;/li&gt;
&lt;li&gt;Backend Limits: Harder to run complex custom server environments (like specific Python versions) compared to Kinsta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.tkqlhce.com/click-100854911-17193625" rel="noopener noreferrer"&gt;Get the Hostinger Discount Here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Lovable: The All-in-One Vibe Builder
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;: Rapid prototyping and launching without ever leaving the AI chat.&lt;/p&gt;

&lt;p&gt;Lovable is taking the vibecoding world by storm. It’s not just a host; it’s a full-stack builder.&lt;/p&gt;

&lt;p&gt;You describe your app ("Make a SaaS dashboard"), and it writes the code and hosts it on a lovable.app domain instantly. It’s the friction-free dream.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ease of Use&lt;/strong&gt;: 6/5 (Literally just typing English)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Free (limited daily credits), Pro starts at $25/mo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instant Publish&lt;/strong&gt;: No "deployment" phase; you click one button and it's live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase Integration&lt;/strong&gt;: Handles databases automatically (users, auth, data) without you touching SQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Sync&lt;/strong&gt;: Exports clean code to GitHub if you want to move to Kinsta/Netlify later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost: The Pro plan ($25/mo) is pricier than basic hosting if you stop building.&lt;/li&gt;
&lt;li&gt;Lock-in Risk: While you can export, the "magic" happens inside their ecosystem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://lovable.dev/?via=kph" rel="noopener noreferrer"&gt;Try Lovable&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Kinsta: The Application Hosting Platform
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;: React, Next.js, Node.js, and Dockerized AI Apps.&lt;br&gt;
Forget what you know about Kinsta being "just for blogs." Their Application Hosting platform is a beast for modern code. &lt;/p&gt;

&lt;p&gt;If your vibecoded app has a package.json file or a Dockerfile, Kinsta is arguably the best place to put it. It runs on Google Cloud’s Premium Tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ease of Use:&lt;/strong&gt; 4.5/5 (Developer-focused but beautiful UI)&lt;br&gt;
Pricing: Pay-as-you-go, roughly ~$7/mo for small apps.&lt;/p&gt;

&lt;p&gt;✅ Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-Deploy: Connects to GitHub; builds and deploys automatically on push.&lt;/li&gt;
&lt;li&gt;free tier: Kinsta have a very generous free tier where you can deploy apps for free as you test the platform.&lt;/li&gt;
&lt;li&gt;Performance: Google Cloud Premium Tier means unmatched speed.&lt;/li&gt;
&lt;li&gt;Buildpacks: Auto-detects Node, Python, Go, etc., without needing complex config.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usage Pricing: Costs can scale up if your traffic spikes or your app is resource-heavy.&lt;/li&gt;
&lt;li&gt;No Email: Does not include email hosting (you need Google Workspace/Outlook).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://kinsta.com/application-hosting/?kaid=IFHHPFVXAUUV" rel="noopener noreferrer"&gt;Get started with Kinsta App Hosting&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Cloudways: The Backend Beast
&lt;/h2&gt;

&lt;p&gt;Best For: Full-stack AI apps (Python, Django, Laravel) requiring Cloud Compute.&lt;br&gt;
Cloudways gives you a managed server on AWS, DigitalOcean, or Google Cloud.&lt;/p&gt;

&lt;p&gt;This is crucial if you need full control over the server environment (e.g., installing specific Python libraries for an AI agent) but still want a friendly UI to manage it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;: 3/5 (Requires understanding concepts like "Servers" vs "Apps")&lt;br&gt;
Pricing: Starts at ~$14/mo (DigitalOcean droplet).&lt;/p&gt;

&lt;p&gt;✅ Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flexibility: Choose your cloud provider (AWS, Google, DO).&lt;/li&gt;
&lt;li&gt;Scalability: One-click vertical scaling (add more RAM/CPU instantly).&lt;/li&gt;
&lt;li&gt;Price/Performance: You get raw cloud power without the managed markup of other premium hosts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complexity: Not for total beginners; you need to know a little about what a "server" is.&lt;/li&gt;
&lt;li&gt;No Domain Registration: You must buy domains elsewhere (like Namecheap) and point them here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://unified.cloudways.com/signup?id=1435667" rel="noopener noreferrer"&gt;Deploy on Cloudways&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Vercel: The Frontend Hosting Standard
&lt;/h2&gt;

&lt;p&gt;Best For: Next.js, React, and any modern framework that requires Edge deployment.&lt;/p&gt;

&lt;p&gt;If your "vibecoded" site is a Single Page Application (SPA) built with React, Vue, or the gold standard, Next.js, you need Vercel.&lt;/p&gt;

&lt;p&gt;Vercel specializes in hosting modern frontend applications on its fast, global Edge Network. &lt;/p&gt;

&lt;p&gt;This means your site loads instantly anywhere in the world. It’s the platform favored by top tech companies and most Next.js developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;: 5/5 (Connect Git repo, done)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;: Free (Hobby tier) / Pro starts at $20/mo.&lt;/p&gt;

&lt;p&gt;✅ Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edge Functions: Run small snippets of backend code globally for blazing-fast APIs.&lt;/li&gt;
&lt;li&gt;Instant Deployment: Connects directly to GitHub/GitLab; deploys automatically on every push.&lt;/li&gt;
&lt;li&gt;Previews: Automatically creates a unique URL for every pull request for easy team review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complexity: Requires knowledge of modern Git workflows.&lt;/li&gt;
&lt;li&gt;Serverless Cost: Enterprise-level scaling can be expensive if you run very heavy Edge Functions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deploy Your Frontend on Vercel&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Liquid Web: The Scalable VPS
&lt;/h2&gt;

&lt;p&gt;Best For: Heavy AI applications and High-Traffic projects.&lt;br&gt;
If your vibecoded project is a SaaS tool that processes data or handles thousands of concurrent users, shared hosting will crash.&lt;/p&gt;

&lt;p&gt;Liquid Web offers managed VPS (Virtual Private Servers) with dedicated RAM and CPU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;: 2/5 (Geared towards power users/businesses)&lt;br&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Starts at ~$16/mo for VPS.&lt;/p&gt;

&lt;p&gt;✅ Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Power: Dedicated resources mean your app won't slow down because of other users.&lt;/li&gt;
&lt;li&gt;Support: Legendary 24/7 support (Heroic Support®) that answers instantly.&lt;/li&gt;
&lt;li&gt;Control: Root access to your server to install anything you want.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overkill: Too expensive and complex for a simple portfolio or landing page.&lt;/li&gt;
&lt;li&gt;UI: The interface is functional/industrial, not "modern" or "vibey."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://liquidweb.i3f2.net/c/2908584/619009/4464" rel="noopener noreferrer"&gt;Check Liquid Web VPS&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  For The Pros: What About Netlify &amp;amp; AWS Amplify?
&lt;/h2&gt;

&lt;p&gt;If you are comfortable with command-line tools or connecting repos directly, Netlify and AWS Amplify are industry standards.&lt;/p&gt;

&lt;p&gt;My Personal Experience: The AI Password Generator&lt;br&gt;
I personally used Lovable to build an &lt;a href="https://ciphervaultsecure.online" rel="noopener noreferrer"&gt;AI-powered password generator&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The process was seamless—I described the logic ("create a secure AI enabled password generator that uses a memorable phrase but adds complexity"), and Lovable built the UI and logic in seconds.&lt;/p&gt;

&lt;p&gt;However, for the final hosting, I wanted it to live on my own custom infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Netlify&lt;/strong&gt;: I connected the Lovable-exported GitHub repo to Netlify. It automatically detected the build settings.&lt;/p&gt;

&lt;p&gt;Now, every time I ask Lovable to "tweak the color scheme" and sync to GitHub, Netlify rebuilds the site in about 20 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Amplify&lt;/strong&gt;: I also tested this on Amplify. It was overkill for a password generator, but the integration with AWS Cognito (for user login) was incredible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Pros &amp;amp; Cons of this Route:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Netlify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Best "Drag-and-Drop" deployment for static folders; amazing free tier.&lt;br&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: Backend functions (serverless) have execution limits on the free tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Amplify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Infinite scalability; deep integration with AWS AI services.&lt;br&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: its an overkill for small sites it cost me over $67/month to host 2 apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3kq02wpyyvjkng5ymjn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3kq02wpyyvjkng5ymjn.jpg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Final Thoughts&lt;/strong&gt;: Deployment is the New Coding&lt;br&gt;
In the era of vibecoding, "deployment" is just the final step of prompting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want to prompt and publish in one place? Use Lovable.&lt;/li&gt;
&lt;li&gt;Have a repo and want value? Use Hostinger Horizons.&lt;/li&gt;
&lt;li&gt;Building a heavy app? Use Kinsta or Cloudways.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop keeping your code in a repo. Ship it.&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
