I recently built my web app using ChatGPT, and I had zero experience with Express.js or building full-stack apps before this. đ
It all started with a simple idea. Thanks to ChatGPT guiding me at every step, I was able to turn it into a real, working product: SnappyQR.com, a QR code scanning and generating tool.
Hereâs how I did it, step by step đ
I had heard of Express.js, but only in the context of creating REST APIs. I didnât know you could actually build web pages with it too. So the first thing I asked ChatGPT was:
âCan I build a web app using Express.js?â
The answer: Absolutely yes!
But to display web pages, Express.js needs something called a templating engine. After exploring options (and asking ChatGPT again), I chose EJS because it seemed beginner-friendly and widely used.
Once I had the tech sorted, I needed a project idea.
So I came up with something simple and useful:
Since I was new to structuring web projects, I asked:
âWhat should my folder structure look like for an Express + TypeScript project?â
ChatGPT suggested a clean and logical structure like this:
- dist
- node_modules
- src
 - app.ts
 - config
 - controllers   # Core business logic
 - public     # CSS, images, JS
 - routes     # Route handlers
 - server.ts    # App entry point
 - views      # EJS templates
- uploads      # Uploaded QR images
This setup helped me keep everything organized from the beginning.
Once again, I turned to ChatGPT and asked:
âWhat are some Node.js libraries to scan and generate QR codes?â
Hereâs what it recommended:
import QRCode from "qrcode";
import { createCanvas, loadImage } from "canvas";
export async function generateQR(data: string, width = 300, centerImg?: string) {
 const canvas = createCanvas(width, width);
 await QRCode.toCanvas(canvas, data, {
   errorCorrectionLevel: "H",
   margin: 1,
 });
 if (centerImg) {
   const ctx = canvas.getContext("2d");
   const img = await loadImage(centerImg);
   const center = (width - 50) / 2;
   ctx.drawImage(img, center, center, 50, 50);
  }
 return canvas.toDataURL("image/png");
}
import QrCode from "qrcode-reader";
import { Jimp } from "jimp";
export async function scanQRCodeFromImage(imagePath: string): Promise<string> {
 const image = await Jimp.read(imagePath);
 image.resize(300, 300);
 return new Promise((resolve, reject) => {
   const qr = new QrCode();
   qr.callback = (err, value) => {
     if (err) return reject(err);
     resolve(value.result);
   };
   qr.decode(image.bitmap);
 });
}
Iâm not great at CSS, so I asked ChatGPT for help:
âCan you help me design a simple, clean UI?â
It gave me CSS and HTML suggestions that I could copy and paste into my EJS files. I made a few small tweaks, but honestly, ChatGPT saved me a lot of time and confusion.
And just like that, my little experiment turned into a real, working app.
⨠SnappyQR.com
âď¸ Upload QR code images
âď¸ Instantly decode them
âď¸ Generate custom QR codes (even with logos)
Itâs simple, but Iâm super proud of it because I built it from scratch and learned so much along the way.
By the end of the project, I had learned how to:
Ask better questions and learn quickly using ChatGPT
If you’re just starting out and feeling overwhelmed, my advice is simple:
đ Pick a small project idea
đ Use ChatGPT as your coding buddy
đ Learn by building and asking questions
You donât need to know everything before you start. I didnât. I just kept learning one step at a time and improved along the way.
Thanks for reading! I hope this inspires you to start your own project too đ