[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-70518":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":9,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":14,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":16,"starSnapshotCount":16,"syncStatus":35,"lastSyncTime":36,"discoverSource":37},70518,"kumo","sivchari\u002Fkumo","sivchari","A lightweight AWS service emulator written in Go",null,"https:\u002F\u002Fgithub.com\u002Fsivchari\u002Fkumo","Go",1374,87,9,182,0,3,23,101,18.83,false,"main",[24,25,26,27,28,29,30,31],"aws","cicd","cloud","continuous-integration","developer-tools","go","testing","localstack","2026-06-12 02:02:34","\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fkumo.jpg\" alt=\"kumo logo\" width=\"480\">\n  \u003Cbr>\u003Cbr>\n  \u003Ca href=\"https:\u002F\u002Fgo.dev\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fgo-mod\u002Fgo-version\u002Fsivchari\u002Fkumo\" alt=\"Go Version\">\u003C\u002Fa>\n  \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fsivchari\u002Fkumo\" alt=\"License\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsivchari\u002Fkumo\u002Freleases\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fsivchari\u002Fkumo\" alt=\"Release\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsivchari\u002Fkumo\u002Factions\u002Fworkflows\u002Flint.yaml\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fsivchari\u002Fkumo\u002Factions\u002Fworkflows\u002Flint.yaml\u002Fbadge.svg\" alt=\"Lint\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsivchari\u002Fkumo\u002Factions\u002Fworkflows\u002Fintegration-test.yaml\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fsivchari\u002Fkumo\u002Factions\u002Fworkflows\u002Fintegration-test.yaml\u002Fbadge.svg\" alt=\"Integration Tests\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">A lightweight AWS service emulator written in Go.\u003Cbr>Works as both a CI\u002FCD testing tool and a local development server with optional data persistence.\u003C\u002Fp>\n\n## Features\n\n- **No authentication required** - Perfect for CI environments\n- **Single binary** - Easy to distribute and deploy\n- **Docker support** - Run as a container\n- **Lightweight** - Fast startup, minimal resource usage\n- **AWS SDK v2 compatible** - Works seamlessly with Go AWS SDK v2\n- **Optional data persistence** - Survive restarts with `KUMO_DATA_DIR`\n\n## Supported Services (76 services)\n\n### Storage\n| Service | Description |\n|---------|-------------|\n| S3 | Object storage |\n| S3 Control | S3 account-level operations |\n| S3 Tables | S3 table buckets |\n| DynamoDB | NoSQL database |\n| ElastiCache | In-memory caching |\n| MemoryDB | Redis-compatible database |\n| Glacier | Archive storage |\n| EBS | Block storage |\n\n### Compute\n| Service | Description |\n|---------|-------------|\n| Lambda | Serverless functions |\n| Batch | Batch computing |\n| EC2 | Virtual machines |\n| Elastic Beanstalk | Application deployment |\n\n### Container\n| Service | Description |\n|---------|-------------|\n| ECS | Container orchestration |\n| ECR | Container registry |\n| EKS | Kubernetes service |\n\n### Database\n| Service | Description |\n|---------|-------------|\n| RDS | Relational database service |\n| Neptune | Graph database |\n| Redshift | Data warehousing |\n\n### Messaging & Integration\n| Service | Description |\n|---------|-------------|\n| SQS | Message queuing |\n| SNS | Pub\u002FSub messaging |\n| EventBridge | Event bus |\n| Kinesis | Real-time streaming |\n| Firehose | Data delivery |\n| MQ | Message broker (ActiveMQ\u002FRabbitMQ) |\n| Pipes | Event-driven integration |\n| MSK (Kafka) | Managed streaming for Kafka |\n\n### Security & Identity\n| Service | Description |\n|---------|-------------|\n| IAM | Identity and access management |\n| KMS | Key management |\n| Secrets Manager | Secret storage |\n| ACM | Certificate management |\n| Cognito | User authentication |\n| Security Lake | Security data lake |\n| STS | Security token service |\n| Macie | Data security and privacy |\n\n### Monitoring & Logging\n| Service | Description |\n|---------|-------------|\n| CloudWatch | Metrics and alarms |\n| CloudWatch Logs | Log management |\n| X-Ray | Distributed tracing |\n| CloudTrail | API audit logging |\n\n### Networking & Content Delivery\n| Service | Description |\n|---------|-------------|\n| CloudFront | CDN |\n| Global Accelerator | Network acceleration |\n| API Gateway | API management |\n| Route 53 | DNS service |\n| Route 53 Resolver | DNS resolver |\n| ELBv2 | Load balancing |\n| App Mesh | Service mesh |\n| Location | Location-based services |\n\n### Application Integration\n| Service | Description |\n|---------|-------------|\n| Step Functions | Workflow orchestration |\n| AppSync | GraphQL API |\n| SES v2 | Email service |\n| Pinpoint SMS Voice v2 | SMS messaging |\n| Scheduler | Task scheduling |\n| Amplify | Full-stack application hosting |\n\n### Management & Configuration\n| Service | Description |\n|---------|-------------|\n| SSM | Systems Manager |\n| Config | Resource configuration |\n| CloudFormation | Infrastructure as code |\n| Organizations | Multi-account management |\n| Service Quotas | Service limit management |\n| CodeConnections | Source code connections |\n| Backup | Centralized backup service |\n\n### Analytics & ML\n| Service | Description |\n|---------|-------------|\n| Athena | SQL query service |\n| Glue | ETL service |\n| Comprehend | NLP service |\n| Rekognition | Image\u002Fvideo analysis |\n| SageMaker | Machine learning |\n| Forecast | Time-series forecasting |\n| Data Exchange | Data marketplace |\n| Entity Resolution | Entity matching |\n\n### Developer Tools\n| Service | Description |\n|---------|-------------|\n| CodeGuru Profiler | Application profiling |\n| CodeGuru Reviewer | Automated code review |\n\n### Other Services\n| Service | Description |\n|---------|-------------|\n| Cost Explorer | Cost analysis |\n| DLM | Data lifecycle manager |\n| Directory Service | Microsoft AD |\n| EMR Serverless | Big data processing |\n| FinSpace | Financial data management |\n| GameLift | Game server hosting |\n| Resilience Hub | Application resilience |\n\n## Quick Start\n\n### Docker\n\n```bash\ndocker run -p 4566:4566 ghcr.io\u002Fsivchari\u002Fkumo:latest\n```\n\nWith data persistence:\n\n```bash\ndocker run -p 4566:4566 \\\n  -e KUMO_DATA_DIR=\u002Fdata \\\n  -v kumo-data:\u002Fdata \\\n  ghcr.io\u002Fsivchari\u002Fkumo:latest\n```\n\n### Binary\n\n```bash\n# Build\nmake build\n\n# Run\n.\u002Fbin\u002Fkumo\n\n# Run with data persistence\nKUMO_DATA_DIR=.\u002Fdata .\u002Fbin\u002Fkumo\n```\n\n### Docker Compose\n\n```yaml\nservices:\n  kumo:\n    image: ghcr.io\u002Fsivchari\u002Fkumo:latest\n    ports:\n      - \"4566:4566\"\n```\n\nWith data persistence:\n\n```yaml\nservices:\n  kumo:\n    image: ghcr.io\u002Fsivchari\u002Fkumo:latest\n    ports:\n      - \"4566:4566\"\n    environment:\n      - KUMO_DATA_DIR=\u002Fdata\n    volumes:\n      - kumo-data:\u002Fdata\n\nvolumes:\n  kumo-data:\n```\n\n## Usage Examples\n\n### S3\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"strings\"\n\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Faws\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fconfig\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fcredentials\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fservice\u002Fs3\"\n)\n\nfunc main() {\n    cfg, _ := config.LoadDefaultConfig(context.TODO(),\n        config.WithRegion(\"us-east-1\"),\n        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(\"test\", \"test\", \"\")),\n    )\n\n    client := s3.NewFromConfig(cfg, func(o *s3.Options) {\n        o.BaseEndpoint = aws.String(\"http:\u002F\u002Flocalhost:4566\")\n        o.UsePathStyle = true\n    })\n\n    \u002F\u002F Create bucket\n    client.CreateBucket(context.TODO(), &s3.CreateBucketInput{\n        Bucket: aws.String(\"my-bucket\"),\n    })\n\n    \u002F\u002F Put object\n    client.PutObject(context.TODO(), &s3.PutObjectInput{\n        Bucket: aws.String(\"my-bucket\"),\n        Key:    aws.String(\"hello.txt\"),\n        Body:   strings.NewReader(\"Hello, World!\"),\n    })\n}\n```\n\n### SQS\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Faws\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fconfig\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fcredentials\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fservice\u002Fsqs\"\n)\n\nfunc main() {\n    cfg, _ := config.LoadDefaultConfig(context.TODO(),\n        config.WithRegion(\"us-east-1\"),\n        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(\"test\", \"test\", \"\")),\n    )\n\n    client := sqs.NewFromConfig(cfg, func(o *sqs.Options) {\n        o.BaseEndpoint = aws.String(\"http:\u002F\u002Flocalhost:4566\")\n    })\n\n    \u002F\u002F Create queue\n    result, _ := client.CreateQueue(context.TODO(), &sqs.CreateQueueInput{\n        QueueName: aws.String(\"my-queue\"),\n    })\n\n    \u002F\u002F Send message\n    client.SendMessage(context.TODO(), &sqs.SendMessageInput{\n        QueueUrl:    result.QueueUrl,\n        MessageBody: aws.String(\"Hello from SQS!\"),\n    })\n\n    \u002F\u002F Receive message\n    messages, _ := client.ReceiveMessage(context.TODO(), &sqs.ReceiveMessageInput{\n        QueueUrl: result.QueueUrl,\n    })\n\n    for _, msg := range messages.Messages {\n        fmt.Println(*msg.Body)\n    }\n}\n```\n\n### DynamoDB\n\n```go\npackage main\n\nimport (\n    \"context\"\n\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Faws\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fconfig\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fcredentials\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fservice\u002Fdynamodb\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fservice\u002Fdynamodb\u002Ftypes\"\n)\n\nfunc main() {\n    cfg, _ := config.LoadDefaultConfig(context.TODO(),\n        config.WithRegion(\"us-east-1\"),\n        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(\"test\", \"test\", \"\")),\n    )\n\n    client := dynamodb.NewFromConfig(cfg, func(o *dynamodb.Options) {\n        o.BaseEndpoint = aws.String(\"http:\u002F\u002Flocalhost:4566\")\n    })\n\n    \u002F\u002F Create table\n    client.CreateTable(context.TODO(), &dynamodb.CreateTableInput{\n        TableName: aws.String(\"users\"),\n        KeySchema: []types.KeySchemaElement{\n            {AttributeName: aws.String(\"id\"), KeyType: types.KeyTypeHash},\n        },\n        AttributeDefinitions: []types.AttributeDefinition{\n            {AttributeName: aws.String(\"id\"), AttributeType: types.ScalarAttributeTypeS},\n        },\n        BillingMode: types.BillingModePayPerRequest,\n    })\n\n    \u002F\u002F Put item\n    client.PutItem(context.TODO(), &dynamodb.PutItemInput{\n        TableName: aws.String(\"users\"),\n        Item: map[string]types.AttributeValue{\n            \"id\":   &types.AttributeValueMemberS{Value: \"user-1\"},\n            \"name\": &types.AttributeValueMemberS{Value: \"Alice\"},\n        },\n    })\n}\n```\n\n### Secrets Manager\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Faws\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fconfig\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fcredentials\"\n    \"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fservice\u002Fsecretsmanager\"\n)\n\nfunc main() {\n    cfg, _ := config.LoadDefaultConfig(context.TODO(),\n        config.WithRegion(\"us-east-1\"),\n        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(\"test\", \"test\", \"\")),\n    )\n\n    client := secretsmanager.NewFromConfig(cfg, func(o *secretsmanager.Options) {\n        o.BaseEndpoint = aws.String(\"http:\u002F\u002Flocalhost:4566\")\n    })\n\n    \u002F\u002F Create secret\n    client.CreateSecret(context.TODO(), &secretsmanager.CreateSecretInput{\n        Name:         aws.String(\"my-secret\"),\n        SecretString: aws.String(`{\"username\":\"admin\",\"password\":\"secret123\"}`),\n    })\n\n    \u002F\u002F Get secret\n    result, _ := client.GetSecretValue(context.TODO(), &secretsmanager.GetSecretValueInput{\n        SecretId: aws.String(\"my-secret\"),\n    })\n\n    fmt.Println(*result.SecretString)\n}\n```\n\n## Configuration\n\nEnvironment variables:\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `KUMO_HOST` | `0.0.0.0` | Server bind address |\n| `KUMO_PORT` | `4566` | Server port |\n| `KUMO_LOG_LEVEL` | `info` | Log level (debug, info, warn, error) |\n| `KUMO_DATA_DIR` | (unset) | Directory for persistent storage. When unset, data is in-memory only. |\n\n## Logging\n\nkumo logs all requests with structured fields. The log level controls the amount of detail:\n\n### INFO (default)\n\nEach request is logged with method, path, status, duration, and API action name:\n\n```\nlevel=INFO msg=request method=POST path=\u002F status=200 duration=61µs request_id=... target=secretsmanager.CreateSecret\nlevel=INFO msg=request method=PUT path=\u002Fmy-bucket pattern=\u002F{bucket} status=200 duration=30µs request_id=...\n```\n\n- `target` -- appears for JSON\u002FQuery protocol services (Secrets Manager, DynamoDB, SQS, etc.)\n- `action` -- appears for Query protocol services (EC2, SNS, etc.) when Action is in the URL query string\n\n### DEBUG\n\nIn addition to INFO output, the full request body is logged:\n\n```\nlevel=DEBUG msg=\"request body\" request_id=... body={\"Name\":\"my-secret\",\"SecretString\":\"...\"}\n```\n\nEnable with:\n\n```bash\nKUMO_LOG_LEVEL=debug .\u002Fbin\u002Fkumo\n```\n\n## Data Persistence\n\nBy default kumo runs as a pure in-memory emulator -- all data is lost when the process stops. This is ideal for CI\u002FCD pipelines where each test run starts from a clean state.\n\nFor local development, set `KUMO_DATA_DIR` to enable persistent storage:\n\n```bash\nKUMO_DATA_DIR=.\u002Fdata .\u002Fbin\u002Fkumo\n```\n\nWhen enabled:\n\n- On startup, each service loads its previous state from `$KUMO_DATA_DIR\u002F{service}.json`.\n- On graceful shutdown (SIGTERM\u002FSIGINT), each service saves its current state.\n- The data directory is created automatically if it does not exist.\n- Writes are atomic (tmp file + rename) to prevent corruption on crash.\n- Ephemeral state (SQS in-flight messages, S3 multipart uploads) is not persisted.\n\n```\n$KUMO_DATA_DIR\u002F\n  s3.json\n  sqs.json\n  dynamodb.json\n  iam.json\n  ...\n```\n\n## kumo-specific Endpoints\n\nkumo provides additional endpoints under the `\u002Fkumo\u002F` prefix for testing purposes. These are not part of any AWS API but are useful for verifying application behavior in tests.\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | `\u002Fkumo\u002Fses\u002Fv2\u002Fsent-emails` | Retrieve a list of emails sent via the SES v2 `SendEmail` API |\n| GET | `\u002Fkumo\u002Fpinpointsmsvoicev2\u002Fsent-messages` | Retrieve a list of SMS messages sent via the Pinpoint SMS Voice v2 `SendTextMessage` API |\n\n### Example: Retrieving sent emails\n\n```bash\ncurl http:\u002F\u002Flocalhost:4566\u002Fkumo\u002Fses\u002Fv2\u002Fsent-emails\n```\n\nResponse:\n\n```json\n{\n  \"SentEmails\": [\n    {\n      \"MessageId\": \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n      \"FromEmailAddress\": \"sender@example.com\",\n      \"Destination\": {\n        \"ToAddresses\": [\"recipient@example.com\"]\n      },\n      \"Subject\": \"Hello\",\n      \"Body\": \"Hello, World!\",\n      \"SentAt\": \"2025-01-01T00:00:00Z\"\n    }\n  ]\n}\n```\n\n### Example: Retrieving sent SMS messages\n\n```bash\ncurl http:\u002F\u002Flocalhost:4566\u002Fkumo\u002Fpinpointsmsvoicev2\u002Fsent-messages\n```\n\nResponse:\n\n```json\n{\n  \"SentTextMessages\": [\n    {\n      \"MessageId\": \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n      \"DestinationPhoneNumber\": \"+1234567890\",\n      \"OriginationIdentity\": \"+0987654321\",\n      \"MessageBody\": \"Hello!\",\n      \"SentAt\": \"2025-01-01T00:00:00Z\"\n    }\n  ]\n}\n```\n\n## Development\n\n```bash\n# Run tests\nmake test\n\n# Run integration tests\nmake test-integration\n\n# Lint\nmake lint\n\n# Build\nmake build\n```\n\n## Contributing\n\nContributions are welcome! Please see the issues for planned features and improvements.\n\n## License\n\nMIT License\n","kumo 是一个用 Go 语言编写的轻量级 AWS 服务模拟器。它支持 76 种 AWS 服务，包括 S3、DynamoDB、Lambda 和 RDS 等，并且兼容 AWS SDK v2。该项目无需认证即可运行，非常适合 CI\u002FCD 测试环境；同时作为一个单一的二进制文件，易于分发和部署，还支持 Docker 容器化运行。此外，kumo 启动速度快、资源消耗低，并提供可选的数据持久化功能，能够满足开发者在本地开发和测试时对 AWS 服务的需求。",2,"2026-06-11 03:32:36","trending"]