Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/dev-mode-arcade/llms.txt
Use this file to discover all available pages before exploring further.
Dev Mode Arcade has no backend, no database, and no API calls at runtime. Every piece of content displayed across all seven routes — projects, skills, articles, case studies, and guestbook entries — is co-located in a single file: data/mockData.js. Keeping everything in one place makes the portfolio trivially portable and fully editable without touching a server.
File location
data/
└── mockData.js # The single source of truth for all portfolio content
When consuming the data in your own components, import by the single-character export names and rename locally for readability:
import { p as projects, s as skills, a as articles, c as caseStudies, g as guestbook }
from "../data/mockData.js";
The exports use single-character aliases (p, s, a, c, g) because the file is minified. These are the actual export names — there are no long-form named exports like projects or skills. Use the short names in your import statement and alias them locally as shown above.
The five exports
Projects — exported as p
Rendered on the /projects route as retro game cartridge cards. Each project maps its tech stack to a genre field and its team size to a players field, staying consistent with the arcade metaphor.
// Project shape — exported as `p`
{
id: string, // Unique identifier, e.g. "proj-1"
title: string, // Display name, e.g. "Neon Nexus"
genre: string, // Tech stack label, e.g. "React / Three.js"
players: string, // "Solo" | "Team"
year: string, // Four-digit year string, e.g. "2025"
description: string,
color: string, // "purple" | "lime" | "magenta" | "cyan"
}
The color field maps directly to the arcade design token set (see Design Tokens). ArcadeButton and the cartridge card components use it to select the correct border, text, and glow utility classes.
Live data snapshot:
| id | title | genre | players | year | color |
|---|
| proj-1 | Neon Nexus | React / Three.js | Solo | 2025 | purple |
| proj-2 | CyberCart | Next.js / Stripe | Team | 2024 | lime |
| proj-3 | GhostWriter | Vue / Node.js | Solo | 2024 | magenta |
| proj-4 | PixelPulse | React Native | Team | 2023 | cyan |
Skills — exported as s
Rendered on the /skills route as a control-panel skill tree, grouped into three categories. Each skill has a human-readable level string rather than a numeric value, keeping the arcade RPG flavour.
// Skills shape — exported as `s`
// Each category holds an array of skill entries
{
frontend: [ { name: string, level: string, desc: string }, /* ... */ ],
backend: [ { name: string, level: string, desc: string }, /* ... */ ],
tooling: [ { name: string, level: string, desc: string }, /* ... */ ],
}
Live data snapshot:
| Category | Skill | Level |
|---|
| frontend | React | Level 99 |
| frontend | TypeScript | Level 85 |
| frontend | Tailwind CSS | Level 90 |
| frontend | Framer Motion | Level 75 |
| backend | Node.js | Level 80 |
| backend | PostgreSQL | Level 70 |
| backend | Redis | Level 60 |
| tooling | Git | Level 95 |
| tooling | Docker | Level 65 |
| tooling | Vite | Level 85 |
Articles — exported as a
Rendered on the /writing route as instruction-manual pages. Each article has a chapter number and a type tag that categorises the writing style.
// Article shape — exported as `a`
{
id: string, // Unique identifier, e.g. "art-1"
chapter: string, // Zero-padded chapter number, e.g. "01"
title: string,
type: string, // "REFLECTION" | "TECHNICAL" | "BUG REPORT"
date: string, // e.g. "Oct 2025"
excerpt: string,
}
Live data snapshot:
| id | chapter | title | type | date |
|---|
| art-1 | 01 | The State Management Dilemma | REFLECTION | Oct 2025 |
| art-2 | 02 | CSS Grid: A Boss Guide | TECHNICAL | Aug 2025 |
| art-3 | 03 | Memory Leak in Sector 7 | BUG REPORT | May 2025 |
Case Studies — exported as c
Rendered on the /case-studies route as boss-fight summaries. The boss field names the antagonist (typically a legacy system or technical debt), and combos lists the techniques used to defeat it.
// CaseStudy shape — exported as `c`
{
id: string,
title: string,
boss: string, // Antagonist / legacy system, e.g. "The Legacy Monolith"
problem: string, // Context and pain points
strategy: string, // Approach taken
combos: [], // string[] — specific techniques used
victory: string, // Measurable outcome
bonus: string, // Next steps / follow-on work
}
Live data snapshot:
The current dataset contains one case study:
| Field | Value |
|---|
| id | cs-1 |
| title | Project: Overhaul |
| boss | The Legacy Monolith |
| victory | Load time reduced to 1.2s. Developer onboarding time cut in half. Zero downtime during migration. |
Guestbook — exported as g
Rendered on the /contact route as an arcade high-score table. Entries use three-character initials to stay faithful to the classic arcade leaderboard format.
// GuestEntry shape — exported as `g`
{
initials: string, // Exactly 3 uppercase characters, e.g. "AAA"
score: number, // Numeric score (higher = better)
message: string, // Short message displayed next to the score
}
Live data snapshot:
| initials | score | message |
|---|
| AAA | 999999 | HIRED. |
| MOM | 500000 | Very proud of you sweetie |
| H4X | 1337 | Nice CSS. |
| DOG | 100 | Woof. |
How components consume the data
All imports are resolved at bundle load time. A component receives the data as a plain JavaScript value — there is no fetch, no useEffect, and no loading state.
The import line in main.js (decompiled):
import { p as Rc, s as Tl, a as zc, c as Ic, g as Oc } from "../data/mockData.js";
Each page component then destructures what it needs. For example, the Projects page uses Rc (projects), and the Skills page uses Tl (skills). Because these are module-level imports, the data is available synchronously on the first render.
Adding a new project
To add a new project, append an object to the array exported as p in data/mockData.js. Follow the shape below exactly:
// data/mockData.js — add to the projects array (exported as `p`)
{
id: "proj-5",
title: "RetroRadar",
genre: "SvelteKit / D3",
players: "Solo",
year: "2025",
description: "An animated data dashboard for visualising open-source project activity.",
color: "cyan"
}
Valid values for color are "purple", "lime", "magenta", and "cyan". Each value corresponds to a Tailwind utility class group defined in assets/main.css.
After editing mockData.js, the change is live immediately — no build step is needed. Because the file is a plain ES module loaded by the browser at runtime, refreshing the page is enough to see the updated content.
Adding a new case study
// data/mockData.js — add to the case studies array (exported as `c`)
{
id: "cs-2",
title: "Operation: Zero Downtime",
boss: "The Deployment Kraken",
problem: "A manual FTP deployment process that caused 30-minute outages on every release.",
strategy: "Incremental CI/CD pipeline introduction alongside the existing process.",
combos: [
"GitHub Actions workflow setup",
"Blue-green deployment strategy",
"Automated smoke test suite"
],
victory: "Deployment time reduced from 30 minutes to 4 minutes. Zero downtime on all releases since adoption.",
bonus: "Next step: canary releases for high-risk feature flags."
}
Static data: implications and trade-offs
| Aspect | Detail |
|---|
| No API latency | Data is bundled with the module graph and available before the first paint |
| No authentication | All data is public — do not put secrets, tokens, or private information here |
| No live updates | Changes require manually editing the file and redeploying |
| Version-controlled | Every content change is tracked in git history alongside code changes |
| Portable | The entire portfolio can be cloned and hosted anywhere without a backend |
For a full reference of every field with example values, see Mock Data Reference.