neocities-dev is a personal developer portfolio website built as a single-page React application and deployed to Neocities static hosting. It leans fully into the Y2K / early-internet aesthetic: chunky bevel-border panels, chromatic-aberration glows, pixel-art fonts, and an operating-system-style navigation sidebar — all rendered in the browser with React, styled with a custom Tailwind theme, and bundled by Vite. The project exists to prove that a modern React toolchain and a lovingly retro visual design are not mutually exclusive.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/neocities-dev/llms.txt
Use this file to discover all available pages before exploring further.
Architecture
neocities-dev is built on four key technologies:| Layer | Technology |
|---|---|
| UI framework | React 18 |
| Build tool | Vite |
| Client-side routing | React Router (hash mode) |
| Styling | Tailwind CSS (custom Y2K theme) |
Hash-based routing
Neocities is a pure static file host — there is no server to rewrite URLs or returnindex.html for unknown paths. To support deep-linking without server configuration, the app uses hash-based routing: every route is prefixed with /#/ (e.g. /#/about, /#/projects). The browser never sends the fragment to the server, so every navigation stays within the single index.html entry point.
The index.html entry point bootstraps this behaviour with a small inline script:
window.__STATIC_PAGE_ROUTE__ marker (used by the React bundle to know which static page shell loaded it) and redirects bare visits to the root hash #/ so React Router always has a valid hash to work with.
FakeBrowserChrome wrapper
The outermost shell of the app is aFakeBrowserChrome component that wraps the entire viewport in a mock browser window — styled to evoke Netscape Navigator, complete with a decorative address bar, nav toolbar buttons, and window-chrome controls. Inside it, a persistent FrameNav sidebar provides navigation, and individual page content is rendered into WindowPanel containers.
All page content is rendered client-side inside a single
<div id="root"> element. The pages/ HTML shells (see Project Structure below) exist only so Neocities can serve each route URL directly without a 404.Project Structure
pages/ is a minimal HTML document that loads the same assets/main.js bundle and sets its own window.__STATIC_PAGE_ROUTE__ value. This lets the React app know which route was requested even before it has parsed the URL hash.
Routes
All routes are served via hash fragments, making them fully compatible with static hosting.| Route | Hash path | Purpose |
|---|---|---|
| Home | /#/ | Landing page — hero section and intro |
| About | /#/about | Personal bio and background (About_Me.txt) |
| Projects | /#/projects | Portfolio of work (Projects.dir) |
| Skills | /#/skills | Technologies and tools (Skills.dat) |
| Writing | /#/writing | Blog posts and articles (Writing.log) |
| Case Studies | /#/case-studies | In-depth project breakdowns (Cases.doc) |
| Contact | /#/contact | Contact form and links (Contact.msg) |
FrameNav sidebar, reinforcing the Y2K OS aesthetic (e.g. Home.exe, About_Me.txt, Projects.dir).
Explore Further
Quickstart
Clone the repo and serve the pre-built static site locally or deploy it to Neocities in minutes.
Components
Explore WindowPanel, FrameNav, PixelButton, FakeBrowserChrome, and CustomCursor.
Styling & Theme
Y2K Tailwind tokens, fonts (VT323, Space Mono, Inter), and custom CSS utility classes.
Pages
How the static HTML shells in
pages/ map to React Router routes.