Scroll a list
The schedule is a stack of cards, like a feed. Each card is one session instead of one video or post.
Start Here
This page can do two jobs. If you are at the conference just exploring, it can explain what you are looking at in plain language. If you want to open the file later and poke at it, it can also guide you through safe beginner edits.
Most conference visitors will want the explainer path. Switch to tinkering only if you want the guide to talk more like a build-along and point you toward safe edits.
The default is the conference-friendly explainer view. Tinkering mode unlocks edit ideas and the coding-depth switch below.
Since you chose the tinkering path, you can decide how much coding vocabulary you want. The default still keeps things plain and beginner-friendly.
This second switch only changes the amount of technical language. It does not change the overall structure of the guide.
Familiar First
When you open Instagram, YouTube, or TikTok, you already know what to do: scroll, look for something interesting, tap it, and open more detail. This conference site uses the same habits. It just swaps videos and posts for sessions, speakers, and notes.
The schedule is a stack of cards, like a feed. Each card is one session instead of one video or post.
Tapping a session opens extra details, the same way apps often open more information when you press into something.
The tabs at the top work like jumping between sections of an app: schedule, people, and your own notes.
When you write a note, the browser remembers it on that same device so it is still there after a refresh.
How To Explore
You do not need to understand every line all at once. A better approach is to explore the page the same way you would explore a new app: notice a pattern, make a guess, try a small change, and see what happened.
Pick something simple first: a tab name, a button label, a color, or a heading you can already see on the page.
Use find-in-page to look for the same word in the file so you can see where that part of the page comes from.
Guess why that part of the page exists or what job it is doing for the attendee.
Edit one small thing at a time so you can tell exactly which change caused the result you see.
Open the live app again and see whether you can spot the same pattern somewhere else on the page.
Reload the page, notice what changed, and try to explain it back in your own words before moving on.
While You're Browsing
Even without changing the code, you can still read the app like a builder. The trick is to notice the repeated patterns and ask what job each part is doing.
The schedule works like a feed. It repeats one card pattern over and over, which makes the page easier to scan quickly.
The tab bar acts like a remote control. It changes your view without sending you to a totally different website.
Your notes feel personal because the browser keeps them on this same device, a bit like a draft that stays in your own notebook.
Buttons, chips, and jump links shorten the path to what you need, which matters when people are standing in hallways between sessions.
Big Idea
Under the hood, the site is doing four jobs over and over: keep the conference information somewhere, show it on screen, react when someone taps something, and remember notes on the same device.
The conference sessions and speaker details are written down in the file so the page can use them later.
The site takes that written-down information and turns it into the cards and sections you can actually see.
When someone taps a tab, opens a session, or saves a note, the page notices and updates what is on screen.
The browser keeps your notes on that same phone or computer, so they are still there after a refresh.
Main Files
This project is small on purpose. That makes it easier to teach from, easier to edit quickly, and less overwhelming for first-time readers.
This is the live conference app. Most of the action is here: the page pieces, the visual styling, the tap behavior, and the conference information.
This is the explainer page you are reading now. It is separate so curious learners can explore without getting in the way of the live conference view.
Uses the same visual language as the app.
Optimized for mobile reading and quick scrolling.
Explains the real site instead of a fake teaching example.
A small service worker file that saves the app to your browser so it works offline at the conference venue, even without WiFi.
README.md tells the full story of how the project was built, and CLAUDE.md is extra guidance for future coding helpers.
1. Page Outline
HTML is the part that names the big pieces of the page: the top bar, the main area, the tabs, the pop-up, and the little status message. It helps the browser know what belongs where.
This is a shortened version of the real layout in index.html.
<header class="app-header">...</header>
<main>
<section id="scheduleTab" class="tab-content active"></section>
<section id="speakersTab" class="tab-content"></section>
<section id="notesTab" class="tab-content">
<div id="notesComposer"></div>
</section>
</main>
<div class="modal-overlay hidden" id="exportModal">...</div>
<div class="toast" id="toast"></div>
These named pieces give the rest of the page something to work with later.
The header stays visible while you scroll.
The tabs point to different sections of the page.
The pop-up and little message bubble already exist, so the page can simply show or hide them.
2. Look And Feel
CSS decides how the site looks and feels. It picks the colors, spacing, fonts, button sizes, and the smooth open-close motion that makes the page feel polished on a phone.
The page gives important colors names so they can be reused in many places.
:root {
--bg: #001329;
--surface: #002040;
--teal: #07a8a8;
--orange: #c8531d;
--lime: #afcd53;
--text: #fff7eb;
--font-display: 'Sen', sans-serif;
}
This is part of what makes each session row smoothly expand instead of popping open suddenly.
.session-body {
max-height: 0;
overflow: hidden;
transition: max-height 0.42s cubic-bezier(0.16, 1, 0.3, 1);
}
The layout starts with phones in mind, then opens up a bit more on larger screens.
Buttons are large enough to tap comfortably when students are standing, walking, or moving between sessions.
Changing one shared color can update many parts of the page at once, which is much easier than editing every button one by one.
3. What Happens On Tap
JavaScript is the part that notices what a person did and responds. It opens a session, switches tabs, saves a note, or shows a message after a button press.
The page builds the schedule from the saved conference information.
function renderSchedule() {
const html = SCHEDULE.map(session => `...`).join('');
document.getElementById('scheduleList').innerHTML = html;
attachScheduleEvents();
}
After the buttons exist, the page tells them what to do when someone presses them.
root.querySelectorAll('.session-trigger').forEach(btn => {
btn.addEventListener('click', () => toggleSession(btn.dataset.id));
});
One small helper keeps the top tabs and the visible section in sync.
function activateTab(target) {
document.querySelectorAll('.tab-btn').forEach(btn => {
const isActive = btn.dataset.tab === target;
btn.classList.toggle('active', isActive);
});
}
This helper makes sure user-facing text is treated like text, not like page instructions.
function esc(str) {
return str
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"');
}
4. Saved data
The site keeps notes in the browser instead of sending them to an account or a server. That keeps the setup simple for a conference, but it also means your notes stay with the same browser on the same device.
The page keeps all notes under one shared storage name.
const NOTES_KEY = 'emw2026_notes';
localStorage.setItem(NOTES_KEY, JSON.stringify(notes));
const saved = JSON.parse(localStorage.getItem(NOTES_KEY) || '{}');
The app can remember a note for a session, a speaker, or a general quick thought.
session:thu-04
speaker:maya-rogers
general:quick-note-1775020500000
Students can open the site and start typing right away. No sign-in is needed.
The app can remember notes tied to a session, notes tied to a speaker, and multiple quick notes for anything else.
If you switch browsers or clear storage, the notes will not come with you. Simple tools often trade power for ease.
If You've Coded Before
If you have done Scratch or basic programming before, these comparisons can help you connect what you already know to this page.
A JavaScript array like SCHEDULE. Both store many items in order.
A JavaScript variable or constant like NOTES_KEY or NOTE_TYPES.
The startup section near the bottom that calls renderSchedule() when the page loads.
An event listener like btn.addEventListener('click', ...).
Calling a function such as activateTab('notes') so other parts of the app react.
Adding or removing classes like active, expanded, or hidden.
Hands-on ideas
These are low-risk edits with a high chance of success. Try one at a time, refresh the page, and notice what changed.
Find --teal: #07a8a8; in :root and replace it with a new color.
Watch how many buttons, badges, and highlights update together.
Search for the visible word Speakers in the HTML and rename it to something like People.
Notice how HTML text changes are often the easiest first wins.
Find showToast('Note saved ✓') and change the words.
This helps you see where the page stores short feedback messages.
Edit one object inside const SCHEDULE = [, then refresh and inspect how it appears in the accordion card.
This shows how written-down information turns into something visible on the page.
Questions To Ask
Because the cards follow the same pattern. Writing the information once and reusing the pattern means the page stays consistent and is much easier to update — change one speaker name in the data and every place it appears updates automatically.
Because simple is a feature here. One easy-to-open file is great for a conference site and easier for beginners to inspect. Frameworks add power, but also add setup steps and learning curve that were not needed for this project.
Because the page sometimes drops text into the page structure. Without escaping, a note containing a < character could accidentally be treated as part of the page code instead of displayed as text. This is a basic web security habit.
Because the buttons have to exist before the page can connect behavior to them. First create them, then teach them what to do. If you tried to attach a listener to a button that has not been created yet, the code would fail silently.
Because the goal was zero friction for students: open the page, start typing, done. No sign-up, no login, no server. The tradeoff is that notes live in one browser on one device.
The JavaScript compares session start and end times against the current time on your phone (in Hawai'i time). It checks every minute and moves the NOW and Up Next badges accordingly.
A natural next step would be to split the project into smaller files once one big file starts to feel crowded. After that, a component framework like React or Vue could help manage more complex interactions — but for this scale, plain HTML and JavaScript do the job well.
Works Without WiFi
Conference WiFi can be unreliable, so the app saves itself to your phone the first time you visit. After that first load, it opens instantly even without an internet connection.
A small background helper downloads the app files and stores them in the browser's cache, like pre-loading a playlist before a flight.
On later visits, the browser opens the saved copy immediately while quietly checking for updates in the background.
Why this fits the event
Anyone can open the site quickly, and future editors can make changes without extra setup getting in the way.
Learners can inspect the real page in one place instead of bouncing through a lot of folders and tools.
The design focuses on scrolling, contrast, and easy taps because students will actually use it on their phones during the event.
Device-only note storage is practical when you want quick note taking without accounts, passwords, or a server.