Coding project ideas: 18 projects by level, each with a first version and a stretch goal
The best coding projects are small enough to finish and specific enough that someone would use them. Start with a tool you would use yourself: a bill splitter, a habit tracker, a time zone planner. Move to a URL shortener, a chat room or a booking page once you can ship something that runs. Below are 18 projects across three levels, each with a stack, a first version, a stretch goal and a time estimate in hours.
How do I pick a coding project?
Pick for what the project teaches, not for how impressive it sounds. A weather dashboard and a bill splitter look different, but the weather dashboard mostly teaches you to read one API response, while the bill splitter teaches rounding, validation and testing. Three questions filter most bad choices.
- Can you describe the first version in two sentences? If not, the project is too big. Cut until you can.
- Can you tell when it is right? Write down one worked example with real numbers before you write any code. If you cannot, you will never know whether a bug is a bug.
- Does it add one new thing? A new language, a database and a deployment target in the same project is three projects. Change one variable at a time.
| Where you are | Start at | Good first pick | What it proves |
|---|---|---|---|
| Never wrote a program | Beginner | Bill splitter or habit streak tracker | You can turn a rule into code and test it |
| Finished a course, stuck in tutorials | End of beginner | Time zone planner, then a deployed links page | You can build without a script to follow |
| Can build a page, never a backend | Intermediate | URL shortener | You understand requests, a database and a redirect |
| Need something to show employers | Intermediate | Job tracker or booking page | Users, data ownership, dates, email: what real apps need |
| Want to know how tools work inside | Advanced | Query engine or version store | You can read a spec and build the thing the tools are made of |
| Learning with an AI coding tool | Any level | Same projects, but write the tests first | You can judge the code the tool wrote |
Time estimates below are hours of focused work for someone at that level, from empty folder to a first version that runs. They do not include reading about the topic. Treat them as a rough guide: if a beginner project takes twice as long, that is normal.
Project name: Who uses it (one sentence): First version does exactly this (two sentences): It is right when (one worked example with real numbers): I will not build in this version (three things): The one new thing I am learning: Where it will run (my laptop, a static host, a server):
If you build with Claude Code, Cursor or Lovable, the brief above is also your first prompt. How to write an app build prompt covers the longer version, and vibe coding for beginners covers how to check what the tool wrote.
What are good coding projects for beginners?
Beginner projects fit in a few files, keep their data in memory or in one file, and have no server. You can finish one in a weekend. The goal is not novelty. It is to meet the same four problems every program has: input you cannot trust, rules with edge cases, state that has to survive a restart, and output a person can read. These six are language-neutral, so use whichever language you are learning.
02 Habit streak tracker
A page or script where you tick off habits each day and see the current streak and the longest streak.
- Stack
- HTML and JavaScript with browser storage, or Python with a JSON file.
- Teaches
- Dates, persistence, one pure function for the streak logic.
- First version
- A list of habits, a tick for today, a current streak computed from ticked dates.
- Stretch goal
- Allow skip days (for example five of seven) and draw a 12-week grid.
- Time
- 4 to 8 hours.
Streak logic breaks at midnight, at month ends and when someone forgets for a day. Write streak(ticked_dates, today) as a function with no screen code in it, and test it: ticks on yesterday and today give 2; a tick on yesterday only gives 1, because the streak is alive until today ends; a last tick two days ago gives 0.
03 Recipe scaler
Paste a recipe, say how many servings you want, and get every quantity rescaled in fractions you can measure.
- Stack
- Python or JavaScript; plain text in, plain text out.
- Teaches
- String parsing, fractions, units, deciding what to do with edge cases.
- First version
- Lines like “1 1/2 cups flour” are multiplied by a factor and printed as tidy fractions.
- Stretch goal
- Convert cups to grams for ten ingredients you list yourself.
- Time
- 6 to 10 hours.
Python’s fractions module does exact arithmetic, so 1 1/2 times 2/3 is exactly 1. In JavaScript you write a small greatest-common-divisor function yourself, which is a good exercise. The interesting part is the rules: 2 eggs scaled by 1.5 is 3, but 1 egg scaled by 1.5 is 1.5. Do you round to the nearest half? Your answer is the project.
04 Time zone meeting planner
Pick two to four cities and see which hours work for all of them, with daylight saving time handled correctly.
- Stack
- JavaScript with the built-in Intl API, or Python with zoneinfo.
- Teaches
- Dates and time zones, why you never do the arithmetic by hand, lookup tables.
- First version
- A 24-hour grid for the first city, the matching local times for the others, and the hours that fall between 9:00 and 18:00 everywhere highlighted.
- Stretch goal
- A shareable link that stores the cities and the date in the URL.
- Time
- 6 to 10 hours.
Use a library or built-in that reads the IANA time zone database. Then test with dates where clocks change. In 2027 the United States moves its clocks on March 14 and most of Europe on March 28, so for two weeks New York is 4 hours behind London instead of 5. If your grid shows 5 hours on March 20, 2027, it is wrong.
05 Dice scorer for a Yahtzee-style game
Given five dice, return every scoring category and its points: pairs, full house, straights and the five-of-a-kind.
- Stack
- Any language; command line.
- Teaches
- Loops, counting with dictionaries, unit tests, pure functions.
- First version
- score(dice) returns a mapping of category to points under the rules you write down.
- Stretch goal
- A computer player that picks the best category each turn; compare it with random play over 10,000 games.
- Time
- 4 to 8 hours.
This is the best project for learning tests, because the right answers are easy to write by hand. Under the standard rules a full house scores 25, a small straight 30, a large straight 40 and a five-of-a-kind 50. Write twenty examples first: [2,2,3,3,3] is a full house, [1,2,3,4,5] is a large straight, [4,4,4,4,4] is a five-of-a-kind and also a full house in some rule sets. Pick a rule and keep it.
06 Personal links page, deployed
A one-page site with your name, a short bio and five links, live on a public URL that you did not have to pay for.
- Stack
- HTML and CSS, git, a free static host such as GitHub Pages or Cloudflare Pages.
- Teaches
- HTML structure, CSS layout, responsive design, git, deployment.
- First version
- One index.html that reads well on a phone and is live.
- Stretch goal
- Dark mode with prefers-color-scheme, a custom domain, and the issues that Lighthouse in Chrome DevTools flags fixed.
- Time
- 3 to 6 hours.
Do this one early. Most beginner projects die on the laptop where they were built, and deploying once removes the mystery. The MDN learning area covers the HTML and CSS you need. Put the project in git on day one and commit each time something works.
What are good intermediate coding projects?
Intermediate projects add a server, a database and users. They take ten to forty hours and can be shown to another person. Each one here adds exactly one hard thing, so when something breaks you know where to look.
| Project | New hard thing | Bug you will meet |
|---|---|---|
| URL shortener | Redirects and a unique database column | Two links getting the same code |
| Chat room | Long-lived connections | A user who stays online after closing the tab |
| Job tracker | Accounts and per-user data | One user reading another’s rows |
| Booking page | Time zones and concurrent writes | Two visitors booking the same slot |
| Static blog generator | Parsing and build pipelines | Broken links between generated pages |
| Webhook receiver | Signatures and retries | The same event processed twice |
01 URL shortener with click counts
A service that turns a long link into a short code, redirects visitors and counts the clicks.
- Stack
- Node with Express, or Python with Flask or FastAPI; SQLite or Postgres.
- Teaches
- HTTP redirects, routing, schema design, unique constraints, input validation.
- First version
- POST a URL and get a code; GET /code redirects and adds one to a counter.
- Stretch goal
- Custom aliases, expiry dates, a stats page with clicks per day, and a block on redirect loops.
- Time
- 12 to 20 hours.
Generate codes from seven random letters and digits: that is 62 to the power of 7, about 3.5 trillion combinations. Put a unique index on the code and retry when an insert collides, instead of checking first. Redirect with a 302, not a 301: browsers may cache a 301 and skip your server, which stops the click count. Accept only http and https links, or someone will shorten a javascript: URL.
Build a URL shortener with FastAPI and SQLite. POST /links with a JSON body {url} returns {code}. GET /{code} responds 302 to the stored URL and increments clicks. Rules: only http and https URLs are accepted (400 otherwise); codes are 7 random characters from a-z, A-Z, 0-9; the code column has a unique index and the insert retries on conflict; unknown codes return 404.
Do not build: accounts, a front end, analytics beyond one counter.
Write pytest tests for each rule, including a javascript: URL and a forced code collision.02 Real-time chat room with presence
A single chat room where messages appear instantly for everyone and a list shows who is online.
- Stack
- Node or Python on the server, plain JavaScript in the page, the WebSocket API.
- Teaches
- Persistent connections, broadcasting, reconnection, shared state across clients.
- First version
- One room, a nickname, messages sent to every connected client, an online list.
- Stretch goal
- Several rooms, the last 50 messages on join, reconnect with backoff, a rate limit per connection.
- Time
- 15 to 25 hours.
The bug everyone meets is a dead connection that never sends a close event, such as a laptop lid shut on a train. The user stays online forever. The fix is a heartbeat: send a ping every 30 seconds and drop any connection that misses two in a row. Test it by killing the client process rather than closing the tab.
03 Job application tracker with reminders
A private board where you log each application, move it through statuses and get a reminder when nothing has happened for a week.
- Stack
- A full-stack framework (Next.js, Django, Rails or Laravel), Postgres, an email service.
- Teaches
- Sign-in, CRUD, per-user data, scheduled jobs, sending email.
- First version
- Sign up, add an application (company, role, status, date), change its status, filter by status.
- Stretch goal
- A reminder seven days after “applied” with no update, CSV import, an .ics export for interviews.
- Time
- 25 to 40 hours.
A related idea, JobsFlow, is posted on the board and goes further: tailoring the resume and drafting follow-ups. The test that matters here is plain. User A must not be able to read user B’s application by changing the ID in the URL. Write that test before you build the second screen. OWASP lists broken access control among the most common web risks, and this is the simplest form of it.
Read “Job application tracker with reminders” on the board and copy its build prompt →
04 Booking page for one person
A public page where visitors pick a free slot from your availability, and both of you get a confirmation.
- Stack
- A full-stack framework, Postgres, an email service, an .ics attachment.
- Teaches
- Time zones, availability rules, transactions, unique constraints, race conditions.
- First version
- Availability of Monday to Friday, 9:00 to 17:00, 30-minute slots; booking stores a name and email; a taken slot disappears.
- Stretch goal
- Buffers between meetings, blocked holidays, a cancel link, Google Calendar sync.
- Time
- 25 to 40 hours.
Two visitors will click the same slot within a second. Put a unique index on the slot start time and let the database refuse the second insert, then show that visitor a message such as “that slot was just taken” instead of an error page. Store every time in UTC and convert only when you display it.
Build a booking page for one host. Tables: bookings(id, slot_start_utc unique, name, email, created_at). Availability is Monday to Friday 09:00 to 17:00 in the host’s time zone, in 30-minute slots, shown to the visitor in their own time zone. Rules: a slot already in bookings is not offered; if two requests book the same slot, the second gets a 409 and a friendly message; no slot in the past. Do not build: accounts, payments, calendar sync, cancellation. Write a test that fires two bookings for the same slot at once and expects exactly one success.
05 Static blog generator from Markdown
A command that reads a folder of Markdown files and writes a complete website with an index page and an RSS feed.
- Stack
- Node or Python, a Markdown library, a template engine such as Jinja.
- Teaches
- File input and output, front matter parsing, templates, command line design, build pipelines.
- First version
- Each .md file with a title and date at the top becomes an HTML page; the index lists them newest first.
- Stretch goal
- Tag pages, syntax highlighting, rebuild only changed files, a dev server with live reload.
- Time
- 15 to 25 hours.
Keep three things apart: content (the Markdown), layout (the templates) and output (the generated folder, which you never edit by hand). Add a link checker as the last step of the build. A generator that publishes broken links between its own pages has failed at the one thing it was for.
06 Webhook receiver that processes each event once
A small service that accepts payment events from a provider’s test mode, checks the signature and stores each event exactly once.
- Stack
- Any HTTP framework, SQLite or Postgres, a payment provider’s test mode.
- Teaches
- HMAC signatures, idempotency, retries, reading the raw request body.
- First version
- An endpoint that verifies the signature, inserts the event ID under a unique constraint and answers 200 quickly.
- Stretch goal
- A replay command, a dead-letter table for events whose handler failed, a small dashboard.
- Time
- 10 to 20 hours.
Providers retry deliveries, so the same event will arrive more than once. A unique constraint on the event ID makes the second delivery harmless. The classic failure is a JSON middleware that parses the body before you verify the signature: the bytes change and every check fails. Stripe’s webhook documentation shows the pattern, and the same idea applies to any provider that signs its requests.
What are good advanced coding projects?
Advanced projects rebuild something you normally use as a black box. They take 30 to 100 hours, they have a specification you can test against, and they leave you able to explain how the real tool works. They are also the projects that stand out in a portfolio, because few people finish them.
01 Offline-first notes app with sync
A notes app that works without a connection, then syncs to a server and resolves edits made on two devices.
- Stack
- A browser app with IndexedDB and a service worker, plus a small server API.
- Teaches
- Local-first design, sync protocols, conflict resolution, versioning.
- First version
- Notes saved locally and usable offline; on reconnect, changes are pushed and the newest edit wins.
- Stretch goal
- Merge text changes instead of overwriting, show real conflicts to the user, encrypt notes before they leave the device.
- Time
- 40 to 70 hours.
Device clocks are wrong often enough to matter, so do not decide “newest” by a timestamp from the client. Have the server hand out a version number per note and reject an update that is based on an old one. Then write the test that proves it: two clients edit the same note offline, both reconnect, and nothing is silently lost.
02 Background job queue with retries and a dashboard
A queue built on a database table, with workers that claim jobs safely, retry failures with backoff and report their state.
- Stack
- Postgres, a worker in any language, a small web dashboard.
- Teaches
- Concurrency, row locking, retries with exponential backoff, idempotency, dead letters, metrics.
- First version
- A jobs table with status, run_at and attempts; a worker claims one job and marks it done or failed.
- Stretch goal
- Several workers at once, per-job timeouts, a dead-letter list, charts of queue depth and age of the oldest job.
- Time
- 30 to 50 hours.
The core trick is that two workers must never take the same job. Postgres supports this with a locking clause, FOR UPDATE SKIP LOCKED, described in the SELECT documentation. A failed job gets run_at set to now plus 2 to the power of attempts seconds, so retries slow down instead of hammering a broken service. Test with ten workers and a thousand jobs, and count that each job ran once.
Build a job queue on Postgres. Table jobs(id, payload jsonb, status, run_at, attempts, last_error). A worker loop claims one due job with SELECT ... FOR UPDATE SKIP LOCKED, runs a handler, and sets status to done; on error it increments attempts and sets run_at to now + 2^attempts seconds; after 5 attempts status becomes dead. Do not build: a dashboard, priorities, scheduling by cron. Test: enqueue 1000 jobs, start 10 workers, assert every job ran exactly once and the total handler calls equal 1000.
03 Query engine over CSV files
A tiny SQL-like engine that runs statements such as SELECT name FROM people WHERE age > 30 LIMIT 10 against CSV files.
- Stack
- Any language with good string handling: Python, Go, Rust or TypeScript.
- Teaches
- Tokenizing, parsing into a tree, evaluating, query plans, streaming rows.
- First version
- A tokenizer, a parser for SELECT, WHERE and LIMIT, and an evaluator that streams rows.
- Stretch goal
- ORDER BY, GROUP BY with COUNT and SUM, a join on one key, an EXPLAIN command that prints the plan.
- Time
- 40 to 80 hours.
You have a free test oracle: load the same CSV into SQLite, run the same 50 queries in both and compare the results. Every difference is a bug in your engine or a decision you should write down. Parse into a tree before you evaluate. Engines that evaluate while parsing cannot support GROUP BY later.
04 Multi-tenant app skeleton with billing
The parts every paid product needs and tutorials skip: organizations, roles, permissions and a plan that limits what an organization can do.
- Stack
- A full-stack framework, Postgres with row-level security or strict query scoping, a payment provider’s test mode.
- Teaches
- Tenancy modeling, authorization, billing state, webhooks, migrations.
- First version
- Organizations with owner and member roles, every query scoped by organization ID, a plan field set by a webhook event.
- Stretch goal
- Invites, an audit log, seat limits, a downgrade that keeps data, automated cross-tenant tests.
- Time
- 60 to 100 hours.
Run it in the provider’s test mode only. The work is in the tests: for every route, log in as a member of organization A and request organization B’s data, and assert a 404 or 403. Generate those tests from your route list so a new route cannot ship without one.
05 Content-addressed version store
A command line tool that saves snapshots of a folder by the hash of their contents, lists history and restores any version.
- Stack
- Go, Rust, Python or Node; SHA-256 from the standard library; plain files on disk.
- Teaches
- Hashing, content-addressed storage, trees, deduplication, diffing.
- First version
- save writes each file into an objects folder named by its hash; log lists snapshots; restore writes one back.
- Stretch goal
- Identical files stored once across versions, a diff between two snapshots, cleanup of unreachable objects.
- Time
- 30 to 60 hours.
Git itself works this way, and the Git Internals chapter of the Pro Git book walks through the object model. A related idea is posted on the board: version history for people who will never use git. A friendly interface on top of this store would answer it.
Read “Content-addressed version store” on the board and copy its build prompt →
06 Mini CI runner
A service that watches a repository, runs a command on every new commit and shows a pass or fail page.
- Stack
- Any backend language, subprocess handling, a git binary; Docker optional.
- Teaches
- Process management, timeouts, isolation, queues, streaming logs.
- First version
- Every 60 seconds run git fetch; on a new commit run ./test.sh with a 5-minute timeout and store the exit code and output.
- Stretch goal
- GitHub webhooks instead of polling, runs inside a container with CPU and memory limits, a status badge, parallel jobs.
- Time
- 30 to 50 hours.
How do I finish a coding project instead of abandoning it?
Most projects stop at the same three points: the first boring part, the first bug you cannot explain, and the moment a better idea arrives. These habits get you past each of them.
- Write the done-when line on day one. One worked example with real numbers, in the README. The project is finished when it passes.
- Commit daily, even for twenty minutes. A project with a commit from yesterday feels alive. One with a three-week gap feels like a chore.
- Deploy by the second session. A live URL turns a folder into something you can show.
- Keep a not-now list. Every new feature goes on it. You may open the list only after the first version works.
- Cut, do not extend. If you are behind, remove a feature. Moving the deadline is how a weekend project becomes a year-long one.
- Ship, then write three sentences. What it does, what you learned, what you would change. That is the README, and it is also what an interviewer asks.
If you have a pile of half-built repos already, an idea posted on the board covers the opposite problem: which of your abandoned repos is closest to finished. Until a tool like that exists, sort them by how many of the six habits above they already have, and finish the top one.
Where can I find coding projects for a specific language or topic?
The 18 projects above work in any language. When you want a list built around one language or one skill, use these:
- Python project ideas for beginners: 14 projects that use only the standard library, from a number guesser to a SQLite contact book.
- JavaScript project ideas: browser-first projects that run without a backend.
- Web development project ideas: sites and apps that cover HTML, CSS, a server and a database.
- Computer science project ideas: data structures, algorithms, compilers and systems work.
- Portfolio project ideas: what to build when the goal is to show employers.
For a project where someone else has already described the problem, browse the developer tools ideas and the rest of the board. Every idea there has a generated build prompt you can paste into Claude Code, Cursor or Lovable, or read as a plain spec and build by hand. If you have an idea you will never build, post it so someone else can.
Frequently asked questions
What are some good coding projects for beginners?
Good beginner coding projects are a bill splitter, a habit streak tracker, a recipe scaler, a time zone meeting planner, a dice scorer and a deployed links page. Each fits in a weekend, needs no server and has an answer you can check by hand. Pick one in the language you are learning and write one worked example before you start.
What are good coding projects for beginners to put on a resume?
Put two projects on a resume: one small tool that is deployed and works, and one intermediate project with users, a database and tests, such as a booking page or a job tracker. Add a README with what it does, how to run it and one thing you would change. Finished and explained beats large and abandoned.
How long should a coding project take?
A beginner project takes 3 to 10 hours, an intermediate one 10 to 40 hours and an advanced one 30 to 100 hours. Those are hours of focused work, so spread over evenings it is a few weeks. If your first version is not running after twice the estimate, cut scope instead of extending the deadline.
What programming project should I build first?
Build something with one rule you can test by hand, like a bill splitter or a dice scorer. It teaches input, logic, output and testing without a server or a database. Choose the language you plan to keep learning, and finish before you start a second project.
Where do I find programming project ideas that real people need?
Look at problems people describe, not tutorials. The board at postyourbuildideas.com lists app ideas posted by people who will not build them, grouped by category, and each has a generated build prompt. Your own annoyances, a friend’s spreadsheet or a small business’s manual process are also good sources.
Can I use AI tools like Claude Code or Cursor for coding projects?
Yes, and it is a good way to learn if you stay in charge. Write the brief and the worked example yourself, let the tool write the first draft, then read every file and ask it to explain what you do not follow. Write the tests before the code so you can judge whether the output is right.
Created with AI assistance and edited for this site. Examples are illustrative and do not represent customer research. About the publisher.