Skip to main content

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:
idtitlegenreplayersyearcolor
proj-1Neon NexusReact / Three.jsSolo2025purple
proj-2CyberCartNext.js / StripeTeam2024lime
proj-3GhostWriterVue / Node.jsSolo2024magenta
proj-4PixelPulseReact NativeTeam2023cyan

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:
CategorySkillLevel
frontendReactLevel 99
frontendTypeScriptLevel 85
frontendTailwind CSSLevel 90
frontendFramer MotionLevel 75
backendNode.jsLevel 80
backendPostgreSQLLevel 70
backendRedisLevel 60
toolingGitLevel 95
toolingDockerLevel 65
toolingViteLevel 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:
idchaptertitletypedate
art-101The State Management DilemmaREFLECTIONOct 2025
art-202CSS Grid: A Boss GuideTECHNICALAug 2025
art-303Memory Leak in Sector 7BUG REPORTMay 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:
FieldValue
idcs-1
titleProject: Overhaul
bossThe Legacy Monolith
victoryLoad 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:
initialsscoremessage
AAA999999HIRED.
MOM500000Very proud of you sweetie
H4X1337Nice CSS.
DOG100Woof.

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

AspectDetail
No API latencyData is bundled with the module graph and available before the first paint
No authenticationAll data is public — do not put secrets, tokens, or private information here
No live updatesChanges require manually editing the file and redeploying
Version-controlledEvery content change is tracked in git history alongside code changes
PortableThe 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.

Build docs developers (and LLMs) love