Skip to main content

Documentation Index

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

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

Y2K Webring uses a single source-of-truth JavaScript module — data/portfolioData.js — for all dynamic content. There is no CMS, no API, and no database. Every page component imports directly from this one file. To update the portfolio, you edit the JS object and redeploy. All pages stay in sync automatically because they all read from the same source.

Exports

The file exports six named constants. In the minified build the names are shortened to single letters; the table below maps each alias to its readable purpose.
Export aliasReadable nameUsed by
SdevInfoHome, About, RightWebring
PprojectsProjects page
askillsSkills page
WwritingPostsWriting / Archive page
CcaseStudiesCase Studies page
GguestbookContact / Guestbook page
// data/portfolioData.js — named exports (minified bundle)
// Each internal variable is exported under a short alias:
//   devInfo      → exported as  S
//   projects     → exported as  P
//   skills       → exported as  a  (used directly, no alias)
//   writingPosts → exported as  W
//   caseStudies  → exported as  C
//   guestbook    → exported as  G
export { n as C, i as G, t as P, e as S, o as W, a };

devInfo (S)

The devInfo object is the developer’s identity card. It drives the Home page hero, the About page bio, the RightWebring sidebar guestbook count, and the social links panel.
const devInfo = {
  devName: "ALEX.EXE",
  tagline: "No actual spells, just suspiciously organized files.",
  bio: "Full-stack developer weaving code into the digital ether. Previously a nursing student, now debugging reality.",
  status: {
    building: "A haunted React component",
    reading: "Documentation from 2014",
    debugging: "Reality (and CSS grids)",
  },
  guestbookCount: 1337,
  stats: {
    location: "The Pacific Northwest (probably raining)",
    pronouns: "they/them",
    obsessedWith: "mechanical keyboards, obscure CSS properties, cold brew",
    previously: "nursing student / healthcare / retail / merchandiser",
    peeves: "off-center buttons, fake enthusiasm, inconsistent branding",
  },
  socials: [
    { name: "GitHub",   url: "#", icon: "github"   },
    { name: "LinkedIn", url: "#", icon: "linkedin"  },
    { name: "Email",    url: "#", icon: "mail"      },
    { name: "RSS",      url: "#", icon: "rss"       },
  ],
};
The icon string in each social entry is resolved at runtime to a lucide-react component by the RightWebring component (which maps "github"<GithubIcon>, "linkedin"<LinkedInIcon>, etc.).

projects (P)

An array of project objects. Each entry can specify one of three dataSource values ("live", "mocked", "sample") to communicate how real the demo data is.
// Shape of a single project entry
{
  id: "proj-1",           // Unique string ID
  name: "Grimoire.js",
  stack: ["React", "TypeScript", "WebGL"],  // Array of tech labels
  status: "✦ shipped",   // Display string (e.g. "✦ shipped", "✦ in-progress", "✦ haunted")
  description: "A digital spellbook for managing code snippets...",
  dataSource: "live",     // "live" | "mocked" | "sample"
  demoUrl: "#",
  sourceUrl: "#",
  readmeUrl: "#",
}

skills (a)

An object keyed by skill category name. Each key maps to an array of skill entries with a numeric level from 1–5.
// Shape of the skills object
{
  "Languages": [
    { name: "TypeScript",  level: 5, note: "5 years of strict typing" },
    { name: "JavaScript",  level: 5, note: "The chaotic neutral core" },
    { name: "Python",      level: 4, note: "For scripting and data spells" },
    { name: "HTML/CSS",    level: 5, note: "The ancient texts" },
    { name: "SQL",         level: 3, note: "SELECT * FROM abyss" },
  ],
  "Frontend": [ /* { name, level, note } */ ],
  "Backend & Data": [ /* { name, level, note } */ ],
  "Tooling": [ /* { name, level, note } */ ],
  "Design Sensibilities": [ /* { name, level, note } */ ],
}
The five categories in the current data set are: Languages, Frontend, Backend & Data, Tooling, and Design Sensibilities. The Skills page iterates Object.entries(skills) to render each group.

writingPosts (W)

An array of blog post objects. The content field holds the full post body as a plain string; no Markdown parsing is needed because the page renders it directly.
// Shape of a single writing post
{
  id: "post-1",
  title: "Why I Still Use Chunky Borders in 2026",
  date: "2026-05-13",           // ISO date string
  excerpt: "A defense of the 2px solid border...",
  tags: ["Design", "Reflection"],  // Array of tag strings
  content: "The modern web is a sea of...",  // Full post body
}

caseStudies (C)

An array of narrative case study objects. The bugs field models each obstacle as a named bug with an hp value — a Y2K-aesthetic nod to RPG boss fights.
// Shape of a single case study
{
  id: "cs-1",
  title: "Neon_Bazaar: Reimagining E-commerce",
  setup:          "A boutique digital art collective needed a storefront...",
  problem:        "Standard e-commerce platforms enforce a grid-and-white-background...",
  investigation:  "I analyzed 15 different 'alternative' storefronts...",
  designChoices:  "We opted for a 'directory' style layout...",
  buildChoices:   "Next.js for SSR SEO benefits, Stripe for payments...",
  bugs: [
    { name: "Stripe Webhook Duplication",          hp: 45 },
    { name: "Framer Motion Memory Leak on Mobile", hp: 80 },
  ],
  result:    "A 40% increase in conversion rate...",
  nextTime:  "I would use a lighter animation library...",
}

guestbook (G)

An array of guestbook entry objects. The color field is a Tailwind text-color utility class applied directly to the entry’s display name.
// Shape of a single guestbook entry
{
  id: 1,
  name: "Recruiter_Sarah",
  date: "2026-05-20",       // ISO date string
  text: "Love the aesthetic! Your React skills are exactly what we need...",
  color: "text-y2k-lime",   // Tailwind class, e.g. "text-y2k-lime" | "text-y2k-cyan" | "text-y2k-magenta"
}
Keep data/portfolioData.js as the single place you update content. Because every page component imports from this file, a change to a project name, skill level, or social link is automatically reflected across the entire site the next time you build — no hunting through individual page files required.

Build docs developers (and LLMs) love