Back to Blog

Amazon's Kiro Writes the Spec Before the Code — And That Changes Everything

Karen Lowe
Karen Lowe
2 updates · last Apr 09
UPDATE HISTORY
Apr 09 Updated article content to improve reading experience.
Apr 09 Improved article wording and structure for better readability.
# Kiro

Every developer has a dirty secret: we hate writing specs. We'd rather jump straight into code, figure it out as we go, and retroactively document what we built — if we document it at all. And every time, without fail, this bites us. A feature that seemed simple in our heads turns into a three-week refactoring nightmare because nobody sat down and thought through the edge cases first.

Amazon's Kiro is the first AI coding tool I've used that directly confronts this problem. Instead of helping you write code faster (like Cursor or Copilot), Kiro insists on writing the spec first — the requirements, the design document, the edge cases, the acceptance criteria — and then generates code that matches that spec. It sounds paternalistic. It sounds slow. In practice, it's the most production-quality AI coding experience I've had.

I've been using Kiro for about five weeks now, primarily on a Node.js microservices project that integrates heavily with AWS. Here's what the spec-driven approach actually looks like in daily work, where it shines, where it frustrates, and why I think it represents a fundamentally different bet on the future of AI-assisted development.


01 What Kiro Is and Where It Came From

Kiro is an AI-powered IDE built by Amazon Web Services. It launched in preview in mid-2025 and was one of the more talked-about announcements on Product Hunt that month — partly because of the Amazon branding, and partly because its approach was so different from the Cursor/Copilot paradigm that dominates the AI coding tool space.

The core philosophy: most AI coding tools optimize for speed — write code faster, complete lines faster, generate boilerplate faster. Kiro optimizes for correctness. Its thesis is that the biggest bottleneck in professional software development isn't typing speed; it's the gap between what a developer intended and what they actually built. By forcing that intent through a structured specification process, Kiro aims to produce code that's closer to production-ready on the first pass.

Kiro is built on familiar foundations — it's a VS Code-based editor with standard extension support — but the AI workflow is uniquely its own. When you start a new feature, Kiro doesn't open a blank file and wait for you to type. It opens a spec panel and starts asking you questions.

💡 Looking to try this yourself? You can AI Coding Subscriptions on Acccup at a discounted price with instant delivery.


02 Spec-Driven Development: How It Actually Works

Here's a concrete walkthrough. I needed to add a notification service to an existing application — users should receive email and in-app notifications when certain events occur (order placed, order shipped, payment failed, etc.).

In Cursor, I would have opened Composer and said "Create a notification service with email and in-app support." I'd get code in 90 seconds. In Kiro, the process was fundamentally different.

I described the feature in plain English. Kiro responded not with code, but with a structured specification document that included:

  • Functional requirements: A bulleted list of what the service must do — send notifications through multiple channels, support template-based content, allow user preference management, handle delivery failures with retry logic.
  • Edge cases: What happens if the email service is down? What if a user has disabled notifications but an admin-level notification needs to get through? What about rate limiting to prevent notification spam?
  • Data model: A proposed schema for notifications, user preferences, delivery logs, and templates.
  • API design: Endpoint definitions with request/response shapes, error codes, and authentication requirements.
  • Acceptance criteria: Specific, testable conditions that define when the feature is "done."

This spec generation took about 30 seconds. But here's the key: Kiro then asked me to review and refine it. "Do you want to include SMS as a channel? Should notifications be persisted or ephemeral? What's the expected volume — dozens per hour or thousands per minute?" Each question I answered refined the spec further.

Only after I approved the spec did Kiro begin generating code. And the code it generated was remarkably different from what I'd get from a "just write it" prompt — it included proper error handling for every edge case we'd identified, the data model matched the spec exactly, the API endpoints had validation for every field, and the retry logic was actually sound, not just a naive exponential backoff.

The total time from "I want a notification service" to working code was about 25 minutes — longer than Cursor's 90 seconds of code generation, but the code required almost no post-generation fixing. When I factor in the debugging and refactoring I'd normally do after a fast AI generation, the total time-to-production-ready was actually shorter with Kiro.


03 The Hooks System: Automation That Respects Your Workflow

Kiro's hooks system is one of those features that sounds minor in a feature list but becomes essential in practice. Hooks are automated actions that trigger at specific points in your development workflow — on file save, on spec approval, on code generation, on test completion.

Here's how I use them. I have a hook that runs on every code generation event: it automatically runs ESLint and Prettier on the generated code, executes the relevant test suite, and if any tests fail, feeds the failure output back to Kiro for automatic correction. Another hook triggers on spec approval: it creates a draft pull request description from the spec document, adds the acceptance criteria as a checklist, and tags the relevant reviewers based on the files that will be affected.

The hooks system is configured through a straightforward YAML file in your project root. You define the trigger event, the commands to run, and optionally, conditions for when the hook should fire. It's similar in concept to Git hooks or GitHub Actions, but specifically designed for the AI coding workflow.

What makes hooks genuinely useful is the feedback loop. When a hook runs tests after code generation and some fail, Kiro doesn't just show you the failures — it uses them as context for its next iteration. "The notification service tests are failing because the retry logic doesn't handle the case where the email provider returns a 429 status code. Let me update the retry handler to include rate-limit awareness." This self-correcting loop means that by the time code reaches my review, it's already been through a cycle of automated validation.

An early adopter on Product Hunt commented: "Kiro's hooks turned AI code generation from a slot machine into a pipeline." I couldn't agree more. The predictability is the point.


04 How Kiro Differs from Cursor, Copilot, and the Rest

The most common question I get when I talk about Kiro: "How is this different from just asking Cursor/Copilot to write a spec first?" It's a fair question, and the answer is that the difference isn't in capability — it's in enforcement and integration.

You absolutely can prompt Cursor's Composer to "first write a spec, then implement it." But nothing in the tool enforces that workflow. You'll do it for the first feature, skip it when you're in a rush on the second, and abandon it entirely by the third. Kiro doesn't give you the option to skip. The spec step is a first-class part of the workflow, with its own UI, its own refinement process, and its own versioning. It's the difference between "we should write tests" and a CI pipeline that blocks merges without test coverage.

  • vs. Cursor: Cursor is faster for quick, iterative coding where you know what you want and just need to get it done. Kiro is better when correctness matters more than speed — new features, API contracts, anything that other services will depend on.
  • vs. Copilot: Copilot operates at the line/function level. Kiro operates at the feature level. They're solving different problems at different scales.
  • vs. Windsurf: Windsurf's Cascade is the closest competitor in terms of multi-step reasoning, but Cascade still follows the "generate first, validate later" pattern. Kiro inverts this — validate the design, then generate.

A Hacker News thread about Kiro's launch had a comment that nailed it: "Every other AI coding tool is trying to make developers faster. Kiro is trying to make developers more correct. In a world of microservices and API contracts, I'm not sure speed is the binding constraint anymore." Whether you agree with that premise determines whether Kiro is for you.


05 AWS Integration: The Quiet Advantage

Given that Kiro comes from Amazon, you'd expect deep AWS integration, and it delivers — though not in the heavy-handed way you might fear. Kiro doesn't push you toward AWS services. But if you're already in the AWS ecosystem, it understands that ecosystem natively.

When I was building a Lambda function triggered by an SQS queue, Kiro's spec included AWS-specific considerations that a generic AI tool wouldn't think to include: DLQ (dead letter queue) configuration, visibility timeout settings, batch size optimization for the expected message volume, and IAM role permissions scoped to least-privilege. This isn't just generic cloud knowledge — it's specific, practical AWS knowledge that would normally require reading three or four documentation pages.

The integration extends to deployment. Kiro can generate CloudFormation or CDK templates that match the infrastructure requirements of the code it produces. When I generated a notification service, it also offered to generate a CDK stack with the SES configuration, DynamoDB tables for notification storage, and the Lambda/API Gateway setup — all consistent with the spec we'd approved.

For teams that are all-in on AWS (and in my experience, that's a lot of teams), this native understanding is a significant advantage over tools that treat cloud infrastructure as an afterthought.


06 The Honest Frustrations

Kiro is not perfect, and the spec-driven approach has real tradeoffs:

  • Speed for small tasks: When I just need to write a utility function or fix a quick bug, Kiro's spec process is overkill. It adds friction to tasks that should be fast. I've taken to using Kiro for feature-level work and keeping a lightweight extension for small edits.
  • Spec quality depends on your input: Garbage in, garbage out. If you give Kiro a vague description, it generates a vague spec, and the resulting code reflects that vagueness. The spec step is only as good as your ability to articulate what you actually want — which, ironically, is the skill most developers are weakest at.
  • Ecosystem maturity: Kiro is newer than Cursor or Copilot, and it shows. The community is smaller, the documentation has gaps, and some workflows feel rough around the edges. The hooks system is powerful but under-documented — I've had to experiment to figure out some configurations.
  • Non-AWS projects: While Kiro works fine with any tech stack, its deep knowledge noticeably favors AWS services. If you're on GCP or Azure, you won't get the same depth of infrastructure understanding. The core spec-driven workflow still works, but you lose the deployment generation advantage.
  • Preview limitations: As of my writing, Kiro is still in preview. Some features are rough, rate limits during peak hours can be frustrating, and the pricing model for general availability hasn't been fully announced.

On the AWS developer blog, the team has been transparent about the roadmap — multi-cloud parity is planned, and the hooks system is getting a visual configuration UI. But for now, Kiro is most compelling for AWS-centric teams doing feature-level development where correctness matters.


07 My Daily Workflow with Kiro

  • 01 Feature planning with specs — Every new feature starts as a Kiro spec session. I describe the feature in 2-3 paragraphs, let Kiro generate the structured spec, then spend 5-10 minutes refining it. This replaces the informal "think about it while coding" approach I used to have.
  • 02 Spec review with the team — I share the generated spec with my team lead for a quick review before code generation. This catches misunderstandings early — before any code exists. It's become our lightweight design review process.
  • 03 Code generation and hooks — After spec approval, I trigger code generation. The hooks automatically lint, format, and run tests. If tests fail, Kiro iterates. I review the final output.
  • 04 Infrastructure as code — For features that need new AWS resources, I let Kiro generate the CDK templates alongside the application code. This keeps infrastructure and code in sync from the start.
  • 05 Quick fixes in other tools — For bug fixes, one-liners, and small adjustments, I switch to a lighter tool. Kiro's spec process isn't designed for five-minute tasks, and I don't force it.

The net effect: my features have fewer post-deployment bugs (roughly 40% fewer based on our Jira tracking over the five weeks), and my pull requests get approved faster because reviewers can check the spec first and understand the intent before diving into code.


08 Getting Started with Kiro

Kiro is currently in preview with free access for early adopters, though the general availability pricing hasn't been fully detailed yet. If you're working in the AWS ecosystem and building production services where correctness matters more than raw coding speed, Kiro is worth serious evaluation.