A beginner-friendly to-do app project for learning backend web development. You already know HTML, CSS, Bootstrap, and basic JavaScript - now it's time to level up!
GSD is a task management app with:
- A landing page (
index.html) - the marketing homepage - A to-do dashboard (
dashboard.html) - the actual app where you add/complete/delete tasks - Login & Sign Up pages (
login.html,signup.html) - forms that will connect to a server later - A contact page (
support.html) - a contact form that will connect to a server later - A backend server (
backend/script.js) - an Express.js API we'll connect in a future lesson
GSD-APP/
├── index.html ← Landing page (homepage)
├── dashboard.html ← To-do app (the main app!)
├── login.html ← Login form (demo mode - not connected to server yet)
├── signup.html ← Sign up form (demo mode - not connected to server yet)
├── support.html ← Contact form (demo mode - not connected to server yet)
├── script.js ← JavaScript for the dashboard (ADD, DELETE, COMPLETE tasks)
├── style.css ← Custom styles for the whole app
├── images/ ← Logo and icon files
│ ├── GSD-logo.png
│ ├── GSD-logo.jpg
│ └── GSD-icon.png
├── backend/ ← Server code (we'll use this later!)
│ ├── script.js ← Express.js server with CRUD API
│ ├── package.json ← Lists the server's dependencies
│ └── node_modules/ ← Installed packages (auto-generated)
└── README.md ← You are here!
- Open VS Code
- Go to
File→Open Folder - Select the
GSD-APPfolder - You should see all the files in the sidebar
- Right-click on
index.htmlin VS Code - Select "Open with Live Server" (if you have the Live Server extension)
- OR just double-click
index.htmlto open it in your browser - Click "GET STARTED" to go to the dashboard
- Try clicking around - the login and contact forms show "Demo Mode" messages
Tip: Install the Live Server extension for VS Code. It auto-refreshes your browser when you save changes!
The to-do app dashboard doesn't work yet because some code is commented out. Here's how to activate it:
- Open
script.jsin VS Code - Find Step 3: Event Listeners (around line 80)
- Uncomment these lines by removing the
//at the start:
// BEFORE (commented out - doesn't work):
// addTaskBtn.addEventListener('click', addTask);
// AFTER (uncommented - now it works!):
addTaskBtn.addEventListener('click', addTask);- Also uncomment the Enter key listener and the filter button listeners
- Find Step 7: Initialize (near the bottom) and uncomment those lines too
- Save the file and refresh your browser
- Try adding a task, completing it, and deleting it!
The backend server is ready but the frontend doesn't use it yet. You can still run it to see how it works:
- Open your terminal in VS Code (
Ctrl + ~orCmd + ~) - Navigate to the backend folder:
cd backend - Install the dependencies:
npm install - Start the server:
node script.js - Open your browser to: http://localhost:3000/todos
- You should see JSON data with sample todos!
Note: The dashboard currently saves tasks in your browser using
localStorage. In a future lesson, we'll connect it to this backend server so tasks are stored on the server instead.
The to-do app runs entirely in your browser:
- You type a task and click "Add Task"
- JavaScript adds the task to an array (a list stored in memory)
- JavaScript creates HTML elements and adds them to the page
- Tasks are saved to localStorage so they survive page refreshes
- You can filter, complete, and delete tasks
These pages have forms, but they don't actually send data anywhere yet. They just show alert messages. In a future lesson, we'll:
- Use
fetch()to send form data to the backend server - Add real user authentication (login/signup)
- Store contact messages in a database
- Uncomment the event listeners in
script.js(Step 3) - Uncomment the DOMContentLoaded listener in
script.js(Step 7) - Test: Add a task, complete it, delete it, refresh the page
- Change
[Your Name]in the dashboard footer to your actual name - Change the brand color in
style.css(look for--electric-violet) - Try changing the heading font in
style.css(look for--heading-font)
- Add a new button in
dashboard.html(below the filter buttons) - Write a function in
script.jsthat removes all completed tasks - Hint: Use
.filter()to keep only tasks wherecompletedisfalse
- Start the server (
cd backend && node script.js) - Visit
http://localhost:3000/todosin your browser - Use your browser's Network tab (DevTools → Network) to watch requests
- Try using Postman or
curlto test the API:curl http://localhost:3000/todos
- Read through every comment in
script.js- understand each function - Read through
style.css- understand each CSS section - Read through
backend/script.js- understand each route
Once you've completed the exercises above, try these:
- Edit Button - Let users change the text of existing tasks
- Task Categories - Add tags like "work", "personal", "school"
- Due Dates - Add a date picker using
<input type="date"> - Search Bar - Filter tasks by typing in a search box
- Dark Mode - Add a toggle button to switch between light and dark themes
- Animations - Add fade effects when tasks are added or removed
- Task Counter Badge - Show the count in the browser tab title
| Topic | Link |
|---|---|
| HTML Basics | W3Schools - HTML Tutorial |
| HTML Forms | MDN - HTML Forms Guide |
| CSS Basics | W3Schools - CSS Tutorial |
| CSS Flexbox | W3Schools - Flexbox |
| CSS Grid | W3Schools - Grid |
| Responsive Design | MDN - Responsive Design |
| Bootstrap 5 Docs | Bootstrap - Getting Started |
| Bootstrap Forms | Bootstrap - Forms |
| Bootstrap Grid | Bootstrap - Grid System |
| Topic | Link |
|---|---|
| JS Basics | W3Schools - JavaScript Tutorial |
| DOM Manipulation | MDN - Introduction to the DOM |
| getElementById | W3Schools - getElementById |
| addEventListener | MDN - addEventListener |
| Array Methods (.push, .filter, .find, .forEach) | W3Schools - Array Methods |
| localStorage | MDN - localStorage |
| JSON.stringify / JSON.parse | W3Schools - JSON |
| Template Literals (backticks) | MDN - Template Literals |
| preventDefault | MDN - preventDefault |
| Fetch API (for later!) | MDN - Using Fetch |
| Topic | Link |
|---|---|
| What is Node.js? | W3Schools - Node.js Intro |
| What is npm? | W3Schools - Node.js NPM |
| Express.js Getting Started | Express - Hello World |
| What is an API? | MDN - Introduction to Web APIs |
| HTTP Methods (GET, POST, etc.) | MDN - HTTP Methods |
| What is REST? | MDN - REST |
| What is CRUD? | FreeCodeCamp - CRUD Explained |
| Tool | Link |
|---|---|
| VS Code | Download VS Code |
| Live Server Extension | VS Code Marketplace |
| Chrome DevTools | Chrome DevTools Docs |
| Postman (API Testing) | Download Postman |
Test your knowledge with these free online quizzes and exercises:
- W3Schools JS Exercises
- W3Schools HTML Exercises
- W3Schools CSS Exercises
- FreeCodeCamp - JavaScript Algorithms
- FreeCodeCamp - Responsive Web Design
- FreeCodeCamp - JavaScript Course
- Codecademy - JavaScript (Free Tier)
- The Odin Project - Foundations
localStorage is a way to save data in the browser. It stores key-value pairs as strings. Data stays even after you close the browser. We use JSON.stringify() to save arrays/objects and JSON.parse() to read them back.
An event listener waits for something to happen (like a click or key press) and then runs a function. Syntax: element.addEventListener('click', myFunction)
CRUD stands for Create, Read, Update, Delete - the four basic operations for managing data. Our to-do app does all four!
An API (Application Programming Interface) is a way for programs to talk to each other. Our Express server creates a REST API that accepts HTTP requests and sends back JSON data.
The login, sign up, and contact forms show "Demo Mode" because they aren't connected to a backend server yet. The forms work (they capture input and handle submissions), but they don't actually send data anywhere. We'll connect them to the Express server in a future lesson using fetch().
Q: Why don't the login/signup forms actually work?
A: They're in "demo mode" - the forms handle submissions with JavaScript but don't send data to a server yet. We'll add that in a future lesson when we learn about fetch() and connecting frontend to backend.
Q: Where are my tasks saved?
A: In your browser's localStorage. Open Chrome DevTools (F12) → Application tab → Local Storage to see them!
Q: What if I break something?
A: Don't worry! You can always undo changes in VS Code with Ctrl + Z (or Cmd + Z on Mac). If things get really messed up, you can re-download the starter files.
Q: Do I need to run the backend server? A: Not yet! The to-do dashboard works entirely in the browser. The backend server is there for a future lesson. You can run it to explore, but it's not required.
Q: What is the node_modules folder?
A: It contains packages (code libraries) that other people wrote. It's created when you run npm install. You never need to edit anything in it.
| Technology | What It Does | Where It's Used |
|---|---|---|
| HTML5 | Page structure | All .html files |
| CSS3 | Styling | style.css |
| Bootstrap 5 | Layout & components | All pages |
| JavaScript | Makes things interactive | script.js, inline <script> tags |
| Node.js | Runs JavaScript on a server | backend/script.js |
| Express.js | Web server framework | backend/script.js |
| localStorage | Saves data in the browser | script.js |
Built in Perth. © 2026 GSD App.