Walkthrough: Your First App
Build a tiny task app with copy-paste prompts. Do the phases in order—do not skip ahead.
Phases complete: 0 / 6
Check each phase when you finish it. All six required phases must be checked for this walkthrough to count as complete (opening the page is not enough).
Do phases in order (0 → 1 → 2…). Copy the “Send this” prompts the first time. Make add / complete / filter / delete work before extra polish.
About 45–90 minutes. No servers, databases, or accounts required. You will build a real mini app that runs by opening index.html and remembers data in the browser.
What you will build
Focus List — a tiny personal task app:
- Type a task and add it with a button or Enter
- See a list of tasks
- Mark a task complete / incomplete
- Delete a task
- Filter: All / Active / Done
- Data saved in the browser (localStorage) so refresh keeps your list
- Empty state when there are no tasks
That is a complete user journey for a first app—not a social network, not login, not multiplayer sync.

A small notebook the browser keeps per website/file origin. Your tasks stay after refresh on the same computer and browser—not a cloud account. Perfect for a first app.
What you need
- Grok installed and signed in
- Ability to approve file edits calmly
- A desktop browser
Prompt rules for this walkthrough
One journey step at a time · attach files · require manual verification · ban unnecessary frameworks · ask for empty/error states explicitly
“Build a full SaaS” · add login first · invent a backend · install React “because serious apps use it” · skip saving data until the UI works
| Avoid saying | Why | Say instead |
|---|---|---|
| “Clone Todoist” | Infinite scope | Focus List feature list above |
| “Use Next.js + Postgres + Auth” | Weeks of setup | Vanilla HTML/CSS/JS + localStorage |
| “Make the UX world-class” | Vague | Concrete UI requirements per phase |
| “Also add teams and comments” | Scope creep | One feature prompt after v1 works |
Phase 0 — Create the project folder
-
mkdir -p ~/projects/focus-list cd ~/projects/focus-list pwd grok /rename focus-list-walkthrough
Phase 1 — Journey + project rules
“Scaffold a modern production app architecture.”
Goal: Create planning files only (no app UI code yet).
Create AGENTS.md:
- App name: Focus List
- Stack: vanilla HTML, CSS, JavaScript only; no npm, no frameworks, no backend
- Run: open index.html in a browser
- Data: browser localStorage key focus-list-tasks
- Rules: accessible labels, simple readable code, no drive-by refactors
- Definition of done: open index.html, use the feature, refresh, data still there when relevant
Create JOURNEY.md with this happy path:
1. Open the app
2. See an empty state message when there are no tasks
3. Type a task title and add it
4. See it in the list as active
5. Mark it complete (it should look completed)
6. Filter between All / Active / Done
7. Delete a task
8. Refresh the browser — tasks remain
Out of scope: user accounts, sync across devices, due dates, tags, collaboration, PWA install prompts, dark-mode engines, component libraries
Verification: print both files fully. Stop after that.AGENTS.md and JOURNEY.md exist and scope is small.
Phase 2 — Static shell (looks like an app, not fully wired)
@AGENTS.md @JOURNEY.md
Goal: Build the visual shell of Focus List so the page looks like the app.
Create:
- index.html
- css/style.css
- js/main.js
UI must include:
- App title "Focus List"
- Text input with placeholder "What matters today?"
- Add button
- Filter controls: All | Active | Done
- A list region (can show 2–3 fake sample tasks hard-coded for layout only)
- A footer line for counts like "2 items left" (can be hard-coded temporarily)
Constraints:
- Vanilla only; no libraries
- Clean, readable layout; good spacing; works on a laptop browser width
- Use semantic HTML (header, main, ul/li, button, input label)
Verification:
1. Tell me how to open it
2. I should see the full layout with no console errors
3. Buttons do not need full behavior yet — but page must not look broken
Stop when the shell looks good.- Approve files.
- Open
index.htmlin your browser. - Confirm layout is readable. Hard-refresh if styles look stale.
You see a credible app layout with input, filters, and a list area.
Phase 3 — Make features work (still in-memory OK)
Wire behavior. Saving across refresh comes in Phase 4 if not already included—many implementations will do both together; the prompt allows either order but requires working UI first.
“Add authentication and a REST API for tasks.”
@JOURNEY.md @AGENTS.md @index.html @css/style.css @js/main.js
Goal: Implement the full happy path in JOURNEY.md.
Behavior requirements:
- Add task from input via Add button and Enter key; ignore empty/whitespace-only titles
- Clear the input after adding
- Each task shows title, a complete toggle (checkbox or button), and a delete button
- Completed tasks are visually distinct (strike-through or muted style)
- Filters: All / Active / Done — only matching tasks visible; active filter highlighted
- Empty state: when the visible list is empty, show a friendly message
- Item count text updates (e.g. "3 active left")
- Remove any hard-coded fake tasks from the shell phase
Data:
- Keep tasks in a JavaScript array of objects { id, title, done }
- Prefer implementing localStorage persistence now (key focus-list-tasks). If you split work, in-memory first is OK only if you clearly say persistence is next — but please implement persistence in this step if straightforward.
Constraints:
- No frameworks, no npm
- No backend
- Keep code beginner-readable; comment short section headers in main.js
Verification checklist in your reply:
1. How to add
2. How to complete
3. How to delete
4. How filters work
5. Whether refresh keeps data
6. Confirm no dependencies added
I will playtest with the journey steps next.- Approve edits; refresh browser.
- Manual test (do every line):
- Confirm empty state (delete samples if any remain).
- Add three tasks.
- Complete one.
- Filter Active — completed hidden.
- Filter Done — only completed.
- Filter All — all visible.
- Delete one task.
- Refresh the page — remaining tasks should still be there if persistence was implemented.
Bug report template:
@js/main.js @index.html
Bug on journey step [number]: I did [x], expected [y], saw [z].
Console: [paste or "none"]
Fix minimal; do not add features.Add / complete / filter / delete all work during the session. Prefer persistence already working.
Phase 4 — Persistence guarantee + polish
@js/main.js @AGENTS.md @JOURNEY.md @css/style.css
Goal: Guarantee localStorage persistence and a small polish pass.
Requirements:
- Save tasks to localStorage key focus-list-tasks whenever the list changes
- Load tasks on startup; if missing/corrupt, start with []
- After load, render list and counts correctly
- Polish: focus ring styles for keyboard users; hover states on buttons; mobile-friendly padding
- Optional: "Clear completed" button that removes done tasks (only if simple)
Non-goals: sync, accounts, drag-and-drop reorder (unless already trivial)
Verification:
1. Add two tasks, complete one, refresh twice — state remains
2. Explain how to wipe data manually if I want a reset (e.g. clear site data)
3. No new librariesClose the tab, reopen index.html, and your tasks are still there. Filters and counts still make sense.
Phase 5 — Finish line
-
@AGENTS.md @JOURNEY.md Write README.md for a total beginner: - what Focus List is - how to open it - features included - out of scope - where data is stored (localStorage) Keep it short. /rename focus-list-done- Show a friend: add a task, refresh, prove it saved.
You shipped an app if…
Someone else can open the file, use the journey, and data survives refresh—without you explaining the code.
Sensible next features (one prompt each)
Edit title on double-click · due dates · export JSON · light/dark toggle — always include verification.
# Example next feature (after v1)
@js/main.js @index.html @css/style.css
Add double-click on a task title to edit it inline; Enter saves, Escape cancels.
Persist changes. Verification: edit a title, refresh, new title remains.
No other features.Troubleshooting
| Problem | Fix approach |
|---|---|
| Data vanishes on refresh | Phase 4 prompt; ask Grok to log save/load in console temporarily |
| Filters wrong | Report which filter + example tasks + expected visibility |
| Grok added React/Vite | “Delete framework scaffolding. Vanilla only per AGENTS.md.” |
| Styles not updating | Hard refresh; confirm css path in index.html |
| Duplicate tasks on add | Bug prompt with exact steps; check event listeners bound twice |
You can run the full JOURNEY.md path without help, refresh, and still see your tasks.
Related: Building Apps (concepts) · First Game walkthrough · Prompt Craft
You finished the app walkthrough. Default next: Intermediate Day-2 Git with Grok (next lesson in the curriculum order), then Slash Commands.