Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/apursley2012/systems-witch/llms.txt

Use this file to discover all available pages before exploring further.

Systems Witch ships as a complete, self-contained React application. There is no scaffolding step, no configuration wizard, and no generator to run — you clone the repository, install dependencies, and the dev server is live in seconds. This guide walks you from a bare machine to a running local instance to a deployed production site, covering every command you need along the way.

Prerequisites

Before you begin, make sure the following are available on your machine:
  • Node.js 18 or later — Vite requires Node 18+ for its native ESM pipeline and import.meta features. Check with node --version.
  • A package manager — npm (bundled with Node), yarn, or pnpm all work. Examples below cover all three.
  • Git — to clone the repository. Check with git --version.
Node version managers like nvm or fnm make it easy to switch to Node 18 without affecting other projects. Run nvm use 18 (or fnm use 18) if you have one installed.

Installation

1

Clone the repository

Clone Systems Witch from GitHub to a local directory:
git clone https://github.com/apursley2012/systems-witch.git
Then move into the project directory:
cd systems-witch
2

Install dependencies

Install all Node dependencies using your preferred package manager:
npm install
This installs React 18, Vite, React Router, Framer Motion, Tailwind CSS, and their transitive dependencies into node_modules/. The first install typically takes 20–40 seconds depending on network speed.
3

Start the dev server

Launch the Vite development server:
npm run dev
Vite starts at http://localhost:5173 by default and enables Hot Module Replacement (HMR). Any change you save to a component or stylesheet is reflected in the browser within milliseconds — no full page reload required.You should see output similar to:
  VITE v5.x.x  ready in 312 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
4

Open the site in a browser

Navigate to http://localhost:5173 in your browser. You will be redirected to http://localhost:5173/#/ automatically — the inline script in index.html ensures the hash fragment is always present on first load.For the first 2.5 seconds you will see the ASCII boot animation: a pre-formatted WITCH ASCII art rendered in JetBrains Mono with text-acid colouring, followed by a blinking [ SYSTEM BOOTING... ] prompt. When the timer clears, the boot sequence fades out and the HeroSigil appears — a slowly rotating SVG sigil, 40-second revolution period, with a pulsing acid-green dot at its centre and the SYSTEMS Witch logotype beneath it.

Project Structure

The repository layout after cloning is as follows:
systems-witch/
├── assets/
│   ├── main.js        # Compiled React app (all page components)
│   ├── main.css       # Tailwind output + custom animations
│   ├── jsx-runtime.js # React JSX runtime
│   └── proxy.js       # Framer Motion + React Router exports
├── components/
│   ├── FilesystemNav.js
│   ├── GlitchHeading.js
│   ├── PageTransition.js
│   ├── ScanlineOverlay.js
│   ├── TerminalFooter.js
│   └── sigils/
│       ├── HeroSigil.js
│       └── SectionSigil.js
├── pages/
│   ├── Home.html
│   ├── About.html
│   ├── Projects.html
│   ├── Skills.html
│   ├── Articles.html
│   ├── Contact.html
│   └── Testimonials.html
└── index.html         # Root entry point
assets/ — The compiled output from Vite’s build pipeline. main.js contains the full React application including all seven page components, routing logic, and animation definitions. main.css is the Tailwind CSS output plus custom keyframe animations (pulse-glow, glitch-anim-1, glitch-anim-2) and utility classes (text-glow, ascii-border, shadow-glow). proxy.js re-exports Framer Motion primitives and React Router hooks so they can be consumed by individual component modules without duplicating the dependency. components/ — Reusable UI primitives. These are the building blocks shared across all seven pages: the sidebar, the footer, the CRT overlay, the page transition wrapper, the glitch heading, and the two SVG sigil variants. pages/ — Static HTML shells for each route. These correspond 1-to-1 with the seven hash routes defined in main.js and are used by the production build for initial HTML delivery. index.html — The single root HTML document. It mounts the #root div, module-preloads all component scripts, links main.css, and runs an inline script that ensures the #/ hash fragment is present before React hydrates — critical for the hash-based router to initialise correctly.

Production Build

When your changes are ready for deployment, run the Vite production build:
npm run build
Vite compiles, tree-shakes, and minifies the entire application into the dist/ directory. Output includes:
  • A static HTML shell for each route (dist/index.html and one file per page)
  • Hashed asset filenames (e.g. main-Bx3kP9aQ.js) for long-term cache busting
  • Minified CSS with all unused Tailwind utilities purged
To preview the production build locally before deploying:
npm run preview
This starts a lightweight static server pointed at dist/ on http://localhost:4173.

Deployment

The dist/ output is a fully static site — no Node.js server, no serverless functions, no database. Drop the contents of dist/ onto any platform that can serve static files:
PlatformHow to deploy
VercelConnect the GitHub repo; Vercel auto-detects Vite and sets the build command to npm run build and output directory to dist
NetlifyDrag-and-drop the dist/ folder into the Netlify dashboard, or connect the repo with build command npm run build and publish directory dist
GitHub PagesUse the peaceiris/actions-gh-pages Action to push dist/ to the gh-pages branch on every push to main
Cloudflare PagesConnect the repo; set build command npm run build and build output directory /dist
Because all routing is hash-based (#/about, #/projects, etc.), you can host this site on GitHub Pages without any _redirects file or 404 workarounds. The browser never requests /about from the server — it only ever requests /, and React Router reads the hash fragment to render the correct page. A plain static file server is all you need.
For self-hosted deployments, any web server capable of serving static files works — nginx, Apache, Caddy, or even python3 -m http.server. Point the server root at dist/ and no additional configuration is required.

Build docs developers (and LLMs) love