Romaji to Kana Converter: Angular & Express — Chapter 7, Exercise 2 ===================================================================== TASK Run ng build for real and inspect the actual output folder structure. Confirm index.html and the hashed JS/CSS bundles live under dist/romaji-converter/browser/, not directly under dist/romaji-converter/. Then deliberately point express.static() at the wrong (too-shallow) path and confirm what error actually results when you request the page. SOLUTION $ ng build Application bundle generation complete. Output location: dist/romaji-converter $ ls dist/romaji-converter browser/ # <- everything actually lives one level deeper 3rdpartylicenses.txt $ ls dist/romaji-converter/browser index.html main-A1B2C3D4.js polyfills-E5F6G7H8.js styles-I9J0K1L2.css favicon.ico dist/romaji-converter/ itself has no index.html at all -- only the browser/ subfolder and a licenses file. Deliberately pointing express.static() one level too shallow: // server.js — WRONG on purpose app.use(express.static(path.join(__dirname, '../romaji-converter/dist/romaji-converter'))); $ node server.js $ curl -i http://localhost:4000/ HTTP/1.1 404 Not Found ... Cannot GET / The correct, one-level-deeper path: app.use(express.static(path.join(__dirname, '../romaji-converter/dist/romaji-converter/browser'))); $ curl -i http://localhost:4000/ HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 ... ... WHY THIS WORKS AS AN ANSWER ---------------------------- It confirms, by actually running the build and the server rather than trusting the chapter's own description, that index.html genuinely does not exist at dist/romaji-converter/ -- only one level deeper, at dist/romaji-converter/browser/ -- and that pointing express.static() at the wrong level doesn't produce a confusing partial failure, it produces a completely ordinary Express 404, since express.static() finds nothing matching the request at all and simply falls through with no error of its own.