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