This repository is a hands-on JavaScript learning challenge consisting of 30 small projects built progressively from scratch. Each project focuses on a practical problem or interaction implemented using HTML, CSS, and JavaScript.
The purpose of this challenge was not to simply reproduce tutorial projects, but to use implementation as a way to strengthen JavaScript fundamentals. Across the 30 projects, I practiced working with the DOM, handling user input, managing application state, working with browser APIs, consuming external APIs, handling asynchronous operations, validating input, debugging issues, and improving implementations.
The projects were developed incrementally, one project at a time. The difficulty and concepts expanded from basic JavaScript logic and DOM manipulation to API-driven applications, asynchronous JavaScript, browser storage, and more involved UI interactions.
Learn β Build β Debug β Understand β Improve
The main goal of this challenge was to strengthen JavaScript fundamentals through repeated implementation rather than passive learning.
Throughout the 30 projects, I practiced:
- JavaScript fundamentals and programming logic
- Variables, data types, operators, conditions, and loops
- Functions and reusable logic
- Arrays, objects, strings, and numbers
- DOM manipulation
- Event handling and UI interactions
- Forms and input validation
- Date and time operations
- Browser APIs
- LocalStorage and client-side state
- Asynchronous JavaScript
- Promises
async/await- Fetch API
- REST APIs
- JSON data handling
- Error handling
- Loading and empty states
- Problem decomposition
- Debugging and testing
- Code organization and maintainability
- Building interactive browser applications
The challenge was structured to gradually move from basic JavaScript logic toward more complete applications involving APIs, asynchronous operations, state, and dynamic interfaces.
| # | Project | Description | Main Concepts | Status |
|---|---|---|---|---|
| 01 | Age Calculator | Calculates a user's age from a selected date of birth. | Date, date calculations, input handling, validation, DOM updates |
β Completed |
| 02 | Analog Clock | Displays the current time using rotating hour, minute, and second hands. | Date, time calculations, setInterval, DOM manipulation, CSS positioning |
β Completed |
| 03 | Barcode Generator | Generates a barcode from user-provided text or numbers. | Input handling, DOM manipulation, libraries/APIs, dynamic rendering | β Completed |
| 04 | BMI Calculator | Calculates Body Mass Index from height and weight inputs. | Forms, arithmetic, validation, functions, conditional logic | β Completed |
| 05 | Box Shadow Generator | Provides controls for creating and previewing CSS box-shadow values. | DOM events, range inputs, CSS properties, dynamic styles, string generation | β Completed |
| 06 | Cocktail Search App | Searches for cocktail information and displays matching results. | Fetch API, REST APIs, JSON, async/await, search, DOM rendering | β Completed |
| 07 | Country Guide App | Retrieves country information and presents details such as location, population, and related data. | REST APIs, Fetch, JSON, async/await, DOM manipulation | β Completed |
| 08 | Currency Converter | Converts an amount between different currencies using exchange-rate data. | Fetch API, APIs, JSON, calculations, forms, async operations | β Completed |
| 09 | Digital Clock | Displays the current time digitally and updates continuously. | Date, setInterval, formatting, DOM updates |
β Completed |
| 10 | Dynamic Calendar | Generates a calendar interface for navigating through dates and months. | Date, date calculations, arrays, DOM generation, event handling |
β Completed |
| 11 | GitHub Profile Search App | Searches for GitHub users and displays profile information. | Fetch API, REST APIs, JSON, async/await, search, error handling | β Completed |
| 12 | Guess the Number Game | Generates a number and lets the user attempt to guess it. | Random numbers, conditions, functions, events, game state, validation | β Completed |
| 13 | Hangman Game | Implements the classic word-guessing game using keyboard or user input. | Strings, arrays, loops, conditions, events, game state, DOM manipulation | β Completed |
| 14 | Interest Calculator | Calculates interest based on principal, rate, and time inputs. | Functions, arithmetic, forms, validation, DOM updates | β Completed |
| 15 | Language Translator | Translates user-provided text using a translation service/API. | Fetch, REST APIs, JSON, async/await, forms, error handling | β Completed |
| 16 | Memory Card Game | Tests the user's memory by matching pairs of cards. | Arrays, objects, events, DOM manipulation, state management, game logic | β Completed |
| 17 | Movie Info App | Searches for movies and displays information retrieved from a movie API. | Fetch API, REST APIs, JSON, search, async/await, error handling | β Completed |
| 18 | Music Player With Waveform | Provides controls for playing audio while displaying a waveform-based interface. | Audio API, events, DOM manipulation, media controls, application state | β Completed |
| 19 | Password Generator | Generates passwords based on configurable character requirements. | Randomization, strings, arrays, functions, DOM events, validation | β Completed |
| 20 | QR Code Generator | Converts user-provided content into a QR code. | Input handling, DOM manipulation, external libraries/APIs, dynamic rendering | β Completed |
| 21 | Quiz App With Timer | Presents questions with answer options and tracks the user's score against a timer. | Arrays, objects, timers, events, state management, DOM manipulation | β Completed |
| 22 | Random Joke Generator | Retrieves and displays a random joke from an API. | Fetch API, JSON, async/await, random data, error handling | β Completed |
| 23 | Random Quote Generator | Retrieves or generates random quotes and displays them dynamically. | APIs, Fetch, JSON, asynchronous operations, DOM manipulation | β Completed |
| 24 | Recipe App | Searches for recipes and displays recipe information from an external API. | REST APIs, Fetch, JSON, async/await, search, dynamic DOM rendering | β Completed |
| 25 | Rock Paper Scissors | Implements the classic game against a computer-generated choice. | Randomization, conditions, functions, events, game state | β Completed |
| 26 | Scientific Calculator | Performs standard and scientific mathematical calculations. | Functions, operators, Math, expressions, event handling, input processing |
β Completed |
| 27 | Simple Calculator | Performs basic arithmetic operations through an interactive calculator interface. | Functions, events, operators, DOM manipulation, input handling | β Completed |
| 28 | Stopwatch | Tracks elapsed time with start, pause, reset, and timing controls. | setInterval, time calculations, state management, events, DOM updates |
β Completed |
| 29 | To-Do App | Allows users to create, complete, remove, and persist tasks. | DOM manipulation, arrays, objects, events, LocalStorage, state management | β Completed |
| 30 | Weather App | Searches for weather information for a location using an external API. | Fetch API, REST APIs, JSON, async/await, search, error handling, UI states | β Completed |
The 30 projects provided repeated opportunities to apply JavaScript concepts in different contexts. Instead of learning each concept only as isolated syntax, I used them while building interactive applications.
Throughout the projects, I worked with:
- Variables and constants
- Data types
- Operators
- Type conversion
- Conditional statements
- Loops
- Functions
- Function parameters and return values
- Scope
- Arrays
- Objects
- Strings
- Numbers
MathDate- Random number generation
- Problem-solving logic
The projects provided practice translating requirements into JavaScript logic and breaking larger problems into smaller operations.
The applications provided repeated practice with:
- Selecting elements
- Changing text and content
- Modifying classes
- Updating styles
- Creating elements dynamically
- Removing elements
- Rendering lists and results
- Handling forms
- Reading user input
- Adding event listeners
- Responding to user interactions
The projects also provided practical use of modern JavaScript features, including:
letandconst- Arrow functions
- Template literals
- Destructuring
- Spread and rest syntax
- Default parameters
- Array methods such as
map,filter,find,reduce, andforEach - Object methods
- Modules where appropriate
- More organized approaches to application logic
API-based projects introduced practical asynchronous programming.
I worked with concepts including:
- Promises
async/await- Fetch API
- Asynchronous request and response handling
- Loading states
- Successful responses
- Failed requests
- Network and API errors
- Separating API operations from UI rendering where appropriate
Several projects provided practice with:
- HTTP requests
- REST APIs
- API endpoints
- Query parameters
- Fetching remote data
- JSON
- Parsing API responses
- Extracting relevant data
- Rendering API data
- Handling missing or unexpected data
- Handling failed API requests
The To-Do application provided practical exposure to client-side persistence using:
localStorage- Saving application state
- Reading stored data
- Updating stored data
- Removing stored data
- Converting between JavaScript objects/arrays and JSON
The projects also provided repeated practice with:
- Breaking requirements into smaller problems
- Designing application logic
- Identifying inputs and outputs
- Handling edge cases
- Validating user input
- Debugging unexpected behavior
- Testing different scenarios
- Refactoring repetitive logic
- Improving existing implementations
Completing the projects does not mean every concept is mastered. The repository represents practical exposure and repeated implementation, which can be built upon through more complex projects and software-engineering work.
The primary technology stack used throughout the challenge includes:
- HTML5
- CSS3
- JavaScript ES6+
- DOM API
- Browser APIs
- LocalStorage
- Fetch API
- REST APIs
- JSON
The projects primarily use vanilla JavaScript so that the underlying language, DOM, browser APIs, asynchronous programming, and application logic can be practiced without relying heavily on frameworks.
External APIs and supporting libraries were used where appropriate for individual projects.
Each project is maintained as an independent application inside the repository.
30-Days-30-JavaScript-Projects/
β
βββ README.md
β
βββ 01-age-calculator/
βββ 02-analog-clock/
βββ 03-barcode-generator/
βββ 04-bmi-calculator/
βββ 05-box-shadow-generator/
βββ 06-cocktail-search-app/
βββ 07-country-guide-app/
βββ 08-currency-converter/
βββ 09-digital-clock/
βββ 10-dynamic-calendar/
βββ 11-github-profile-search-app/
βββ 12-guess-the-number-game/
βββ 13-hangman-game/
βββ 14-interest-calculator/
βββ 15-language-translator/
βββ 16-memory-card-game/
βββ 17-movie-info-app/
βββ 18-music-player-with-waveform/
βββ 19-password-generator/
βββ 20-qr-code-generator/
βββ 21-quiz-app-with-timer/
βββ 22-random-joke-generator/
βββ 23-random-quote-generator/
βββ 24-recipe-app/
βββ 25-rock-paper-scissors/
βββ 26-scientific-calculator/
βββ 27-simple-calculator/
βββ 28-stopwatch/
βββ 29-to-do-app/
βββ 30-weather-app/
Each project follows a structure similar to:
project-folder/
βββ index.html
βββ style.css
βββ script.js
βββ README.md
| File | Purpose |
|---|---|
index.html |
Defines the structure and content of the application |
style.css |
Handles layout, styling, responsiveness, and visual presentation |
script.js |
Contains JavaScript logic, interactions, state, and application behavior |
README.md |
Documents the project, implementation, concepts, and future improvements |
Individual projects may contain additional assets or files when required.
The projects were developed using a consistent workflow while allowing the implementation to vary according to each problem.
-
Understand the problem
Identify what the application needs to do and what inputs and outputs are involved. -
Plan the UI and logic
Break the application into smaller components, interactions, and logical steps. -
Build the HTML structure
Create the elements required for the application's interface. -
Style the interface
Build the layout and visual structure using CSS. -
Implement JavaScript functionality
Connect user interactions and application logic to the DOM. -
Test the application
Try normal inputs, invalid inputs, boundary cases, and different interactions. -
Debug errors
Use browser developer tools and debugging techniques to identify and fix problems. -
Refactor where necessary
Improve duplicated logic, readability, organization, and maintainability where appropriate. -
Document what was learned
Record important concepts, implementation decisions, and possible improvements. -
Commit and push the project
Add the completed work to GitHub as part of the challenge.
This incremental workflow helped keep the challenge focused on implementation rather than simply collecting finished projects.
Projects Completed: 30 / 30
Progress: 100%
- 01 β Age Calculator
- 02 β Analog Clock
- 03 β Barcode Generator
- 04 β BMI Calculator
- 05 β Box Shadow Generator
- 06 β Cocktail Search App
- 07 β Country Guide App
- 08 β Currency Converter
- 09 β Digital Clock
- 10 β Dynamic Calendar
- 11 β GitHub Profile Search App
- 12 β Guess the Number Game
- 13 β Hangman Game
- 14 β Interest Calculator
- 15 β Language Translator
- 16 β Memory Card Game
- 17 β Movie Info App
- 18 β Music Player With Waveform
- 19 β Password Generator
- 20 β QR Code Generator
- 21 β Quiz App With Timer
- 22 β Random Joke Generator
- 23 β Random Quote Generator
- 24 β Recipe App
- 25 β Rock Paper Scissors
- 26 β Scientific Calculator
- 27 β Simple Calculator
- 28 β Stopwatch
- 29 β To-Do App
- 30 β Weather App
| Learning Area | Status |
|---|---|
| JavaScript Fundamentals | β Completed |
| DOM Manipulation | β Completed |
| Events | β Completed |
| Functions | β Completed |
| Arrays & Objects | β Completed |
| Browser APIs | β Completed |
| Forms & Validation | β Completed |
| LocalStorage | β Completed |
| Async JavaScript | β Completed |
| Fetch API | β Completed |
| REST APIs | β Completed |
| JSON | β Completed |
| Error Handling | β Completed |
| Problem Solving | β Completed |
| Clean Code | π |
Note: "Completed" here means the learning area was practiced through the challenge, not that it has been mastered. Clean code and software quality remain areas for continued improvement.
What it does:
Calculates a user's age from a selected date of birth.
Key concepts:
Date, date differences, input values, validation, functions, DOM updates.
Learning focus:
This project provided practice with JavaScript Date objects, date calculations, user input, validation, and updating the DOM based on calculated results.
What it does:
Displays the current time using rotating hour, minute, and second hands.
Key concepts:
Date, time calculations, setInterval, DOM manipulation, CSS positioning.
Learning focus:
This project provided practice with continuously updating the UI based on changing time values and converting time into visual positions.
What it does:
Generates a barcode from user-provided text or numerical input.
Key concepts:
Input handling, DOM manipulation, dynamic rendering, external libraries or APIs.
Learning focus:
This project provided practice connecting user input to dynamically generated visual output and integrating supporting functionality when required.
What it does:
Calculates Body Mass Index using height and weight values.
Key concepts:
Forms, arithmetic operations, validation, functions, conditional logic, DOM manipulation.
Learning focus:
This project provided practice taking multiple user inputs, validating them, applying a formula, and presenting the result through the interface.
What it does:
Allows users to adjust box-shadow properties and preview the resulting CSS effect.
Key concepts:
Range inputs, event listeners, dynamic CSS properties, string generation, DOM manipulation.
Learning focus:
This project provided practice using UI controls to dynamically modify styles and generate CSS values from multiple inputs.
What it does:
Searches for cocktails and displays information retrieved from an external API.
Key concepts:
Fetch API, REST APIs, JSON, async/await, search input, DOM rendering, error handling.
Learning focus:
This project provided practice making asynchronous API requests and converting remote JSON data into a usable interface.
What it does:
Retrieves country information and presents relevant details to the user.
Key concepts:
REST APIs, Fetch, JSON, asynchronous operations, search, DOM manipulation.
Learning focus:
This project provided practice understanding API response structures and selecting and displaying the information needed by the interface.
What it does:
Converts an amount from one currency to another using exchange-rate information.
Key concepts:
API requests, JSON, calculations, forms, asynchronous JavaScript, validation.
Learning focus:
This project provided practice combining user input, external data, calculations, and asynchronous operations into a single application flow.
What it does:
Displays the current time in a digital format and updates continuously.
Key concepts:
Date, setInterval, formatting, functions, DOM updates.
Learning focus:
This project provided practice with recurring operations and keeping displayed data synchronized with the current time.
What it does:
Generates a calendar interface and allows navigation between months.
Key concepts:
Date, date calculations, arrays, loops, DOM generation, event handling.
Learning focus:
This project provided practice with date-related logic and generating a dynamic interface from calculated data.
What it does:
Searches for a GitHub user and displays information from their public profile.
Key concepts:
Fetch API, REST APIs, JSON, search, async/await, dynamic rendering, error handling.
Learning focus:
This project provided practice integrating an external API into an interactive search interface and handling different response states.
What it does:
Generates a random number and allows the user to guess it.
Key concepts:
Math.random, conditions, functions, events, state, input validation.
Learning focus:
This project provided practice implementing game logic, maintaining state between interactions, and responding to user guesses.
What it does:
Implements a word-guessing game where the player attempts to identify a hidden word.
Key concepts:
Strings, arrays, loops, conditions, keyboard/input events, game state, DOM manipulation.
Learning focus:
This project provided practice managing multiple pieces of application state and updating the interface as the game progresses.
What it does:
Calculates interest using values such as principal, rate, and time.
Key concepts:
Functions, arithmetic, form inputs, validation, conditional logic, DOM updates.
Learning focus:
This project provided practice converting a mathematical formula into reusable JavaScript logic and validating required inputs.
What it does:
Translates user-provided text using a translation service or API.
Key concepts:
Fetch, REST APIs, JSON, async/await, forms, asynchronous operations, error handling.
Learning focus:
This project provided practice working with an external service where the application depends on asynchronous requests and responses.
What it does:
Challenges the player to find matching pairs of cards.
Key concepts:
Arrays, objects, event listeners, DOM manipulation, state management, comparison logic.
Learning focus:
This project provided practice managing game state, tracking user interactions, and coordinating multiple DOM elements.
What it does:
Searches for movies and displays information retrieved from a movie database API.
Key concepts:
Fetch API, REST APIs, JSON, search, async/await, dynamic rendering, error handling.
Learning focus:
This project provided practice building an API-driven search application and handling different states such as results, empty searches, and failed requests.
What it does:
Provides an interactive music player with playback controls and a waveform-based interface.
Key concepts:
Audio API, media events, DOM manipulation, event listeners, playback state.
Learning focus:
This project provided practice interacting with browser media capabilities and synchronizing UI elements with audio playback.
What it does:
Generates passwords based on selected character requirements and length.
Key concepts:
Strings, arrays, randomization, functions, input controls, validation.
Learning focus:
This project provided practice building configurable logic and combining multiple input conditions into a generated result.
What it does:
Generates a QR code from user-provided text or a URL.
Key concepts:
Input handling, DOM manipulation, dynamic rendering, external libraries or APIs.
Learning focus:
This project provided practice converting user input into generated output and integrating a focused external dependency where appropriate.
What it does:
Presents questions, records answers, tracks a score, and limits the quiz with a timer.
Key concepts:
Arrays, objects, timers, events, state management, conditional logic, DOM updates.
Learning focus:
This project provided practice coordinating multiple application states such as the current question, selected answer, score, and remaining time.
What it does:
Retrieves and displays a random joke from an external API.
Key concepts:
Fetch API, JSON, async/await, API responses, DOM updates, error handling.
Learning focus:
This project provided practice with a complete asynchronous application flow from user action to API response to UI update.
What it does:
Retrieves or generates a random quote and displays it dynamically.
Key concepts:
Arrays or APIs, random selection, Fetch, JSON, asynchronous operations, DOM manipulation.
Learning focus:
This project provided practice with random data selection and, where applicable, asynchronous external data.
What it does:
Searches for recipes and displays relevant recipe information.
Key concepts:
REST APIs, Fetch, JSON, search, async/await, dynamic DOM rendering, error handling.
Learning focus:
This project provided practice building a data-oriented API application where responses may contain multiple related pieces of information.
What it does:
Implements the classic Rock Paper Scissors game against a computer-generated choice.
Key concepts:
Randomization, conditions, functions, events, game state, DOM updates.
Learning focus:
This project provided practice representing game rules in code and keeping the implementation predictable and easy to follow.
What it does:
Provides standard and scientific mathematical operations through an interactive interface.
Key concepts:
Functions, operators, Math, expressions, event handling, input processing.
Learning focus:
This project provided practice organizing multiple related mathematical operations and handling more complex calculator interactions.
What it does:
Performs basic arithmetic operations through an interactive calculator.
Key concepts:
Functions, arithmetic operators, event listeners, DOM manipulation, input handling.
Learning focus:
This project provided practice building a complete interactive application from basic UI events and JavaScript logic.
What it does:
Tracks elapsed time with controls for starting, pausing, and resetting the timer.
Key concepts:
setInterval, time calculations, state management, event listeners, DOM updates.
Learning focus:
This project provided practice managing a continuously changing value while keeping controls and application state synchronized.
What it does:
Allows users to add, complete, remove, and persist tasks.
Key concepts:
Arrays, objects, DOM manipulation, events, LocalStorage, JSON, application state.
Learning focus:
This project provided practice building a small stateful application where data persists beyond a page refresh.
What it does:
Searches for a location and displays weather information retrieved from an external API.
Key concepts:
Fetch API, REST APIs, JSON, async/await, search, error handling, loading states, dynamic UI.
Learning focus:
This project brought together several concepts from the challenge into a complete API-driven application with asynchronous data and multiple UI states.
Completing all 30 projects marks the completion of the challenge, but it does not mean the implementations are final.
Projects can be revisited to improve:
- Code quality
- Validation
- Error handling
- UI/UX
- Accessibility
- Responsiveness
- Performance
- Code organization
- Maintainability
- Reusability
The first working implementation is useful as a starting point. Reviewing older projects provides an opportunity to apply newer understanding and improve earlier code.
Each individual project contains or can contain its own README documenting the implementation in more detail.
Project-level documentation can include:
- Project description
- Features
- Technologies
- Concepts learned
- Project structure
- How it works
- What I learned
- Future improvements
The main README serves as the high-level overview and index of the complete 30-project challenge, while each project README provides implementation-specific documentation.
The purpose of this repository was to build stronger confidence with JavaScript fundamentals through repeated implementation.
Rather than treating JavaScript concepts as isolated syntax, the projects provided opportunities to use them in different situations: building interfaces, handling user input, managing state, working with browser APIs, consuming external data, debugging problems, and improving existing code.
The core learning cycle throughout the challenge was:
Understanding β Implementation β Debugging β Iteration
Completing these 30 projects is one step in building a stronger foundation for more complex JavaScript, frontend, backend, and software-engineering work.
Prateek
Learning, building, and improving one project at a time.