Project Story: Agile Planning Tool
The Inspiration
The Problem We Saw
As developers working in distributed teams, we've all been there: the dreaded async planning poker session. Someone drops a Slack message with a story, people trickle in their estimates over hours (or days), and by the time everyone votes, half the team has forgotten the context. Product Owners struggle to get everyone aligned, Operations teams feel left out of the planning process, and the whole experience feels disconnected from where the actual work lives—GitHub.
We needed something better. Not just another estimation tool, but a comprehensive planning platform that brings everyone together in real-time, integrates seamlessly with GitHub, and makes sprint planning feel collaborative rather than chaotic.
Why This Project?
This project was born from three key insights:
- Planning is a team sport: Product Owners, developers, operations, and even marketing need to be in the same room (virtual or otherwise) to make good decisions
- Context matters: Stories live in GitHub—why should planning happen somewhere else?
- Real-time changes everything: When everyone sees votes reveal simultaneously, discussions happen naturally and decisions get made faster
We wanted to prove that with the right tools (Kiro) and the right approach (spec-driven development), we could build a production-ready, feature-rich application that solves real problems for real teams.
What We Learned
Spec-Driven Development is a Game-Changer
Before this project, I approached complex features with vibe coding—describing what I wanted and iterating until it worked. It was flexible but chaotic.
The revelation: Spec-driven development with Kiro transformed how I think about building software. By investing time upfront to:
- Define clear requirements with acceptance criteria using EARS patterns
- Design comprehensive solutions with correctness properties
- Break down implementation into discrete, testable tasks
I discovered that Kiro could implement entire features autonomously while I focused on the next design challenge. The spec became a contract between my vision and Kiro's execution.
Key Learning: The 20% time spent on spec design saved 80% time in implementation and debugging. Features like external tool embedding, collaborative whiteboard, and E2E testing worked correctly the first time because the requirements were crystal clear.
E2E Testing Demonstrates Business Value
The challenge: How do you prove to stakeholders that complex features work end-to-end?
The solution: Comprehensive E2E tests with Playwright that:
- Test complete user workflows (project creation → estimation → finalization)
- Verify real-time collaboration with multiple users
- Validate GitHub integration end-to-end
- Test responsive design across devices
- Provide visual demos for stakeholders
Key Learning: E2E tests aren't just for QA—they're powerful tools for demonstrating business value to product owners.
External Tool Integration Amplifies Collaboration
The insight: Teams already use tools like Miro, Figma, and Google Docs. Why force them to switch contexts?
The implementation: Built a flexible embedding system that:
- Parses URLs from multiple platforms (Miro, Figma, Google Docs/Sheets)
- Validates and generates proper embed URLs
- Creates resizable, draggable panels
- Persists panel state per session
- Syncs across all participants in real-time
Key Learning: Integration beats replacement. Let teams use their favorite tools within your platform.
How We Built It
Spec Creation
The turning point: After building the foundation with Vibe coding commands for project setup, we realized the remaining features were too complex for ad-hoc vibe coding.
What we created:
- Comprehensive requirements document with 26 major requirements
- Detailed design document with architecture, data models, and correctness properties
- Task breakdown with 45 discrete implementation tasks across 2 phases
The process with Kiro:
- Started with rough ideas: "I want real-time voting, GitHub integration, session history, team management..."
- Kiro helped formalize these into EARS-compliant requirements
- Iteratively refined the design document, adding correctness properties
- Broke down the design into implementable tasks
Key insight: Kiro's spec workflow guided us through requirements → design → tasks systematically. Each phase had clear approval gates.
Core Features Implementation (Tasks 6-27)
The workflow:
For each task:
1. Open tasks.md in Kiro
2. Click "Start task" next to the task
3. Kiro reads requirements, design, and task details
4. Kiro implements the feature completely
5. Review, test, approve
6. Move to next task
What made this work:
- Context preservation: Kiro always had access to requirements and design docs
- Clear acceptance criteria: Each task had specific requirements to validate against
- Incremental progress: Each task built on previous tasks
- Documentation: Kiro generated implementation docs for each major task
Standout implementations:
Task 11: GitHub Integration (Most Complex)
- Kiro implemented OAuth flow, token encryption, and GitHub API service
- Generated type-safe wrappers for GitHub API calls
- Handled rate limiting and error cases
- Created UI components for repository/project/issue selection
- All from the spec, first try
Task 14: Real-Time Voting (Most Impressive)
- WebSocket connection management with auto-reconnect
- Optimistic UI updates
- Vote synchronization across clients
- Presence detection
- All working together seamlessly
Task 20: Animations (Most Delightful)
- Comprehensive animation system with Framer Motion
- Consistent timing and easing across the app
- Micro-interactions for every user action
- Created a reusable animation library
Task 21: Session History (Most Data-Intensive)
- Complete history and analytics system
- Export to JSON/CSV
- Filtering, sorting, pagination
- Detailed statistics and trends
Advanced Collaboration Features (Tasks 28-42)
Project & Team Management (Tasks 28-30):
- Multi-project organization
- Role-based access control (Owner, Admin, Member)
- Team invitation system
- Project settings and defaults
In-Session Communication (Tasks 32-34):
- Real-time chat with typing indicators
- Story comments synced to GitHub
- Vote rationale and explanations
Enhanced Voting UX (Tasks 35-37):
- Voting status indicators with progress tracking
- Anonymous vs. open voting modes
- Re-voting functionality with history
- Automated reminders for non-voters
Backlog Management (Tasks 38-39):
- Drag-and-drop story reordering
- Story status management
- Bulk operations (mark estimated, export, delete)
- Advanced filtering and search
Notifications (Tasks 40-41):
- Email notifications (session invites, reminders, summaries)
- In-app notifications with real-time updates
- Customizable notification preferences
- Calendar invite generation
Visual Collaboration (Task 42):
- Collaborative whiteboard with real-time sync
- Drawing tools (pen, shapes, text, eraser)
- Whiteboard snapshots
- Snapshot gallery and story attachment
External Tool Embedding (Task 43):
- URL parsing for Miro, Figma, Google Docs/Sheets
- Resizable, draggable embed panels
- Panel state persistence
- Real-time synchronization across users
Quality Assurance & Testing
The challenge: How do you ensure a complex real-time application works correctly?
The solution: Comprehensive E2E testing with Playwright
What we built:
- Smoke Tests (4 tests): Basic application health checks
- Complete Estimation Flow (2 tests): Full workflow from creation to finalization
- GitHub Integration (3 tests): Import and sync workflows
- Real-Time Collaboration (3 tests): Multi-user simultaneous interactions
- Project Management (4 tests): Team and permission workflows
- Session History & Export (4 tests): Reporting and analytics
Test Coverage:
- ✅ 20+ E2E test scenarios
- ✅ 100% passing smoke tests in Chrome
- ✅ Multi-browser support (Chrome, Firefox, Safari, Mobile)
- ✅ Visual regression capabilities
- ✅ Demo-ready for stakeholders
Key Features:
- Tests written in TypeScript with Playwright
- Configurable for CI/CD integration
- HTML reports with screenshots and videos
- Interactive UI mode for debugging
- Slow-motion mode for demos
Technical Architecture
Stack Choices
Frontend:
- Next.js 14+ (App Router) - Server components + client components
- React 18 - UI library
- TypeScript - Type safety
- Tailwind CSS - Styling
- Shadcn UI - Component library
- Framer Motion - Animations
Backend:
- Next.js API Routes - RESTful API
- Socket.IO - Real-time WebSocket communication
- MongoDB Atlas - Database
- Mongoose - ODM
Authentication:
- Auth.js v5 (NextAuth.js) - OAuth flow
- GitHub OAuth - Identity provider
External APIs:
- GitHub REST API - Repository/issue data
- GitHub GraphQL API - Projects V2 data
Testing:
- Playwright - E2E testing framework
- Property-based testing - Correctness validation
Email:
- SendGrid/AWS SES/Resend - Email delivery
- ICS generation - Calendar invites
Key Technical Decisions
1. Why Next.js App Router?
- Server components for better performance
- Built-in API routes
- File-based routing
- Excellent TypeScript support
2. Why Socket.IO over native WebSockets?
- Automatic reconnection
- Room-based broadcasting
- Fallback to polling
- Better error handling
3. Why MongoDB over PostgreSQL?
- Flexible schema for evolving requirements
- Easy to model nested data (participants, votes, embeds)
- Excellent with Next.js
- MongoDB Atlas for managed hosting
4. Why Playwright over Cypress?
- Multi-browser support out of the box
- Better TypeScript integration
- Faster execution
- Built-in test generator
Challenges We Faced
Challenge: Real-Time State Synchronization
The Problem: When multiple users vote simultaneously, how do you keep everyone's UI in sync without race conditions?
The Solution:
- Implemented optimistic updates (show your vote immediately)
- Server is source of truth (broadcast actual state)
- Reconciliation logic (merge server state with local state)
- Used Socket.IO rooms for efficient broadcasting
What Kiro Did: Generated the entire WebSocket event handling system, including edge cases like:
- User disconnects mid-vote
- User rejoins after voting
- Multiple votes from same user (take latest)
- Whiteboard concurrent editing
Learning: Breaking the problem into clear requirements in the spec allowed Kiro to handle the complexity.
Challenge: E2E Test Authentication
The Problem: E2E tests need to authenticate, but GitHub OAuth requires real credentials.
The Solution:
- Created authentication helper utilities
- Documented multiple auth strategies (mock, real OAuth, storage state, API-based)
- Implemented smoke tests that work without auth
- Provided clear setup guide for full test suite
What Kiro Did: Generated comprehensive test infrastructure including:
- Test helpers for auth and data generation
- Smoke tests for immediate value
- Full test scenarios ready to enable
- Documentation for auth setup
Learning: Start with tests that provide immediate value, then expand with proper auth setup.
Challenge: Drag-and-Drop with Real-Time Sync
The Problem: When multiple users reorder stories simultaneously, conflicts arise.
The Solution:
- Optimistic updates for immediate feedback
- Server-side conflict resolution
- Last-write-wins strategy with timestamps
- Real-time broadcast of final order
What Kiro Did: Implemented complete drag-and-drop system with:
- dnd-kit integration
- Database persistence
- Socket.IO synchronization
- Conflict resolution logic
Learning: Spec-driven development handles complex state management elegantly.
Challenge: Notification System Complexity
The Problem: Multiple notification types (email, in-app), multiple triggers, user preferences, and delivery reliability.
The Solution:
- Unified notification service
- Template-based email generation
- Queue system for reliability
- User preference management
- Calendar invite generation
What Kiro Did: Generated complete notification system including:
- Email service with multiple provider support
- In-app notification API and UI
- Preference management
- Notification scheduler
- ICS file generation
Learning: Complex systems become manageable when broken into clear components in the design phase.
The Kiro Advantage
What Made This Project Successful
1. Spec-Driven Development
- Clear requirements prevented scope creep
- Design document served as single source of truth
- Task breakdown enabled parallel thinking (design next feature while Kiro implements current)
- Correctness properties led to property-based tests
2. Vibe Coding for Exploration
- Used for foundation and experimentation
- Perfect for "figure it out as we go" scenarios
- Great for quick iterations and refinements
4. Hybrid Approach
- Vibe coding for foundation (Tasks 1-5)
- Spec-driven for complex features (Tasks 6-43)
- Vibe coding for refinements (bug fixes, tweaks)
Productivity Metrics
Without Kiro (estimated):
- Foundation: 1 week
- Phase 1 features (21 tasks): 6-8 weeks
- Phase 2 features (15 tasks): 4-6 weeks
- E2E testing: 2 weeks
- Refinement: 1 week
- Total: 14-18 weeks
With Kiro (actual):
- Foundation: 2 days (with vibe coding)
- Spec creation: 1 day
- Phase 1 features: 5 days (spec-driven)
- Phase 2 features: 3 days (spec-driven)
- E2E testing: 1 day (spec-driven)
- Refinement: 2 hours (vibe coding)
- Total: ~11 days
Productivity multiplier: ~12x
Quality Metrics
- Type safety: 100% TypeScript, zero
anytypes - Error handling: Comprehensive error handling on all 40+ API routes
- Testing: E2E tests covering all major workflows
- Documentation: Auto-generated docs for each major feature
- Consistency: Uniform patterns across entire codebase
- Security: Proprietary license, input validation, secure embeds
Key Takeaways
For Developers
- Invest in specs for complex features: The upfront time pays off exponentially
- Use vibe coding for exploration: Perfect for figuring things out
- Use spec-driven for implementation: Perfect for executing clear plans
- Trust Kiro with complexity: Well-specified complex features work first try
- E2E tests demonstrate value: Not just for QA, but for stakeholder demos
For Teams
- Specs enable collaboration: Clear requirements mean anyone can implement
- Steering docs maintain quality: Consistency without constant code review
- Documentation is automatic: Implementation docs generated with each feature
- Velocity is sustainable: Quality doesn't degrade as you move faster
- Testing builds confidence: Comprehensive E2E tests prove features work
For the Future
This project proved that AI-assisted development isn't about replacing developers—it's about amplifying our ability to build complex, high-quality software. With Kiro:
- We think at a higher level (requirements, design, architecture)
- We move faster (12x productivity)
- We maintain quality (consistent patterns, comprehensive error handling)
- We enjoy the process (focus on creative problem-solving, not boilerplate)
What's Next
Planned Features
- Advanced Analytics: Velocity tracking, estimation accuracy, team insights
- More Integrations: Jira, Linear, Azure DevOps
- AI Estimation: ML-based estimation suggestions
- Video/Audio: Built-in communication for remote teams
- Templates: Pre-built estimation templates for common scenarios
Technical Improvements
- Performance: Implement Redis caching for GitHub API
- Testing: Expand property-based test coverage
- Monitoring: Add observability with OpenTelemetry
- Deployment: Set up CI/CD pipeline with E2E tests
- Documentation: Create user guides and API documentation
Final Statistics
Features Delivered
Phase 1 (Core):
- ✅ GitHub OAuth Authentication
- ✅ Session Management
- ✅ Real-Time Voting
- ✅ GitHub Integration
- ✅ Planning Poker Cards
- ✅ Estimate Reveal & Finalization
- ✅ Session History
- ✅ Responsive Design
- ✅ Animations
Phase 2 (Advanced):
- ✅ Project & Team Management
- ✅ Role-Based Access Control
- ✅ Session Chat
- ✅ Story Comments
- ✅ Vote Rationale
- ✅ Voting Modes (Anonymous/Open)
- ✅ Re-voting with History
- ✅ Drag-and-Drop Backlog
- ✅ Bulk Operations
- ✅ Email Notifications
- ✅ In-App Notifications
- ✅ Collaborative Whiteboard
- ✅ External Tool Embedding
Quality Assurance:
- ✅ 20+ E2E Test Scenarios
- ✅ Property-Based Testing
- ✅ Multi-Browser Support
- ✅ Comprehensive Documentation
Code Statistics
- Files: 100+ TypeScript/React files
- Components: 50+ React components
- API Routes: 40+ REST endpoints
- Socket Events: 20+ real-time events
- Tests: 20+ E2E test scenarios
- Lines of Code: ~15,000 (excluding tests and docs)
Documentation
- Spec Documents: 3 (requirements, design, tasks)
- Implementation Docs: 20+ task implementation summaries
- Guides: 10+ setup and usage guides
- Test Documentation: 5 comprehensive test guides
- License & Legal: 5 copyright and licensing documents
Conclusion
Building the Agile Planning Tool with Kiro was a transformative experience. It demonstrated that with the right approach—combining spec-driven development for complex features, steering documents for consistency, and vibe coding for exploration—we can build production-ready applications at unprecedented speed without sacrificing quality.
The key insight: Kiro isn't just a coding assistant; it's a development methodology multiplier. It makes spec-driven development practical, steering documents powerful, and vibe coding productive.
This project went from concept to production-ready in 11 days with:
- ✅ 40+ features across 2 phases
- ✅ Comprehensive E2E testing
- ✅ Enterprise-grade security
- ✅ Real-time collaboration
- ✅ External tool integration
- ✅ Complete documentation
That's not just fast—it's a fundamental shift in how we can build software.
Acknowledgments
Built with:
- Kiro AI - Development partner
- Next.js - Application framework
- MongoDB - Database
- Socket.IO - Real-time communication
- Playwright - E2E testing
- GitHub - Version control and API integration
Inspired by:
- Real teams struggling with async planning
- The need for better collaboration tools
- The potential of AI-assisted development
Special thanks to:
- The Kiro team for building an incredible development tool
- The open-source community for the amazing libraries we built upon
- Every developer who's ever struggled with sprint planning—this one's for you
Built in 11 days with Kiro. Designed for teams who want to plan better, together.
Built With
- mongodb
- next.js-14
- playwright
- socket.io
- typescript
Log in or sign up for Devpost to join the conversation.