DEV Community

Cover image for Reflections on Developing GoodBot with Kiro
YoungLee
YoungLee

Posted on

Reflections on Developing GoodBot with Kiro

Preface

Completing a full Telegram Bot management system in 48 hours was once unimaginable. But with Kiro, I made it happen. This article documents my real experience and thoughts using Kiro to develop the GoodBot project.

From Zero to One: How Kiro Changed My Development Process

No More "Writing Code"—It's "Conversational Development"

Traditional development flow: Clarify → Check docs → Write code → Debug → Repeat.

With Kiro, it became: Describe requirements → Kiro generates → Fine-tune → Done.

This isn’t laziness—it shifts focus from “how to write” to “what to write.” I can now concentrate on product logic and user experience instead of getting bogged down by syntax details and API call methods.

A Real Example: Message Forwarding System

The core feature of GoodBot is bidirectional message forwarding—users send messages to the bot, which forwards them to admins; when admins reply, the response is automatically routed back to the original user.

This involves:

  • Webhook handling using the grammY framework
  • Database transactions and message ID mapping
  • Reply thread tracking
  • Error handling and edge cases

I simply described the business needs, and Kiro generated a complete implementation—including the design of the messageMaps table. It worked right away upon first run, requiring only minor adjustments.

Steering: Making AI Truly Understand Your Project

Kiro’s Steering feature is one of the most valuable aspects I’ve found.

My Steering Configuration

.kiro/steering/
├── Rules.md      # Basic rules: use Chinese
├── tech.md       # Tech stack: Next.js 16, pnpm, Drizzle
├── structure.md  # Project structure and coding conventions
└── product.md    # Product background and business logic
Enter fullscreen mode Exit fullscreen mode

Before vs After Steering

Without Steering:

  • Kiro might use npm instead of pnpm
  • Generate English comments and UI text
  • Place files in non-conforming locations
  • Require repeated corrections

With Steering:

  • Always uses pnpm
  • Outputs in Chinese
  • Follows project structure
  • Gets it right the first time

I estimate that Steering reduced over 70% of “not like this, should be like that” correction conversations.

Spec-Driven vs Vibe Coding: Finding the Balance

The Charm of Vibe Coding

For simple tasks, direct conversation with Kiro suffices:

  • "Help me add a loading state"
  • "Change this button to blue"
  • "Fix this TypeScript error"

Fast, direct, efficient.

Value of Spec-Driven Development

But for complex features like a lottery system, I chose Spec-driven:

  1. Requirements: Define acceptance criteria

    • Admins can create lotteries
    • Users participate by sending keywords
    • Automatic draw at scheduled time
  2. Design: Technical solutions

    • Database schema design
    • Fisher-Yates shuffling algorithm
    • Scheduled task solution in serverless environment
  3. Tasks: Breakdown and execution

    • Create lotteries table
    • Implement lottery creation API
    • Implement participation logic
    • Implement drawing logic

My Strategy

Scenario Approach
UI adjustments, bug fixes Vibe Coding
New simple features Vibe Coding
Core business logic Spec-Driven
Database design Spec-Driven
Multi-file refactoring Spec-Driven

Pitfalls Encountered and Solutions

1. Scheduled Tasks in Serverless Environment

Problem: Vercel’s serverless functions are stateless—the setTimeout will lose its context after cold start.

Kiro’s Suggestion: Adopt a hybrid approach:

  • Primary: External Cron service polling every minute
  • Backup: In-memory timer (active sessions)
  • Fallback: Check during each bot interaction

This solution would have taken me hours to figure out myself—Kiro immediately provided a mature strategy.

2. BigInt Serialization

Problem: Telegram IDs are 64-bit integers, but JSON doesn't support BigInt.

Kiro’s Solution:

// Database storage
id: bigint("id", { mode: "number" })

// API response serialization
const serialized = { ...user, id: user.id.toString() };
Enter fullscreen mode Exit fullscreen mode

3. React 19 New Patterns

Problem: ESLint reports useEffect as anti-pattern.

Kiro’s Help: Identified the issue and refactored code according to React 19 best practices.

Data Speaks

Task Traditional Way With Kiro
Project setup 4–6 hours 30 minutes
CRUD APIs Each 2–3 hours Each 15–20 minutes
Bug fixes Uncertain Minutes-level (with context)
Code review Manual Auto suggestions
Documentation Often skipped Generated alongside code

The entire project has 5,000+ lines of code, 12 API endpoints, 6 database tables, 20+ UI components, completed in 48 hours.

Deepest Insight

AI Is Not Replacement—It’s Amplification

Kiro won’t replace developer thinking—but it amplifies my capabilities. I still need to:

  • Understand business requirements
  • Make architectural decisions
  • Review generated code
  • Handle edge cases

But I no longer need to:

  • Remember parameter order for every API
  • Write boilerplate code manually
  • Set up project structure from scratch
  • Search Stack Overflow for common issues

Conversation Quality Determines Output Quality

The clearer and more specific your conversation with Kiro, the better the output.

❌ "Help me build a chat feature"
✅ "Implement a chat list component showing all user conversations sorted by last message time, click to enter detailed conversation"

Iteration Matters More Than Perfection

Don’t expect Kiro to generate perfect code in one go. Better approach:

  1. Generate initial version
  2. Test and find issues
  3. Describe problems for Kiro to fix
  4. Repeat until satisfied

This mirrors how human developers collaborate effectively.

Final Thoughts

These 48 hours developing GoodBot with Kiro were the most productive period of my programming career.

It made me rethink what “development” really means—not typing speed, but the ability to turn ideas into reality.

If you haven’t tried Kiro yet, strongly recommend giving it a shot—not because it writes code, but because it lets you focus on what truly matters: creating value.


Top comments (0)