Actively Maintained Work
TeamOps
Next.js TypeScript PostgreSQL Prisma Docker Terraform AWS ECS AWS Bedrock Claude
Overview
Engineering teams generate a lot of noise, hundreds of ADO board tickets spread across projects, features, and sprints. Senior leaders don't need all of that; they need to know what's blocked, what's urgent, and what needs their attention right now. TeamOps solves this by syncing projects, features, and tasks from Azure DevOps boards (or letting teams create them manually) and presenting a curated, prioritized view built for leadership. On top of that, a Claude-powered chat interface (via AWS Bedrock) lets anyone ask questions about work status in plain English, no board navigation, no filters, no hunting through tickets.
What I built
- ADO board sync pipeline that pulls projects, features, and tasks and keeps them up to date
- Manual creation flow for work that lives outside ADO
- Priority and urgency tagging so senior leaders can zero in on what needs their attention
- Claude (AWS Bedrock) conversational interface for querying tasks and project status in plain English
- Role-based views so leaders see curated signal without day-to-day board noise
- Hosted on AWS ECS with Docker and Terraform-managed infrastructure
- PostgreSQL + Prisma for relational modeling of the ADO entity hierarchy
What I learned
- Building sync pipelines against third-party APIs (ADO) with change detection and conflict handling
- AWS ECS deployments with Terraform, infrastructure as code for a real production workload
- Integrating Claude via AWS Bedrock for conversational querying over structured relational data
- Modeling hierarchical data (project → feature → task) in a way that stays queryable at each level
- Designing for a non-technical audience, the UI needs to surface insight, not just expose data
Architecture
flowchart TD
ADO["Azure DevOps Boards"]
Member([" Team Member"])
Leaders([" Senior Leaders"])
subgraph AWS["AWS ECS · Docker · Terraform"]
Sync["ADO Sync Pipeline"]
subgraph App["Next.js Application"]
API["API Routes"]
UI["Leadership Dashboard"]
Chat["Claude Chat Interface"]
end
DB[("PostgreSQL
(Prisma)")]
Bedrock["AWS Bedrock
(Claude)"]
end
ADO -->|"sync"| Sync
Sync --> DB
Member -->|"manual entry"| API
API --> DB
DB --> UI
DB --> Chat
Chat <-->|"query + response"| Bedrock
Leaders --> UI
Leaders --> Chat