AWS Bites Podcast

147. Spec coding with Kiro

What if AWS built an IDE to rival your favorite editor? Turns out they did!

In this episode of AWS Bites, we dive into Kiro, an AI centric fork of VS Code that tries to turn an empty repo and a loose idea into working software. Kiro imports your VS Code world, then guides you through requirements, design, and a clear task plan before an agent gets to work. We share what clicked, what tripped us up, and how Kiro’s spec driven approach compares to Cursor or Claude Code. We also cover status, limits, pricing, and what this could become if AWS leans in with deep cloud integration. Stick around for our take on whether you should switch or wait.

Big shoutout to fourTheorem for powering yet another episode of AWS Bites. At fourTheorem, we believe the cloud should be simple, scalable, and cost-effective, and we help teams do just that. Whether you’re diving into containers, stepping into event-driven architecture, or scaling a global SaaS platform on AWS, or trying to keep cloud spend under control our team has your back. Visit fourTheorem.com to see how we can help you build faster, better, and with more confidence using AWS cloud!

In this episode, we mentioned the following resources:

Let's talk!

Do you agree with our opinions? Do you have interesting AWS questions you'd like us to chat about? Leave a comment on YouTube or connect with us on:

Eoin
00:01:15

I don't think a lot of people saw this coming, but a few weeks ago there was a lot of hype about it for a very short period. You'll find all the info on Kiro.dev. It's got a dedicated site and like many other tools of its kind, it's a fork of VS Code. So similar to Cursor or Windsurf. And that makes it easy to move from VS Code to Kiro because it'll import all of your settings, including themes, plugins, and config. And one of its top features is that it offers an agentic workflow. So unlike just single prompt iteration like you might do in Copilot before or in ChatGPT, you can describe in plain English what you want and it will try to achieve the given outcome. So it can read and edit files, run commands, search information online, and more. And it basically runs then in a loop trying to achieve the given goal. So as an example, you can tell it to run tests to make sure the changes it makes don't break anything. If the tests fail, it can read the output of the tests and then try to iterate and fix the issue until it reaches a stable state. And you can also turn it into a more interactive collaborator. So you can tell it to ask clarifying questions or to request more context if it needs. And you can also tell it to come up with a plan and request user validation before executing it. So it's a lot more collaborative than previous tools of its kind. So Luciano, what do you think? What can Kiro do for you? Yeah, I think it's fair to try to provide some example use cases.

Luciano
00:02:40

One that I really like is when you are starting on a project that has been created by maybe a team that you just joined. So you don't really have a lot of context. You can just open Kiro, open the project and ask it to explain the structure of the existing code base. And I think that's a really useful feature to just get you started quickly and do all of the onboarding stuff. And similarly, if you need to generate some documentation or improve existing documentation, that's another excellent use case. You can just add Kiro, like maybe read that some files and update the docs. And generally, this is the kind of tasks where these tools really shine. And another use case is totally when you start from scratch, and you literally have a blank slate, and you want to start creating a new project quickly on a prototype. Kiro actually can help you with that. And we'll talk more about an example that we played with. Or even you can work on features or fixes on existing projects. So if you've used Courser, Windsurf, Copilot Agent Mode, Cloud Code, Open Code, Cline (or Cline) for VS Code, or any other of these AI-agentic tools, the experience is exactly the same. It's just that this is the product that AWS is building and promoting. So it's a more AWS-centric take on this kind of products. So one thing where I think Kiro is trying to innovate a little bit more than all of the competitors is what they call the spec-driven approach or specification-driven approach. And we'll talk a little bit more about that later. But I think it's fair at this point to mention what is the current status of this project since it's very new.

Luciano
00:05:10

Yes, so as I say, this is probably the most innovating piece of Kiro, this spec-driven development. And I think to really appreciate what that means, we need to say that AI-driven development is all about context. And we can define context as basically the combination of a specific prompt that you are giving to the agent with somewhat clear instructions and expected outcomes, plus everything that you have in your project. So basically you are giving the agent access to additional information like local files, or maybe other documents that you can provide in some other way. Sometimes can be even diagrams, pictures, because all these models support not just text, but they can also read images and audio and so on. So all of that together is basically something we can define as context. And context also can be enriched even more if you use tools like MCP servers, but we're not going to deep dive too much into that. Just keep in mind that that's yet another thing that you can use to basically provide even more information to your AI agents. So effectively, the idea is very simple. The more context and the more details you can provide about your projects and the features that you're trying to build, the more likely is that the agent is going to do a good job, and you end up with a result of an acceptable quality. And if we think about that, to be honest, humans work more or less the same way, right? If you are working with a colleague and you can provide very clear details and requirements, chances are that at the end you end up with a much more fruitful collaboration. If you just give very loose specs, so to speak, then your management might vary, right? You don't know what your colleague is going to come up with because they need to make a lot of assumptions and you might not be happy with some of these assumptions. So the main question in general, and this is a question that goes even beyond here, I think it's in the industry at this stage with all these new AI agentic tools is how do you provide good context to an AI model?

Eoin
00:12:05

So I guess it's worth noting that all of these documents are created in order and you can tweak them manually, or you could use more prompting to get Kiro to do it for you before you move to the next one. So that makes it feel like it is quite a structured guided process and you have control over it, but you don't have to do all the work yourself. And what we do like is that if you don't have a lot of clarity on what you want to build, this process helps you to kind of brainstorm it and rubber duck it with the agent and helps you to come up with a better picture before you move on to the implementation. This process alone has a lot of value. And I say that, you know, all of these AI code tools are great, but the biggest challenge in software is actually understanding what you're trying to build, communicating it well, understanding the needs of the users and really getting that into a specification. Because once you have that clarity, writing software is always easier anyway, whether you're using AI or not. It is interesting to see that Kiro makes this clear difference between vibe and spec, where vibe, which often for a very good reason gets a negative connotation is intended as like, just work off a single prompt and figure it out yourself. Spec is more on the line of, let me give you all the details and the structured format we just described and let's come up with an implementation plan. Now you can still do the vibe mode in Kiro. You can pick the approach that feels most appropriate for what you want to do. If you just want to update a readme file or do something very throwaway, you can probably just vibe it. But if you're working on something like a complex new feature, it makes sense to probably go with a spec-driven approach. Luciano, you were able to put this into practice with some real-world needs, which is what it's supposed to be designed for. So how did it go?

00:15:25

And of course, you can make this configuration a little bit fancier if you want to support multiple URLs, multiple countries, maybe fallback URLs if you cannot detect the country, or if the current country is not in the lists that you have provided. So this was kind of the use cases that I want key row to help me with. So let's build this Lambda with all this logic and figure out how to package it in a way that we can ship it to AWS and have it running. So we started the process from scratch in spec mode. And as we described before, the process starts in a very simple way. So you just need to give it an initial prompt, which doesn't have to be detailed at all. So it needs to be a very high level description of what you want to achieve. And what I gave it was effectively not more than two lines, something that goes like a Lambda function written in Rust with an HTTP trigger could be API Gateway or function URL that allows you to redirect the user to different URLs depending on their geo location. That was just the prompt that I gave Kiro. And it started by generating the first file, which is a requirements.md. Now I'm not going to read the entire documents because it's quite long, but the document that was generated at an introduction, more or less similar to the prompt that I gave at the beginning. But then it started to generate requirements and user story. So for instance, there was a first user story that said, when a user makes an HTTP request to the Lambda, then the system shall determine the user geographic location. When the geographic location is determined, then the system shall match it against a configured set of rules. And then you keep going. When you identify the rule, then you need to create a direct response and so on. So very structured format. And this was the first acceptance criteria. And there were more acceptance criteria going even into performance and security.

00:19:18

And Cargo Lambda basically allows you to go from zero to a structured approach where you can say, I want an HTTP Lambda, and it generates an entire example for you that you can build on. So when I say we, I mean myself and Kiro, we kind of decided, okay, we want to use Cargo Lambda. So the first step is going to be to scaffold the project with Cargo Lambda. And because it's going to be an HTTP function, the first step that Cargo Lambda generally asks you is like, what kind of Lambda are you building? So it generates a more closer template to actually what you are trying to do. And the problem is that when Kiro tried to run Cargo Lambda in the terminal, it did use an argument that actually didn't really exist. So the command failed. And at that point, Kiro somehow didn't realize that the command had failed and what was the error. So it got stuck into a loop where it was working, waiting for the command to finish, although the command wasn't running anymore. And I was waiting for a while. And then eventually I had to ask, like, what's going on? Didn't you see that the command finished? And Kiro kind of pretended that at that point, he realized, oh, yes, the command finished, but it looked like he wasn't able to read the output of that command. So he didn't really know what was the next step to do. So I started to assume that there was something wrong, for instance, with my Rust configuration and tried to fix the Rust environment, rather than really understanding that he wasn't able to read the output of the command and that he had used a wrong command in the first place. So I had to do a lot of manual steering to get it to the point where he was able to run the command correctly. But again, even when the command was running correctly, it was stuck in this working mode because it didn't really understand that the command had finished successfully. So that seemed like a bug. And then I started to look online and many other people seem to have very similar bugs. So I reported it on GitHub myself and many other people are reporting that. So hopefully that's get fixed and it's going to make the experience much nicer because at this point, this is pretty frustrating from a user experience perspective. This is like the main thing you expect an agent to do, to be autonomous to some degree, once you have defined the tasks and the acceptance criteria. And if you have to continuously interact with it to fix this kind of misunderstanding of every single action, then you are just better off doing it yourself. Which by the way, funny enough, was one of the proposed solutions on GitHub is like copy paste the command yourself and plan it yourself. But then you're not using an agent anymore. You're just using a readme that tells you which commands to run. So this was our experience, although it was a bit frustrating. I think it's fair to say that this product is still in beta and bugs are to be expected. This can be a reasonable bug in the sense that everything has worked fine. The spec driven approach worked seamlessly. So I think I just expect all these things will be cleaned up and fixed as we go out of that beta phase. And at that point, I think everyone will have a nice experience with Kiro. So don't take this as negative feedback or as don't use Kiro. Of course, at the beginning bugs are expected, but we believe it's normal and it's only going to get better.

Eoin
00:22:14

Yeah, I hope that let's look at the GitHub issue list and keep an eye on it because it is great when Amazon tries to do a project like this in open source and on GitHub. But we have seen cases in the past where there's a lot of fanfare when things are open sourced at the beginning. But the repo does not get the attention and resourcing it deserves. So the fingers crossed that we'll see a bit of activity there. Maybe we should talk a little bit about a couple of other unique features Kiro has compared to other tools. So those are agent hooks and steering. So agent hooks lets you define a prompt that runs automatically when specific things happen in your IDE, like when a file is created, saved or deleted, as well as on a manual trigger. And this is a bit like custom commands in cloud code. So an examples to that for that are like, if you want to review changed files for potential security issues automatically, like check if you've got credentials in your code. Or another one might be like an internationalization helper. So when you add a new label in one language, make sure to highlight missing translations in other supported languages and provide an initial template translation. Then there's steering. So that steering is basically giving you persistent project knowledge stored in markdown files under dot Kiro slash steering. And Kiro will load that as context on every prompt. So it basically stops you from having to continuously steer it back in the kind of style or patterns you prefer to have. So it feels very similar to CLAUDE.md with Cloude code or Cursor rules if you use cursor, but it's a bit more structured. You get default files for product overview, your tech stack and your project structure. And you can also reference live files from the repo inside a steering file. And they'll be loaded as well into the context window of each prompt, which is, it seems like a nice approach. Now, all this is all very well and good, but it completely depends on what it costs. So what does it cost?

00:26:11

And also you can enable pay as you go. So if you reach one of these limits, and you still need to use the tool, you don't necessarily need to upgrade to the next plan because you can just pay for whatever else you need. And the rates are $0.04 per every single vibe and $0.20 per spec. And again, I want to underline that the pricing is not per token. So people might wonder, okay, what does a spec gives me? And actually, there is a note somewhere in the article that says that if you try to do complex actions, you might end up consuming multiple requests. So this is something worth noting that I think you cannot just game the system and try to use one prompt to do 1 million things. Because I think there is a mechanism that realizes and it will still be built accordingly to some kind of unit that I don't think is super well described. But yeah, you cannot just let it do everything with just one ask and expect that it's going to cost you only one request. There is, by the way, a very useful usage dashboard that shows exactly what is your current consumption for every kind of request. And if you are using any of the overages in case you enable that feature. So at least you can keep things in check and understand where you're going with your spend. Now, this pricing has been a little bit debated in the AWS community. I've seen some very common complaints. And I think some of them are fair to share here. Like for instance, when you get at the beginning free zero spec credits, it makes it really hard to really evaluate one of what I believe is the best features of Kiro. So it's a little bit of a shame that users might not even realize that how powerful is that feature just because they are discouraged by either pricing or maybe because they have a free plan and they don't have any more. Maybe they expired the 14 days trial. So they don't effectively have a way to test if the spec thing is actually really good for them. The other complaint is that cost feels a little bit unpredictable. One task can consume multiple spec or vibe. So what happens? How much is this going to cost me? You don't necessarily can you cannot tell upfront when you're starting to do an action how much it's going to cost you. And then the spec between vibe and sorry, the split between vibe and spec. It's nice in a way, but also adds cognitive load because you have to always think, okay, which mode do I need to use? How much credit do I have left for each mode? And so it kind of makes developers work a little bit more just to really understand what am I going to build on? And do I actually even have the credits for what I want to do? So I think this it's important to say that this pricing decision doesn't really seem final from the AWS perspective. So probably important for you to provide feedback. If you have ideas or complaints, make sure you express them to AWS, because I expect this is probably the best phase of this product to try to influence future outcomes in this sense.

Luciano
00:32:47

I think if people are already using VS code, there is very minimal difference. Like even the team gets imported, so you don't even feel like you are changing an IDE. So in that sense, it's not a big deal. Although I think there is an important thing to call out that because Kiro as Cursor and Windsurf are forks of VS code, I think there is a huge amount of work that needs to happen behind the scenes to keep that fork in sync with the evolution of VS code. And to keep it always compatible, as the two products of this multiple forks go ahead in their own history. So if AWS is not really committed to invest in that, then eventually Kiro is not going to be a VS code fork anymore. It's just going to be its own thing, and it's going to be impossible to migrate from one to the other without losing features or losing configuration or whatever. So that's probably the risk in the long term. But in the short term, if you use VS code, you're literally not going to see any difference. So the migration is just like the name of the binary that you run effectively. But I would also say that if you come from other ideas or editors, I don't think there is a compelling enough story there for you to move on because that will require a lot of mental effort and just embracing a totally different tool. So in those cases, you might be better off with something more CLI driven, like Claude code is something that I really like because you can run it in parallel in another terminal window, and it doesn't affect your main workflow with your IDE. But if you like that experience and you want to use something that is a little bit closer to AWS, you can use Amazon Q developer CLI, which is somewhat similar to cloud code. Yeah. Yeah.

Help us to make this transcription better! If you find an error, please submit a PR with your corrections.