How I Built a Kiro Crew App in 5 Minutes - Full Tutorial With Code Kiro Crew, an AI agent platform, now includes an App Store that lets developers build and publish full apps with agents, skills, cron jobs, and UI pages. A developer, sarvar_04, created a Daily Standup Bot in five minutes using five files, demonstrating the platform's ease of use. The app reads git commits and generates standup notes automatically. Parts 1-4 showed you what Kiro Crew can do. Investigate incidents. Automate weekly toil. Block dangerous commands. All using the built-in agent. But here's what nobody's talking about: Kiro Crew has an App Store. And you can build your own apps for it. In five minutes. Not plugins. Not scripts. Full apps with their own agents, skills, cron jobs, and dashboard pages. Package them. Publish them. Other users install with one click. I built one. A Daily Standup Bot. It reads my git commits every morning and generates standup notes so I never have to write "worked on X" again. Let me show you how. An app is a package that contributes any combination of: | Component | What it does | |---|---| Agents | Custom AI agent with its own model, prompt, and tool access | Skills | On-demand knowledge files that teach the agent specific capabilities | MCP servers | New tools the LLM can call | Cron jobs | Scheduled tasks the app owns | UI pages | Custom pages in the dashboard sidebar | Backend processes | HTTP servers reverse-proxied through the gateway | An app that only ships a skill is one markdown file. An app that ships everything is a full project. You decide the scope. The key difference from "just adding a skill": apps are installable, versioned, publishable, and isolated. Crew manages their lifecycle. Users install from the App Store with one click. A Daily Standup Bot that: Five files. Five minutes. A real app you'd actually use. standup-bot/ ├── app.json ← manifest identity + resources ├── agents/ │ └── standup-agent.json ← agent definition ├── skills/ │ └── standup-format/ │ └── SKILL.md ← formatting rules └── ui/ └── src/App.tsx ← dashboard page Every app needs one file: app.json . This is the single source of truth. { "name": "standup-bot", "version": "1.0.0", "displayName": "Daily Standup Bot", "description": "Auto-generates standup notes from git commits.", "author": "sarvar 04", "agents": "agents/standup-agent.json" , "skills": "skills/standup-format" , "ui": { "entry": "dist/index.mjs", "pages": { "route": "/apps/standup-bot", "label": "Standups", "icon": "ClipboardList" } }, "crons": { "name": "morning-standup", "cron expr": "0 9 1-5", "message": "Generate today's standup summary from yesterday's git activity", "agent": "standup-agent" } } That's agents, skills, a dashboard page, and a cron job. All declared in one file. Crew reads this and wires everything up. agents/standup-agent.json : { "name": "standup-agent", "model": "auto", "description": "Generates standup summaries from git activity", "prompt": "You are a standup summary assistant. Analyze git commits from the last 24 hours and generate concise standup notes. Format: What I Did, What's Blocked, What's Next.", "tools": "@kirocrew-core" } Eight lines. The @kirocrew-core tool reference gives it access to spawn processes, read files, and interact with the system. The model: "auto" lets Crew pick the best available model. skills/standup-format/SKILL.md : --- name: standup-format description: How to format daily standup updates triggers: standup, daily, summary, morning always: false --- Standup Format When generating standup notes: 1. What I did - List completed work from git commits group by feature/fix 2. What's blocked - Identify stale PRs, failing CI, unresolved issues 3. What's next - Infer from branch names and open issues Rules: - One line per bullet - Past tense for "did", present for "blocked", future for "next" - Group related commits into one bullet - Skip merge commits and dependency bumps - Flag anything unmerged for 24 hours Skills are markdown. They load on-demand when trigger words appear in the conversation. No code. No compilation. Just knowledge the agent uses when relevant. ui/src/App.tsx : js import { useAppApi, useAppEvents } from '@kirocrew/app-sdk' import { Card, CardTitle, PageHeader, StatCard, Badge } from '@kirocrew/app-sdk/ui' import { useState, useEffect } from 'react' export default function StandupDashboard { const api = useAppApi const standups, setStandups = useState useEffect = { api.get '/api/apps/standup-bot/history' .then setStandups }, return <