Digital Alchemy is a client-side Single Page Application that uses React Router v6 withDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/digital-alchemy/llms.txt
Use this file to discover all available pages before exploring further.
HashRouter for navigation. All route definitions live in assets/main.js, where the router is bootstrapped and the entire component tree is mounted into #root.
Why HashRouter?
GitHub Pages serves static files only — there is no server to intercept requests and rewrite URLs toindex.html. If the app used BrowserRouter, navigating directly to https://example.github.io/digital-alchemy/about would return a 404 because no about/index.html file exists on disk.
HashRouter sidesteps this entirely by appending all paths to the URL fragment (the # portion), which is never sent to the server:
| Browser address bar | What the server sees |
|---|---|
https://user.github.io/#/about | https://user.github.io/ → serves index.html ✅ |
https://user.github.io/about | https://user.github.io/about → 404 ❌ |
HashRouter is imported as H from Layout.js and wraps the entire app in main.js.
For direct URL navigation (e.g. bookmarks and sharing links) a complementary strategy using per-route static HTML files is used. See Static Pages for details.
Route table
| Path | Page name | Component |
|---|---|---|
/ | The Sanctum (Home) | HomeView |
/about | The Witch | AboutView |
/projects | Summonings | ProjectsView |
/skills | Familiar Languages | SkillsView |
/work | Lineage | WorkView |
/case-studies | Grimoire | CaseStudiesView |
/case-studies/:slug | Grimoire (detail) | CaseStudiesView |
/articles | Forbidden Knowledge | ArticlesView |
/articles/:slug | Forbidden Knowledge (detail) | ArticlesView |
/testimonials | The Coven | TestimonialsView |
/contact | Cast a Message | ContactView |
Dynamic routes
Two routes accept a:slug parameter for individual detail pages:
/case-studies/:slug— renders a specific case study. TheCaseStudiesViewcomponent reads the slug fromuseParams()and conditionally renders the matching content./articles/:slug— renders a specific article. TheArticlesViewcomponent follows the same pattern.
Route definitions (JSX)
Adding a new route
Create the view component
Add a new view file under
components/ or inline in main.js. Follow the existing pattern of exporting a default React component.Register the route
Import your component in
assets/main.js and add a <Route> element inside <Routes>:Add a nav item
Add an entry to the
navItems array in components/Layout.js so the new route appears in the header navigation.Create a static HTML page
Add a corresponding file in
pages/ so the route works when navigated to directly. See Static Pages for the exact template to use.