witch-dev is designed to be forked and personalized. The navigation routes, page content, color palette, and build path are all controlled by a small set of configuration files. This guide walks through each customization point and explains what to change to make the portfolio your own.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/witch-dev/llms.txt
Use this file to discover all available pages before exploring further.
Navigation routes
The sidebar navigation is driven by theua array defined in components/Navigation.js. Each entry in the array is a route object:
icon property accepts any Lucide React icon component. Import it from lucide-react alongside the other icons at the top of Navigation.js.
To add a new route:
- Add an entry to the
uaarray: - Create the corresponding page component and register it in your React Router configuration.
- Add a static HTML shell at
pages/Uses.htmlfollowing the same pattern as the existing shells (see the Build guide). - Rebuild with
npm run build.
label string. The label appears in the tooltip on desktop hover and as the full-size menu item on mobile.
To reorder routes — rearrange the objects in the ua array. The navigation renders them in array order.
pages/CaseStudies.html exists in the build output and sets window.__STATIC_PAGE_ROUTE__ = "/case-studies". The /case-studies route is not included in the default ua navigation array — it is a scaffolded shell ready to be activated. To enable it, add a { path: '/case-studies', label: '...', icon: ... } entry to ua and register the route in your React Router configuration.Page content
Each page’s data is defined as a static array in the corresponding page component source file before the build. After runningnpm run build, this data is compiled into assets/main.js. To update content, edit the source arrays and rebuild.
| Page | Array name | Shape |
|---|---|---|
| Projects | v | { id, title, desc, tags[], mocked, image } |
| Skills | p | { name, level, category } |
| Writing | j | { id, title, excerpt, category, icon, date, featured } |
| About (timeline) | ue | { id, title, icon, content, color, glow } |
| About (sidebar) | ge | string[] |
v array defines one project card:
p array defines one skill bar:
j array defines one post card:
ue array defines one timeline event:
ge array is a plain list of strings displayed as a skill/interest list in the About page sidebar:
Tailwind colors
witch-dev uses a customcoven-* color palette defined in tailwind.config.js. These tokens are referenced throughout every component via Tailwind utility classes (text-coven-green-400, bg-coven-purple-900, border-coven-magenta, etc.).
The full palette, with hex values extracted from the compiled CSS:
coven-green hex values with your chosen palette. For example, swapping to amber:
npm run build. Tailwind regenerates the CSS with the new values.
To add a new custom utility — add it to the plugins array or inside an addUtilities call in tailwind.config.js, following the same pattern as box-glow-green, box-glow-purple, and glass-panel:
Vite base path
If you are deploying to a subdirectory URL — for example, GitHub Pages athttps://username.github.io/witch-dev/ rather than a custom apex domain — you must tell Vite what the base path is. Without this, all asset URLs in the HTML output (/assets/main.js) will be absolute and will 404 on the subdirectory host.
Set the base option in vite.config.js:
/witch-dev/ with the exact subdirectory path of your deployment. After changing this value, rebuild:
/witch-dev/, matching the deployment URL.
canvas.manifest.js
The file canvas.manifest.js (output to dist/canvas.manifest.js) maps internal screen identifiers to route paths. The current manifest registers one screen:
Adding a screen to
canvas.manifest.js alone is not enough to create a working route. You must also:- Create the page component in your source.
- Register the route in your React Router configuration.
- Create the corresponding HTML shell in
pages/YourPage.htmlwith thewindow.__STATIC_PAGE_ROUTE__redirect script. - Rebuild with
npm run build.