In-memory mock DynamoDB server for local integration testing.
# Docker
docker build -t mock-dynamodb .
docker run -p 8000:8000 mock-dynamodb
# Direct
dotnet run --project src/MockDynamoDB.Server
# Custom port
MOCK_DYNAMODB_PORT=4566 dotnet run --project src/MockDynamoDB.Server
Configure the AWS SDK to point at http://localhost:8000 with any credentials.
CreateTable, DeleteTable, DescribeTable, ListTables, PutItem, GetItem, DeleteItem, UpdateItem, Query, Scan, BatchGetItem, BatchWriteItem, TransactWriteItems, TransactGetItems
Local Secondary Indexes (LSI) and Global Secondary Indexes (GSI) are supported on Query.
| Feature |
Supported |
| CreateTable |
✅ |
| DeleteTable |
✅ |
| DescribeTable |
✅ |
| ListTables (with pagination) |
✅ |
| UpdateTable |
❌ |
| TagResource / UntagResource / ListTagsOfResource |
❌ |
| Feature |
Supported |
| PutItem |
✅ |
| GetItem |
✅ |
| DeleteItem |
✅ |
| UpdateItem (SET, REMOVE, ADD, DELETE) |
✅ |
| ConditionExpression on writes |
✅ |
| ReturnValues (ALL_OLD, ALL_NEW, UPDATED_OLD, UPDATED_NEW) |
✅ |
| ConsistentRead (accepted, no-op) |
✅ |
| TTL / item expiry |
❌ |
| Feature |
Supported |
| Query with KeyConditionExpression |
✅ |
| Query with FilterExpression |
✅ |
| Query ScanIndexForward (forward/reverse) |
✅ |
| Query with Limit and pagination |
✅ |
| Query with ProjectionExpression |
✅ |
| Query Select=COUNT |
✅ |
| Query ReturnConsumedCapacity |
✅ |
| Scan with FilterExpression |
✅ |
| Scan with Limit and pagination |
✅ |
| Scan with ProjectionExpression |
✅ |
| Parallel Scan (TotalSegments / Segment) |
✅ |
| Feature |
Supported |
| Local Secondary Indexes (LSI) |
✅ |
| Global Secondary Indexes (GSI) |
✅ |
| GSI hash-key-only (no range key) |
✅ |
| GSI / LSI Projection: ALL |
✅ |
| GSI / LSI Projection: KEYS_ONLY |
❌ |
| GSI / LSI Projection: INCLUDE |
❌ |
| Feature |
Supported |
ExpressionAttributeNames (#name) |
✅ |
ExpressionAttributeValues (:val) |
✅ |
Comparison operators (=, <>, <, <=, >, >=) |
✅ |
| Logical operators (AND, OR, NOT) |
✅ |
| BETWEEN |
✅ |
| IN |
✅ |
attribute_exists / attribute_not_exists |
✅ |
attribute_type |
✅ |
begins_with |
✅ |
contains |
✅ |
size |
✅ |
if_not_exists (UpdateExpression) |
✅ |
list_append (UpdateExpression) |
✅ |
| Document paths (nested maps, list indexes) |
✅ |
| PartiQL |
❌ |
| Feature |
Supported |
| BatchGetItem (up to 100 keys) |
✅ |
| BatchWriteItem (up to 25 requests) |
✅ |
| TransactWriteItems (Put, Update, Delete, ConditionCheck) |
✅ |
| TransactGetItems |
✅ |
| TransactionCanceledException with CancellationReasons |
✅ |
| Feature |
Supported |
| All attribute types (S, N, B, SS, NS, BS, BOOL, NULL, L, M) |
✅ |
| Streams / DynamoDB Streams |
❌ |
| DynamoDB Accelerator (DAX) |
❌ |
| Point-in-time recovery (PITR) |
❌ |
| Backup and restore |
❌ |
| Global Tables |
❌ |
| Auto Scaling |
❌ |
This project uses OpenSpec to manage requirements and track changes. Specifications in openspec/specs/ define what the system should do. When a feature is planned, a change folder is created under openspec/changes/ containing a proposal, design, and task checklist that reference the relevant specs. Once implemented and verified, changes are archived. This keeps requirements, design decisions, and implementation history in sync without heavyweight process.
- AWS API Models - Smithy model definitions for AWS services including DynamoDB
- Smithy - Interface definition language used by AWS
- OpenSpec - Spec-driven development framework for AI coding assistants