[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-aws-labs-dynamodb":3,"mdc--eab5la-key":34,"related-repo-aws-labs-dynamodb":1739,"related-org-aws-labs-dynamodb":1842},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"dynamodb","design DynamoDB schemas and access patterns","Deep-dive into Amazon DynamoDB table design, access patterns, and operations. Use when designing DynamoDB schemas, choosing partition keys, planning GSI\u002FLSI strategies, implementing single-table design, configuring capacity modes, or troubleshooting performance issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"aws-labs","AWS Labs","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Faws-labs.png","awslabs",[13,17,20],{"name":14,"slug":15,"type":16},"NoSQL","nosql","tag",{"name":18,"slug":19,"type":16},"Database","database",{"name":21,"slug":22,"type":16},"AWS","aws",14,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fstartups","2026-07-12T08:40:08.609534",null,15,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Official AWS Startups repository that hosts plugins, skills, tools and resources to support startup builders on AWS","https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fstartups\u002Ftree\u002FHEAD\u002Fsolution-architecture\u002Fplugins\u002Faws-dev-toolkit\u002Fskills\u002Fdynamodb","---\nname: dynamodb\ndescription: Deep-dive into Amazon DynamoDB table design, access patterns, and operations. Use when designing DynamoDB schemas, choosing partition keys, planning GSI\u002FLSI strategies, implementing single-table design, configuring capacity modes, or troubleshooting performance issues.\n---\n\nYou are a DynamoDB specialist. Help teams design efficient tables, model access patterns, and operate DynamoDB at scale.\n\n## Process\n\n1. Identify all access patterns before designing the table schema\n2. Use the `awsknowledge` MCP tools (`mcp__plugin_aws-dev-toolkit_awsknowledge__aws___search_documentation`, `mcp__plugin_aws-dev-toolkit_awsknowledge__aws___read_documentation`, `mcp__plugin_aws-dev-toolkit_awsknowledge__aws___recommend`) to verify current DynamoDB limits and features\n3. Design the key schema (partition key, sort key) to satisfy the primary access pattern\n4. Add GSIs\u002FLSIs only when the base table key schema cannot serve a required access pattern\n5. Choose capacity mode based on traffic predictability\n6. Recommend operational best practices (TTL, Streams, backups)\n\n## Key Design Principles\n\n### Partition Key Selection\n\n- **High cardinality is mandatory.** A partition key with few distinct values creates hot partitions.\n- Good partition keys: `userId`, `orderId`, `deviceId`, `tenantId`\n- Bad partition keys: `status`, `date`, `region`, `type`\n- If you must query by a low-cardinality attribute, use it as a sort key or GSI sort key — never as the partition key.\n\n### Sort Key Design\n\n- Use composite sort keys to enable flexible queries: `STATUS#TIMESTAMP`, `TYPE#2024-01-15`\n- Sort keys enable `begins_with`, `between`, and range queries — design them for your query patterns\n- Hierarchical sort keys work well: `COUNTRY#STATE#CITY` lets you query at any level with `begins_with`\n\n### Single-Table Design\n\nUse single-table design when:\n\n- You need transactions across entity types\n- You want to minimize the number of DynamoDB tables to manage\n- Your entities share the same partition key (e.g., all items for a tenant)\n\nAvoid single-table design when:\n\n- Access patterns are simple and don't cross entity boundaries\n- Team members are unfamiliar with the pattern (readability matters)\n- You need different table-level settings per entity type (encryption, capacity, TTL)\n\nGeneric key names (`PK`, `SK`, `GSI1PK`, `GSI1SK`) are standard for single-table design.\n\n## Secondary Indexes\n\n### GSI (Global Secondary Index)\n\n- Completely separate partition and sort key from the base table\n- Eventually consistent reads only\n- Has its own provisioned capacity (or consumes from on-demand)\n- Maximum 20 GSIs per table\n- Use for access patterns that need a different partition key than the base table\n\n### LSI (Local Secondary Index)\n\n- Same partition key as the base table, different sort key\n- Supports strongly consistent reads\n- Must be created at table creation time — cannot be added later\n- Maximum 5 LSIs per table\n- 10 GB limit per partition key value (across base table + all LSIs)\n- **Prefer GSIs over LSIs unless you need strong consistency on the alternate sort key**\n\n## Capacity Modes\n\n### On-Demand\n\n- Use for: unpredictable traffic, new workloads, spiky patterns, dev\u002Ftest\n- No capacity planning needed\n- More expensive per-request than provisioned at sustained volume\n- Scales instantly (within previously reached traffic levels; new peaks may take minutes)\n\n### Provisioned\n\n- Use for: predictable, steady-state production workloads\n- Enable auto-scaling — never set a fixed capacity without it\n- Set target utilization to 70% for auto-scaling\n- Reserved capacity available for further savings on committed throughput\n- Provisioned is typically 5-7x cheaper than on-demand at sustained load\n\n## DynamoDB Streams\n\n- Captures item-level changes (INSERT, MODIFY, REMOVE) in order\n- Use for: event-driven architectures, cross-region replication, materialized views, analytics pipelines\n- Stream records are available for 24 hours\n- Pair with Lambda for real-time processing — use event source mapping with batch size tuning\n- Choose the right `StreamViewType`: `NEW_AND_OLD_IMAGES` is most flexible but largest payload\n\n## TTL (Time to Live)\n\n- Set a TTL attribute (epoch seconds) to auto-expire items at no cost\n- Deletion is eventual — items may persist up to 48 hours past expiry\n- TTL deletions appear in Streams (useful for cleanup triggers)\n- Use for: session data, temporary tokens, audit logs with retention policies\n- Filter expired items in queries with a condition: `#ttl > :now`\n\n## DAX (DynamoDB Accelerator)\n\n- In-memory cache in front of DynamoDB — microsecond read latency\n- Use for: read-heavy workloads with repeated access to the same items\n- **Do not use DAX when:** writes are heavy, data changes constantly, or you need strongly consistent reads (DAX serves eventually consistent by default)\n- DAX cluster runs in your VPC — factor in the instance cost\n- Item cache and query cache are separate — both cache misses hit DynamoDB\n\n## Common CLI Commands\n\n```bash\n# Create a table\naws dynamodb create-table \\\n  --table-name MyTable \\\n  --attribute-definitions AttributeName=PK,AttributeType=S AttributeName=SK,AttributeType=S \\\n  --key-schema AttributeName=PK,KeyType=HASH AttributeName=SK,KeyType=RANGE \\\n  --billing-mode PAY_PER_REQUEST\n\n# Query with key condition\naws dynamodb query \\\n  --table-name MyTable \\\n  --key-condition-expression \"PK = :pk AND begins_with(SK, :prefix)\" \\\n  --expression-attribute-values '{\":pk\":{\"S\":\"USER#123\"},\":prefix\":{\"S\":\"ORDER#\"}}'\n\n# Put item with condition (prevent overwrites)\naws dynamodb put-item \\\n  --table-name MyTable \\\n  --item '{\"PK\":{\"S\":\"USER#123\"},\"SK\":{\"S\":\"PROFILE\"}}' \\\n  --condition-expression \"attribute_not_exists(PK)\"\n\n# Scan with filter (avoid in production — reads entire table)\naws dynamodb scan \\\n  --table-name MyTable \\\n  --filter-expression \"#s = :status\" \\\n  --expression-attribute-names '{\"#s\":\"status\"}' \\\n  --expression-attribute-values '{\":status\":{\"S\":\"ACTIVE\"}}'\n\n# Update with atomic counter\naws dynamodb update-item \\\n  --table-name MyTable \\\n  --key '{\"PK\":{\"S\":\"USER#123\"},\"SK\":{\"S\":\"PROFILE\"}}' \\\n  --update-expression \"SET view_count = view_count + :inc\" \\\n  --expression-attribute-values '{\":inc\":{\"N\":\"1\"}}'\n\n# Enable TTL\naws dynamodb update-time-to-live \\\n  --table-name MyTable \\\n  --time-to-live-specification \"Enabled=true,AttributeName=expireAt\"\n\n# Describe table (check indexes, capacity, status)\naws dynamodb describe-table --table-name MyTable\n```\n\n## Anti-Patterns\n\n- **Scan for queries.** If you're scanning with a filter, you need a GSI or a redesigned key schema.\n- **Hot partition keys.** A single partition key that receives disproportionate traffic (e.g., `status=ACTIVE`) throttles the entire table.\n- **Large items.** DynamoDB max item size is 400 KB. Store large blobs in S3 and keep a pointer in DynamoDB.\n- **Relational modeling.** Don't normalize into many tables with joins — DynamoDB has no joins. Denormalize and use single-table design or composite keys.\n- **Over-indexing.** Each GSI duplicates data and consumes write capacity. Only create indexes for access patterns you actually need.\n- **Using Scan in production code paths.** Scans read the entire table and are expensive. Use Query with a well-designed key schema instead.\n- **Ignoring pagination.** Query and Scan return max 1 MB per call. Always handle `LastEvaluatedKey` for pagination.\n- **Not using condition expressions.** Without conditions on writes, concurrent updates silently overwrite each other. Use `attribute_not_exists` or version counters for optimistic locking.\n\n## Output Format\n\nWhen recommending a table design, use this format:\n\n| Entity | PK          | SK                  | GSI1PK          | GSI1SK            | Attributes        |\n| ------ | ----------- | ------------------- | --------------- | ----------------- | ----------------- |\n| User   | `USER#\u003Cid>` | PROFILE             | `EMAIL#\u003Cemail>` | `USER#\u003Cid>`       | name, email, ...  |\n| Order  | `USER#\u003Cid>` | `ORDER#\u003Ctimestamp>` | `ORDER#\u003Cid>`    | `STATUS#\u003Cstatus>` | total, items, ... |\n\nInclude:\n\n- All access patterns mapped to the key schema or index that serves them\n- Capacity mode recommendation with rationale\n- Estimated item sizes and read\u002Fwrite patterns\n\n## Reference Files\n\n- `references\u002Faccess-patterns.md` — Key design examples (e-commerce, multi-tenant SaaS), GSI overloading, hierarchical sort keys, adjacency list, sparse index, write sharding, and single-table design patterns\n\n## Related Skills\n\n- `lambda` — Lambda with DynamoDB Streams event source mapping\n- `api-gateway` — API Gateway direct integration with DynamoDB\n- `messaging` — DynamoDB Streams feeding event-driven architectures\n- `cost-check` — DynamoDB capacity mode cost analysis, reserved capacity\n- `iam` — Fine-grained access control with DynamoDB condition keys\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,47,54,121,127,134,218,224,283,289,294,312,317,335,369,375,381,409,415,451,457,463,486,492,520,526,570,576,610,616,649,655,1366,1372,1479,1485,1490,1626,1631,1649,1655,1669,1675,1733],{"type":40,"tag":41,"props":42,"children":43},"element","p",{},[44],{"type":45,"value":46},"text","You are a DynamoDB specialist. Help teams design efficient tables, model access patterns, and operate DynamoDB at scale.",{"type":40,"tag":48,"props":49,"children":51},"h2",{"id":50},"process",[52],{"type":45,"value":53},"Process",{"type":40,"tag":55,"props":56,"children":57},"ol",{},[58,64,101,106,111,116],{"type":40,"tag":59,"props":60,"children":61},"li",{},[62],{"type":45,"value":63},"Identify all access patterns before designing the table schema",{"type":40,"tag":59,"props":65,"children":66},{},[67,69,76,78,84,86,92,93,99],{"type":45,"value":68},"Use the ",{"type":40,"tag":70,"props":71,"children":73},"code",{"className":72},[],[74],{"type":45,"value":75},"awsknowledge",{"type":45,"value":77}," MCP tools (",{"type":40,"tag":70,"props":79,"children":81},{"className":80},[],[82],{"type":45,"value":83},"mcp__plugin_aws-dev-toolkit_awsknowledge__aws___search_documentation",{"type":45,"value":85},", ",{"type":40,"tag":70,"props":87,"children":89},{"className":88},[],[90],{"type":45,"value":91},"mcp__plugin_aws-dev-toolkit_awsknowledge__aws___read_documentation",{"type":45,"value":85},{"type":40,"tag":70,"props":94,"children":96},{"className":95},[],[97],{"type":45,"value":98},"mcp__plugin_aws-dev-toolkit_awsknowledge__aws___recommend",{"type":45,"value":100},") to verify current DynamoDB limits and features",{"type":40,"tag":59,"props":102,"children":103},{},[104],{"type":45,"value":105},"Design the key schema (partition key, sort key) to satisfy the primary access pattern",{"type":40,"tag":59,"props":107,"children":108},{},[109],{"type":45,"value":110},"Add GSIs\u002FLSIs only when the base table key schema cannot serve a required access pattern",{"type":40,"tag":59,"props":112,"children":113},{},[114],{"type":45,"value":115},"Choose capacity mode based on traffic predictability",{"type":40,"tag":59,"props":117,"children":118},{},[119],{"type":45,"value":120},"Recommend operational best practices (TTL, Streams, backups)",{"type":40,"tag":48,"props":122,"children":124},{"id":123},"key-design-principles",[125],{"type":45,"value":126},"Key Design Principles",{"type":40,"tag":128,"props":129,"children":131},"h3",{"id":130},"partition-key-selection",[132],{"type":45,"value":133},"Partition Key Selection",{"type":40,"tag":135,"props":136,"children":137},"ul",{},[138,149,181,213],{"type":40,"tag":59,"props":139,"children":140},{},[141,147],{"type":40,"tag":142,"props":143,"children":144},"strong",{},[145],{"type":45,"value":146},"High cardinality is mandatory.",{"type":45,"value":148}," A partition key with few distinct values creates hot partitions.",{"type":40,"tag":59,"props":150,"children":151},{},[152,154,160,161,167,168,174,175],{"type":45,"value":153},"Good partition keys: ",{"type":40,"tag":70,"props":155,"children":157},{"className":156},[],[158],{"type":45,"value":159},"userId",{"type":45,"value":85},{"type":40,"tag":70,"props":162,"children":164},{"className":163},[],[165],{"type":45,"value":166},"orderId",{"type":45,"value":85},{"type":40,"tag":70,"props":169,"children":171},{"className":170},[],[172],{"type":45,"value":173},"deviceId",{"type":45,"value":85},{"type":40,"tag":70,"props":176,"children":178},{"className":177},[],[179],{"type":45,"value":180},"tenantId",{"type":40,"tag":59,"props":182,"children":183},{},[184,186,192,193,199,200,206,207],{"type":45,"value":185},"Bad partition keys: ",{"type":40,"tag":70,"props":187,"children":189},{"className":188},[],[190],{"type":45,"value":191},"status",{"type":45,"value":85},{"type":40,"tag":70,"props":194,"children":196},{"className":195},[],[197],{"type":45,"value":198},"date",{"type":45,"value":85},{"type":40,"tag":70,"props":201,"children":203},{"className":202},[],[204],{"type":45,"value":205},"region",{"type":45,"value":85},{"type":40,"tag":70,"props":208,"children":210},{"className":209},[],[211],{"type":45,"value":212},"type",{"type":40,"tag":59,"props":214,"children":215},{},[216],{"type":45,"value":217},"If you must query by a low-cardinality attribute, use it as a sort key or GSI sort key — never as the partition key.",{"type":40,"tag":128,"props":219,"children":221},{"id":220},"sort-key-design",[222],{"type":45,"value":223},"Sort Key Design",{"type":40,"tag":135,"props":225,"children":226},{},[227,245,265],{"type":40,"tag":59,"props":228,"children":229},{},[230,232,238,239],{"type":45,"value":231},"Use composite sort keys to enable flexible queries: ",{"type":40,"tag":70,"props":233,"children":235},{"className":234},[],[236],{"type":45,"value":237},"STATUS#TIMESTAMP",{"type":45,"value":85},{"type":40,"tag":70,"props":240,"children":242},{"className":241},[],[243],{"type":45,"value":244},"TYPE#2024-01-15",{"type":40,"tag":59,"props":246,"children":247},{},[248,250,256,257,263],{"type":45,"value":249},"Sort keys enable ",{"type":40,"tag":70,"props":251,"children":253},{"className":252},[],[254],{"type":45,"value":255},"begins_with",{"type":45,"value":85},{"type":40,"tag":70,"props":258,"children":260},{"className":259},[],[261],{"type":45,"value":262},"between",{"type":45,"value":264},", and range queries — design them for your query patterns",{"type":40,"tag":59,"props":266,"children":267},{},[268,270,276,278],{"type":45,"value":269},"Hierarchical sort keys work well: ",{"type":40,"tag":70,"props":271,"children":273},{"className":272},[],[274],{"type":45,"value":275},"COUNTRY#STATE#CITY",{"type":45,"value":277}," lets you query at any level with ",{"type":40,"tag":70,"props":279,"children":281},{"className":280},[],[282],{"type":45,"value":255},{"type":40,"tag":128,"props":284,"children":286},{"id":285},"single-table-design",[287],{"type":45,"value":288},"Single-Table Design",{"type":40,"tag":41,"props":290,"children":291},{},[292],{"type":45,"value":293},"Use single-table design when:",{"type":40,"tag":135,"props":295,"children":296},{},[297,302,307],{"type":40,"tag":59,"props":298,"children":299},{},[300],{"type":45,"value":301},"You need transactions across entity types",{"type":40,"tag":59,"props":303,"children":304},{},[305],{"type":45,"value":306},"You want to minimize the number of DynamoDB tables to manage",{"type":40,"tag":59,"props":308,"children":309},{},[310],{"type":45,"value":311},"Your entities share the same partition key (e.g., all items for a tenant)",{"type":40,"tag":41,"props":313,"children":314},{},[315],{"type":45,"value":316},"Avoid single-table design when:",{"type":40,"tag":135,"props":318,"children":319},{},[320,325,330],{"type":40,"tag":59,"props":321,"children":322},{},[323],{"type":45,"value":324},"Access patterns are simple and don't cross entity boundaries",{"type":40,"tag":59,"props":326,"children":327},{},[328],{"type":45,"value":329},"Team members are unfamiliar with the pattern (readability matters)",{"type":40,"tag":59,"props":331,"children":332},{},[333],{"type":45,"value":334},"You need different table-level settings per entity type (encryption, capacity, TTL)",{"type":40,"tag":41,"props":336,"children":337},{},[338,340,346,347,353,354,360,361,367],{"type":45,"value":339},"Generic key names (",{"type":40,"tag":70,"props":341,"children":343},{"className":342},[],[344],{"type":45,"value":345},"PK",{"type":45,"value":85},{"type":40,"tag":70,"props":348,"children":350},{"className":349},[],[351],{"type":45,"value":352},"SK",{"type":45,"value":85},{"type":40,"tag":70,"props":355,"children":357},{"className":356},[],[358],{"type":45,"value":359},"GSI1PK",{"type":45,"value":85},{"type":40,"tag":70,"props":362,"children":364},{"className":363},[],[365],{"type":45,"value":366},"GSI1SK",{"type":45,"value":368},") are standard for single-table design.",{"type":40,"tag":48,"props":370,"children":372},{"id":371},"secondary-indexes",[373],{"type":45,"value":374},"Secondary Indexes",{"type":40,"tag":128,"props":376,"children":378},{"id":377},"gsi-global-secondary-index",[379],{"type":45,"value":380},"GSI (Global Secondary Index)",{"type":40,"tag":135,"props":382,"children":383},{},[384,389,394,399,404],{"type":40,"tag":59,"props":385,"children":386},{},[387],{"type":45,"value":388},"Completely separate partition and sort key from the base table",{"type":40,"tag":59,"props":390,"children":391},{},[392],{"type":45,"value":393},"Eventually consistent reads only",{"type":40,"tag":59,"props":395,"children":396},{},[397],{"type":45,"value":398},"Has its own provisioned capacity (or consumes from on-demand)",{"type":40,"tag":59,"props":400,"children":401},{},[402],{"type":45,"value":403},"Maximum 20 GSIs per table",{"type":40,"tag":59,"props":405,"children":406},{},[407],{"type":45,"value":408},"Use for access patterns that need a different partition key than the base table",{"type":40,"tag":128,"props":410,"children":412},{"id":411},"lsi-local-secondary-index",[413],{"type":45,"value":414},"LSI (Local Secondary Index)",{"type":40,"tag":135,"props":416,"children":417},{},[418,423,428,433,438,443],{"type":40,"tag":59,"props":419,"children":420},{},[421],{"type":45,"value":422},"Same partition key as the base table, different sort key",{"type":40,"tag":59,"props":424,"children":425},{},[426],{"type":45,"value":427},"Supports strongly consistent reads",{"type":40,"tag":59,"props":429,"children":430},{},[431],{"type":45,"value":432},"Must be created at table creation time — cannot be added later",{"type":40,"tag":59,"props":434,"children":435},{},[436],{"type":45,"value":437},"Maximum 5 LSIs per table",{"type":40,"tag":59,"props":439,"children":440},{},[441],{"type":45,"value":442},"10 GB limit per partition key value (across base table + all LSIs)",{"type":40,"tag":59,"props":444,"children":445},{},[446],{"type":40,"tag":142,"props":447,"children":448},{},[449],{"type":45,"value":450},"Prefer GSIs over LSIs unless you need strong consistency on the alternate sort key",{"type":40,"tag":48,"props":452,"children":454},{"id":453},"capacity-modes",[455],{"type":45,"value":456},"Capacity Modes",{"type":40,"tag":128,"props":458,"children":460},{"id":459},"on-demand",[461],{"type":45,"value":462},"On-Demand",{"type":40,"tag":135,"props":464,"children":465},{},[466,471,476,481],{"type":40,"tag":59,"props":467,"children":468},{},[469],{"type":45,"value":470},"Use for: unpredictable traffic, new workloads, spiky patterns, dev\u002Ftest",{"type":40,"tag":59,"props":472,"children":473},{},[474],{"type":45,"value":475},"No capacity planning needed",{"type":40,"tag":59,"props":477,"children":478},{},[479],{"type":45,"value":480},"More expensive per-request than provisioned at sustained volume",{"type":40,"tag":59,"props":482,"children":483},{},[484],{"type":45,"value":485},"Scales instantly (within previously reached traffic levels; new peaks may take minutes)",{"type":40,"tag":128,"props":487,"children":489},{"id":488},"provisioned",[490],{"type":45,"value":491},"Provisioned",{"type":40,"tag":135,"props":493,"children":494},{},[495,500,505,510,515],{"type":40,"tag":59,"props":496,"children":497},{},[498],{"type":45,"value":499},"Use for: predictable, steady-state production workloads",{"type":40,"tag":59,"props":501,"children":502},{},[503],{"type":45,"value":504},"Enable auto-scaling — never set a fixed capacity without it",{"type":40,"tag":59,"props":506,"children":507},{},[508],{"type":45,"value":509},"Set target utilization to 70% for auto-scaling",{"type":40,"tag":59,"props":511,"children":512},{},[513],{"type":45,"value":514},"Reserved capacity available for further savings on committed throughput",{"type":40,"tag":59,"props":516,"children":517},{},[518],{"type":45,"value":519},"Provisioned is typically 5-7x cheaper than on-demand at sustained load",{"type":40,"tag":48,"props":521,"children":523},{"id":522},"dynamodb-streams",[524],{"type":45,"value":525},"DynamoDB Streams",{"type":40,"tag":135,"props":527,"children":528},{},[529,534,539,544,549],{"type":40,"tag":59,"props":530,"children":531},{},[532],{"type":45,"value":533},"Captures item-level changes (INSERT, MODIFY, REMOVE) in order",{"type":40,"tag":59,"props":535,"children":536},{},[537],{"type":45,"value":538},"Use for: event-driven architectures, cross-region replication, materialized views, analytics pipelines",{"type":40,"tag":59,"props":540,"children":541},{},[542],{"type":45,"value":543},"Stream records are available for 24 hours",{"type":40,"tag":59,"props":545,"children":546},{},[547],{"type":45,"value":548},"Pair with Lambda for real-time processing — use event source mapping with batch size tuning",{"type":40,"tag":59,"props":550,"children":551},{},[552,554,560,562,568],{"type":45,"value":553},"Choose the right ",{"type":40,"tag":70,"props":555,"children":557},{"className":556},[],[558],{"type":45,"value":559},"StreamViewType",{"type":45,"value":561},": ",{"type":40,"tag":70,"props":563,"children":565},{"className":564},[],[566],{"type":45,"value":567},"NEW_AND_OLD_IMAGES",{"type":45,"value":569}," is most flexible but largest payload",{"type":40,"tag":48,"props":571,"children":573},{"id":572},"ttl-time-to-live",[574],{"type":45,"value":575},"TTL (Time to Live)",{"type":40,"tag":135,"props":577,"children":578},{},[579,584,589,594,599],{"type":40,"tag":59,"props":580,"children":581},{},[582],{"type":45,"value":583},"Set a TTL attribute (epoch seconds) to auto-expire items at no cost",{"type":40,"tag":59,"props":585,"children":586},{},[587],{"type":45,"value":588},"Deletion is eventual — items may persist up to 48 hours past expiry",{"type":40,"tag":59,"props":590,"children":591},{},[592],{"type":45,"value":593},"TTL deletions appear in Streams (useful for cleanup triggers)",{"type":40,"tag":59,"props":595,"children":596},{},[597],{"type":45,"value":598},"Use for: session data, temporary tokens, audit logs with retention policies",{"type":40,"tag":59,"props":600,"children":601},{},[602,604],{"type":45,"value":603},"Filter expired items in queries with a condition: ",{"type":40,"tag":70,"props":605,"children":607},{"className":606},[],[608],{"type":45,"value":609},"#ttl > :now",{"type":40,"tag":48,"props":611,"children":613},{"id":612},"dax-dynamodb-accelerator",[614],{"type":45,"value":615},"DAX (DynamoDB Accelerator)",{"type":40,"tag":135,"props":617,"children":618},{},[619,624,629,639,644],{"type":40,"tag":59,"props":620,"children":621},{},[622],{"type":45,"value":623},"In-memory cache in front of DynamoDB — microsecond read latency",{"type":40,"tag":59,"props":625,"children":626},{},[627],{"type":45,"value":628},"Use for: read-heavy workloads with repeated access to the same items",{"type":40,"tag":59,"props":630,"children":631},{},[632,637],{"type":40,"tag":142,"props":633,"children":634},{},[635],{"type":45,"value":636},"Do not use DAX when:",{"type":45,"value":638}," writes are heavy, data changes constantly, or you need strongly consistent reads (DAX serves eventually consistent by default)",{"type":40,"tag":59,"props":640,"children":641},{},[642],{"type":45,"value":643},"DAX cluster runs in your VPC — factor in the instance cost",{"type":40,"tag":59,"props":645,"children":646},{},[647],{"type":45,"value":648},"Item cache and query cache are separate — both cache misses hit DynamoDB",{"type":40,"tag":48,"props":650,"children":652},{"id":651},"common-cli-commands",[653],{"type":45,"value":654},"Common CLI Commands",{"type":40,"tag":656,"props":657,"children":662},"pre",{"className":658,"code":659,"language":660,"meta":661,"style":661},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Create a table\naws dynamodb create-table \\\n  --table-name MyTable \\\n  --attribute-definitions AttributeName=PK,AttributeType=S AttributeName=SK,AttributeType=S \\\n  --key-schema AttributeName=PK,KeyType=HASH AttributeName=SK,KeyType=RANGE \\\n  --billing-mode PAY_PER_REQUEST\n\n# Query with key condition\naws dynamodb query \\\n  --table-name MyTable \\\n  --key-condition-expression \"PK = :pk AND begins_with(SK, :prefix)\" \\\n  --expression-attribute-values '{\":pk\":{\"S\":\"USER#123\"},\":prefix\":{\"S\":\"ORDER#\"}}'\n\n# Put item with condition (prevent overwrites)\naws dynamodb put-item \\\n  --table-name MyTable \\\n  --item '{\"PK\":{\"S\":\"USER#123\"},\"SK\":{\"S\":\"PROFILE\"}}' \\\n  --condition-expression \"attribute_not_exists(PK)\"\n\n# Scan with filter (avoid in production — reads entire table)\naws dynamodb scan \\\n  --table-name MyTable \\\n  --filter-expression \"#s = :status\" \\\n  --expression-attribute-names '{\"#s\":\"status\"}' \\\n  --expression-attribute-values '{\":status\":{\"S\":\"ACTIVE\"}}'\n\n# Update with atomic counter\naws dynamodb update-item \\\n  --table-name MyTable \\\n  --key '{\"PK\":{\"S\":\"USER#123\"},\"SK\":{\"S\":\"PROFILE\"}}' \\\n  --update-expression \"SET view_count = view_count + :inc\" \\\n  --expression-attribute-values '{\":inc\":{\"N\":\"1\"}}'\n\n# Enable TTL\naws dynamodb update-time-to-live \\\n  --table-name MyTable \\\n  --time-to-live-specification \"Enabled=true,AttributeName=expireAt\"\n\n# Describe table (check indexes, capacity, status)\naws dynamodb describe-table --table-name MyTable\n","bash","",[663],{"type":40,"tag":70,"props":664,"children":665},{"__ignoreMap":661},[666,678,704,722,745,768,782,792,801,822,838,867,891,899,907,927,943,970,993,1001,1010,1031,1047,1073,1099,1120,1128,1137,1158,1174,1199,1225,1246,1254,1263,1284,1300,1322,1330,1339],{"type":40,"tag":667,"props":668,"children":671},"span",{"class":669,"line":670},"line",1,[672],{"type":40,"tag":667,"props":673,"children":675},{"style":674},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[676],{"type":45,"value":677},"# Create a table\n",{"type":40,"tag":667,"props":679,"children":681},{"class":669,"line":680},2,[682,687,693,698],{"type":40,"tag":667,"props":683,"children":685},{"style":684},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[686],{"type":45,"value":22},{"type":40,"tag":667,"props":688,"children":690},{"style":689},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[691],{"type":45,"value":692}," dynamodb",{"type":40,"tag":667,"props":694,"children":695},{"style":689},[696],{"type":45,"value":697}," create-table",{"type":40,"tag":667,"props":699,"children":701},{"style":700},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[702],{"type":45,"value":703}," \\\n",{"type":40,"tag":667,"props":705,"children":707},{"class":669,"line":706},3,[708,713,718],{"type":40,"tag":667,"props":709,"children":710},{"style":689},[711],{"type":45,"value":712},"  --table-name",{"type":40,"tag":667,"props":714,"children":715},{"style":689},[716],{"type":45,"value":717}," MyTable",{"type":40,"tag":667,"props":719,"children":720},{"style":700},[721],{"type":45,"value":703},{"type":40,"tag":667,"props":723,"children":725},{"class":669,"line":724},4,[726,731,736,741],{"type":40,"tag":667,"props":727,"children":728},{"style":689},[729],{"type":45,"value":730},"  --attribute-definitions",{"type":40,"tag":667,"props":732,"children":733},{"style":689},[734],{"type":45,"value":735}," AttributeName=PK,AttributeType=S",{"type":40,"tag":667,"props":737,"children":738},{"style":689},[739],{"type":45,"value":740}," AttributeName=SK,AttributeType=S",{"type":40,"tag":667,"props":742,"children":743},{"style":700},[744],{"type":45,"value":703},{"type":40,"tag":667,"props":746,"children":748},{"class":669,"line":747},5,[749,754,759,764],{"type":40,"tag":667,"props":750,"children":751},{"style":689},[752],{"type":45,"value":753},"  --key-schema",{"type":40,"tag":667,"props":755,"children":756},{"style":689},[757],{"type":45,"value":758}," AttributeName=PK,KeyType=HASH",{"type":40,"tag":667,"props":760,"children":761},{"style":689},[762],{"type":45,"value":763}," AttributeName=SK,KeyType=RANGE",{"type":40,"tag":667,"props":765,"children":766},{"style":700},[767],{"type":45,"value":703},{"type":40,"tag":667,"props":769,"children":771},{"class":669,"line":770},6,[772,777],{"type":40,"tag":667,"props":773,"children":774},{"style":689},[775],{"type":45,"value":776},"  --billing-mode",{"type":40,"tag":667,"props":778,"children":779},{"style":689},[780],{"type":45,"value":781}," PAY_PER_REQUEST\n",{"type":40,"tag":667,"props":783,"children":785},{"class":669,"line":784},7,[786],{"type":40,"tag":667,"props":787,"children":789},{"emptyLinePlaceholder":788},true,[790],{"type":45,"value":791},"\n",{"type":40,"tag":667,"props":793,"children":795},{"class":669,"line":794},8,[796],{"type":40,"tag":667,"props":797,"children":798},{"style":674},[799],{"type":45,"value":800},"# Query with key condition\n",{"type":40,"tag":667,"props":802,"children":804},{"class":669,"line":803},9,[805,809,813,818],{"type":40,"tag":667,"props":806,"children":807},{"style":684},[808],{"type":45,"value":22},{"type":40,"tag":667,"props":810,"children":811},{"style":689},[812],{"type":45,"value":692},{"type":40,"tag":667,"props":814,"children":815},{"style":689},[816],{"type":45,"value":817}," query",{"type":40,"tag":667,"props":819,"children":820},{"style":700},[821],{"type":45,"value":703},{"type":40,"tag":667,"props":823,"children":825},{"class":669,"line":824},10,[826,830,834],{"type":40,"tag":667,"props":827,"children":828},{"style":689},[829],{"type":45,"value":712},{"type":40,"tag":667,"props":831,"children":832},{"style":689},[833],{"type":45,"value":717},{"type":40,"tag":667,"props":835,"children":836},{"style":700},[837],{"type":45,"value":703},{"type":40,"tag":667,"props":839,"children":841},{"class":669,"line":840},11,[842,847,853,858,863],{"type":40,"tag":667,"props":843,"children":844},{"style":689},[845],{"type":45,"value":846},"  --key-condition-expression",{"type":40,"tag":667,"props":848,"children":850},{"style":849},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[851],{"type":45,"value":852}," \"",{"type":40,"tag":667,"props":854,"children":855},{"style":689},[856],{"type":45,"value":857},"PK = :pk AND begins_with(SK, :prefix)",{"type":40,"tag":667,"props":859,"children":860},{"style":849},[861],{"type":45,"value":862},"\"",{"type":40,"tag":667,"props":864,"children":865},{"style":700},[866],{"type":45,"value":703},{"type":40,"tag":667,"props":868,"children":870},{"class":669,"line":869},12,[871,876,881,886],{"type":40,"tag":667,"props":872,"children":873},{"style":689},[874],{"type":45,"value":875},"  --expression-attribute-values",{"type":40,"tag":667,"props":877,"children":878},{"style":849},[879],{"type":45,"value":880}," '",{"type":40,"tag":667,"props":882,"children":883},{"style":689},[884],{"type":45,"value":885},"{\":pk\":{\"S\":\"USER#123\"},\":prefix\":{\"S\":\"ORDER#\"}}",{"type":40,"tag":667,"props":887,"children":888},{"style":849},[889],{"type":45,"value":890},"'\n",{"type":40,"tag":667,"props":892,"children":894},{"class":669,"line":893},13,[895],{"type":40,"tag":667,"props":896,"children":897},{"emptyLinePlaceholder":788},[898],{"type":45,"value":791},{"type":40,"tag":667,"props":900,"children":901},{"class":669,"line":23},[902],{"type":40,"tag":667,"props":903,"children":904},{"style":674},[905],{"type":45,"value":906},"# Put item with condition (prevent overwrites)\n",{"type":40,"tag":667,"props":908,"children":909},{"class":669,"line":27},[910,914,918,923],{"type":40,"tag":667,"props":911,"children":912},{"style":684},[913],{"type":45,"value":22},{"type":40,"tag":667,"props":915,"children":916},{"style":689},[917],{"type":45,"value":692},{"type":40,"tag":667,"props":919,"children":920},{"style":689},[921],{"type":45,"value":922}," put-item",{"type":40,"tag":667,"props":924,"children":925},{"style":700},[926],{"type":45,"value":703},{"type":40,"tag":667,"props":928,"children":930},{"class":669,"line":929},16,[931,935,939],{"type":40,"tag":667,"props":932,"children":933},{"style":689},[934],{"type":45,"value":712},{"type":40,"tag":667,"props":936,"children":937},{"style":689},[938],{"type":45,"value":717},{"type":40,"tag":667,"props":940,"children":941},{"style":700},[942],{"type":45,"value":703},{"type":40,"tag":667,"props":944,"children":946},{"class":669,"line":945},17,[947,952,956,961,966],{"type":40,"tag":667,"props":948,"children":949},{"style":689},[950],{"type":45,"value":951},"  --item",{"type":40,"tag":667,"props":953,"children":954},{"style":849},[955],{"type":45,"value":880},{"type":40,"tag":667,"props":957,"children":958},{"style":689},[959],{"type":45,"value":960},"{\"PK\":{\"S\":\"USER#123\"},\"SK\":{\"S\":\"PROFILE\"}}",{"type":40,"tag":667,"props":962,"children":963},{"style":849},[964],{"type":45,"value":965},"'",{"type":40,"tag":667,"props":967,"children":968},{"style":700},[969],{"type":45,"value":703},{"type":40,"tag":667,"props":971,"children":973},{"class":669,"line":972},18,[974,979,983,988],{"type":40,"tag":667,"props":975,"children":976},{"style":689},[977],{"type":45,"value":978},"  --condition-expression",{"type":40,"tag":667,"props":980,"children":981},{"style":849},[982],{"type":45,"value":852},{"type":40,"tag":667,"props":984,"children":985},{"style":689},[986],{"type":45,"value":987},"attribute_not_exists(PK)",{"type":40,"tag":667,"props":989,"children":990},{"style":849},[991],{"type":45,"value":992},"\"\n",{"type":40,"tag":667,"props":994,"children":996},{"class":669,"line":995},19,[997],{"type":40,"tag":667,"props":998,"children":999},{"emptyLinePlaceholder":788},[1000],{"type":45,"value":791},{"type":40,"tag":667,"props":1002,"children":1004},{"class":669,"line":1003},20,[1005],{"type":40,"tag":667,"props":1006,"children":1007},{"style":674},[1008],{"type":45,"value":1009},"# Scan with filter (avoid in production — reads entire table)\n",{"type":40,"tag":667,"props":1011,"children":1013},{"class":669,"line":1012},21,[1014,1018,1022,1027],{"type":40,"tag":667,"props":1015,"children":1016},{"style":684},[1017],{"type":45,"value":22},{"type":40,"tag":667,"props":1019,"children":1020},{"style":689},[1021],{"type":45,"value":692},{"type":40,"tag":667,"props":1023,"children":1024},{"style":689},[1025],{"type":45,"value":1026}," scan",{"type":40,"tag":667,"props":1028,"children":1029},{"style":700},[1030],{"type":45,"value":703},{"type":40,"tag":667,"props":1032,"children":1034},{"class":669,"line":1033},22,[1035,1039,1043],{"type":40,"tag":667,"props":1036,"children":1037},{"style":689},[1038],{"type":45,"value":712},{"type":40,"tag":667,"props":1040,"children":1041},{"style":689},[1042],{"type":45,"value":717},{"type":40,"tag":667,"props":1044,"children":1045},{"style":700},[1046],{"type":45,"value":703},{"type":40,"tag":667,"props":1048,"children":1050},{"class":669,"line":1049},23,[1051,1056,1060,1065,1069],{"type":40,"tag":667,"props":1052,"children":1053},{"style":689},[1054],{"type":45,"value":1055},"  --filter-expression",{"type":40,"tag":667,"props":1057,"children":1058},{"style":849},[1059],{"type":45,"value":852},{"type":40,"tag":667,"props":1061,"children":1062},{"style":689},[1063],{"type":45,"value":1064},"#s = :status",{"type":40,"tag":667,"props":1066,"children":1067},{"style":849},[1068],{"type":45,"value":862},{"type":40,"tag":667,"props":1070,"children":1071},{"style":700},[1072],{"type":45,"value":703},{"type":40,"tag":667,"props":1074,"children":1076},{"class":669,"line":1075},24,[1077,1082,1086,1091,1095],{"type":40,"tag":667,"props":1078,"children":1079},{"style":689},[1080],{"type":45,"value":1081},"  --expression-attribute-names",{"type":40,"tag":667,"props":1083,"children":1084},{"style":849},[1085],{"type":45,"value":880},{"type":40,"tag":667,"props":1087,"children":1088},{"style":689},[1089],{"type":45,"value":1090},"{\"#s\":\"status\"}",{"type":40,"tag":667,"props":1092,"children":1093},{"style":849},[1094],{"type":45,"value":965},{"type":40,"tag":667,"props":1096,"children":1097},{"style":700},[1098],{"type":45,"value":703},{"type":40,"tag":667,"props":1100,"children":1102},{"class":669,"line":1101},25,[1103,1107,1111,1116],{"type":40,"tag":667,"props":1104,"children":1105},{"style":689},[1106],{"type":45,"value":875},{"type":40,"tag":667,"props":1108,"children":1109},{"style":849},[1110],{"type":45,"value":880},{"type":40,"tag":667,"props":1112,"children":1113},{"style":689},[1114],{"type":45,"value":1115},"{\":status\":{\"S\":\"ACTIVE\"}}",{"type":40,"tag":667,"props":1117,"children":1118},{"style":849},[1119],{"type":45,"value":890},{"type":40,"tag":667,"props":1121,"children":1123},{"class":669,"line":1122},26,[1124],{"type":40,"tag":667,"props":1125,"children":1126},{"emptyLinePlaceholder":788},[1127],{"type":45,"value":791},{"type":40,"tag":667,"props":1129,"children":1131},{"class":669,"line":1130},27,[1132],{"type":40,"tag":667,"props":1133,"children":1134},{"style":674},[1135],{"type":45,"value":1136},"# Update with atomic counter\n",{"type":40,"tag":667,"props":1138,"children":1140},{"class":669,"line":1139},28,[1141,1145,1149,1154],{"type":40,"tag":667,"props":1142,"children":1143},{"style":684},[1144],{"type":45,"value":22},{"type":40,"tag":667,"props":1146,"children":1147},{"style":689},[1148],{"type":45,"value":692},{"type":40,"tag":667,"props":1150,"children":1151},{"style":689},[1152],{"type":45,"value":1153}," update-item",{"type":40,"tag":667,"props":1155,"children":1156},{"style":700},[1157],{"type":45,"value":703},{"type":40,"tag":667,"props":1159,"children":1161},{"class":669,"line":1160},29,[1162,1166,1170],{"type":40,"tag":667,"props":1163,"children":1164},{"style":689},[1165],{"type":45,"value":712},{"type":40,"tag":667,"props":1167,"children":1168},{"style":689},[1169],{"type":45,"value":717},{"type":40,"tag":667,"props":1171,"children":1172},{"style":700},[1173],{"type":45,"value":703},{"type":40,"tag":667,"props":1175,"children":1177},{"class":669,"line":1176},30,[1178,1183,1187,1191,1195],{"type":40,"tag":667,"props":1179,"children":1180},{"style":689},[1181],{"type":45,"value":1182},"  --key",{"type":40,"tag":667,"props":1184,"children":1185},{"style":849},[1186],{"type":45,"value":880},{"type":40,"tag":667,"props":1188,"children":1189},{"style":689},[1190],{"type":45,"value":960},{"type":40,"tag":667,"props":1192,"children":1193},{"style":849},[1194],{"type":45,"value":965},{"type":40,"tag":667,"props":1196,"children":1197},{"style":700},[1198],{"type":45,"value":703},{"type":40,"tag":667,"props":1200,"children":1202},{"class":669,"line":1201},31,[1203,1208,1212,1217,1221],{"type":40,"tag":667,"props":1204,"children":1205},{"style":689},[1206],{"type":45,"value":1207},"  --update-expression",{"type":40,"tag":667,"props":1209,"children":1210},{"style":849},[1211],{"type":45,"value":852},{"type":40,"tag":667,"props":1213,"children":1214},{"style":689},[1215],{"type":45,"value":1216},"SET view_count = view_count + :inc",{"type":40,"tag":667,"props":1218,"children":1219},{"style":849},[1220],{"type":45,"value":862},{"type":40,"tag":667,"props":1222,"children":1223},{"style":700},[1224],{"type":45,"value":703},{"type":40,"tag":667,"props":1226,"children":1228},{"class":669,"line":1227},32,[1229,1233,1237,1242],{"type":40,"tag":667,"props":1230,"children":1231},{"style":689},[1232],{"type":45,"value":875},{"type":40,"tag":667,"props":1234,"children":1235},{"style":849},[1236],{"type":45,"value":880},{"type":40,"tag":667,"props":1238,"children":1239},{"style":689},[1240],{"type":45,"value":1241},"{\":inc\":{\"N\":\"1\"}}",{"type":40,"tag":667,"props":1243,"children":1244},{"style":849},[1245],{"type":45,"value":890},{"type":40,"tag":667,"props":1247,"children":1249},{"class":669,"line":1248},33,[1250],{"type":40,"tag":667,"props":1251,"children":1252},{"emptyLinePlaceholder":788},[1253],{"type":45,"value":791},{"type":40,"tag":667,"props":1255,"children":1257},{"class":669,"line":1256},34,[1258],{"type":40,"tag":667,"props":1259,"children":1260},{"style":674},[1261],{"type":45,"value":1262},"# Enable TTL\n",{"type":40,"tag":667,"props":1264,"children":1266},{"class":669,"line":1265},35,[1267,1271,1275,1280],{"type":40,"tag":667,"props":1268,"children":1269},{"style":684},[1270],{"type":45,"value":22},{"type":40,"tag":667,"props":1272,"children":1273},{"style":689},[1274],{"type":45,"value":692},{"type":40,"tag":667,"props":1276,"children":1277},{"style":689},[1278],{"type":45,"value":1279}," update-time-to-live",{"type":40,"tag":667,"props":1281,"children":1282},{"style":700},[1283],{"type":45,"value":703},{"type":40,"tag":667,"props":1285,"children":1287},{"class":669,"line":1286},36,[1288,1292,1296],{"type":40,"tag":667,"props":1289,"children":1290},{"style":689},[1291],{"type":45,"value":712},{"type":40,"tag":667,"props":1293,"children":1294},{"style":689},[1295],{"type":45,"value":717},{"type":40,"tag":667,"props":1297,"children":1298},{"style":700},[1299],{"type":45,"value":703},{"type":40,"tag":667,"props":1301,"children":1303},{"class":669,"line":1302},37,[1304,1309,1313,1318],{"type":40,"tag":667,"props":1305,"children":1306},{"style":689},[1307],{"type":45,"value":1308},"  --time-to-live-specification",{"type":40,"tag":667,"props":1310,"children":1311},{"style":849},[1312],{"type":45,"value":852},{"type":40,"tag":667,"props":1314,"children":1315},{"style":689},[1316],{"type":45,"value":1317},"Enabled=true,AttributeName=expireAt",{"type":40,"tag":667,"props":1319,"children":1320},{"style":849},[1321],{"type":45,"value":992},{"type":40,"tag":667,"props":1323,"children":1325},{"class":669,"line":1324},38,[1326],{"type":40,"tag":667,"props":1327,"children":1328},{"emptyLinePlaceholder":788},[1329],{"type":45,"value":791},{"type":40,"tag":667,"props":1331,"children":1333},{"class":669,"line":1332},39,[1334],{"type":40,"tag":667,"props":1335,"children":1336},{"style":674},[1337],{"type":45,"value":1338},"# Describe table (check indexes, capacity, status)\n",{"type":40,"tag":667,"props":1340,"children":1342},{"class":669,"line":1341},40,[1343,1347,1351,1356,1361],{"type":40,"tag":667,"props":1344,"children":1345},{"style":684},[1346],{"type":45,"value":22},{"type":40,"tag":667,"props":1348,"children":1349},{"style":689},[1350],{"type":45,"value":692},{"type":40,"tag":667,"props":1352,"children":1353},{"style":689},[1354],{"type":45,"value":1355}," describe-table",{"type":40,"tag":667,"props":1357,"children":1358},{"style":689},[1359],{"type":45,"value":1360}," --table-name",{"type":40,"tag":667,"props":1362,"children":1363},{"style":689},[1364],{"type":45,"value":1365}," MyTable\n",{"type":40,"tag":48,"props":1367,"children":1369},{"id":1368},"anti-patterns",[1370],{"type":45,"value":1371},"Anti-Patterns",{"type":40,"tag":135,"props":1373,"children":1374},{},[1375,1385,1403,1413,1423,1433,1443,1461],{"type":40,"tag":59,"props":1376,"children":1377},{},[1378,1383],{"type":40,"tag":142,"props":1379,"children":1380},{},[1381],{"type":45,"value":1382},"Scan for queries.",{"type":45,"value":1384}," If you're scanning with a filter, you need a GSI or a redesigned key schema.",{"type":40,"tag":59,"props":1386,"children":1387},{},[1388,1393,1395,1401],{"type":40,"tag":142,"props":1389,"children":1390},{},[1391],{"type":45,"value":1392},"Hot partition keys.",{"type":45,"value":1394}," A single partition key that receives disproportionate traffic (e.g., ",{"type":40,"tag":70,"props":1396,"children":1398},{"className":1397},[],[1399],{"type":45,"value":1400},"status=ACTIVE",{"type":45,"value":1402},") throttles the entire table.",{"type":40,"tag":59,"props":1404,"children":1405},{},[1406,1411],{"type":40,"tag":142,"props":1407,"children":1408},{},[1409],{"type":45,"value":1410},"Large items.",{"type":45,"value":1412}," DynamoDB max item size is 400 KB. Store large blobs in S3 and keep a pointer in DynamoDB.",{"type":40,"tag":59,"props":1414,"children":1415},{},[1416,1421],{"type":40,"tag":142,"props":1417,"children":1418},{},[1419],{"type":45,"value":1420},"Relational modeling.",{"type":45,"value":1422}," Don't normalize into many tables with joins — DynamoDB has no joins. Denormalize and use single-table design or composite keys.",{"type":40,"tag":59,"props":1424,"children":1425},{},[1426,1431],{"type":40,"tag":142,"props":1427,"children":1428},{},[1429],{"type":45,"value":1430},"Over-indexing.",{"type":45,"value":1432}," Each GSI duplicates data and consumes write capacity. Only create indexes for access patterns you actually need.",{"type":40,"tag":59,"props":1434,"children":1435},{},[1436,1441],{"type":40,"tag":142,"props":1437,"children":1438},{},[1439],{"type":45,"value":1440},"Using Scan in production code paths.",{"type":45,"value":1442}," Scans read the entire table and are expensive. Use Query with a well-designed key schema instead.",{"type":40,"tag":59,"props":1444,"children":1445},{},[1446,1451,1453,1459],{"type":40,"tag":142,"props":1447,"children":1448},{},[1449],{"type":45,"value":1450},"Ignoring pagination.",{"type":45,"value":1452}," Query and Scan return max 1 MB per call. Always handle ",{"type":40,"tag":70,"props":1454,"children":1456},{"className":1455},[],[1457],{"type":45,"value":1458},"LastEvaluatedKey",{"type":45,"value":1460}," for pagination.",{"type":40,"tag":59,"props":1462,"children":1463},{},[1464,1469,1471,1477],{"type":40,"tag":142,"props":1465,"children":1466},{},[1467],{"type":45,"value":1468},"Not using condition expressions.",{"type":45,"value":1470}," Without conditions on writes, concurrent updates silently overwrite each other. Use ",{"type":40,"tag":70,"props":1472,"children":1474},{"className":1473},[],[1475],{"type":45,"value":1476},"attribute_not_exists",{"type":45,"value":1478}," or version counters for optimistic locking.",{"type":40,"tag":48,"props":1480,"children":1482},{"id":1481},"output-format",[1483],{"type":45,"value":1484},"Output Format",{"type":40,"tag":41,"props":1486,"children":1487},{},[1488],{"type":45,"value":1489},"When recommending a table design, use this format:",{"type":40,"tag":1491,"props":1492,"children":1493},"table",{},[1494,1529],{"type":40,"tag":1495,"props":1496,"children":1497},"thead",{},[1498],{"type":40,"tag":1499,"props":1500,"children":1501},"tr",{},[1502,1508,1512,1516,1520,1524],{"type":40,"tag":1503,"props":1504,"children":1505},"th",{},[1506],{"type":45,"value":1507},"Entity",{"type":40,"tag":1503,"props":1509,"children":1510},{},[1511],{"type":45,"value":345},{"type":40,"tag":1503,"props":1513,"children":1514},{},[1515],{"type":45,"value":352},{"type":40,"tag":1503,"props":1517,"children":1518},{},[1519],{"type":45,"value":359},{"type":40,"tag":1503,"props":1521,"children":1522},{},[1523],{"type":45,"value":366},{"type":40,"tag":1503,"props":1525,"children":1526},{},[1527],{"type":45,"value":1528},"Attributes",{"type":40,"tag":1530,"props":1531,"children":1532},"tbody",{},[1533,1578],{"type":40,"tag":1499,"props":1534,"children":1535},{},[1536,1542,1551,1556,1565,1573],{"type":40,"tag":1537,"props":1538,"children":1539},"td",{},[1540],{"type":45,"value":1541},"User",{"type":40,"tag":1537,"props":1543,"children":1544},{},[1545],{"type":40,"tag":70,"props":1546,"children":1548},{"className":1547},[],[1549],{"type":45,"value":1550},"USER#\u003Cid>",{"type":40,"tag":1537,"props":1552,"children":1553},{},[1554],{"type":45,"value":1555},"PROFILE",{"type":40,"tag":1537,"props":1557,"children":1558},{},[1559],{"type":40,"tag":70,"props":1560,"children":1562},{"className":1561},[],[1563],{"type":45,"value":1564},"EMAIL#\u003Cemail>",{"type":40,"tag":1537,"props":1566,"children":1567},{},[1568],{"type":40,"tag":70,"props":1569,"children":1571},{"className":1570},[],[1572],{"type":45,"value":1550},{"type":40,"tag":1537,"props":1574,"children":1575},{},[1576],{"type":45,"value":1577},"name, email, ...",{"type":40,"tag":1499,"props":1579,"children":1580},{},[1581,1586,1594,1603,1612,1621],{"type":40,"tag":1537,"props":1582,"children":1583},{},[1584],{"type":45,"value":1585},"Order",{"type":40,"tag":1537,"props":1587,"children":1588},{},[1589],{"type":40,"tag":70,"props":1590,"children":1592},{"className":1591},[],[1593],{"type":45,"value":1550},{"type":40,"tag":1537,"props":1595,"children":1596},{},[1597],{"type":40,"tag":70,"props":1598,"children":1600},{"className":1599},[],[1601],{"type":45,"value":1602},"ORDER#\u003Ctimestamp>",{"type":40,"tag":1537,"props":1604,"children":1605},{},[1606],{"type":40,"tag":70,"props":1607,"children":1609},{"className":1608},[],[1610],{"type":45,"value":1611},"ORDER#\u003Cid>",{"type":40,"tag":1537,"props":1613,"children":1614},{},[1615],{"type":40,"tag":70,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":45,"value":1620},"STATUS#\u003Cstatus>",{"type":40,"tag":1537,"props":1622,"children":1623},{},[1624],{"type":45,"value":1625},"total, items, ...",{"type":40,"tag":41,"props":1627,"children":1628},{},[1629],{"type":45,"value":1630},"Include:",{"type":40,"tag":135,"props":1632,"children":1633},{},[1634,1639,1644],{"type":40,"tag":59,"props":1635,"children":1636},{},[1637],{"type":45,"value":1638},"All access patterns mapped to the key schema or index that serves them",{"type":40,"tag":59,"props":1640,"children":1641},{},[1642],{"type":45,"value":1643},"Capacity mode recommendation with rationale",{"type":40,"tag":59,"props":1645,"children":1646},{},[1647],{"type":45,"value":1648},"Estimated item sizes and read\u002Fwrite patterns",{"type":40,"tag":48,"props":1650,"children":1652},{"id":1651},"reference-files",[1653],{"type":45,"value":1654},"Reference Files",{"type":40,"tag":135,"props":1656,"children":1657},{},[1658],{"type":40,"tag":59,"props":1659,"children":1660},{},[1661,1667],{"type":40,"tag":70,"props":1662,"children":1664},{"className":1663},[],[1665],{"type":45,"value":1666},"references\u002Faccess-patterns.md",{"type":45,"value":1668}," — Key design examples (e-commerce, multi-tenant SaaS), GSI overloading, hierarchical sort keys, adjacency list, sparse index, write sharding, and single-table design patterns",{"type":40,"tag":48,"props":1670,"children":1672},{"id":1671},"related-skills",[1673],{"type":45,"value":1674},"Related Skills",{"type":40,"tag":135,"props":1676,"children":1677},{},[1678,1689,1700,1711,1722],{"type":40,"tag":59,"props":1679,"children":1680},{},[1681,1687],{"type":40,"tag":70,"props":1682,"children":1684},{"className":1683},[],[1685],{"type":45,"value":1686},"lambda",{"type":45,"value":1688}," — Lambda with DynamoDB Streams event source mapping",{"type":40,"tag":59,"props":1690,"children":1691},{},[1692,1698],{"type":40,"tag":70,"props":1693,"children":1695},{"className":1694},[],[1696],{"type":45,"value":1697},"api-gateway",{"type":45,"value":1699}," — API Gateway direct integration with DynamoDB",{"type":40,"tag":59,"props":1701,"children":1702},{},[1703,1709],{"type":40,"tag":70,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":45,"value":1708},"messaging",{"type":45,"value":1710}," — DynamoDB Streams feeding event-driven architectures",{"type":40,"tag":59,"props":1712,"children":1713},{},[1714,1720],{"type":40,"tag":70,"props":1715,"children":1717},{"className":1716},[],[1718],{"type":45,"value":1719},"cost-check",{"type":45,"value":1721}," — DynamoDB capacity mode cost analysis, reserved capacity",{"type":40,"tag":59,"props":1723,"children":1724},{},[1725,1731],{"type":40,"tag":70,"props":1726,"children":1728},{"className":1727},[],[1729],{"type":45,"value":1730},"iam",{"type":45,"value":1732}," — Fine-grained access control with DynamoDB condition keys",{"type":40,"tag":1734,"props":1735,"children":1736},"style",{},[1737],{"type":45,"value":1738},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1740,"total":1841},[1741,1755,1770,1782,1794,1809,1826],{"slug":1742,"name":1742,"fn":1743,"description":1744,"org":1745,"tags":1746,"stars":23,"repoUrl":24,"updatedAt":1754},"agentcore","design Amazon Bedrock AgentCore architectures","Deep-dive into Amazon Bedrock AgentCore platform design, service selection, deployment, and production operations. This skill should be used when the user asks to \"design an AgentCore architecture\", \"deploy agents on AgentCore\", \"configure AgentCore Runtime\", \"set up AgentCore Memory\", \"use AgentCore Gateway\", \"configure AgentCore Identity\", \"set up AgentCore Policy\", \"plan agent observability\", \"evaluate agent quality\", \"move agent PoC to production\", or mentions AgentCore, AgentCore Runtime, AgentCore Memory, AgentCore Gateway, AgentCore Identity, AgentCore Policy, AgentCore Evaluations, AgentCore Code Interpreter, AgentCore Browser, A2A protocol, or multi-agent orchestration on AWS.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1747,1750,1753],{"name":1748,"slug":1749,"type":16},"Agents","agents",{"name":1751,"slug":1752,"type":16},"Architecture","architecture",{"name":21,"slug":22,"type":16},"2026-07-12T08:40:11.108951",{"slug":1756,"name":1756,"fn":1757,"description":1758,"org":1759,"tags":1760,"stars":23,"repoUrl":24,"updatedAt":1769},"aidlc-lite","develop AI applications on AWS","Lightweight AI development lifecycle for building on AWS. A simplified take on the AI-DLC philosophy — think together, then build fast. Acts as a design partner that understands intent, proposes alternatives with trade-offs, and ships working code without the ceremony of full requirements\u002Fdesign\u002Fspec documents. Use when a founder says \"build X on AWS\", \"add Y to my stack\", \"scaffold an API\", or \"write the CDK for Z\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1761,1762,1765,1766],{"name":1748,"slug":1749,"type":16},{"name":1763,"slug":1764,"type":16},"AI Infrastructure","ai-infrastructure",{"name":21,"slug":22,"type":16},{"name":1767,"slug":1768,"type":16},"Engineering","engineering","2026-07-12T08:40:40.204103",{"slug":1771,"name":1771,"fn":1772,"description":1773,"org":1774,"tags":1775,"stars":23,"repoUrl":24,"updatedAt":1781},"architect-for-startups","advise on AWS architecture for startups","AWS architecture advisor tailored specifically for startups. Alters AWS architecture recommendations based on startup stage (pre-revenue through Series B+), team size, runway, and credits. ALWAYS use when asked about building on AWS, choosing services, planning infrastructure, managing costs with credits, or preparing architecture for fundraising.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1776,1777,1778],{"name":1751,"slug":1752,"type":16},{"name":21,"slug":22,"type":16},{"name":1779,"slug":1780,"type":16},"Strategy","strategy","2026-07-12T08:41:33.557354",{"slug":1783,"name":1783,"fn":1784,"description":1785,"org":1786,"tags":1787,"stars":23,"repoUrl":24,"updatedAt":1793},"aws-architect","design and review AWS architectures","Design and review AWS architectures following Well-Architected Framework principles. Use when planning new infrastructure, reviewing existing architectures, evaluating trade-offs between AWS services, or when asked about AWS best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1788,1789,1790],{"name":1751,"slug":1752,"type":16},{"name":21,"slug":22,"type":16},{"name":1791,"slug":1792,"type":16},"Infrastructure","infrastructure","2026-07-12T08:40:57.630086",{"slug":1795,"name":1795,"fn":1796,"description":1797,"org":1798,"tags":1799,"stars":23,"repoUrl":24,"updatedAt":1808},"aws-compare","compare AWS architecture options","Compare 2-3 AWS architecture options side-by-side across cost, complexity, performance, security, and operational burden. Use when evaluating trade-offs between approaches or when the user is deciding between options.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1800,1801,1802,1805],{"name":1751,"slug":1752,"type":16},{"name":21,"slug":22,"type":16},{"name":1803,"slug":1804,"type":16},"Cost Optimization","cost-optimization",{"name":1806,"slug":1807,"type":16},"Security","security","2026-07-12T08:40:23.960287",{"slug":1810,"name":1810,"fn":1811,"description":1812,"org":1813,"tags":1814,"stars":23,"repoUrl":24,"updatedAt":1825},"aws-debug","debug AWS infrastructure and deployment failures","Debug AWS infrastructure issues, deployment failures, and runtime errors. Use when troubleshooting CloudFormation stack failures, Lambda errors, ECS task failures, permission issues, networking problems, or any AWS service misbehavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1815,1816,1819,1822],{"name":21,"slug":22,"type":16},{"name":1817,"slug":1818,"type":16},"Debugging","debugging",{"name":1820,"slug":1821,"type":16},"Deployment","deployment",{"name":1823,"slug":1824,"type":16},"Observability","observability","2026-07-12T08:40:16.767171",{"slug":1827,"name":1827,"fn":1828,"description":1829,"org":1830,"tags":1831,"stars":23,"repoUrl":24,"updatedAt":1840},"aws-diagram","generate AWS architecture diagrams","Generate AWS architecture diagrams in Mermaid or ASCII from a description, existing IaC, or conversation context. Use when the user wants to visualize an architecture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1832,1833,1834,1837],{"name":1751,"slug":1752,"type":16},{"name":21,"slug":22,"type":16},{"name":1835,"slug":1836,"type":16},"Diagrams","diagrams",{"name":1838,"slug":1839,"type":16},"Visualization","visualization","2026-07-12T08:40:43.26341",42,{"items":1843,"total":2013},[1844,1859,1878,1888,1901,1914,1924,1934,1953,1968,1983,1998],{"slug":1845,"name":1845,"fn":1846,"description":1847,"org":1848,"tags":1849,"stars":1856,"repoUrl":1857,"updatedAt":1858},"agentcore-investigation","investigate Bedrock AgentCore runtime sessions","Investigate Bedrock AgentCore runtime sessions via CloudWatch Logs Insights — resolve session\u002Ftrace IDs, query OTEL spans, filter noise, build timelines. Use when debugging AgentCore agent sessions, tracing tool calls, or analyzing latency.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1850,1851,1852,1855],{"name":21,"slug":22,"type":16},{"name":1817,"slug":1818,"type":16},{"name":1853,"slug":1854,"type":16},"Logs","logs",{"name":1823,"slug":1824,"type":16},9427,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fmcp","2026-07-12T08:37:22.601527",{"slug":1860,"name":1861,"fn":1862,"description":1863,"org":1864,"tags":1865,"stars":1856,"repoUrl":1857,"updatedAt":1877},"amazon-aurora-dsql","amazon aurora dsql","build applications with Aurora DSQL","Build with Aurora DSQL — manage schemas, execute queries, handle migrations, diagnose query plans, load data, and develop applications with a serverless, distributed SQL database. Covers IAM auth, multi-tenant patterns, MySQL-to-DSQL and PostgreSQL-to-DSQL schema conversion, FK replacement code generation, OCC retry patterns, ORM migration (Django\u002FHibernate\u002FRails), DDL operations, query plan explainability, SQL compatibility validation, and bulk data loading. Triggers on phrases like: DSQL, Aurora DSQL, create DSQL table, DSQL schema, migrate to DSQL, distributed SQL database, serverless PostgreSQL-compatible database, DSQL query plan, DSQL EXPLAIN ANALYZE, why is my DSQL query slow, DSQL foreign key, DSQL OCC retry, DSQL multi-region, load into DSQL, load CSV into DSQL, bulk load DSQL, aurora-dsql-loader.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1866,1869,1870,1871,1874],{"name":1867,"slug":1868,"type":16},"Aurora","aurora",{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":1872,"slug":1873,"type":16},"Serverless","serverless",{"name":1875,"slug":1876,"type":16},"SQL","sql","2026-07-12T08:36:45.053393",{"slug":1879,"name":1880,"fn":1862,"description":1863,"org":1881,"tags":1882,"stars":1856,"repoUrl":1857,"updatedAt":1887},"aurora-dsql","aurora dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1883,1884,1885,1886],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":1872,"slug":1873,"type":16},{"name":1875,"slug":1876,"type":16},"2026-07-12T08:36:42.694299",{"slug":1889,"name":1890,"fn":1862,"description":1863,"org":1891,"tags":1892,"stars":1856,"repoUrl":1857,"updatedAt":1900},"aws-dsql","aws dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1893,1894,1895,1898,1899],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":1896,"slug":1897,"type":16},"Migration","migration",{"name":1872,"slug":1873,"type":16},{"name":1875,"slug":1876,"type":16},"2026-07-12T08:36:38.584057",{"slug":1902,"name":1903,"fn":1862,"description":1863,"org":1904,"tags":1905,"stars":1856,"repoUrl":1857,"updatedAt":1913},"distributed-postgres","distributed postgres",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1906,1907,1908,1911,1912],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":1909,"slug":1910,"type":16},"PostgreSQL","postgresql",{"name":1872,"slug":1873,"type":16},{"name":1875,"slug":1876,"type":16},"2026-07-12T08:36:46.530743",{"slug":1915,"name":1916,"fn":1862,"description":1863,"org":1917,"tags":1918,"stars":1856,"repoUrl":1857,"updatedAt":1923},"distributed-sql","distributed sql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1919,1920,1921,1922],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":1872,"slug":1873,"type":16},{"name":1875,"slug":1876,"type":16},"2026-07-12T08:36:48.104182",{"slug":1925,"name":1925,"fn":1862,"description":1863,"org":1926,"tags":1927,"stars":1856,"repoUrl":1857,"updatedAt":1933},"dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1928,1929,1930,1931,1932],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":1896,"slug":1897,"type":16},{"name":1872,"slug":1873,"type":16},{"name":1875,"slug":1876,"type":16},"2026-07-12T08:36:36.374512",{"slug":1935,"name":1935,"fn":1936,"description":1937,"org":1938,"tags":1939,"stars":1950,"repoUrl":1951,"updatedAt":1952},"cost-efficiency-analyzer","analyze cost efficiency and expenses","Analyzes cost structure, cost efficiency, and expense management from P&L data. Use when the user asks about costs, expenses, COGS, operating expenses, cost ratios, cost control, spending efficiency, margin compression from cost side, or wants to understand where money is going. Also use for \"are we spending too much\", \"cost breakdown\", \"expense analysis\", or \"how efficient are our operations\". NOT for revenue or top-line analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1940,1943,1946,1947],{"name":1941,"slug":1942,"type":16},"Accounting","accounting",{"name":1944,"slug":1945,"type":16},"Analytics","analytics",{"name":1803,"slug":1804,"type":16},{"name":1948,"slug":1949,"type":16},"Finance","finance",3176,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fagentcore-samples","2026-07-12T08:40:03.29555",{"slug":1954,"name":1954,"fn":1955,"description":1956,"org":1957,"tags":1958,"stars":1950,"repoUrl":1951,"updatedAt":1967},"executive-financial-briefing","generate executive financial briefings","Generates a concise executive-level financial briefing or summary suitable for a CEO, CFO, or board presentation. Use when the user asks for a summary, briefing, executive summary, board update, financial overview, financial health check, or \"how is the business doing\". Covers the full P&L picture in one page. Also use for \"give me the highlights\", \"what do I need to know\", or \"quick financial update\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1959,1960,1961,1964],{"name":21,"slug":22,"type":16},{"name":1948,"slug":1949,"type":16},{"name":1962,"slug":1963,"type":16},"Management","management",{"name":1965,"slug":1966,"type":16},"Reporting","reporting","2026-07-12T08:40:02.066471",{"slug":1969,"name":1969,"fn":1970,"description":1971,"org":1972,"tags":1973,"stars":1950,"repoUrl":1951,"updatedAt":1982},"multi-quarter-trend-analysis","analyze multi-quarter financial trends","Analyzes financial trends across multiple quarters by comparing P&L metrics over time. Use when the user wants to see trends, patterns, trajectories, or directional movement across 3 or more quarters. Also use for \"how are we trending\", \"show me the trend\", \"track performance over time\", \"quarter over quarter comparison across all quarters\", or any multi-period longitudinal analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1974,1975,1976,1979],{"name":1944,"slug":1945,"type":16},{"name":1948,"slug":1949,"type":16},{"name":1977,"slug":1978,"type":16},"Financial Statements","financial-statements",{"name":1980,"slug":1981,"type":16},"Variance Analysis","variance-analysis","2026-07-12T08:40:00.79141",{"slug":1984,"name":1984,"fn":1985,"description":1986,"org":1987,"tags":1988,"stars":1950,"repoUrl":1951,"updatedAt":1997},"pdf","process and manipulate PDF documents","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1989,1992,1995],{"name":1990,"slug":1991,"type":16},"Automation","automation",{"name":1993,"slug":1994,"type":16},"Documents","documents",{"name":1996,"slug":1984,"type":16},"PDF","2026-07-12T08:41:44.135656",{"slug":1999,"name":1999,"fn":2000,"description":2001,"org":2002,"tags":2003,"stars":1950,"repoUrl":1951,"updatedAt":2012},"quarterly-kpi-calculator","calculate quarterly financial KPIs","Calculates quarterly financial KPIs from P&L data. P&L figures can be provided directly by the user or fetched from the financial data MCP server. Use when the user wants KPI calculations such as Gross Margin %, EBITDA Margin %, Operating Expense Ratio, or Revenue Growth % QoQ. Also use for quarterly performance review, P&L analysis, or interpreting financial ratios against benchmarks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2004,2005,2008,2009],{"name":1941,"slug":1942,"type":16},{"name":2006,"slug":2007,"type":16},"Data Analysis","data-analysis",{"name":1948,"slug":1949,"type":16},{"name":2010,"slug":2011,"type":16},"KPI","kpi","2026-07-12T08:39:59.54971",150]