The whole cloud, on your machine.

Local emulators for AWS, Google Cloud and Azure in one binary, on one port. Starts in about 25 ms, with nothing to sign up for.

InstallRead the docsMIT licensed · open source

One port. Every cloud.

One address for every SDK. AWS, Google Cloud, Azure and the console all answer on 7644.

localhost:7644
  • AWSS3 PutObject photos/cat.jpg200
  • Google CloudPub/Sub Publish topics/uploads200
  • AzureBlob Storage PutBlob media/cat.jpg200

Everything stays on localhost.

eval "$(pogi env)" points every SDK here. 7644 spells “pogi” on a phone keypad.

Ready before you blink.

Fast enough to start a fresh pogi for every test run.

Start-up time

about25 ms

Warm start, timed to ready.

Writes per second

about20,000

DynamoDB PutItem, 8 at a time.

Memory under load

about140 MB

About 64 MB at idle.

One call, start to finish

about0.1 ms

DynamoDB PutItem, one at a time.

*Apple M5, pogi v0.1.0 release build. How we measured →

Your tools already speak it.

Point them at pogi once. Your code stays the same.

  1. Your SDKs, on all three cloudsAWS, Google Cloud and Azure clients read the endpoints from your environment.
  2. Terraformpogi writes the provider block with every endpoint.
  3. AWS CDKBootstrap and deploy as usual, without a wrapper script.

181 services across AWS (131), Google Cloud (26) and Azure (24). See coverage

Moving from LocalStack? Point at port 7644, or keep 4566 with pogi start --port 4566. Read the migration guide

Terminal
$ eval "$(pogi env)"
$ python upload.py
$ pogi tf > pogi_override.tf
$ terraform apply
$ cdk bootstrap
$ cdk deploy
$

See what your code just did.

Every call, flow and connection, live in your browser at localhost:7644/_pogi/.

Every call, live

Every call your code makes, on every cloud, the moment it happens.

localhost:7644/_pogi/

Activity

Every call to every service, newest first.

TimeServiceOperationStatus
  • 14:26:21.311Cloud Storage objects.getobjects.get200
  • 14:26:21.301Blob Storage GetBlobGetBlob200
  • 14:26:21.288DynamoDB GetItemGetItem200
  • 14:26:21.272Pub/Sub PublishPublish200
  • 14:26:20.996Cloud Storage objects.getobjects.get200
  • 14:26:20.987Blob Storage GetBlobGetBlob200

Every flow, traced

Each upload is traced end to end, from S3 through Pub/Sub to Azure Blob Storage. One took 6 steps in 19 ms.

localhost:7644/_pogi/

Flows 1-6cf92f35-77b34da6a3ce929d0e0e4711

PutObject /photos/uploads/6cf92.jpg

2026-10-13 14:25:14 · 6 steps · 19 ms

  1. S3 PutObject0.1 ms
  2. SQS deliver → thumbnails0.0 ms
  3. Pub/Sub Publish0.1 ms
  4. Blob Storage PutBlob0.0 ms
  5. Event Grid deliver → events0.0 ms
  6. Pub/Sub deliver → thumbsno time captured

Times are per step. The 19 ms runs from the first call to the last step, including the wait between deliveries.

How it's wired

The map draws each cloud's resources and the messages moving between them.

localhost:7644/_pogi/
Map. On AWS, the S3 bucket photos sends a notification to the SQS queue thumbnails. On Google Cloud, the Pub/Sub topic uploads feeds thumbs through a subscription. On Azure, the storage resource pogistore feeds the storage resource events through a subscription.

Least privilege, written for you.

pogi records what your code calls, writes the smallest IAM (who may do what) policy that allows it, and attaches it. On AWS, Google Cloud and Azure.

Record

Run your code as a real IAM user. pogi records every action it calls and writes the matching policy.

localhost:7644/_pogi/

uploader · 5 calls recorded, one identity on each cloud

  • s3:PutObject photos/*would deny
  • sqs:SendMessage thumbnailswould deny
  • dynamodb:PutItem table/orderswould deny
  • pubsub.topics.publish topics/uploadswould deny
  • .../containers/blobs/write containers/mediawould deny

Strict mode blocks

Turn on strict mode (deny anything not allowed) and calls without a policy fail, with the same AccessDenied error AWS returns.

localhost:7644/_pogi/

StrictCalls without an allowing policy fail.

An error occurred (AccessDenied) when calling the PutObject operation: User: arn:aws:iam::000000000000:user/uploader is not authorized to perform: s3:PutObject on resource: arn:aws:s3:::photos/cat.jpg because no identity-based policy allows the s3:PutObject action

Attach

Review the policy pogi wrote, then attach it in one step.

localhost:7644/_pogi/
{
  "Version": "2012-10-17",
  "Statement": [
    { "Effect": "Allow", "Action": "dynamodb:PutItem",
      "Resource": "arn:aws:dynamodb:us-east-1:000000000000:table/orders" },
    { "Effect": "Allow", "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::photos/*" },
    { "Effect": "Allow", "Action": "sqs:SendMessage",
      "Resource": "arn:aws:sqs:us-east-1:000000000000:thumbnails" }
  ]
}

Attached to user/uploaderas the policy pogi-uploader

  • roles/pubsub.publisher on projects/pogi/topics/uploads
  • Role pogi-uploader · custom role, new. Assigned to uploader at .../containers/media

Calls pass

The same calls pass. Least privilege, without guessing.

5 of 5 callsallowed

The rest of your toolkit, built in.

$13.60

Estimated monthly cost

≈ $0.45 / day · on-demand · no free tier

  • AWS

    $1.73

  • Google Cloud

    $0.63

  • Azure

    $11.24

Know the bill before there is one.

A real-cloud cost estimate from your resources and traffic.

  • sqs · any operation100%+300 ms
  • dynamodb · Put*30%400 ProvisionedThroughputExceededException

Break things on purpose.

Throttle, slow down or take out a service to test your retries.

before-tests

Saved
9s ago
Size
50.9 MB

Snapshots for every test run.

Save every resource once, then restore it with one command before each run.

  • Your sign-in code is 482913sms10s ago
  • Your order o-1042 has shippedemail · ses10s ago

Every email and SMS, caught.

Messages your code sends land in a local inbox, never a real phone.

Up and running in seconds.

Nothing to sign up for. Pick your platform and paste.

  1. 1

    Install

    brew install nrndev/tap/pogi
  2. 2

    Start

    pogi startReady.
  3. 3

    Point your tools at it

    # In a second terminal.# sets the endpoint and test keyseval "$(pogi env)"aws s3 mb s3://my-bucketmake_bucket: my-bucket
  4. 4

    Open the console

Binaries for macOS, Linux and Windows are on the releases page. pogi also has a CLI, a terminal UI and an MCP server, so AI coding assistants can drive it; see the docs.

Your whole cloud, one command away.