The file contents ship in the chat_web_app public-site PR.
Test plan
Render the web-static nginx template and confirm only chat_web_app gets the three exact locations
Webhook location /api/finance/webhooks/ is still present
After deploy, curl -I https://hesychia.ai/robots.txt is text/plain, and a missing file would be 404 rather than HTML
## Summary
- `chat_web_app` nginx now has exact locations for `/robots.txt`, `/sitemap.xml`, and `/llms.txt`.
- Each location serves the static file or returns 404. It does not fall through to `index.html`.
- Other static apps are unchanged. The flag is `exact_root_files` on `chat_web_app` only.
- Merged current `master`, so the Stripe webhook proxy stays in place next to the new locations.
- Closes #43.
The file contents ship in the chat_web_app public-site PR.
## Test plan
- [ ] Render the web-static nginx template and confirm only `chat_web_app` gets the three exact locations
- [ ] Webhook location `/api/finance/webhooks/` is still present
- [ ] After deploy, `curl -I https://hesychia.ai/robots.txt` is `text/plain`, and a missing file would be 404 rather than HTML
## Summary
- Unknown Hesychia URLs return 404 with `404.html` instead of 200 and the app shell.
- Extensionless routes (`/legal/terms-of-service`, billing return paths, `/document_storage`) are served as HTML.
- `chat_web_app` sends the security headers. The enforcing CSP stays loose enough for Tianji, the API, and the new analytics hosts. A stricter policy is report-only.
- Production only: one-character paths redirect for HeyCatch short links.
Depends on #44. Merge that first, then retarget this to `master` if Gitea does not do it automatically.
## Test plan
- [ ] After #44 and this change are deployed, `curl -sI https://hesychia.ai/not-a-page` is 404.
- [ ] `curl -sI https://hesychia.ai/pricing/` is 200 once the frontend shells are published.
- [ ] Response headers include `Content-Security-Policy`, `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY`, and `Referrer-Policy`.
- [ ] `curl -sI https://hesychia.ai/x` is a 302 to `/?utm_source=heycatch&utm_campaign=x`.
Reviewed-on: #45
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
chat_web_appnginx now has exact locations for/robots.txt,/sitemap.xml, and/llms.txt.index.html.exact_root_filesonchat_web_apponly.master, so the Stripe webhook proxy stays in place next to the new locations.The file contents ship in the chat_web_app public-site PR.
Test plan
chat_web_appgets the three exact locations/api/finance/webhooks/is still presentcurl -I https://hesychia.ai/robots.txtistext/plain, and a missing file would be 404 rather than HTML