← Back to blog

Published · Updated · By Elliot Jackson

How to choose the right local S3 tool for your development job

Compare LocalStack, MinIO, S3Mock, Moto, S3rver, and Objectively by the development job each one is best suited to handle.

“Local S3” sounds like a category. It covers several different jobs.

Depending on what you’re trying to do, it might mean a Python mock, an embedded fake server, a deployable object store, a full AWS emulator, or a small desktop app that lets you inspect requests and objects. Those tools can all accept something that looks like an S3 request. They don’t all give you the same confidence, workflow, or maintenance burden.

The useful question is what job you’re asking the tool to do.

This guide compares the common choices by scenario. Product features, plans, and licences change, so check the linked primary sources before deciding.

Start with the job

There are five useful categories:

  • A full AWS emulator is for a local version of several AWS services, often with infrastructure-as-code and CI workflows.
  • An S3-compatible object store is a server you deploy and operate as storage, locally or elsewhere.
  • A test double is a mock or fake designed to make automated tests quick and repeatable.
  • A native development endpoint is for a developer’s interactive loop: point an SDK at localhost, make requests, and inspect the resulting state.
  • A real AWS environment is the complement you still need when provider-specific behaviour, IAM, networking, quotas, or production scale matter.

Choosing the wrong category creates predictable pain. A full emulator is unnecessary infrastructure for a developer who needs one bucket and a visible request. A test double is the wrong shape when you want to browse fixture objects by hand. A local object store is not a substitute for testing an AWS-only feature. And a desktop endpoint generally isn’t a CI service.

Here’s the short version:

If your main job is…Start with…Why
Several AWS services, IaC, or pull-request integration testsLocalStackIt emulates AWS services in a local container and documents CI and IaC workflows.
A deployable S3-compatible storage server, accepting a legacy community optionCommunity MinIO (archived)Its repository is archived and the community edition is source-only; evaluate the current AIStor documentation separately.
Fast Python testsMotoIts S3 backend is designed for mocking AWS calls in Python tests.
JVM integration tests with TestcontainersS3MockIt documents a deliberately limited S3 subset and a Docker/Testcontainers path.
JavaScript tests that need an embedded fake server, accepting a legacy optionS3rver (archived)It can be started programmatically, but its repository is read-only; pin and test it rather than treating it as a default active choice.
One interactive S3 endpoint on a supported MacObjectivelyIt is a native Mac development app with an object browser and request feed.

Use the table as a starting point. The details below make the choice defensible.

Choose LocalStack when S3 is only one part of the system

LocalStack is the natural choice when the application under test touches more than S3. Its current overview describes a cloud service emulator that runs in one local container or a CI environment, with S3, Lambda, DynamoDB, SQS, and more than 80 supported services. The same page calls out local development, automated integration testing, and infrastructure-as-code validation as use cases.

That breadth matters when your test needs to exercise a workflow such as:

  1. A Lambda function receives an event.
  2. The function writes an object to S3.
  3. A queue receives a follow-up message.
  4. An application reads the result from another service.

You can assemble that locally with a tool built for a multi-service environment. You don’t need to pretend that a single-purpose S3 server is equivalent.

LocalStack is also the better fit when the local environment is part of your team’s automation. Its documentation has dedicated CI integration and IaC paths, including GitHub Actions and Terraform/CDK-oriented workflows.

Check the current access model before standardising on it. LocalStack’s auth-token documentation says that an auth token is mandatory to start the container and activate licensed features, with separate developer and CI token types. The services and capabilities available to your account depend on the current workspace licence.

The trade-off is scope. If you only need a local S3 endpoint while developing a Mac application, installing and configuring a broader emulator may add more moving parts than the S3 problem deserves. You’re comparing different jobs, not judging LocalStack’s quality.

For S3 specifically, LocalStack documents both path-style and virtual-hosted-style request handling. That can matter if your client or framework builds bucket-host URLs rather than putting the bucket in the path. Verify the exact behaviour your application needs against LocalStack’s current S3 documentation, rather than treating “S3 supported” as a blanket compatibility guarantee.

Consider Community MinIO only when you accept its legacy status

MinIO needs a qualification that older setup guides often omit. The Community MinIO repository is archived and read-only. Its README says that the community edition is distributed as source code only under AGPLv3, while the vendor’s current AIStor documentation describes a separate current offering. This section treats Community MinIO as a legacy/source-build option; it is not a generic recommendation for a maintained current product.

The Community MinIO quickstart still documents a standalone server started from source, with a storage path and an embedded Console object browser. That can be useful when your team has deliberately accepted the repository and licence position, but do not infer current support or pre-compiled binary availability from older MinIO guides.

That makes Community MinIO relevant only when the thing you’re evaluating is the object store itself and you accept the maintenance trade-off:

  • a service that other machines or containers connect to;
  • storage behaviour across a longer-lived environment;
  • deployment, administration, and operational integration;
  • an S3-compatible server that belongs in a larger infrastructure design.

It can still be a local-development option if your team already has a container runtime and is comfortable building and maintaining the source. Docker’s current Mac installation guide documents a Docker Desktop installation path, while Colima and OrbStack provide other Mac container-runtime options. If you need a maintained current offering, start with the AIStor documentation and verify its edition, access, and licence instead of assuming Community MinIO and AIStor are interchangeable.

There are two things to check before copying old MinIO advice into a new project.

First, the old standalone setup link is not a current Community MinIO distribution guide: it now routes to AIStor documentation. Don’t infer a supported macOS installation workflow from either a redirected page or an archived repository; verify the distribution route and platform for the exact offering you intend to use.

Second, MinIO’s current software licence is time-sensitive. The live page says that, unless an Enterprise Agreement is in force, the software is offered for one instance used for non-production, internal evaluation. That is a description of the current page, not legal advice, and it is not the same thing as the older assumptions many blog posts make about MinIO licensing.

Community MinIO is a legacy answer when you need a source-built server and have accepted its status and licence. AIStor is a separate evaluation; it is usually a different answer from “I want a small interactive S3 loop on my Mac.”

Choose a test double when the test runner is the product

If your local S3 service exists primarily to support automated tests, start with the test framework and language you already use.

Moto for Python tests

Moto’s S3 documentation covers mocking S3 calls in Python. Its server-mode documentation separately documents a standalone server for non-Python SDKs. That gives Python teams a direct path from a unit or integration test to mocked S3 behaviour without introducing a separate desktop workflow.

The important boundary is that Moto’s value is test integration. It gives your test suite a controlled backend; it isn’t trying to be a persistent object browser for a developer who is manually exploring application behaviour.

S3Mock for JVM and Testcontainers workflows

Adobe S3Mock describes itself as a lightweight server implementing a subset of Amazon S3 for local integration testing. Its README documents Docker and Testcontainers as the recommended path, and it calls out limitations such as path-style-only access and the absence of production security features.

That explicit scope is useful. If your test needs the operations S3Mock implements, a constrained fixture can be preferable to a large emulator. If it needs a missing operation, the limitation is visible before you build a test around it.

S3rver for embedded JavaScript tests (archived)

S3rver describes itself as a fake S3 server for sandboxing and testing. Its documentation includes a programmatic API, a configurable data directory, bucket setup, and an option to reset data when the server closes. The repository is archived and read-only, so treat S3rver as a legacy option to pin and test, not a default active recommendation. The README is equally clear that its goal is testing rather than duplicating all S3 behaviour or serving production.

That makes it a useful fit when a Node test can start and stop its own S3-shaped server. It’s less compelling if your primary need is a reusable endpoint you can inspect outside the test process.

Choose Objectively when the interactive Mac loop is the bottleneck

Disclosure: I’m building Objectively, so it’s my product. The comparison is intended to help you choose the right tool even when Objectively isn’t the right fit.

Objectively is the narrow option in this comparison: a native macOS app that runs a local S3-compatible development server. Its public product page is aimed at a Mac developer who wants a local endpoint without Docker or cloud setup, and it includes SDK configuration examples for several languages.

Choose it for the workflow around one S3 endpoint:

  • keep a local server available from a Mac menu bar app;
  • use separate environments for different local states;
  • browse buckets and objects rather than inspecting state only through a CLI;
  • see a request feed while diagnosing what the client actually sent.

Those are development-loop features. They’re useful when a client reports an unhelpful upload error, when an object appears under an unexpected key, or when you want to inspect the state produced by a real SDK call without first writing another diagnostic command.

Objectively focuses on interactive bucket-and-object development on macOS. Its compatibility boundary does not include every S3 feature, so compare the documented operations with what your application needs. If you require virtual-hosted addressing, bucket policies, lifecycle configuration, or another advanced S3 feature, verify support before adopting it.

Objectively is a GUI and menu-bar application intended for the Mac development loop. Use a headless test double, emulator, object store, or AWS environment for automated and production-shaped tests.

Don’t use one tool to answer every S3 question

The word “S3” covers more ground than bucket CRUD. AWS’s current overview distinguishes general-purpose, directory, table, and vector buckets. A local tool that handles the classic object API may still tell you nothing about directory-bucket authentication, S3 Tables, S3 Vectors, IAM policy evaluation, network conditions, or AWS-specific service limits.

That’s why a sensible development setup often has two layers:

  1. A fast local tool for the feedback loop you repeat all day.
  2. Tests against AWS for provider-specific behaviour and the risks a local subset cannot prove.

The local tool reduces friction. AWS tests still cover provider-specific behaviour and the risks a local subset cannot prove. Passing against LocalStack or another emulator does not establish Amazon S3 production behaviour, IAM, durability, networking, quotas, or billing.

Run a small proof-of-fit before committing

You don’t need a week-long evaluation. Take the two most plausible options and run the same five operations against each:

  1. Create a bucket.
  2. Upload an object with metadata.
  3. List and download it, including a byte range if your application uses ranges.
  4. Exercise your application’s addressing mode and signing configuration.
  5. Run one failure case that matters, such as a missing key or conditional request.

Add one operation that is easy to overlook in your own code: multipart upload, a presigned URL, a non-ASCII key, or a large-object path. The right test is the one that represents your application, not an arbitrary compatibility checklist.

Record the endpoint shape, required credentials, addressing mode, persistence behaviour, and whether you can see enough information to diagnose a failure. For a test double, record how it starts and stops inside the test runner. For an emulator, record the services and CI path you actually need. For an object store, record the deployment and licensing assumptions your team can accept.

A failed check answers the question before you commit to the tool.

The practical recommendation

Choose LocalStack when your local environment is a small AWS estate and its current token/licence model fits your team. Consider Community MinIO only when you have accepted its archived, source-only status and AGPLv3 obligations; evaluate AIStor separately when you need a current offering. Choose Moto or S3Mock when automated tests and language integration are the centre of the job, and consider S3rver only as a pinned legacy option because its repository is archived and read-only.

Choose Objectively when you’re a supported Mac developer who wants one visible, interactive S3 endpoint for the local development loop, and your application fits its documented compatibility boundary. Keep AWS in the test plan for behaviours no local subset can establish.

Pick the tool that makes your actual job smaller.

Try Objectively

If you need an interactive local S3 endpoint on a Mac, see Objectively and the current installation path. Check the supported macOS version and the compatibility details against your application before adopting it.