Oracle is deployed on GitHub Pages — a purely static host that serves files from a repository with no server-side routing logic. When a visitor navigates directly to a URL likeDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/oracle/llms.txt
Use this file to discover all available pages before exploring further.
oracle.example.io/about, the server looks for a file at about/index.html. On a traditional SPA that file doesn’t exist, so the server returns a 404. To sidestep this entirely, Oracle uses React Router v6’s HashRouter: every route lives after the # fragment, which the browser never sends to the server. The server always receives a request for /, always returns index.html, and React Router takes over from there.
Route Map
Oracle defines ten routes — nine content pages and a catch-all 404 fallback. Each route maps to a top-level page component and carries a mystical label used in the navigation sidebar.| Path | Component | Mystical Label |
|---|---|---|
/ | <Home /> | Home |
/about | <About /> | About |
/projects | <Projects /> | Projects |
/skills | <Skills /> | Skills |
/work | <Work /> | Work |
/case-studies | <CaseStudies /> | Case Studies |
/articles | <Articles /> | Articles |
/testimonials | <Testimonials /> | Testimonials |
/contact | <Contact /> | Contact |
* | <NotFound /> | — |
zp array, which pairs each path with a display label and a Unicode glyph used as a decorative icon:
Static Page Shim
AlthoughHashRouter handles in-app navigation, GitHub Pages also hosts individual HTML shims for each route (e.g. pages/about.html). This allows canonical per-page URLs to be shared and bookmarked. Each shim injects a small script that sets a window.__STATIC_PAGE_ROUTE__ sentinel and redirects the hash before the React app boots:
#/about). The app then boots and HashRouter reads the corrected hash, rendering the expected page immediately.
404 Fallback
Thepath="*" wildcard route catches any hash path that doesn’t match a defined route:
NotFound page displays the message “This page has vanished into the mist.”, keeping the mystical tone consistent even in error states. Because HashRouter controls all routing, a mistyped hash like #/arcane reaches this component rather than triggering a server 404.
Because
HashRouter puts the route after the # fragment, the browser never sends the path to the server. No matter which page a visitor navigates to, the server only ever sees a request for / and returns index.html. All routing decisions happen entirely on the client — making the site fully deployable on any static host with zero server configuration.