verification
use it
# add to stunt.yaml
services:
dynamodb:
adapter: embedded:dynamodb-style
# then
$ stunt upThe embedded: source extracts this adapter from the binary — no git clone, fully offline.
how to mock the Amazon DynamoDB API locally
Install stunt, paste the service block above into stunt.yaml, run stunt up — then point your client at localhost instead of Amazon DynamoDB API. It works offline, keeps state across requests and restarts, and every response is synthetic: the route shapes, status codes, pagination, and webhook delivery follow the real Amazon DynamoDB API 2012-08-10 surface — the data is fake, the behavior is real.
backing stores
tablesitems
api surface (1)
generated from the adapter manifest — exactly what boots, nothing more
1 routes
POST/
SDK-verified behaviors (8)
- ✓CreateTable via real SigV4
- ✓typed item Put/Get round-trip (S/N/BOOL/SS)
- ✓UpdateItem SET/ADD with exact decimal arithmetic
- ✓ConditionExpression → ConditionalCheckFailedException
- ✓Query numeric sort-key ordering (1,2,10)
- ✓Query BETWEEN + ScanIndexForward=false
- ✓Scan with FilterExpression
- ✓typed ResourceNotFoundException surface
VM-verified behaviors (22)
- ✓an unsigned request is 403; a real SigV4 signature passes
- ✓tampered signatures, wrong secrets, and clock skew are all 403
- ✓CreateTable returns ACTIVE; duplicate and bad-schema creates throw the real exceptions
- ✓Describe/List/Delete round out the lifecycle with table paging
- ✓typed values round-trip verbatim through PutItem/GetItem
- ✓projection, misses, and malformed keys take the documented paths
- ✓SET upserts, ADD does exact-decimal math, REMOVE drops with UPDATED_OLD
- ✓non-numeric ADD and bogus ReturnValues are ValidationExceptions
- ✓numeric sort keys order numerically (10 after 9)
- ✓BETWEEN, >=, descending, and begins_with shape the key range
- ✓Limit + ExclusiveStartKey pages queries; bad conditions are rejected
- ✓Scan returns the whole table and filters by expression
- ✓Select COUNT, pagination, and error paths round out Scan
- ✓attribute_not_exists guards writes; failed checks return the old item
- ✓conditional deletes enforce the condition; consumed capacity echoes
- ✓batch writes and gets round-trip with empty Unprocessed maps
- ✓oversized, unknown-table, and invalid batches are rejected atomically
- ✓unsupported constructs fail with named ValidationExceptions
- ✓a leading "." answers ValidationException instead of wedging the tokenizer
- ✓"|" in key values cannot collide two composite keys
- ✓set members dedupe by string and numeric value
- ✓"-0" and "0" name the same stored item
Not implemented (8)
- No secondary indexes: GSI/LSI creation and index-targeted queries
- No transactions: TransactGetItems, TransactWriteItems
- No PartiQL: ExecuteStatement, BatchExecuteStatement
- No TTL: DescribeTimeToLive, UpdateTimeToLive
- No backup or restore: CreateBackup, RestoreTableFromBackup
- No UpdateTable, TagResource/UntagResource/ListTags, or DescribeLimits
- No PITR or import/export: ExportTableToPointInTime, ImportTable
- No global tables (CreateGlobalTable, ListGlobalTables)
Differs from the real API (5)
- expression subset: OR/NOT/parens/IN/size()/doc paths rejected as ValidationException
- tables are ACTIVE immediately and DeleteTable is synchronous; no CREATING/DELETING
- UnprocessedKeys/UnprocessedItems always empty; no throttling, ConsumedCapacity fixed at 1
- Query/Scan Limit caps returned post-filter items; real caps items evaluated
- UpdateItem REMOVE on a key attribute silently no-ops instead of erroring
want more of the Amazon DynamoDB API surface? adapters are YAML + Starlark — the authoring guide covers adding routes, fixtures, and state machines. Open an issue for anything big first, or just file a PR — merged routes ship in the next release.