Complete setup checklist for running the NYC Masterclass lab with 50 participants.
Time Required: 4-6 hours (spread over 1 week) Lab Duration: 3 hours 15 minutes (9:15 AM – 12:30 PM, including 15-minute break)
Key Stats:
- 50 participants
- 8 exercises (9:15 AM – 12:30 PM, 15-min break 11:20–11:35)
- Multi-site architecture (hands-on repoless setup)
- Real-world collaborative site building
Collision Prevention Strategy:
- Each participant: personal git branch (
jsmithformat) - All participant content:
/drafts/jsmith/in DA.live - Pre-populated shared reference data
- No simultaneous editing of shared resources
- Deploy Cloudflare Worker for Exercise 6
- Test worker and Slack integration
- Verify all content exists (sessions, labs, speakers, future-events)
- Verify index config is active in config storage (includes /sessions/, /labs/, excludes /drafts/**)
- Publish all content to
.aem.live - Verify query-index populates with custom metadata
- Verify all JSON endpoints work (speakers.json, future-events.json, query-index.json)
- Verify participants have DA.live access
- Assign participants to branches
- Send participant setup instructions
- Final endpoint verification (speakers, future-events, query-index)
- Dev server test
- Monitor query-index freshness
- Test worker one final time
- Verify Site Admin tool is accessible
The index definition is stored in EDS config storage (not in the git repo — helix-query.yaml was intentionally removed from the repository). Verify the config is active via the Index Admin tool:
https://tools.aem.live/tools/index-admin
The config should have:
- Includes:
/sessions/**and/labs/** - Excludes:
/drafts/** - Custom properties: speaker-name, instructor, category, tags, published-date, session-level, session-time, difficulty-level, duration
After publishing all content, verify:
curl https://main--nycmasterclass--cloudadoption.aem.live/query-index.json | jq '.data | length'
# Should return 15+ (7 sessions + 8 labs)
curl https://main--nycmasterclass--cloudadoption.aem.live/query-index.json | jq '.data[0] | keys'
# Should include custom metadata fieldsAction: Verify query index populates after all session/lab pages are published.
All in /sessions/ folder, published to .aem.live:
-
/sessions/what-is-edge-delivery(Amol Anand) -
/sessions/architecture-deep-dive(Matt Ward) -
/sessions/authoring-approaches(David Nuescheler) -
/sessions/development-best-practices(Stefan Seifert) -
/sessions/integration-strategies(Kiran Murugulla) -
/sessions/edge-commerce(Matt Ward) -
/sessions/ai-development(Stefan Seifert)
Each should have: Hero block, content, metadata block with custom fields (speaker-name, category, tags, session-level, session-time, published-date)
All in /labs/ folder, published to .aem.live:
-
/labs/authoring-first-page -
/labs/block-development -
/labs/dynamic-cards -
/labs/search-block -
/labs/json2html -
/labs/form-submissions -
/labs/da-plugin-development -
/labs/repoless-setup
Each should have: Hero block, content, metadata block with custom fields (instructor, difficulty-level, duration, category)
Speakers Sheet (/speakers in DA.live):
- 6 Adobe expert speakers
- Columns: Name, Title, Company, Bio, Image, Session, LinkedIn
- Published to
.aem.live - JSON endpoint: https://main--nycmasterclass--cloudadoption.aem.live/speakers.json
curl https://main--nycmasterclass--cloudadoption.aem.live/speakers.json | jq '.total'
# Should output: 6Future Events Sheet (/future-events in DA.live):
- 6 future masterclass events (Sydney, London, Bangalore, Berlin, Singapore, Dubai)
- Columns: city, country, date, venue, address, description, highlights, image, registrationUrl, URL
- Published to
.aem.live - JSON endpoint: https://main--nycmasterclass--cloudadoption.aem.live/future-events.json
- Note:
highlightsfield is comma-separated string (not array)
curl https://main--nycmasterclass--cloudadoption.aem.live/future-events.json | jq '.data.total'
# Should output: 6Required for: Exercise 3 (speakers.json), Exercise 5 (future-events.json)
-
/(Homepage with hero, featured cards sections) -
/schedule(Schedule page with hero, table blocks with section metadata) -
/register(Registration page with hero, mc-register block) -
/speakers(Speakers page with hero, placeholder content for Exercise 3)
-
/nav.htmlincludes: Home, Schedule, Speakers, Register links
The answers branch contains complete solution code for all exercises (blocks/search/, blocks/dynamic-cards/, blocks/feedback/, blocks/tradingview/, tools/plugins/embedwidget/, etc.). Exercise instructions link directly to it so participants can copy block code.
Do not delete or force-push the answers branch. It is a permanent reference, not a feature branch.
Create participants.txt with branch names (one per line):
jsmith
agarcia
kwang
...
(50 total)
Format: first initial + last name, lowercase (e.g., John Smith = jsmith)
git checkout main
git pull origin main
while read branch; do
git checkout -b "$branch" main
git push origin "$branch"
git checkout main
done < participants.txtVerify: git branch -r | grep -v main | wc -l should output 50
Document for reference:
| Participant Name | Branch | Preview URL |
|------------------|--------|-------------|
| John Smith | jsmith | https://jsmith--nycmasterclass--cloudadoption.aem.page/ |
Required for: Exercise 6 - Form Submissions
- Create Cloudflare Worker:
nycmasterclass-feedback - Deploy worker code (see Exercise 6 for POST structure)
- Add environment variable:
SLACK_WEBHOOK_URL - Deploy and note Worker URL
Worker must handle:
- CORS preflight (OPTIONS)
- POST requests with JSON body (name, email, company, participant_id, submission_time)
- Slack Block Kit formatting
- Error responses with proper CORS headers
curl -X POST https://nycmasterclass-feedback.{account}.workers.dev \
-H "Content-Type: application/json" \
-d '{"name":"Test","email":"test@test.com","company":"Test"}'Verify: Returns {"success":true} and posts to Slack
Create labs/WORKER_URL.txt with the worker URL for participants to use in Exercise 6.
Required for: Exercise 8 - Repoless Setup
- Visit: https://tools.aem.live/tools/site-admin/index.html
- Verify you're logged in (requires AEM Sidekick extension)
- Search for
cloudadoption/nycmasterclass - Confirm site configuration is visible
Confirm all participants have:
- DA.live access to
cloudadoptionorganization - Ability to create new DA.live projects
- Access to Site Admin tool (requires AEM Sidekick login)
Note: In Exercise 8, each participant creates their own DA.live project (cloudadoption/jsmith-mc) and configures code source via Site Admin tool. No pre-setup needed.
Subject: NYC Masterclass 2026 - Setup Instructions
Include:
- Branch assignment
- Preview URL:
https://{branch}--nycmasterclass--cloudadoption.aem.page/ - Setup guide: Link to
labs/SETUP.md - DA.live access: https://da.live/#/cloudadoption/nycmasterclass
Create: #nycmasterclass-registrations for Exercise 6 form submissions
- All 50 participant branches exist
- All participants assigned to branches (roster created)
- All participants emailed with setup instructions
- Speakers sheet published (speakers.json works)
- Future events sheet published (future-events.json works)
- Query index has 15+ entries with custom metadata
- Worker deployed and tested
- Site Admin tool accessible to participants
- Slack channel created
- Homepage and schedule published
- All JSON endpoints verified
- Dev server runs:
aem up- http://localhost:3000 loads - Speakers JSON works: https://main--nycmasterclass--cloudadoption.aem.live/speakers.json
- Future Events JSON works: https://main--nycmasterclass--cloudadoption.aem.live/future-events.json
- Query Index works: https://main--nycmasterclass--cloudadoption.aem.live/query-index.json
- Worker responds:
curl -X POST {worker-url} -d '{"name":"Test"}' - DA.live accessible: https://da.live/
- Site Admin tool works: https://tools.aem.live/tools/site-admin/index.html
- GitHub repo accessible
- Participant roster available
- Slack channel open
Exercise 1 (20 mins): Authoring Your First Page
- Verify participants can create pages in
/drafts/jsmith/ - Check they understand
.md,.plain.html, "View document source" inspection - Confirm proper naming convention (jsmith format)
Exercise 2 (20 mins): Block Development - Simple Variations
- No special monitoring needed
- Watch for CSS scoping issues
Exercise 3 (25 mins): Dynamic Cards with Data Sources
- Verify participants copy
/speakers.jsonto/drafts/jsmith/speakers.json - Confirm they add personal speaker data
- Check dynamic-cards block fetches from
/drafts/jsmith/speakers.json - Monitor for fetch/CORS errors
Exercise 4 (25 mins): Extend Search Block from Block Collection
- Verify query-index.json is accessible and populated (15+ entries with custom metadata)
- Confirm participants create
blocks/search/search.jsandblocks/search/search.css - Check that search results render as Cards block cards
- Verify participants can find their own
/labs/jsmith/page via search - Monitor for
cards.cssnot loading (check browser console for import errors)
Exercise 5 (25 mins): JSON2HTML - Dynamic Pages
- Verify future-events.json is accessible
- Help participants with JSON2HTML Simulator: https://tools.aem.live/tools/json2html-simulator/
- Guide Admin Edit tool usage: https://tools.aem.live/tools/admin-edit/index.html
- Watch for Mustache template issues (highlights is string, not array)
Exercise 6 (20 mins): Form Submissions to Slack
- Monitor Slack channel for form submissions
- Watch for CORS or worker endpoint errors
- Verify participants use correct Worker URL
- Check JSON POST structure
Exercise 7 (30 mins): DA Plugin Development
- Help with local plugin testing (
?ref=local) - Verify branch testing (
?ref=jsmith) - Check DA App SDK PostMessage API issues
- Monitor for context/token/actions problems
Exercise 8 (30 mins): Repoless Multi-Site Setup
- Guide participants creating DA.live projects (
cloudadoption/jsmith-mc) - Help with Site Admin tool configuration (code source points to
nycmasterclass) - Verify DevTools Network tab shows code from
nycmasterclass - Watch for DA.live project creation permissions
- Check Site Admin tool access
Query index empty: Verify published to .aem.live, check helix-query.yaml committed, wait 5-10 mins, force re-index via Index Admin
Speakers/Future Events 404: Verify sheet published (not just previewed), test JSON endpoint
Participant can't push: Verify branch exists, check they're on correct branch, verify GitHub permissions
Worker not working: Test with curl, check Cloudflare logs, verify Slack webhook URL, check CORS headers
JSON2HTML not working (Exercise 5): Verify future-events.json published to .aem.live, test template in Simulator first, check worker config in Admin Edit, remember highlights is string not array
Site Admin not accessible (Exercise 8): Verify logged in via AEM Sidekick extension, check org access, try logout/login
Can't create DA.live project (Exercise 8): Verify DA.live access to cloudadoption org, check permissions, confirm creating project not folder
gh pr list
gh pr view {pr-number}
gh pr checks {pr-number}
gh pr merge {pr-number}- Archive/delete participant branches after 30 days
- Export lightning talk content
- Collect feedback
- Document lessons learned
Setup creates:
- Complete starter site (9 pages: sessions, labs, supporting pages)
- 6 speaker profiles via speakers.json
- 6 future events via future-events.json
- Query index with custom metadata
- 50 participant branches (isolated workspaces)
- Cloudflare Worker for form submissions
- Slack integration
- Site Admin tool access for repoless
- Zero collision risk
Participant experience:
- Personal workspace (
/drafts/jsmith/) - Personal data first (Exercise 3), shared data later (Exercise 4-5)
- Hands-on with real tools (Simulator, Admin Edit, Site Admin)
- Create own repoless site (Exercise 8)
Exercise changes from original:
- Exercise 3: Dynamic Cards fetching from a personal
speakers.json(personal workspace approach) - Exercise 4: Extend Search Block from Block Collection using
query-index.jsonas data source - Exercise 5: JSON2HTML worker (not speaker profiles)
- Exercise 7: Extended to 30 minutes
- Exercise 8: Hands-on site creation (not pre-configured observation)