Production: direct URL hits and refresh on sub-routes return raw "Not Found" (missing SPA fallback) #196
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:open_issues
agents
agent:security_audit
agent:verify
area
timecurve
arena
arena-v2
audit
block:feature_review
block:security
bug
contracts
design
devops
docs
documentation
enhancement
epic
feature
frontend
indexer
low priority
megaeth
operations
ops
performance
QA
qa checklist
referrals
removal
security
smart-contracts
tech-debt
testing
time-arena
timecurve
visual-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
code/yieldomega#196
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Direct URL hits to any sub-route on production return raw
Not Foundserver text instead of the SPA. Only/(root) renders the app correctly. Page refresh on any route, deep links shared externally, and bookmarks to sub-routes are all broken.What is wrong
Production static host has no SPA fallback configured. When a browser requests
yieldomega.com/timecurvedirectly, the server looks for a literal/timecurvefile on disk, doesn't find one, returns a server-level 404 with bodyNot Found. React Router never gets a chance to handle the route because the SPA bundle is never served.In-app navigation works fine because React Router intercepts the click client-side and updates the URL via History API without a server roundtrip.
Steps to reproduce
https://yieldomega.com/timecurvedirectly into address bar, hit Enter.Not Foundtext top-left, no app shell, no nav, no branding./vesting,/referrals,/timecurve/arena, any non-root path — same result.https://yieldomega.com/(root, works fine), click TimeCurve nav button, URL updates to/timecurveand page renders correctly. Hit F5 to refresh. Page immediately flips to rawNot Found.User impact
Recommended fix
Add an SPA fallback rewrite rule at the static host. The pattern is "any unmatched path serves
/index.htmlwith 200, not 404." Host-specific examples:Render (
render.yamlat repo root, or dashboard → Redirects/Rewrites):Vercel (
vercel.json):Netlify / Cloudflare Pages (
public/_redirects):nginx:
Verification checklist (post-fix)
https://yieldomega.com/timecurve(fresh tab) renders the TimeCurve view with full app shell./timecurve/arenareloads the arena view, doesn't flip toNot Found.https://yieldomega.com/referralsdirect paste renders the referrals page.https://yieldomega.com/this-route-does-not-existrenders the SPA in-app 404 (React Router fallback), NOT the raw server 404 text. (If no in-app 404 exists, separate polish-nit can track that.)/timecurveURL into a new incognito tab) lands on app shell, not raw text.index.htmlcontent (not 404 withNot Foundbody).Source
Discovered during #147 production visual QA walk, items 3.12 (Deep links), 4.4 (Vesting hidden-from-nav), 4.11 (404 / global error pages) all FAIL from this single root cause.
@PlasticDigits — flagging pre-launch since this affects every shared link, refresh, and bookmark. Single config change at the host. Happy to verify post-fix immediately.
mentioned in issue #147
@Brouie Due to missing rewrite rule on render - fixed.