Project: Interactive & Data-Driven User Interfaces
Table of Contents:
Overview
It's time for your first paired project week! For this project, you and a partner will build an application that interacts with a third-party API. You will fetch data, render the fetched data to the DOM, and then fetch some more data! In the end, you will have a deployed interactive application that connects with a web API.
The main technical goal of your app is to send two fetches and render the fetched data:
First, fetch a collection of resources (GET a set of users, a set of pictures, a set of authors) and render all of those resources.
Fetch more details about a single one of those resources (GET details about a single user, a single picture, a single author, etc…) when the user interacts with the page.
By building this project, you will demonstrate the following technical skills:
Structuring HTML with semantic elements
CSS layout with Flexbox and Grid
Media Query Responsiveness
JavaScript form handling
Modular Code with ES Modules
Event handling and event delegation
Additionally, you will:
Develop teamwork skills including communication, problem-solving, compromise, and task management
Strengthen your Git workflow fundamentals, managing branches, navigating merge conflicts, and maintaining a repository
Practice Agile methodologies by managing a scrum board and by performing daily stand-up and stand-down
Deploy a project
Practice your technical communication through a presentation
Deliverables
Unlike your solo projects where the project itself was the main deliverable, for a portfolio-level project, you will be required to do a bit more. The deliverables below will help keep you and your partner organized and will help keep your Engineering Manager (your instructor) informed on your progress. In the end, all of these deliverables will serve as valuable artifacts that document your work.
Deliverable Resources
Presentation Template — make sure to hit all of the talking points in the template but feel free to modify the design!
Expand each below to see details and examples.
A Deployed Project
Your project must meet all of the grading requirements listed below.
Each project is deployed on GitHub using an Organization
A Project Spec Sheet
A project spec sheet is a document that provides key details about the project including the API being used, the intended features/user stories, and wireframes.
Examples:
A GitHub Organization and Scrum Board
A GitHub Organization is a shared account on GitHub where you and your teammates can collaborate on repositories. Having a GitHub organization will make deployment straight forward.
A scrum board is a tool for creating and assigning tasks ("tickets") within a project. Typically, a scrum board will organize tasks into these columns: Backlog (tasks waiting to be assigned), In Progress (assigned tasks that are being worked on), In Review (tasks to be reviewed), and Done (completed tasks).
A Professional README
Your README.md should be polished enough that a new engineer can understand and run your project without asking questions.
Example: We Cooked Repository README
At minimum, include:
Project title and one-paragraph summary
Live deployed link
Team members
API used (name + endpoints)
Features section
List your 2 MVP features
List your stretch feature(s)
Setup instructions
npm installnpm run dev
Tech stack (
HTML,CSS,JavaScript,Vite, etc.)Screenshots or GIFs
Known limitations or future improvements
Use the same professional writing standards we expect in all artifacts:
Clear section headers
Correct spelling/grammar
Consistent formatting
No placeholder text
AI Usage Document (Required)
Generative AI tools are a required part of this project workflow, but you must be able to explain every line of code you submit.
Make a copy of this AI Usage Document and track your usage.
For each meaningful AI interaction, you are required to document:
What you asked for (your prompt)
What you received (the AI response)
What you changed and why
How the final code works (in your own words)
Add a link to your AI Usage Document in your README.md, for example:
A Presentation + Walkthrough Demo Video
The presentation is your "elevator pitch" to tell your audience about the project, how you built it, and what you learned through the process.
Examples:
We Cooked Presentation — This example does an excellent job with their demo recording, walking the audience through the features of the application.
Pickle Productions Presentation — This example does an excellent job at explaining their technical challenge and teamwork learnings.
Stretch Features: localStorage + AI
Use AI to help you learn and implement localStorage for a real user-facing feature in your app.
Your localStorage stretch feature should:
Store user preferences or user-generated state in the browser
Persist after page refresh
Be loaded on page start and reflected in the UI
Include a clear way for users to update the stored value
Feature ideas:
Save the most recently selected item and re-render it on reload
Save filter/search form values so they persist on refresh
Save a favorites list of fetched items
Save a theme preference (light/dark) or display settings
Suggested AI workflow:
Ask AI: "How does
localStoragework in JavaScript, and when should I use it?"Ask AI: "Help me implement
<your feature>withlocalStoragein a Vite app."Ask AI to review your implementation for edge cases:
Missing keys
Invalid JSON
Clearing stale data
Refactor the code to match your project structure and naming conventions.
Document the full interaction in your AI Usage Document.
Quality bar for this stretch:
localStoragereads/writes are wrapped in helper functionsJSON parsing/stringifying is handled safely
UI still works when
localStorageis emptyThe feature is demonstrated in your walkthrough video
Milestones
As you work on this project, don't set your sights on the fully completed project from the jump. Give yourself smaller goals that you can reach each day and focus on one goal at a time. As long as your goals build on each other, you will eventually reach your final destination.
For this Art Viewer project, you can see the progress made on each day.
https://art-viewer-mike-example.github.io/art-viewer-day-1 (just the app is deployed. It doesn't do anything yet)
https://art-viewer-mike-example.github.io/art-viewer-day-2 (we can fetch and then render a list of pictures)
https://art-viewer-mike-example.github.io/art-viewer-day-3 (we can click on a picture to fetch more details about that one picture)
Note: no need to create a new repo for each day - this is just done this way for demonstration purposes.
Eventually, you will need to develop the skill of planning out your objectives. However, for this project we've laid out some daily milestones that you can strive for with bare minimum requirements, ideal progress, and stretch goals. Remember: a feature isn't "done" until it's been reviewed and merged to main via a PR.
Bare Minimum:
Ideal:
Stretch:
Note: If you have not submitted your proposal and are undecided about your API by this deadline, you will be assigned an API and product spec sheet by your Engineering Manager.
Bare Minimum:
Ideal:
Stretch:
Bare Minimum:
Ideal:
Stretch:
Bare minimum:
Ideal:
Stretch:
Bare minimum:
Ideal:
Stretch:
Setup Steps
GitHub Organization & Scrum Board
First, we will create the GitHub organization and Scrum Board that will enable you and your partner to collaborate on the project.
Create a new GitHub organization for your team. Only one person needs to do this. They will provide their email for verification and then invite their partner as a collaborator.
Copy the Scrum Board template.
Make your organization the Owner
Make sure to check the box that says "Draft issues will be copied if selected".
Remove "[COPY]" from the project name.

Make a copy of the scrum board Then, you can get started assigning tickets! We recommend completing the Project Setup and Assign Tasks tickets as a team before assigning individual tickets. When a ticket is assigned, move it to the "In progress" column.

Assigning tickets
Vite Project + Project Repo
Next, we will create the Vite Project that will serve as the starting point for your project.
Both partners should open VS Code and
cdinto the directory where they plan on working.One person in your group should run
npm create vite@latestto create the project starter codeRemove any unnecessary code provided by Vite, but keep the
index.html,styles.css, andmain.jsfiles.Create additional module files such as
src/dom-helpers.jsandsrc/fetch-helpers.js.
Make a new repository owned by your GitHub organization.
It should have NOTHING in it.
The name should be
mod-4-project(you can change it later).Make sure it is public.
It will then provide instructions to turn your existing Vite project into a repo and push to your newly created repo. It will tell you to run these commands:
Product Spec Sheet
Before you begin coding, you must align as a team on your project vision by making a Product Spec Sheet.
Make a copy of the Template
Update your Share settings to "Anyone with the link > Commenter"
Post your team's Product Spec Sheet on Canvas.
Here is an example of the Art Viewer Product Spec Sheet
Completing this is your first deliverable!
Deployment with gh-pages
As you write your code, your project is considered "in development". When we are ready to share the project with the world, we will deploy it. The main differences between a project in development and a deployed project are file storage, access, and uptime.
In development you use a development server (like Vite) that runs on localhost:
File Storage: The files are stored on your computer.
Access: Only you can see it. If you send the link
http://localhost:5173to a friend, it won't work for them.Uptime: When your computer turns off, the server stops running as well.
Deployment is the act of moving your finished work to a publicly accessible server which is just a computer whose resources you can access over a network. We'll be deploying our code onto GitHub's servers:
File Storage: The files are stored on one of GitHub's servers.
Access: Anyone with the URL can see the project and access the files.
Uptime: GitHub keeps the servers running. Even if you turn your computer off, your website stays online because its living on their hardware, not yours.
A deployment server often refers to both the computer hardware that is "hosting" our files and the server-side application running on it is programmed to wait for incoming requests and sends those files to the user requesting them ("the client").
GitHub Pages is known as a static web server which means that it just stores our HTML, CSS, and JS files and serves them directly to the user. Every user will get the exact same website and user experience.
In the upcoming Backend unit, you will learn how to create your own dynamic server-side applications, enabling you customize what the client receives based on who they are, what resources they've requested, etc. In other words, you will be able to create your own APIs.
To deploy your project with GitHub pages, follow these steps:
Step 1: Create and Update vite.config.js
Create a file called vite.config.js at the root of your repository and add the code below. If you've changed the name of your repository from mod-4-project to something else, make sure to update this file.
Step 2: Install gh-pages
Install the gh-pages package as a dev dependency. It makes it incredibly easy to deploy.
Step 3: Add predeploy and deploy scripts to package.json
Add the following "predeploy" and "deploy" scripts to your package.json file:
Step 4: Add the homepage to package.json
GitHub pages will serve your website at https://{github-organization}.github.io/{repo-name}/.
Add the complete website URL by adding a "homepage" to your package.json. Make sure to update the organization name (keep .github.io) and the repo name
Step 5: Run Deploy
Now, deploy your project! Run the command:
And you’re done!
Step 6: GitHub Configuration
Lastly, Go to your GitHub repository and navigate to Settings -> Pages (left sidebar). Select source as “Deploy from branch” and branch as “gh-pages”.

Wait for a few minutes and soon, your site will be live!
Git Workflow for Paired Projects
This is likely your first time collaborating on code with another person using Git. The workflow below is intentionally simple. Follow it closely and you'll avoid most of the headaches that come from working in the same codebase.
The Golden Rule
Never push directly to main. All work happens on branches. Code gets into main through Pull Requests (PRs) that your partner reviews.
Branch Strategy
Use feature branches — short-lived branches where each branch corresponds to one ticket on your scrum board.
Branch naming convention: feature/short-description
Examples:
feature/fetch-all-itemsfeature/render-item-listfeature/single-item-sectionfeature/form-htmlfeature/responsive-layout
The Workflow (Repeat for Every Ticket)
Then start the next ticket from step 1.
Dividing the Work into Tickets
The key to working in parallel is to split work by feature, not by file. Each ticket should be a vertical slice — the HTML, CSS, JS, and fetch logic needed for one piece of functionality.
Here is a suggested way to break the project into tickets. The ticket numbers suggest a rough order, but tickets at the same level can be worked on in parallel by different partners.
Setup (do together, Day 1) — this is the one time you push directly to main
Project Setup — Create GitHub Organization, repo, and clone locally. Set up Vite project with initial file structure (
index.html,styles.css,app.js)Assign Tickets — Assign tickets in the backlog to each team member.
Partner A: Fetch & Render All Items:
Collection section HTML & CSS — Create a
<section>for displaying the collection of data with ah2and aulto be filled using JavaScriptFetch all items — Write a fetch function that GETs the collection endpoint and logs the data. Include
async/await,try/catch,response.okcheck.Render item list — Write a function that takes the fetched array and renders
<li>elements inside the<ul>in the collection<section>. UsecreateElementResponsive grid layout — Style the item list using CSS Flexbox or Grid. Add a media query so items stack on mobile and sit side-by-side on desktop.
Partner B: Fetch & Render One Item:
Single item section HTML + CSS — Create the
<section>for displaying a single fetched item with its<h2>and placeholder content.Fetch single item — Write a fetch function that GETs the "single item" endpoint and logs the data. Include
async/await,try/catch,response.okcheck.Fetch on Click — Add an event listener (using event delegation on the
<ul>) that fetches details for one item and renders them in the single-item section.
Either partner (after earlier tickets merge):
Build the form HTML — Create the
<form>with labels, inputs, andnameattributes for each input.Form event handling — Add a submit event listener that prevents default, reads input values, clears the form, and triggers a fetch (or filters results).
Connect form to fetch — Wire up the form so submitting it triggers the collection fetch with the form's input value (e.g. a search query or filter).
Polish and accessibility pass — Confirm semantic HTML, single
<h1>, single<main>,<title>in head, no divs replacing semantic elements.README and deployment — Write the professional README, link AI Usage Doc, final deploy.
Handling Merge Conflicts
Merge conflicts happen when both partners edit the same lines in the same file. To minimize them:
Communicate constantly. Tell your partner what file you're working in.
Keep branches short-lived. Merge PRs quickly (within hours, not days). The longer a branch lives, the more likely it conflicts with
main.Pull
mainbefore starting a new branch. This ensures you're always building on the latest code.
When a conflict does happen:
Pull
maininto your feature branch:git merge mainGit will mark the conflicting lines in the file. Open the file and look for the
<<<<<<<,=======,>>>>>>>markers.Talk to your partner about which version to keep (or how to combine them).
Edit the file to resolve the conflict, removing the markers.
git add .andgit committo complete the merge.Push your branch and continue with the PR.
Daily Routine
Start of day
Stand-up: What did you do yesterday? What are you doing today? Any blockers?
During the day
Work on your ticket. Commit often. Push and open a PR when done. Review your partner's PRs promptly.
End of day
Stand-down: What got done? What's next? Make sure all open PRs are merged so tomorrow starts clean.
Common Mistakes to Avoid
Working on
maindirectly. You'll overwrite each other's work.Giant branches that touch every file. Keep tickets small and focused.
Not pulling before branching. You'll end up working on stale code.
Ignoring your partner's PR. Review quickly — your partner is blocked until you do.
Both editing
index.htmlat the same time. Coordinate who's touching shared files, or accept that you'll need to resolve a merge conflict.
Project Grading
We care deeply about the quality of the code that is produced at Marcy. Even if your application works as described, was it created following best practices? Did you effectively use all of the skills from the module? Were you able to learn and grow from this project-building process?
To ensure that your project meets Marcy's standards of excellence, your project will be assessed on the following criteria (38 points total):
Fetching Requirements (8 points)
User Interface: Structure and Accessibility (12 points)
There is a
sectionfor displaying a single fetched itemThe section has an
h2The section displays information about the single fetched item
There are no instances of recreating any semantic elements (using a
divfor anav)The entire application is responsive with mobile and desktop compatibility (we recommend a mobile-first approach)
General (9 points)
The project is created using Vite
The code exists in more than one JS file
The project is deployed via GitHub Pages properly
CSS Flexbox or Grid was used
The code does not render unescaped text directly to the DOM (
createElementor other escape method used)The repository has a polished
README.mdwith: project summary, live link, team members, API details, setup instructions, and feature list (MVP + stretch)The
README.mdincludes screenshots or GIFs and uses professional writing (clear headers, no placeholder text, minimal grammar/spelling errors)The AI Usage Document is linked in
README.mdThe AI Usage Document includes meaningful logged entries with: prompt, AI response, what changed/why, and how the final code works
Form Requirements (9 points)
There is a
formfor triggering a fetch or for modifying the fetch resultsformelements have an aria-label or aria-labelledby attribute that describes the formThe form has an
h2The form has at least one
inputEvery
inputelement has an associatedlabelelement (it can be invisible but it must be in the HTML)The form has a
buttonto submit the form
At least one field is a required field, and the form cannot be submitted without it
Clicking the form submit button does not reload the page because the default behavior is prevented
Clicking the form submit button clears the form
Tips for Success
Choosing an Easy API to Work With
Choose an API from this list of free APIs as they are all free and, importantly, do not require an API key.
If you are able to find another API that is free and does not require an API key, you are free to use it, but do not waste time on this search nor trying to get a tricky API to work (don't use the Spotify API. Just don't. Please.)
Focus on demonstrating your learning, not building something unique.
One of the easiest ways to get off track is by worrying about creating a unique project
Remember:
Student projects are meant for learning, demonstrating your learning, and practicing talking about your technical work
Student projects are not meant to be unique.
You're not creating a new app that addresses a gap in the market.
You aren't deploying this app for the purpose of having real users.
Make Decisions Quickly
You may have a great idea that you really want to implement, but remember, you are working as a team and you only have a week. Time is not on your side and the more time you waste disagreeing with your partner about what features to implement or what API to use, the less time you'll have to actually build the thing.
Plan and Delegate!!
Use branches and make PRs
Use your scrum board
Assign tasks
Don't do duplicate work
Meet on your own time
Be in alignment with your teammate outside of the scheduled meetings with your Engineering Manager.
Test your API!
Actually write a fetch to make sure that the API works before choosing it for your proposal
Last updated