Inspiration

Every developer I know has lost hours to CI/CD setup. You copy a workflow file from somewhere, rename a few stages, push, and spend the next hour fixing YAML indentation and missing secrets. It's the same judgment-heavy, repetitive work every single time — and it's exactly the kind of task an agent should own. I wanted to build something that doesn't just generate a config file, but actually understands your repo, generates the right pipeline, validates it, and proves it works by running it.


What I Built

Flow is a multi-agent CI/CD pipeline builder. You give it a GitHub URL, and a team of specialized AI agents takes over:

  • Repo Analysis reads your package.json, detects your framework, and extracts the exact scripts available
  • Pipeline Gen builds a structured pipeline incrementally using tool calls — not a single JSON blob, but stage by stage
  • Validation checks for missing dependencies, disconnected stages, and best practice violations
  • Export converts the abstract pipeline to GitHub Actions, GitLab CI, Jenkinsfile, or CodePipeline YAML
  • CI Runner executes the pipeline inside an ephemeral Lambda MicroVM, streaming logs back to the browser in real time

The result is a visual canvas where parallel stages appear side-by-side, a run panel with live output per stage, and an export panel with a ready-to-commit config file.


How I Built It

Agent orchestration — Each agent is a standalone Python container deployed on AWS Bedrock AgentCore, built with the Strands Agents SDK. The Orchestrator routes to sub-agents by calling them as tools via InvokeAgentRuntime, passing context explicitly.

Pipeline execution — AWS Lambda Durable Execution makes the CI runner cost-efficient. The orchestrator Lambda suspends at callback.result() after dispatching the pipeline to the MicroVM, consuming no compute while the pipeline runs. When the runner finishes, it signals back via a durable callback and the Lambda resumes to clean up.

Visual canvas — Built with React Flow and dagre for automatic DAG layout. Parallel stages (stages at the same dependency depth) are positioned side-by-side automatically, so a pipeline with lint and test running in parallel after install looks exactly like that on screen.

Infrastructure — Everything is provisioned with Terraform: AgentCore runtimes, API Gateway (REST + WebSocket), Lambda functions, DynamoDB tables, S3, Cognito, and the MicroVM image build pipeline.


Challenges

Runner stages never saved. The pipeline-gen agent was correctly generating runner_stages (the executable steps for the CI runner), but they weren't reaching DynamoDB. The orchestrator response was wrapped in markdown fences — json\n{...}\n — and the frontend's JSON.parse(resultText) silently threw and kept runner_stages = []. The fix was to reuse the already-parsed parsedResult object instead of re-parsing resultText.

WebSocket dropped events. Lambda MicroVMs can take 30–60 seconds to boot and run. If the user's WebSocket connection drops and reconnects mid-run, the pipeline completion event is sent to a stale connection ID (GoneException). Solved with a 15-second polling fallback: when a run is active, the frontend periodically sends a run_status message to check DynamoDB directly, recovering the UI state without a page reload.


What I Learned

Multi-agent systems have emergent failure modes that single-agent systems don't. A wrong key name, a markdown fence, a shared session — any of these silently breaks the chain two hops later. Observability and logging at every hop isn't optional; it's the only way to find these bugs.

Durable execution is genuinely powerful for human-in-the-loop and long-running agent workflows. Suspending a Lambda mid-execution while a MicroVM runs independently — and resuming it via a callback — is a clean pattern that Step Functions would make much more verbose.

AgentCore's session model is designed for persistent user conversations. For tool-calling sub-agents that are called fresh each time, you want stateless sessions — meaning unique session IDs per invocation, not shared ones.

Built With

Share this project:

Updates

Submission history