This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Live Meeting Assistant (LMA) -- an AWS-based solution for real-time meeting transcription, AI-powered meeting assistance, and virtual meeting participation. Built on Amazon Transcribe, Amazon Bedrock, and the Strands Agents SDK. Current version is tracked in ./VERSION.
Prerequisites: bash, node v18/v20/v22, npm, docker (running), zip, python3, pip3, virtualenv, aws cli, sam cli (>=1.118.0).
AWS profile: Always use AWS_PROFILE=default for build/deploy/test commands in this repo unless the user explicitly tells you otherwise. Other profiles (e.g. bedrock) point at unrelated accounts and will fail with AccessDenied on S3/CloudFormation.
Full build and publish to S3:
./publish.sh <cfn_bucket_basename> <cfn_prefix> <region> [public]This validates dependencies, builds all stacks (SAM + npm), uploads artifacts to S3, and outputs CloudFormation deploy URLs. Deployment takes 35-40 minutes via CloudFormation.
AI stack Makefile (in lma-ai-stack/):
- Requires
CONFIG_ENVenv var (maps to SAM--config-env). Set inconfig.mkorconfig-$(USER).mk. make install-- set up Python venvs and npm depsmake build-- build SAM applicationmake package-- package artifactsmake deploy-- deploy CloudFormation stackmake test-local-invoke-default-- local SAM Lambda invocation
UI (in lma-ai-stack/source/ui/):
npm install && npm start # local dev server
npm run build # production build
npm test # vitest testsWebSocket server (in lma-websocket-transcriber-stack/source/app/):
npm install && npm run build # TypeScript build
npm test # jest testsVirtual Participant (in lma-virtual-participant-stack/backend/):
npm install && npm run build # TypeScript buildMakefile targets in lma-ai-stack/:
make lint-cfn-lint-- CloudFormation template lintmake lint-yamllint-- YAML lintmake lint-pylint-- Python lint (100 char lines, see.pylintrc)make lint-mypy-- Python type checkingmake lint-bandit-- Python security scanningmake lint-validate-- SAM template validation
JavaScript/TypeScript uses ESLint (airbnb-base) + Prettier (120 char lines, single quotes, trailing commas). Config in lma-ai-stack/.eslintrc.json and .prettierrc.
Python uses Black (formatter), Flake8, Pylint (100 char lines). Config in lma-ai-stack/.pylintrc and .flake8.
Nested CloudFormation stacks orchestrated by lma-main.yaml:
| Stack | Purpose | Language |
|---|---|---|
lma-ai-stack/ |
Core stack: Lambda functions, AppSync GraphQL API, Cognito auth, DynamoDB, UI (React/CloudFront) | Python (Lambdas), React (UI) |
lma-websocket-transcriber-stack/ |
WebSocket server on ECS Fargate ingesting stereo audio, streaming to Amazon Transcribe, writing to Kinesis | TypeScript/Fastify |
lma-virtual-participant-stack/ |
Headless CloakBrowser/Chromium (Playwright) on ECS Fargate joining meetings, optional voice assistant + avatar | TypeScript |
lma-vpc-stack/ |
VPC networking, security groups, NAT gateways | CloudFormation |
lma-meetingassist-setup-stack/ |
Meeting assistant configuration | CloudFormation |
lma-bedrockkb-stack/ |
Bedrock Knowledge Base setup | CloudFormation |
lma-cognito-stack/ |
Cognito user pool and identity pool | CloudFormation |
lma-llm-template-setup-stack/ |
LLM prompt templates stored in DynamoDB | CloudFormation |
lma-chat-button-config-stack/ |
Chat UI button configuration | CloudFormation |
lma-nova-sonic-config-stack/ |
Nova Sonic voice assistant config | CloudFormation |
Data flow: Browser audio -> WebSocket server (Fargate) -> Amazon Transcribe -> Kinesis Data Stream -> Call Event Processor Lambda (Strands Agents SDK) -> DynamoDB + AppSync (real-time GraphQL subscriptions) -> React UI.
Key source locations:
- Lambda functions:
lma-ai-stack/source/lambda_functions/(19 functions) - AppSync resolvers:
lma-ai-stack/source/appsync/(39 resolvers) - React UI:
lma-ai-stack/source/ui/ - Lambda layers:
lma-ai-stack/source/lambda_layers/ - CloudFormation templates:
lma-ai-stack/deployment/
Meeting Assistant uses the Strands Agents SDK with Amazon Bedrock. It supports built-in tools (transcript search, web search, document search, meeting history), MCP server integration for external tools, and Bedrock Guardrails. Customization is done via DynamoDB-stored LLM prompt templates and chat button configs.
Full documentation lives in ./docs/ with the master entry point at docs/INDEX.md. Scattered .md files in stack subdirectories are redirect stubs pointing to the consolidated docs.
mainbranch: releasesdevelopbranch: active development (default PR target)- Feature branches:
feature/prefix - Release branches:
release/prefix
Project-specific coding patterns, checklists, and review workflows live in
.claude/skills/. Consult the relevant skill file whenever a task touches
the corresponding domain — these conventions take precedence over generic
patterns.
| Skill File | When to Use |
|---|---|
.claude/skills/backend-lambda.md |
Writing Python Lambda handlers in lma-ai-stack/source/lambda_functions/ |
.claude/skills/frontend-ui.md |
React / Cloudscape UI changes in lma-ai-stack/source/ui/ |
.claude/skills/infrastructure.md |
CloudFormation / SAM templates, nested stacks, GovCloud rules |
.claude/skills/code-review.md |
Pre-commit self-review checklist for your own changes |
.claude/skills/pr-review.md |
Reviewing a GitHub PR or GitLab MR at a URL (e.g. review <url>) |
.claude/skills/integ-tests.md |
Running end-to-end integration tests against a live deployed stack (make integ-tests) |
When asked to review <PR/MR URL>, follow .claude/skills/pr-review.md and
produce a structured review answering the six questions (good PR / safe /
good UX / no security issues / well documented / safe to merge).