Book 2: Ship

What Is SpecKit?
Section titled “What Is SpecKit?”You have a vault full of organised knowledge and a validated offer with paying early adopters. Now you need to build the thing. SpecKit is a specification-driven development workflow that turns product descriptions into working code through a repeatable four-stage cycle: Specify, Plan, Tasks, Implement.
Each stage produces a concrete artefact that feeds into the next, so nothing gets lost in translation between what you imagined and what gets built.
SpecKit is implemented as a set of skills installed in your LLM’s skills directory. Each skill auto-activates when you describe the relevant task.
The SpecKit Cycle
Section titled “The SpecKit Cycle”- Specify. Describe what you want built in plain language. The
speckit.specifyskill generates a structured specification with an overview, user stories, requirements, and acceptance criteria. - Plan. The
speckit.planskill reads your specification and produces a technical blueprint: which files need to change, the implementation order, and any risks. - Tasks. The
speckit.tasksskill breaks the plan into a flat, ordered list of discrete tasks. - Implement. The
speckit.implementskill works through the task list one task at a time, writing code, running tests, and moving on.
The four stages form a loop. After implementing a feature, you may discover that the spec needs updating, or that the plan should change for the next feature. This is expected. The spec is always the source of truth.
The Constraint of the Sold
Section titled “The Constraint of the Sold”In the Offer page, you found 10 early adopters. They paid. They are waiting. The offer PDF you shared with them is your build constraint now.
You can only build what the offer promised. Not more. Not less. Without this constraint, you would spend three weeks adding features nobody asked for. With the constraint, you build what people paid for, and you ship it to them.
Step 1: Install OpenAI Codex CLI
Section titled “Step 1: Install OpenAI Codex CLI”OpenAI Codex is the AI coding tool you will use throughout this book. It submits tasks to a sandboxed cloud environment and returns the result for you to review.
Install OpenAI Codex CLI
Open Terminal and run: npm install -g @openai/codex. Once the installation
finishes, run codex to verify it launches. You will need Node.js 18 or
later installed first. If you do not have Node.js, download it from
nodejs.org.
Open PowerShell and run: npm install -g @openai/codex. Once the
installation finishes, run codex to verify it launches. You will need
Node.js 18 or later installed first. If you do not have Node.js, download it
from nodejs.org.
Codex requires an active OpenAI account with either an active subscription or API credits. Go to platform.openai.com and make sure your account is ready. When you first run codex, it will walk you through authentication.
For detailed setup instructions, see the OpenAI Codex CLI guide.
Step 2: Clone the Repository
Section titled “Step 2: Clone the Repository”The complete Time Boxing starter project is available on Gumroad: Get the Time Boxing repo
Cloning the Time Boxing repository... git clone -b develop https://github.com/evalincius/odd-time-box-mob-app Cloning into 'odd-time-box-mob-app'... remote: Enumerating objects: 312, done. remote: Counting objects: 100% (312/312), done. remote: Compressing objects: 100% (231/231), done. Receiving objects: 100% (312/312), 1.58 MiB | 5.12 MiB/s, done. Resolving deltas: 100% (127/127), done. Repository cloned successfully. Here is the folder structure: odd-time-box-mob-app/ ├── android/ # Android platform files ├── ios/ # iOS platform files ├── lib/ │ ├── main.dart # App entry point │ ├── models/ │ │ ├── timebox.dart │ │ └── category.dart │ ├── screens/ │ │ ├── today_screen.dart │ │ ├── review_screen.dart │ │ └── settings_screen.dart │ ├── widgets/ │ │ ├── timebox_card.dart │ │ ├── timebox_form.dart │ │ └── timer_display.dart │ ├── providers/ │ │ └── timebox_provider.dart │ └── database/ │ └── timebox_database.dart ├── test/ # Unit and widget tests ├── pubspec.yaml # Flutter dependencies └── README.md # Setup instructions The project uses Flutter with Riverpod for state management and SQLite for local storage. Categories include Work, Learning, Health, Personal, and Creative.
LLM outputs are non-deterministic and may vary from this example.
Step 3: Follow the README Setup Instructions
Section titled “Step 3: Follow the README Setup Instructions”Open the README.md file in the repository and read through the setup instructions. If you get stuck on any step, ask your LLM for help.
I have read the README. Let me walk you through each setup step. 1. Flutter SDK Checking if Flutter is installed... found (version 3.27.4). Running: flutter doctor [✓] Flutter (Channel stable, 3.27.4) [✓] Android toolchain [✓] Xcode - develop for iOS and macOS [✓] Connected device (2 available) All checks passed. 2. Dependencies Running: flutter pub get Resolving dependencies... Got dependencies. 52 packages installed. Key packages: - flutter_riverpod 2.6.1 (state management) - sqflite 2.4.1 (local database) - intl 0.19.0 (date/time formatting) - fl_chart 0.70.2 (charts and graphs) 3. Android Emulator Checking for available emulators... Found: Pixel_7_API_34 Starting emulator... Emulator launched successfully. 4. Verify setup Running: flutter analyze Analyzing odd-time-box-mob-app... No issues found! 0 hints, 0 warnings, 0 errors. All dependencies are installed and your development environment is ready. Run "flutter run" to launch the app on the emulator.
LLM outputs are non-deterministic and may vary from this example.
Step 4: Get the App Running
Section titled “Step 4: Get the App Running”Running: flutter run Launching lib/main.dart on Pixel 7 API 34 in debug mode... ✓ Built build/app/outputs/flutter-apk/app-debug.apk. Installing and launching on Pixel 7 API 34... App launched successfully. Here is what you should see: Today Screen (default tab): - Today's date at the top (e.g. "Friday, 21 February 2026") - An empty list area with the message "No timeboxes for today" - A floating action button (+ icon) in the bottom right - A summary bar showing: "0h 0m scheduled | 0h 0m completed" Tap the floating action button (+): - The Create Timebox form opens with fields for: - Title (text input, e.g. "Write blog post") - Category (dropdown: Work, Learning, Health, Personal, Creative) - Duration (picker: 15m, 25m, 30m, 45m, 60m, 90m) - Type (toggle: Hard deadline / Soft deadline) - Start time (time picker) - Notes (optional text field) - "Create" and "Cancel" buttons at the bottom Bottom Navigation Bar (3 tabs): - Today (calendar icon): the current screen - Review (bar chart icon): weekly summary and stats - Settings (gear icon): categories, defaults, preferences Tap "Review" in the bottom bar: - Shows this week's summary: total scheduled vs completed - A bar chart breaking down time by category - A completion rate percentage - Empty state message if no data exists yet Tap "Settings" in the bottom bar: - Default duration setting (currently 25 minutes) - Category management (add, rename, reorder) - Theme toggle (light/dark) Verify these three things before moving on: 1. The app launches without errors ✓ 2. All three tabs are tappable and switch screens ✓ 3. The floating action button opens the create form ✓
LLM outputs are non-deterministic and may vary from this example.
Before moving on, confirm these three things:
- The app launches without crash screens or error messages in your terminal.
- Navigation works by tapping each tab in the bottom bar (Today, Review, Settings).
- The core interaction responds: tap the floating action button and confirm the create form opens.
If any of these checks fail, copy the error message from your terminal and paste it into Codex.
Step 5: Build a New Feature — Quick Timebox Templates
Section titled “Step 5: Build a New Feature — Quick Timebox Templates”Now you will use the SpecKit workflow to add a real feature. The app will track the user’s recent timebox history and display 3 to 5 quick-create buttons on the Today screen based on their most common category, duration, and type combinations. Tapping a button pre-fills the Create Timebox screen.
Describe the feature to your LLM. The speckit.specify skill will auto-activate and generate a structured specification:
The speckit.specify skill has activated. Generating specification... Specification saved to: specs/quick-templates/spec.md ═══════════════════════════════════════════════════ FEATURE SPECIFICATION: Quick Timebox Templates ═══════════════════════════════════════════════════ Overview Add a Quick Templates feature that analyses the user's recent timebox history and displays 3 to 5 quick-create buttons on the Today screen. Each button represents a frequently used category + duration + type combination. Tapping a button pre-fills the Create Timebox form. User Stories 1. As a user, I want to see my most common timebox patterns as quick buttons so I can create routine timeboxes faster. 2. As a user, I want tapping a quick button to pre-fill the form so I only need to add a title and start time. 3. As a user, I want the templates to update automatically based on my recent usage so they stay relevant. 4. As a new user with few completed timeboxes, I want a helpful message instead of empty buttons so I understand the feature. Requirements Template Generation: - Analyse the last 30 completed timeboxes - Group by (category, duration, type) combination - Rank by frequency, select top 3 to 5 - Minimum threshold: a combination must appear at least 2 times - Recalculate when the Today screen loads Today Screen UI: - Display template buttons in a horizontal scrollable row above the timebox list - Each button shows: category name + duration (e.g. "Work 25m") - Button colour matches the category colour from Settings - Hard deadline templates show a small dot indicator - Maximum 5 buttons displayed Pre-fill Behaviour: - Tapping a template button opens the Create Timebox form - Pre-filled fields: Category, Duration, Type (hard/soft) - Empty fields: Title, Start Time, Notes - User can modify any pre-filled field before creating Empty State: - If fewer than 3 completed timeboxes exist, show a message: "Complete a few timeboxes and your shortcuts will appear here" - Do not show the template row until the threshold is met Acceptance Criteria - [ ] Templates appear after 3+ completed timeboxes - [ ] Templates reflect the most common combos - [ ] Maximum of 5 template buttons displayed - [ ] Tapping a template opens form with correct pre-fill values - [ ] User can modify pre-filled values before saving - [ ] Template buttons show category name and duration - [ ] Button colours match category colours - [ ] Empty state message shows for users with <3 timeboxes - [ ] Templates recalculate on Today screen load - [ ] Existing tests still pass after implementation Out of Scope - Manual template creation or editing - Pinning or reordering templates - Template suggestions based on time of day - Templates for categories the user has deleted ═══════════════════════════════════════════════════ Review the specification. If you are happy with it, say "generate the implementation plan" to activate speckit.plan, or edit the spec file directly to make changes first.
LLM outputs are non-deterministic and may vary from this example.
Once the specification is created and you are happy with it, ask your LLM to generate the implementation plan (the speckit.plan skill will auto-activate), then to break it into ordered tasks (speckit.tasks), and finally to implement them (speckit.implement). Review the output at each stage.
Delivering to Your Early Adopters
Section titled “Delivering to Your Early Adopters”The app is built. Now put it in the hands of the people who paid for it.
Your 10 early adopters from the Offer page are waiting. Share a development build (APK for Android, TestFlight for iOS). Send it to each early adopter with a short message: “Here is the time boxing app you signed up for. I would love to hear what you think.”
Run lightweight UAT. Ask each person to do three things: create a timebox and complete it, check the review screen after a few sessions, and adjust a setting. If they can do all three without asking you a question, the core experience works.
Collect feedback simply. A shared note, a WhatsApp group, or a reply to your message. Close the loop: when you fix something based on their feedback, tell them.
What Comes Next
Section titled “What Comes Next”You have taken a starter project, set up a development environment, and built a real feature using the SpecKit workflow with OpenAI Codex. The Time Boxing app is yours to keep building.
Head to the Scale page to learn how to grow beyond your first 10 early adopters with outreach, content, and the Core Four framework.