Copilot Code: build a simple web app

From a clear brief to a working web app.

Four prompts. Five core missions. Build a Bootcamp Lab Tracker, refine one thing at a time, and test the published result without writing code manually.

  • 30-minute core
  • 5 guided missions + 1 optional
  • Real training data
Bootcamp Lab Tracker with a dark design, day tabs, a timeline and green completed lab cards. View full-size screenshot
Your destination: a tracker with day tabs, a lab timeline and synchronized completion.

Your next 30 minutes

You are attending the bootcamp and need one place to see every day’s labs and mark them complete. Build from the published agenda, not an invented schedule. Lunch belongs on the timeline but must never count toward progress.

At a proctor-led event with a provided, pre-provisioned account? You're ready to start.

Using your own tenant? View setup requirements

Complete the classic lab’s prerequisite setup separately before starting. Copilot Code is a Frontier preview in the browser; this exercise needs no local development toolchain.

Build, Style, Label, Navigate and Publish take about 30 minutes; Extend is optional.

Checkmarks, quiz answers and your notes are saved only in this browser's local storage. Nothing is sent to the lab site. To keep them, download a PDF at the end.

Turn the agenda into a tracker

11 minutes Copilot Code

Start with a precise specification, then prove the basic tracker works before changing its appearance.

Your finish line A published neutral-grey tracker whose schedule and completion controls match the brief.

  1. Open Microsoft Copilot and sign in with your lab account. Select Code in the Home | Code switcher at the top of the left pane, then New session. Find Let’s build something together. and the Create anything box.

    Show me: the new Code session
    Copilot Code with Code selected, New session in the left pane, and the Create anything box. View full-size screenshot Copilot Code with Code selected, New session in the left pane, and the Create anything box. View full-size screenshot
    Start in Create anything. Keep the same session for all four prompts.
  2. Paste the entire prompt into Create anything, including the agenda URL and final instructions, then select the send arrow. Do not send Prompts 2–4 yet.

    Create anything
    Build an app called "My Bootcamp Lab Tracker". Progress is kept in memory only: it starts with every lab unchecked and resets on reload.
    
    Fetch the agenda at https://microsoft.github.io/mcs-labs/events/architecture-bootcamp/ and use every day's "Lab N:" items and "Lunch break" as the app's data (day, number, title, start, end). Skip everything else, including optional labs. If the page can't be fetched, stop and tell me.
    
    Layout (max 720px, centered):
    
    - **Sticky header:** "COPILOT BOOTCAMP" eyebrow, title, "N of TOTAL labs complete" (aria-live) and a progress bar.
    
    - **Timeline:** a Gantt chart for each day with hourly gridlines. Each row is labelled "LAB N" or "LUNCH". Lab bars are toggle buttons (aria-pressed) showing the title, truncated with "…". Hovering or focusing a bar shows a tooltip with its details. Lunch bars aren't clickable.
    
    - **Cards:** grouped by day. Each lab card is a label around a checkbox, showing "LAB N", the title and the time. Done cards get a strike-through and a "DONE" badge.
    
    Keep the bars, checkboxes, counter and progress bar in sync. Use neutral greys and square corners, with visible focus outlines. When done, give me a preview link I can open in my browser.
    Notice this

    Keep the tab open for about 5–7 minutes while Copilot Code fetches the agenda, writes and checks the code, then publishes. If it asks for permission to continue, for example to search the web, review and approve that lab action. If it cannot fetch the agenda or find labs, stop and tell your facilitator; do not invent a schedule.

  3. Select Open on the My Bootcamp Lab Tracker app card to show Preview beside the chat. Then select the Open in app arrow in Preview’s toolbar (accessible name: Open My Bootcamp Lab Tracker in app) to open the published tracker in a new browser tab. If there is no working link, ask Copilot Code for one before continuing.

    Click-by-click help

    The app tab may ask you to sign in again. Use the same lab account. If an account picker also lists your personal or work account, choose the lab account or Use another account; do not select the account connected to your device.

    Show me: the app card
    My Bootcamp Lab Tracker app card with an Open button. View full-size screenshot My Bootcamp Lab Tracker app card with an Open button. View full-size screenshot
    Open shows Preview; use its Open in app arrow for the published app.
    Notice this

    Copilot Code checks that the code builds and publishes, but it cannot click through the app itself in this flow. The behavior checks are yours.

    1. Compare every day’s lab numbers, titles, start/end times, and Lunch with the published agenda. Confirm time order.
    2. Confirm modules, welcome/re-cap, coffee breaks, Q&A, social, and all optional labs are excluded.
    3. Count the included labs. Confirm the header starts at 0 of TOTAL, using that count rather than a fixed number.
    4. Confirm neutral greys and square corners. The initial app may follow your browser’s light or dark theme; purple, green, amber, emojis, and day tabs come in the next three prompts.
    1. Click a lab’s timeline bar. Check that its checkbox, styling, overall completion count, and progress bar update together.
    2. Toggle a card’s checkbox and check that its timeline bar updates too.
    3. Uncheck a completed lab to reverse completion.
    4. Complete every included lab and confirm TOTAL of TOTAL.
    5. Try each day’s Lunch: it must not toggle or count toward progress.
    6. Reload the page and confirm all labs reset to unchecked.
    7. Use Tab and Space to operate the controls and confirm visible keyboard focus.
    Show me: synchronized completion
    Neutral-grey tracker with three DONE lab cards and a header showing 3 of 11 labs complete. View full-size screenshot Neutral-grey tracker with three DONE lab cards and a header showing 3 of 11 labs complete. View full-size screenshot
    The example has 11 labs; your total must come from the current agenda, not this screenshot.
    Notice this

    Fix failed checks before refining: describe the action, expected result, and actual result to Copilot Code in this same session. Ask it to preserve the original specification, correct the defect, and publish the correction. Select Refresh in New version available, then repeat the check. Ask your facilitator if it still fails. Only then continue to Prompts 2–4.

What makes this more than a convincing screen?Pause and reveal the idea

A working app passes observable checks, including undo and reload.

The prompt specifies content, interactions, and constraints. The agenda is the source of truth; synchronized state makes several controls reflect one completion value. A successful build alone does not establish that behavior.

  1. Published agenda
  2. Explicit specification
  3. Generated app
  4. Behavior you verify
Quick check

The screenshot shows 11 labs. Which total should your tracker use?

Something not matching?
Generation is taking longer than the mission budget.

Check whether Copilot Code is waiting for permission. If it is actively working, read ahead without submitting the next prompt. Do not resend Prompt 1 or start a second session. Ask your facilitator for help if generation or troubleshooting overruns.

The app link does not open, or the agenda cannot be fetched.

Ask Copilot Code for a working link if publishing completed. If it still fails, or the agenda cannot be fetched or contains no matching labs, stop and tell your facilitator. Do not fabricate the agenda.

A behavior check fails.

Report the action, expected result, and actual result in the same Code session. Ask for a focused correction without changing the agenda or in-memory progress, publish it, and select Refresh in the app’s New version available notice. A browser reload alone may still open the previous version. Repeat the failed check before continuing; ask your facilitator if it still fails.

Tab and Space work, but I cannot see which control has keyboard focus.

Ask Copilot Code to give timeline buttons and card checkboxes (or their enclosing labels) a clearly visible solid focus outline in both themes. Publish, load the notified version, and repeat Tab and Space on both control types. A successful build does not prove that the outline is visible.

Change the look, preserve the behavior

4 minutes Copilot Code + Preview

Apply a dark design without changing which labs count or how completion works.

Your finish line A dark preview with purple to-do labs, green completed labs, and amber Lunch.

  1. Paste Prompt 2 unchanged into Ask a follow-up or request changes and send it.

    Ask a follow-up or request changes
    Update with a dark theme, keeping everything else the same.
    - Background #0d0d0d, surfaces #161616/#1e1e1e, borders #2a2a2a, text #d4d4d4, headings #e8e8e8.
    - To do = purple #a78bfa (outlined bars, purple left border on cards).
    - Done = solid green #4ade80 bars, green-tinted cards.
    - Lunch = amber #fbbf24, with a dashed border and diagonal stripes.
    Keep focus outlines visible and respect prefers-reduced-motion.
  2. Wait for Copilot Code to finish the update, then inspect the Preview pane beside the chat. The Open in app arrow opens the published app, not this live preview. Confirm incomplete labs are purple, completed labs green, and Lunch amber with dashed borders and stripes.

    Show me: the dark app design
    Preview of the dark tracker with purple lab outlines, one green completed lab, and amber striped Lunch bars. View full-size screenshot Preview of the dark tracker with purple lab outlines, one green completed lab, and amber striped Lunch bars. View full-size screenshot
    The preview shows the dark appearance requested in the prompt.
  3. Toggle a lab in both directions. Confirm its bar, card, counter, and progress bar still agree, and focus outlines remain visible.

    Notice this

    Prompts 2–4 change Preview only; the published link keeps the basic version until you publish at the end. Each update reloads the preview, so earlier ticks reset because progress is in memory only.

Why say 'keeping everything else the same'?Pause and reveal the idea

A visual refinement is not a new specification.

The design changes, but schedule and completion behavior remain acceptance criteria. Repeating a small behavior check after each update catches regressions before the final test.

  1. One focused change
  2. Wait for Preview
  3. Recheck existing behavior
Quick check

The preview is dark, but your published link is still grey. What happened?

Something not matching?
My completed labs reset after the update.

That is expected: the update reloads the app. Do not add storage to fix it; resetting on reload is an explicit requirement.

The timeline bars look cut off.

Expand the Preview pane or check the published app in its own tab. The next prompt also shortens bar labels while retaining full titles elsewhere.

Shorten labels without losing meaning

3 minutes Copilot Code + Preview

Make the timeline easier to scan while preserving full lab titles and meaningful accessible names.

Your finish line Consistent topic emojis and short Lab N bars with full titles still available.

  1. Paste and send Prompt 3 in the same session. Wait about 1–2 minutes for the update before continuing.

    Same Code session
    Update by giving each lab a distinct emoji that suits its topic; lunch is 🥪. Show it before "LAB N" in the timeline row labels, on the cards and in the tooltips. Lunch bars read "🥪 Lunch", and lunch cards show 🥪 instead of a checkbox. Hide emojis from screen readers. At ≤480px, the timeline row labels show the emoji only.
    
    Lab bars should say "Lab N" instead of the title, which gets cut off. The full title stays in the tooltip, the aria-label and the card.
  2. Confirm each lab’s emoji is consistent across its timeline row, card, and tooltip. Check Lab N on the bars and the full title in the tooltip, accessible name, and card. Confirm Lunch remains non-interactive. Save the narrow-screen check for the published tracker.

    Show me: short labels with full tooltips
    Dark tracker with topic emojis, short Lab N bar labels, and a tooltip containing Lab 3's full title. View full-size screenshot Dark tracker with topic emojis, short Lab N bar labels, and a tooltip containing Lab 3's full title. View full-size screenshot
    Short visual labels must not remove the full title. Generated emoji choices can differ.
Did shorter labels mean less information?Pause and reveal the idea

A compact visual label still needs a meaningful accessible name.

Emojis help scanning, but they are decorative here. The tooltip, aria-label, and card retain the title so a shortened bar does not become an unexplained control.

  1. Short visual label
  2. Full title retained
  3. Accessible name checked
Quick check

Which change would violate Prompt 3?

Something not matching?
The full title is no longer available.

Hover or focus a bar and inspect the card and accessible name. Report the missing information to your facilitator; do not accept shortened labels that remove meaning.

Even Lab N is clipped on a short bar, or disappears when I complete it.

Ask Copilot Code to keep the complete short label readable before and after completion, including at 400px, without changing the agenda times or accessible name. A label beside a short bar can remain part of the same toggle button. Recheck the label, tooltip, and toggle after the correction.

Verify the version other people can open

8 minutes Preview + published app + browser DevTools

Publish the refinements, then test the actual app for correct progress, keyboard access, and narrow-screen behavior.

Your finish line A published tracker checked against the original specification, not just its appearance.

  1. Select Publish at the top of Preview. Wait about 1–2 minutes while it shows Publishing…, until Your app is published appears with Open app and Share. You can also ask Copilot Code to publish.

  2. Return to the tracker browser tab. Select Refresh in New version available. If the notice is absent after publishing completes, reload the tab to check for it, then select the notice’s Refresh button; a browser reload alone may retain the older version. If that tab is closed, select Open app. Run the remaining checks in the published app’s tab, not just Preview.

    Show me: the new version notification
    New version available notification with a Refresh button in the published app. View full-size screenshot New version available notification with a Refresh button in the published app. View full-size screenshot
    Use this Refresh button to load the newly published version.
    1. Repeat the Build mission’s schedule and completion checks: every day’s numbers, titles, times, Lunch, exclusions, dynamic total, toggles, reversal, and TOTAL of TOTAL must still be correct.
    2. Complete a lab on one day, switch to another, and switch back. Confirm the tick remains and the header includes completions from all days.
    3. Compare each tab’s x/y count with that day’s completed and total labs.
    4. Complete all labs on a day and confirm its count turns green both while that tab is selected and after selecting another day; uncheck one and confirm complete-day styling reverses.
    5. Confirm bars, checkboxes, per-day counts, the overall counter, and progress bar stay synchronized. Lunch must never count.
    1. Use Tab to reach the day tabs and selected day’s controls.
    2. Use arrow keys to navigate tabs; activate with Enter or Space if needed. Confirm visible focus.
    3. Hover over or focus a lab bar and confirm its full title remains available.
    4. Check with a screen reader that decorative emojis are not announced and each lab still has a meaningful name.
    1. Make the published app narrower than 480px. In browser DevTools, press F12, then Ctrl+Shift+M, and set device emulation to 400px wide.
    2. Confirm timeline row labels show only emojis and day tabs remain usable. Also test 480px: Prompt 3 includes that boundary. At 481px, the row text should be visible again. If 480px fails, ask for a focused correction and repeat the check; passing at 400px alone is not enough.
    3. Reload the page and confirm completion resets because there is no storage. This differs from switching tabs, which must keep ticks.
    4. Confirm square corners and the dark theme remain after all updates.
    Show me: the 400px-wide tracker
    Finished tracker at 400px wide with emoji-only timeline row labels and three usable equal-sized day tabs. View full-size screenshot
    Check usability at 400px, then verify the inclusive 480px boundary and the return of row text at 481px.
When is the task really finished?Pause and reveal the idea

After you open and use the published app.

Publishing moves the refinements beyond Preview. Repeating the original checks catches regressions; keyboard, screen-reader, and narrow-width checks test whether a polished layout remains usable.

  1. Publish
  2. Refresh the app
  3. Repeat functional checks
  4. Test access and width
Quick check

The app looks finished in Preview. What is still required?

Something not matching?
The published link still shows an older version.

Prompts 2–4 changed Preview only. Select Publish, wait for Your app is published, then Refresh in the app tab. If the link still fails, ask Copilot Code for a working link and tell your facilitator.

The labels remain full length at 480px.

Tell Copilot Code that Prompt 3 requires emoji-only row labels at 480px inclusive, not just below it. Ask it to preserve screen-reader text and all other behavior, publish the correction, and load it with the app’s Refresh notice. Recheck 400px, 480px, and 481px.

A final check fails.

Report your action, expected result, and actual result to your facilitator. Keep the initial specification available; do not add persistent storage or invent a new schedule to conceal a failure.

Transfer the method to your own idea

Optional mission 3 minutes Your notes

Practice describing one further refinement and the behavior it must preserve.

Your finish line A focused change brief with an acceptance check.

  1. Write down one further refinement for this tracker or your own small app. Name the existing behavior you would explicitly preserve; do not submit another build during the core lab.

  2. Write one action and its expected result. Explain why Prompt 2 preserves behavior, why Prompt 3 retains full titles, why a tab switch differs from reload, and why you check after each prompt instead of submitting all four together.

What transfers beyond this tracker?Pause and reveal the idea

Specify, inspect, and refine one change at a time.

This is a deliberately scoped prototype, not a production-ready service. The prompts do not require a single HTML file or a particular framework. Plain HTML/CSS/JavaScript and React still face the same acceptance checks. React can help organize reusable components and state as an interface grows, but adds dependencies and build tooling; accounts, shared data, saved cross-device progress, or server-side credentials call for a different, full-stack scope.

  1. One change
  2. Preserved behavior
  3. Observable acceptance check
Quick check

Which follow-up brief is easiest to verify?

You built, refined, and checked a web app

Four unchanged prompts took you from a published agenda to a tracker with a dark design, emojis, accessible day tabs, and a published link. Your acceptance checks—not the generation summary—establish whether it works.

Want to go further? Transfer the method to your own idea (optional, 3 minutes).

Specify
Describe content, interactions, and constraints. The agenda determines the total; Lunch is not a lab.
Verify
Exercise completion and reversal across bars, cards, day counts, and overall progress.
Preserve
Change one thing at a time and recheck existing behavior. Tab switches keep ticks; reloads reset them.
Include
Check keyboard focus, arrow-key tabs, meaningful names, and narrow-screen labels.
Publish
Preview changes do not update the published link until you publish and refresh.

Saved only in this browser. Your note stays in this browser's local storage on this device. It is not sent to the lab site or your Microsoft account, does not follow you to another browser or device, and is erased if you clear browsing data or reset progress. Download a PDF to keep it.

Product guidance and further reading

Product UI and available capabilities can vary by tenant. Screenshots show the training experience, not a promise of identical generated output.

Updated: