You are working on the codebase behind echo.zuplo.io. An external scan of the deployed site found the tells listed below — the specific things that make it read as assembled by a website builder rather than built. Fix them in the order given. Each item names the evidence observed on the live page, so you can confirm the problem before you change anything. Rules for this task: - Do not redesign the site. Change only what each item asks for. - Do not change any URL, route or page title beyond what an item explicitly requires. - If an item does not match what you find in the code, say so and skip it rather than inventing a change. - Work through the list top to bottom and report what you changed for each. ## Scaffold defaults still in place ### 1. Starter-template files are still being served Observed on the live site: /bolt.config.json (613 bytes) — the Bolt project config · /lovable-uploads/ (613 bytes) — Lovable's upload directory These starter-template files are still served in production: /bolt.config.json (613 bytes) — the Bolt project config; /lovable-uploads/ (613 bytes) — Lovable's upload directory. Delete them from `public/` (or wherever the template put them) and redeploy — they are the clearest sign nobody went through the scaffold after generating it. Paths to remove: /bolt.config.json, /lovable-uploads/. ## Unfinished production basics ### 2. Unknown URLs return 200 instead of 404 (SPA catch-all) Observed on the live site: GET /is-vibecoded-probe-iltaml5 → 200 (expected 404) Make unknown URLs return a real HTTP 404. The catch-all currently answers 200 for paths that do not exist (GET /is-vibecoded-probe-iltaml5 → 200 (expected 404)), so every typo and dead link gets indexed as a duplicate page. Serve the not-found view with a 404 status code, not a client-side redirect. ### 3. Initial HTML is an empty shell — content only appears after JavaScript runs Observed on the live site: 46 words of text in the initial HTML response Server-render the content. The first response carries 46 words of readable text, so crawlers, link unfurlers and agents that do not execute JavaScript see an empty page. Move at least the hero copy, headings and primary navigation into the server-rendered HTML. ### 4. No meta description at all Observed on the live site: no Add a `` of 140–160 characters, unique per route. Without one, search engines and link previews invent one from whatever text they scrape first. ### 5. No Open Graph image — links unfurl as a bare grey box Observed on the live site: no og:image Add Open Graph and Twitter card tags with a real 1200×630 `og:image`, plus `og:title`, `og:description`, `og:url` and `twitter:card=summary_large_image`. Right now every share of this link renders as an empty grey rectangle, which reads as unfinished more than any design choice does. ## When you are done Re-run the checks yourself before reporting: fetch the deployed page with curl and confirm the markers above are gone from the HTML, that unknown paths return 404, and that `/robots.txt` and `/sitemap.xml` answer 200. Then summarise anything you deliberately did not change and why.