{"id":10388,"date":"2026-04-27T17:27:32","date_gmt":"2026-04-27T23:27:32","guid":{"rendered":"https:\/\/rec0m88.com\/?page_id=10388"},"modified":"2026-08-23T19:33:27","modified_gmt":"2026-08-24T01:33:27","slug":"setup-rec0m88","status":"publish","type":"page","link":"https:\/\/rec0m88.com\/pt\/setup-rec0m88\/","title":{"rendered":"Setup Rec0m88"},"content":{"rendered":"\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Setup &amp; Instructions \u2014 Rec0m88<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin=\"\">\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=Sora:wght@500;600;700&#038;family=JetBrains+Mono:wght@400;500;600&#038;display=swap\">\n\n<style>\n\/* =========================================================\n   REC0M88 \u2014 SETUP & INSTRUCTIONS\n   Same design system as the Rec0m88 homepage, download page,\n   legal disclaimer and about page.\n\n   Everything is scoped under .setup-page. The previous version\n   styled the bare `body`, `:root`, `code` and `pre` selectors\n   from inside a content block, which overrode the theme on\n   every element outside this page too.\n   ========================================================= *\/\n\n.setup-page {\n  \/* ---- Surface ramp ---- *\/\n  --r-bg:        #08090c;\n  --r-bg-2:      #0b0d11;\n  --r-surface:   #101319;\n  --r-surface-2: #151922;\n  --r-line:      rgba(255,255,255,.07);\n  --r-line-2:    rgba(255,255,255,.12);\n\n  \/* ---- Ink ---- *\/\n  --r-text:      #e8eaf0;\n  --r-body:      #a5abba;\n  --r-muted:     #6f7789;\n\n  \/* ---- Accent ---- *\/\n  --r-cyan:        #35d6ee;\n  --r-cyan-soft:   rgba(53,214,238,.12);\n  --r-violet:      #a68bfa;\n  --r-violet-soft: rgba(166,139,250,.12);\n  --r-amber:       #f0c24b;\n  --r-amber-soft:  rgba(240,194,75,.12);\n  --r-green:       #4ade80;\n  --r-green-soft:  rgba(74,222,128,.12);\n  --r-warn:        #fb7185;\n  --r-warn-soft:   rgba(251,113,133,.10);\n\n  \/* ---- Type ---- *\/\n  --r-display: 'Sora', 'Inter', system-ui, sans-serif;\n  --r-sans:    'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;\n  --r-mono:    'JetBrains Mono', ui-monospace, 'SFMono-Regular', Menlo, monospace;\n\n  \/* ---- Shape ---- *\/\n  --r-r-sm: 8px;\n  --r-r-md: 14px;\n  --r-r-lg: 20px;\n  --r-shadow: 0 1px 2px rgba(0,0,0,.4), 0 12px 32px -12px rgba(0,0,0,.7);\n\n  margin: 0 !important;\n  padding: 0 !important;\n  position: relative;\n  z-index: 1;\n  background: var(--r-bg);\n  color: var(--r-body);\n  font-family: var(--r-sans);\n  font-size: 16px;\n  line-height: 1.75;\n  letter-spacing: -0.005em;\n  overflow-x: hidden;\n  \/* Never split a word across lines. Long paths and commands live in\n     <pre>, which gets its own horizontal scroll instead. *\/\n  word-break: normal;\n  overflow-wrap: normal;\n  hyphens: none;\n  text-wrap: pretty;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.setup-page, .setup-page * { box-sizing: border-box; min-width: 0; }\n\n\/* Element resets wrapped in :where() so they carry ZERO element specificity \u2014\n   otherwise `.setup-page p` (0,1,1) would beat every component rule (0,1,0)\n   and silently kill its margins and colors. *\/\n.setup-page :where(img) { max-width: 100%; height: auto; display: block; }\n.setup-page :where(a) { text-decoration: none; color: inherit; }\n.setup-page :where(ul, ol, li) { margin: 0; padding: 0; list-style: none; }\n.setup-page :where(p) { margin: 0 0 1.1em; }\n.setup-page :where(h1, h2, h3, h4, h5) { margin: 0; font-family: var(--r-display); color: var(--r-text); letter-spacing: -0.025em; line-height: 1.25; font-weight: 600; }\n.setup-page :where(strong) { color: var(--r-text); font-weight: 600; }\n.setup-page :where(blockquote) { margin: 0; }\n\n.setup-page a:focus-visible,\n.setup-page button:focus-visible,\n.setup-page summary:focus-visible {\n  outline: 2px solid var(--r-cyan); outline-offset: 3px; border-radius: 4px;\n}\n\n\/* ---------- Icons ---------- *\/\n.setup-page .icon { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }\n.setup-page .icon svg { width: 100%; height: 100%; display: block; }\n.icon-sm { width: 16px; height: 16px; }\n.icon-md { width: 20px; height: 20px; }\n.icon-lg { width: 24px; height: 24px; }\n.icon-cyan   svg { color: var(--r-cyan); }\n.icon-violet svg { color: var(--r-violet); }\n.icon-amber  svg { color: var(--r-amber); }\n.icon-green  svg { color: var(--r-green); }\n.icon-warn   svg { color: var(--r-warn); }\n.icon-muted  svg { color: var(--r-muted); }\n\n\/* =========================================================\n   PAGE HEADER\n   ========================================================= *\/\n.setup-hero {\n  position: relative; overflow: hidden;\n  border-bottom: 1px solid var(--r-line);\n  background:\n    radial-gradient(760px 400px at 20% -20%, rgba(53,214,238,.10), transparent 62%),\n    radial-gradient(620px 360px at 85% 0%, rgba(166,139,250,.09), transparent 64%),\n    var(--r-bg);\n}\n.setup-hero::before {\n  content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 0;\n  background-image:\n    linear-gradient(rgba(255,255,255,.022) 1px, transparent 1px),\n    linear-gradient(90deg, rgba(255,255,255,.022) 1px, transparent 1px);\n  background-size: 64px 64px;\n  mask-image: radial-gradient(ellipse 85% 80% at 35% 15%, #000 30%, transparent 76%);\n  -webkit-mask-image: radial-gradient(ellipse 85% 80% at 35% 15%, #000 30%, transparent 76%);\n}\n.setup-hero__inner { position: relative; z-index: 1; max-width: 1240px; margin: 0 auto; padding: 34px 28px 58px; }\n\n.rw-backlink {\n  display: inline-flex; align-items: center; gap: 8px; margin-bottom: 34px;\n  padding: 8px 14px; border-radius: 999px;\n  border: 1px solid var(--r-line-2); background: rgba(255,255,255,.03);\n  font-size: .8125rem; font-weight: 600; color: var(--r-body);\n  transition: border-color .18s ease, color .18s ease, background .18s ease;\n}\n.rw-backlink .icon { transition: transform .18s ease; }\n.rw-backlink:hover { color: var(--r-cyan); border-color: rgba(53,214,238,.35); background: var(--r-cyan-soft); }\n.rw-backlink:hover .icon { transform: translateX(-3px); }\n\n.rw-kicker {\n  display: flex; align-items: baseline; gap: 10px;\n  font-family: var(--r-mono); font-size: .7rem; font-weight: 500;\n  letter-spacing: .16em; text-transform: uppercase; line-height: 1.6;\n  color: var(--r-cyan); margin-bottom: 18px;\n}\n.rw-kicker::before { content: ''; flex: none; width: 22px; height: 1px; background: currentColor; opacity: .5; transform: translateY(-4px); }\n\n.setup-hero h1 {\n  font-size: clamp(2.1rem, 4.6vw, 3rem);\n  font-weight: 700; letter-spacing: -0.038em; line-height: 1.08;\n  margin: 0 0 16px; text-wrap: balance;\n}\n.setup-hero__sub { font-size: 1.0625rem; color: var(--r-body); max-width: 62ch; margin: 0 0 24px; }\n.setup-hero__chips { display: flex; flex-wrap: wrap; gap: 9px; }\n.rw-chip {\n  display: inline-flex; align-items: center; gap: 8px;\n  padding: 6px 13px; border-radius: 999px;\n  border: 1px solid var(--r-line-2); background: rgba(255,255,255,.03);\n  font-family: var(--r-mono); font-size: .68rem; font-weight: 500;\n  letter-spacing: .06em; text-transform: uppercase; color: var(--r-body); white-space: nowrap;\n}\n.rw-chip--cyan  { color: var(--r-cyan);  border-color: rgba(53,214,238,.28); background: var(--r-cyan-soft); }\n.rw-chip--green { color: var(--r-green); border-color: rgba(74,222,128,.28); background: var(--r-green-soft); }\n\n\/* =========================================================\n   LAYOUT\n   ========================================================= *\/\n.setup-container { max-width: 1240px; margin: 0 auto; padding: 0 28px; }\n.setup-layout { display: grid; grid-template-columns: 264px minmax(0,1fr); gap: 48px; align-items: start; padding: 48px 0 72px; }\n\n\/* ---------- Sidebar ---------- *\/\n.setup-sidebar { position: sticky; top: 24px; }\n.sidebar-shell {\n  border: 1px solid var(--r-line); border-radius: var(--r-r-lg);\n  background: var(--r-surface); overflow: hidden;\n}\n.sidebar-summary {\n  display: none; \/* desktop: the nav is always open, so no control is needed *\/\n  cursor: pointer; list-style: none;\n  align-items: center; justify-content: space-between; gap: 12px;\n  padding: 16px 18px;\n  font-family: var(--r-display); font-size: .9375rem; font-weight: 600;\n  letter-spacing: -0.02em; color: var(--r-text);\n}\n.sidebar-summary::-webkit-details-marker { display: none; }\n.sidebar-summary .chev { transition: transform .22s ease; color: var(--r-muted); }\n.sidebar-shell[open] .sidebar-summary .chev { transform: rotate(90deg); }\n.sidebar-body { padding: 18px; max-height: calc(100vh - 96px); overflow-y: auto; }\n\n.sidebar-category {\n  font-family: var(--r-mono); font-size: .64rem; font-weight: 600;\n  letter-spacing: .16em; text-transform: uppercase; color: var(--r-muted);\n  margin: 22px 0 8px; padding: 0 10px;\n}\n.sidebar-category:first-child { margin-top: 0; }\n\n.sidebar-nav { display: grid; gap: 1px; }\n.sidebar-nav a {\n  display: grid; grid-template-columns: 2px 1fr; gap: 12px; align-items: center;\n  padding: 9px 10px; border-radius: var(--r-r-sm);\n  font-size: .9rem; color: var(--r-body);\n  transition: background .18s ease, color .18s ease;\n}\n.sidebar-nav a::before {\n  content: ''; align-self: stretch; border-radius: 2px;\n  background: transparent; transition: background .18s ease;\n}\n.sidebar-nav a:hover { background: rgba(255,255,255,.04); color: var(--r-text); }\n.sidebar-nav a.active { background: var(--r-cyan-soft); color: var(--r-cyan); font-weight: 600; }\n.sidebar-nav a.active::before { background: var(--r-cyan); }\n\n\/* ---------- Content ---------- *\/\n.setup-content { min-width: 0; display: grid; gap: 24px; }\n\n.content-section {\n  position: relative; overflow: hidden;\n  border: 1px solid var(--r-line); border-radius: var(--r-r-lg);\n  background: var(--r-surface); padding: 34px 36px 36px;\n  scroll-margin-top: 24px;\n}\n.content-section::before {\n  content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none;\n  background: radial-gradient(620px 240px at 6% 0%, var(--sec-tint, rgba(53,214,238,.07)), transparent 62%);\n}\n.content-section > * { position: relative; z-index: 1; }\n.content-section--cyan   { --sec-tint: rgba(53,214,238,.07);  --sec-accent: var(--r-cyan); }\n.content-section--violet { --sec-tint: rgba(166,139,250,.07); --sec-accent: var(--r-violet); }\n.content-section--amber  { --sec-tint: rgba(240,194,75,.06);  --sec-accent: var(--r-amber); }\n.content-section--green  { --sec-tint: rgba(74,222,128,.06);  --sec-accent: var(--r-green); }\n\n.content-section h2 {\n  display: flex; align-items: center; gap: 13px;\n  font-size: clamp(1.35rem, 2.6vw, 1.7rem); letter-spacing: -0.03em;\n  margin: 0 0 20px; padding-bottom: 20px; border-bottom: 1px solid var(--r-line);\n}\n.sec-icon {\n  width: 38px; height: 38px; border-radius: 10px; flex-shrink: 0;\n  display: grid; place-items: center;\n  border: 1px solid var(--r-line-2); background: rgba(255,255,255,.04);\n}\n.content-section--cyan   .sec-icon { background: var(--r-cyan-soft);   border-color: rgba(53,214,238,.28); }\n.content-section--violet .sec-icon { background: var(--r-violet-soft); border-color: rgba(166,139,250,.28); }\n.content-section--amber  .sec-icon { background: var(--r-amber-soft);  border-color: rgba(240,194,75,.28); }\n.content-section--green  .sec-icon { background: var(--r-green-soft);  border-color: rgba(74,222,128,.28); }\n\n.content-section h3 {\n  display: flex; align-items: center; gap: 10px;\n  font-size: 1.15rem; letter-spacing: -0.025em;\n  margin: 34px 0 14px; padding-top: 28px; border-top: 1px solid var(--r-line);\n  color: var(--r-text);\n}\n.content-section h3:first-of-type { }\n.content-section h4 {\n  display: flex; align-items: center; gap: 10px;\n  font-size: 1rem; letter-spacing: -0.02em; margin: 28px 0 12px;\n}\n.content-section h5 { font-size: .9375rem; letter-spacing: -0.02em; margin: 0 0 6px; }\n\n.content-section p, .content-section li { color: var(--r-body); font-size: .96rem; line-height: 1.78; }\n.content-section p { max-width: 74ch; }\n.content-section p:last-child { margin-bottom: 0; }\n.content-section a:not(.api-link-btn) { color: var(--r-cyan); border-bottom: 1px solid rgba(53,214,238,.3); }\n.content-section a:not(.api-link-btn):hover { border-bottom-color: var(--r-cyan); }\n.content-section hr { border: none; border-top: 1px solid var(--r-line); margin: 32px 0; }\n\n\/* Ordered steps get real numbers; unordered get a marker. *\/\n.content-section ol {\n  counter-reset: rwstep; display: grid; gap: 12px; margin: 0 0 20px; max-width: 74ch;\n}\n.content-section ol > li {\n  counter-increment: rwstep;\n  display: grid; grid-template-columns: 26px 1fr; gap: 14px; align-items: start;\n}\n.content-section ol > li::before {\n  content: counter(rwstep);\n  font-family: var(--r-mono); font-size: .72rem; font-weight: 600;\n  color: var(--sec-accent, var(--r-cyan));\n  border: 1px solid var(--r-line-2); border-radius: 7px;\n  width: 26px; height: 26px; display: grid; place-items: center;\n  background: rgba(255,255,255,.03); margin-top: 3px;\n}\n.content-section ul:not(.sidebar-nav):not(.nested-rules) {\n  display: grid; gap: 10px; margin: 0 0 20px; max-width: 74ch;\n}\n.content-section ul:not(.sidebar-nav):not(.nested-rules) > li {\n  display: grid; grid-template-columns: auto 1fr; gap: 12px; align-items: start;\n}\n.content-section ul:not(.sidebar-nav):not(.nested-rules) > li::before {\n  content: '\u25b8'; font-size: .7rem; padding-top: 5px; color: var(--sec-accent, var(--r-cyan));\n}\n.content-section ol ul, .content-section ul ul { margin-top: 12px; }\n.content-section li > p { margin: 0 0 .6em; max-width: none; }\n.content-section li > p:last-child { margin-bottom: 0; }\n\n\/* ---------- Code ---------- *\/\n.setup-page code {\n  font-family: var(--r-mono); font-size: .84em;\n  padding: 2px 7px; border-radius: 6px;\n  background: rgba(53,214,238,.09); border: 1px solid rgba(53,214,238,.16);\n  color: var(--r-cyan);\n  \/* A long path inside a sentence has to be allowed to wrap or it pushes the\n     whole card wide on a phone. Prose still never breaks mid-word \u2014 this\n     applies only to code spans. *\/\n  white-space: normal; overflow-wrap: anywhere;\n}\n.setup-page kbd {\n  font-family: var(--r-mono); font-size: .78em; font-weight: 600; white-space: nowrap;\n  padding: 3px 8px; border-radius: 6px;\n  background: var(--r-surface-2); border: 1px solid var(--r-line-2);\n  border-bottom-width: 2px; color: var(--r-text);\n}\n.rw-code {\n  position: relative; margin: 14px 0 18px;\n  border: 1px solid var(--r-line); border-radius: var(--r-r-md);\n  background: #06070a; overflow: hidden;\n}\n.rw-code__bar {\n  display: flex; align-items: center; justify-content: space-between; gap: 12px;\n  padding: 9px 12px 9px 14px; border-bottom: 1px solid var(--r-line);\n  background: rgba(255,255,255,.02);\n}\n.rw-code__label {\n  font-family: var(--r-mono); font-size: .64rem; letter-spacing: .12em;\n  text-transform: uppercase; color: var(--r-muted);\n}\n.rw-copy {\n  display: inline-flex; align-items: center; gap: 7px;\n  padding: 5px 11px; border-radius: 6px; cursor: pointer;\n  border: 1px solid var(--r-line-2); background: rgba(255,255,255,.03);\n  font-family: var(--r-mono); font-size: .64rem; font-weight: 500;\n  letter-spacing: .1em; text-transform: uppercase; color: var(--r-body);\n  transition: border-color .18s ease, color .18s ease, background .18s ease;\n}\n.rw-copy:hover { color: var(--r-cyan); border-color: rgba(53,214,238,.35); background: var(--r-cyan-soft); }\n.rw-copy.is-done { color: var(--r-green); border-color: rgba(74,222,128,.35); background: var(--r-green-soft); }\n.rw-code pre {\n  margin: 0; padding: 14px 16px; overflow-x: auto;\n  font-family: var(--r-mono); font-size: .84rem; line-height: 1.7; color: #cfe9ee;\n}\n.rw-code pre code {\n  background: none; border: none; padding: 0; color: inherit; font-size: 1em; white-space: pre;\n}\n\n\/* ---------- Callouts ---------- *\/\n.disclaimer-box, .tip-box, .beta-box {\n  display: grid; grid-template-columns: auto 1fr; gap: 14px; align-items: start;\n  padding: 17px 19px; margin: 24px 0; border-radius: var(--r-r-md);\n  font-size: .9rem; line-height: 1.7; max-width: 74ch;\n}\n.disclaimer-box p, .tip-box p, .beta-box p { margin: 0; font-size: inherit; max-width: none; }\n.disclaimer-box .icon, .tip-box .icon, .beta-box .icon { margin-top: 2px; }\n\n.disclaimer-box { border: 1px solid rgba(251,113,133,.28); border-left: 2px solid var(--r-warn); background: var(--r-warn-soft); }\n.disclaimer-box strong { color: var(--r-warn); }\n.tip-box { border: 1px solid rgba(53,214,238,.22); border-left: 2px solid var(--r-cyan); background: var(--r-cyan-soft); }\n.tip-box strong { color: var(--r-cyan); }\n.beta-box { border: 1px solid rgba(74,222,128,.26); border-left: 2px solid var(--r-green); background: var(--r-green-soft); }\n.beta-box strong { color: var(--r-green); }\n.warn-amber { border: 1px solid rgba(240,194,75,.28); border-left: 2px solid var(--r-amber); background: var(--r-amber-soft); }\n.warn-amber strong { color: var(--r-amber); }\n\n\/* ---------- API callout ---------- *\/\n.api-info-box {\n  padding: 26px 28px; margin: 22px 0 0; border-radius: var(--r-r-lg);\n  border: 1px solid var(--r-line); background: var(--r-bg-2);\n}\n.api-info-box h4 { margin-top: 0; }\n.api-link-btn {\n  display: inline-flex; align-items: center; gap: 9px; margin-top: 6px;\n  padding: 12px 20px; border-radius: var(--r-r-sm);\n  background: var(--r-violet); color: #14092b;\n  font-size: .9rem; font-weight: 600; letter-spacing: -0.01em;\n  transition: background .18s ease, transform .18s ease;\n}\n.api-link-btn span { transition: transform .18s ease; }\n.api-link-btn:hover { background: #bda6ff; transform: translateY(-1px); }\n.api-link-btn:hover span { transform: translateX(3px); }\n\n\/* ---------- Step cards ---------- *\/\n.step-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(238px, 1fr)); gap: 14px; margin: 20px 0 24px; }\n.step-card {\n  padding: 20px 20px 22px; border-radius: var(--r-r-md);\n  border: 1px solid var(--r-line); background: var(--r-bg-2);\n  transition: border-color .2s ease, background .2s ease, transform .2s ease;\n}\n.step-card:hover { border-color: var(--r-line-2); background: var(--r-surface-2); transform: translateY(-2px); }\n.step-card--green:hover { border-color: rgba(74,222,128,.35); }\n.step-card--cyan:hover { border-color: rgba(53,214,238,.35); }\n.step-num {\n  display: inline-grid; place-items: center; width: 26px; height: 26px; margin-bottom: 12px;\n  border-radius: 7px; font-family: var(--r-mono); font-size: .72rem; font-weight: 600;\n  border: 1px solid var(--r-line-2); background: rgba(255,255,255,.03); color: var(--r-body);\n}\n.step-card--green .step-num { color: var(--r-green); border-color: rgba(74,222,128,.32); background: var(--r-green-soft); }\n.step-card--cyan .step-num { color: var(--r-cyan); border-color: rgba(53,214,238,.32); background: var(--r-cyan-soft); }\n.step-card p { margin: 0; font-size: .875rem; line-height: 1.7; color: var(--r-body); max-width: none; }\n.step-card p + .rw-code { margin-bottom: 0; }\n\n\/* ---------- RetroAchievements badges ---------- *\/\n.badge-hardcore, .badge-softcore {\n  display: inline-flex; align-items: center; gap: 7px;\n  padding: 4px 10px; border-radius: 999px;\n  font-family: var(--r-mono); font-size: .66rem; font-weight: 600;\n  letter-spacing: .12em; text-transform: uppercase; white-space: nowrap;\n}\n.badge-hardcore { color: var(--r-warn); border: 1px solid rgba(251,113,133,.35); background: var(--r-warn-soft); }\n.badge-softcore { color: var(--r-amber); border: 1px solid rgba(240,194,75,.32); background: var(--r-amber-soft); }\n\n.mode-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 30px 0 14px; }\n.mode-head .mode-note { font-family: var(--r-mono); font-size: .66rem; letter-spacing: .1em; text-transform: uppercase; color: var(--r-muted); }\n\n\/* The blocked-feature list is the one place a nested list is meaningful:\n   these are the specific things Hardcore turns off. *\/\n.nested-rules {\n  display: grid; gap: 8px; margin: 14px 0 4px; padding: 16px 18px;\n  border: 1px solid rgba(251,113,133,.22); border-left: 2px solid var(--r-warn);\n  border-radius: var(--r-r-md); background: var(--r-warn-soft);\n}\n.nested-rules li {\n  display: grid; grid-template-columns: auto 1fr; gap: 11px; align-items: start;\n  font-size: .875rem; line-height: 1.65; color: #f4c3c9;\n}\n.nested-rules li::before { content: '\u00d7'; font-family: var(--r-mono); font-size: .8rem; padding-top: 2px; color: var(--r-warn); }\n\n\/* =========================================================\n   RESPONSIVE\n   ========================================================= *\/\n@media (max-width: 980px) {\n  .setup-layout { grid-template-columns: 1fr; gap: 24px; padding-top: 32px; }\n  \/* The nav becomes a collapsible panel that sticks under the top of the\n     viewport, so it stays reachable without eating the screen. *\/\n  .setup-sidebar { position: sticky; top: 0; z-index: 20; }\n  .sidebar-shell { background: rgba(11,13,17,.92); backdrop-filter: blur(12px); border-color: var(--r-line-2); }\n  .sidebar-summary { display: flex; }\n  .sidebar-body { display: none; padding: 4px 14px 16px; max-height: 58vh; }\n  .sidebar-shell[open] .sidebar-body { display: block; }\n  .sidebar-category { margin-top: 16px; }\n}\n@media (max-width: 620px) {\n  .setup-hero__inner { padding: 26px 20px 46px; }\n  .setup-container { padding: 0 20px; }\n  .content-section { padding: 26px 22px 28px; }\n  .content-section h2 { flex-direction: column; align-items: flex-start; gap: 12px; }\n  .content-section h3, .content-section h4 { align-items: flex-start; }\n  .disclaimer-box, .tip-box, .beta-box, .nested-rules li { grid-template-columns: 1fr; gap: 9px; }\n  .disclaimer-box .icon, .tip-box .icon, .beta-box .icon { margin-top: 0; }\n  .nested-rules li::before { display: none; }\n  .step-grid { grid-template-columns: 1fr; }\n  .api-info-box { padding: 22px 20px; }\n  .rw-kicker { font-size: .65rem; letter-spacing: .12em; }\n  .rw-code__bar { padding: 8px 10px 8px 12px; }\n  .rw-code__label { display: none; }\n  .rw-copy { margin-left: auto; }\n}\n@media (prefers-reduced-motion: reduce) {\n  .setup-page *, .setup-page *::before, .setup-page *::after {\n    animation-duration: .001ms !important; animation-iteration-count: 1 !important;\n    transition-duration: .001ms !important;\n  }\n}\n<\/style>\n\n<div class=\"setup-page\">\n\n  <!-- ==================== SVG ICON SPRITE ==================== -->\n  <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"display:none;\" aria-hidden=\"true\" focusable=\"false\">\n    <defs>\n      <symbol id=\"icon-windows\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 5.5L10.5 4.3V11.4H3V5.5ZM3 18.5V12.6H10.5V19.7L3 18.5ZM11.5 4.1L21 2.5V11.4H11.5V4.1ZM11.5 12.6H21V21.5L11.5 19.9V12.6Z\"><\/path><\/symbol>\n      <symbol id=\"icon-apple\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M18.71 19.5C17.88 20.74 17 21.95 15.66 21.97C14.32 22 13.89 21.18 12.37 21.18C10.84 21.18 10.37 21.95 9.1 22C7.79 22.05 6.8 20.68 5.96 19.47C4.25 17 2.94 12.45 4.7 9.39C5.57 7.87 7.13 6.91 8.82 6.88C10.1 6.86 11.32 7.75 12.11 7.75C12.89 7.75 14.37 6.68 15.92 6.84C16.57 6.87 18.39 7.1 19.56 8.82C19.47 8.88 17.39 10.1 17.41 12.63C17.44 15.65 20.06 16.66 20.09 16.67C20.06 16.74 19.67 18.11 18.71 19.5ZM13 3.5C13.73 2.67 14.94 2.04 15.94 2C16.07 3.17 15.6 4.35 14.9 5.19C14.21 6.04 13.07 6.7 11.95 6.61C11.8 5.46 12.36 4.26 13 3.5Z\"><\/path><\/symbol>\n      <symbol id=\"icon-linux\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12.5 2C10.29 2 8.5 3.79 8.5 6C8.5 6.68 8.66 7.32 8.94 7.89L8.5 9L6.5 9C5.67 9 5 9.67 5 10.5C5 11.33 5.67 12 6.5 12H7.34L6.11 14.46C5.42 15.84 5 17.37 5 19C5 20.1 5.9 21 7 21H17C18.1 21 19 20.1 19 19C19 17.37 18.58 15.84 17.89 14.46L16.66 12H17.5C18.33 12 19 11.33 19 10.5C19 9.67 18.33 9 17.5 9H15.5L15.06 7.89C15.34 7.32 15.5 6.68 15.5 6C15.5 3.79 13.71 2 12.5 2ZM10.5 6C10.5 5.45 10.95 5 11.5 5C12.05 5 12.5 5.45 12.5 6C12.5 6.55 12.05 7 11.5 7C10.95 7 10.5 6.55 10.5 6ZM13.5 6C13.5 5.45 13.95 5 14.5 5C15.05 5 15.5 5.45 15.5 6C15.5 6.55 15.05 7 14.5 7C13.95 7 13.5 6.55 13.5 6ZM10 16C9.45 16 9 15.55 9 15C9 14.45 9.45 14 10 14C10.55 14 11 14.45 11 15C11 15.55 10.55 16 10 16ZM14 16C13.45 16 13 15.55 13 15C13 14.45 13.45 14 14 14C14.55 14 15 14.45 15 15C15 15.55 14.55 16 14 16Z\"><\/path><\/symbol>\n      <symbol id=\"icon-xbox\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2a10 10 0 1 0 10 10A10 10 0 0 0 12 2Zm-1.8 14.8c-2.4-.6-4.4-2.5-5.3-4.9.4.2.9.4 1.4.4 1.7 0 3.2-1 3.8-2.4l1.7 2.5c1 1.4 1.4 2.8 1.4 4.2 0 .1-.2.2-.6.3l-.4-.1Zm7.5-4.4c-1.1 2.6-3.4 4.6-6.2 5.1v-.4c0-1.5.5-3 1.5-4.3l1.9-2.8c.7-1.5 2.3-2.4 4.1-2.4.4 0 .8 0 1.2-.2a8.2 8.2 0 0 1-2.5 4.3v.7Zm-6.8-8.1c2.3.8 4.1 2.7 4.8 5.1a5 5 0 0 0-3.5-1.3 5.3 5.3 0 0 0-4.1 2L7 8.5c-.6-.9-1.6-1.6-2.7-1.9a8.4 8.4 0 0 1 6.5-5.4l.4.1Z\"><\/path><\/symbol>\n      <symbol id=\"icon-book\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\"><\/path><path d=\"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z\"><\/path><line x1=\"8\" y1=\"7\" x2=\"16\" y2=\"7\"><\/line><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"><\/line><\/symbol>\n      <symbol id=\"icon-arrow-left\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"><\/line><polyline points=\"12 19 5 12 12 5\"><\/polyline><\/symbol>\n      <symbol id=\"icon-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"><\/polyline><\/symbol>\n      <symbol id=\"icon-key\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\"><\/path><\/symbol>\n      <symbol id=\"icon-warning\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"><\/path><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"><\/line><circle cx=\"12\" cy=\"17\" r=\"1\" fill=\"currentColor\"><\/circle><\/symbol>\n      <symbol id=\"icon-settings\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"><\/circle><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"><\/path><\/symbol>\n      <symbol id=\"icon-package\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7.5 4.27 9 5.15\"><\/path><path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"><\/path><path d=\"m3.3 7 8.7 5 8.7-5\"><\/path><path d=\"M12 22V12\"><\/path><\/symbol>\n      <symbol id=\"icon-folder\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"><\/path><\/symbol>\n      <symbol id=\"icon-scan\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12a9 9 0 1 1-2.64-6.36\"><\/path><polyline points=\"21 3 21 9 15 9\"><\/polyline><\/symbol>\n      <symbol id=\"icon-target\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle><circle cx=\"12\" cy=\"12\" r=\"5\"><\/circle><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"><\/circle><\/symbol>\n      <symbol id=\"icon-bulb\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18h6\"><\/path><path d=\"M10 22h4\"><\/path><path d=\"M15.09 14c.18-.98.65-1.74 1.41-2.5A4.65 4.65 0 0 0 18 8 6 6 0 0 0 6 8c0 1 .23 2.23 1.5 3.5A4.61 4.61 0 0 1 8.91 14\"><\/path><\/symbol>\n      <symbol id=\"icon-trophy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9H4.5a2.5 2.5 0 0 1 0-5H6\"><\/path><path d=\"M18 9h1.5a2.5 2.5 0 0 0 0-5H18\"><\/path><path d=\"M4 22h16\"><\/path><path d=\"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22\"><\/path><path d=\"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22\"><\/path><path d=\"M18 2H6v7a6 6 0 0 0 12 0V2Z\"><\/path><\/symbol>\n      <symbol id=\"icon-shield\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1Z\"><\/path><\/symbol>\n      <symbol id=\"icon-layout\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"><\/rect><path d=\"M9 3v18\"><\/path><path d=\"M15 3v18\"><\/path><\/symbol>\n      <symbol id=\"icon-offline\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 8.5a16 16 0 0 1 20 0\"><\/path><path d=\"M5 12.5a11 11 0 0 1 14 0\"><\/path><path d=\"M8.5 16.4a6 6 0 0 1 7 0\"><\/path><circle cx=\"12\" cy=\"20\" r=\"1\" fill=\"currentColor\"><\/circle><\/symbol>\n      <symbol id=\"icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"12\" height=\"12\" rx=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/symbol>\n      <symbol id=\"icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/symbol>\n      <symbol id=\"icon-disc\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle><circle cx=\"12\" cy=\"12\" r=\"3\"><\/circle><\/symbol>\n    <\/defs>\n  <\/svg>\n\n  <!-- ==================== HEADER ==================== -->\n  <header class=\"setup-hero\">\n    <div class=\"setup-hero__inner\">\n      <a href=\"https:\/\/rec0m88.com\/download-rec0m88\" class=\"rw-backlink\">\n        <span class=\"icon icon-sm\"><svg><use href=\"#icon-arrow-left\"><\/use><\/svg><\/span>\n        Back to downloads\n      <\/a>\n\n      <div class=\"rw-kicker\">Rec0m88 Documentation<\/div>\n      <h1>Setup &amp; instructions<\/h1>\n      <p class=\"setup-hero__sub\">\n        Everything needed to get Rec0m88 installed and configured \u2014 per platform, plus BIOS files,\n        Dolphin system files, API keys, cheats, and the full RetroAchievements integration.\n      <\/p>\n      <div class=\"setup-hero__chips\">\n        <span class=\"rw-chip rw-chip--cyan\">Windows \u00b7 macOS \u00b7 Linux<\/span>\n        <span class=\"rw-chip rw-chip--green\">Xbox Series X|S<\/span>\n        <span class=\"rw-chip\">12 sections<\/span>\n      <\/div>\n    <\/div>\n  <\/header>\n\n  <div class=\"setup-container\">\n    <div class=\"setup-layout\">\n\n      <!-- ==================== SIDEBAR ==================== -->\n      <aside class=\"setup-sidebar\">\n        <details class=\"sidebar-shell\" open>\n          <summary class=\"sidebar-summary\">\n            Contents\n            <span class=\"icon icon-md chev\"><svg><use href=\"#icon-chevron\"><\/use><\/svg><\/span>\n          <\/summary>\n          <div class=\"sidebar-body\">\n            <nav aria-label=\"Setup sections\">\n              <div class=\"sidebar-category\">Installation<\/div>\n              <ul class=\"sidebar-nav\">\n                <li><a href=\"#install-windows\" class=\"nav-link\">Windows setup<\/a><\/li>\n                <li><a href=\"#install-macos\" class=\"nav-link\">macOS setup<\/a><\/li>\n                <li><a href=\"#install-linux\" class=\"nav-link\">Linux setup<\/a><\/li>\n                <li><a href=\"#install-xbox\" class=\"nav-link\">Xbox Series X|S setup<\/a><\/li>\n              <\/ul>\n\n              <div class=\"sidebar-category\">Configuration<\/div>\n              <ul class=\"sidebar-nav\">\n                <li><a href=\"#config-bios\" class=\"nav-link\">Setting BIOS files<\/a><\/li>\n                <li><a href=\"#install-gamecube-wii\" class=\"nav-link\">GameCube &amp; Wii files<\/a><\/li>\n                <li><a href=\"#config-api\" class=\"nav-link\">API keys (cover art)<\/a><\/li>\n                <li><a href=\"#config-cheats\" class=\"nav-link\">Cheat files<\/a><\/li>\n              <\/ul>\n\n              <div class=\"sidebar-category\">RetroAchievements<\/div>\n              <ul class=\"sidebar-nav\">\n                <li><a href=\"#ra-login\" class=\"nav-link\">Logging in<\/a><\/li>\n                <li><a href=\"#ra-hardcore\" class=\"nav-link\">Hardcore vs Softcore<\/a><\/li>\n                <li><a href=\"#ra-ui\" class=\"nav-link\">In-game UI &amp; overlay<\/a><\/li>\n                <li><a href=\"#ra-offline\" class=\"nav-link\">Offline queues<\/a><\/li>\n              <\/ul>\n            <\/nav>\n          <\/div>\n        <\/details>\n      <\/aside>\n\n      <!-- ==================== CONTENT ==================== -->\n      <main class=\"setup-content\">\n\n        <!-- ---------- Windows ---------- -->\n        <section class=\"content-section content-section--cyan\" id=\"install-windows\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-cyan\"><svg><use href=\"#icon-windows\"><\/use><\/svg><\/span><\/span>Windows setup<\/h2>\n          <ol>\n            <li><span>Download the <code>Rec0m88-Setup.exe<\/code> file from the downloads page.<\/span><\/li>\n            <li><span>Double-click the <code>.exe<\/code> file to run the installer.<\/span><\/li>\n            <li><span>Follow the on-screen prompts. If Windows Defender warns you, click <strong>More info<\/strong> \u2192 <strong>Run anyway<\/strong>.<\/span><\/li>\n            <li><span>Open Rec0m88 from your desktop or Start menu.<\/span><\/li>\n          <\/ol>\n        <\/section>\n\n        <!-- ---------- macOS ---------- -->\n        <section class=\"content-section content-section--cyan\" id=\"install-macos\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-cyan\"><svg><use href=\"#icon-apple\"><\/use><\/svg><\/span><\/span>macOS setup<\/h2>\n          <ol>\n            <li><span>Download the <code>.dmg<\/code> file (Intel or Apple Silicon).<\/span><\/li>\n            <li><span>Open the DMG and drag the <strong>Rec0m88.app<\/strong> icon into your <code>Applications<\/code> folder.<\/span><\/li>\n            <li>\n              <div>\n                <p>Open <strong>Terminal<\/strong> (Applications \u2192 Utilities \u2192 Terminal) and run the following command to remove the quarantine flag macOS adds to apps from unidentified developers:<\/p>\n                <div class=\"rw-code\">\n                  <div class=\"rw-code__bar\">\n                    <span class=\"rw-code__label\">Terminal<\/span>\n                    <button type=\"button\" class=\"rw-copy\">\n                      <span class=\"icon icon-sm\"><svg><use href=\"#icon-copy\"><\/use><\/svg><\/span><span class=\"rw-copy__label\">Copy<\/span>\n                    <\/button>\n                  <\/div>\n                  <pre><code>xattr -cr \/Applications\/Rec0m88.app<\/code><\/pre>\n                <\/div>\n              <\/div>\n            <\/li>\n            <li><span>Launch <strong>Rec0m88<\/strong> from your Applications folder as normal.<\/span><\/li>\n          <\/ol>\n\n          <p><strong>Why this step?<\/strong> Rec0m88 is not signed with an Apple Developer certificate, so macOS will block it on first launch. The command above clears the download quarantine so the app can run. You only need to do this once per install.<\/p>\n          <p><strong>Alternative (no Terminal):<\/strong> Double-click the app, dismiss the warning dialog, then go to <strong>System Settings<\/strong> \u2192 <strong>Privacy &amp; Security<\/strong>, scroll down, and click <strong>Open Anyway<\/strong> next to the Rec0m88 message.<\/p>\n        <\/section>\n\n        <!-- ---------- Linux ---------- -->\n        <section class=\"content-section content-section--cyan\" id=\"install-linux\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-cyan\"><svg><use href=\"#icon-linux\"><\/use><\/svg><\/span><\/span>Linux setup<\/h2>\n\n          <h4><span class=\"icon icon-sm icon-cyan\"><svg><use href=\"#icon-package\"><\/use><\/svg><\/span>Recommended \u2014 Debian \/ Ubuntu (.deb)<\/h4>\n          <ol>\n            <li><span>Download the <code>.deb<\/code> package for your architecture (most users: <code>amd64<\/code>).<\/span><\/li>\n            <li>\n              <div>\n                <p>Install it by double-clicking the file, or from a terminal \u2014 update the version number as needed:<\/p>\n                <div class=\"rw-code\">\n                  <div class=\"rw-code__bar\">\n                    <span class=\"rw-code__label\">Terminal<\/span>\n                    <button type=\"button\" class=\"rw-copy\">\n                      <span class=\"icon icon-sm\"><svg><use href=\"#icon-copy\"><\/use><\/svg><\/span><span class=\"rw-copy__label\">Copy<\/span>\n                    <\/button>\n                  <\/div>\n                  <pre><code>sudo apt install .\/Rec0m88_5.0.2_amd64.deb<\/code><\/pre>\n                <\/div>\n              <\/div>\n            <\/li>\n            <li><span>Launch <strong>Rec0m88<\/strong> from your applications menu.<\/span><\/li>\n          <\/ol>\n\n          <h4><span class=\"icon icon-sm icon-cyan\"><svg><use href=\"#icon-disc\"><\/use><\/svg><\/span>Other distributions (.AppImage)<\/h4>\n          <ol>\n            <li><span>Download the <code>.AppImage<\/code> file.<\/span><\/li>\n            <li><span>Right-click the file \u2192 Properties \u2192 check <strong>Allow executing file as program<\/strong>.<\/span><\/li>\n            <li><span>Double-click to run. If the app fails to start with a sandbox error, you may need to install <code>libfuse2<\/code> and\/or launch it with the <code>--no-sandbox<\/code> flag. The <code>.deb<\/code> package above avoids both issues and is the recommended option.<\/span><\/li>\n          <\/ol>\n        <\/section>\n\n        <!-- ---------- Xbox ---------- -->\n        <section class=\"content-section content-section--green\" id=\"install-xbox\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-green\"><svg><use href=\"#icon-xbox\"><\/use><\/svg><\/span><\/span>Xbox Series X|S setup (Dev Mode)<\/h2>\n\n          <div class=\"beta-box\" role=\"note\">\n            <span class=\"icon icon-lg icon-green\"><svg><use href=\"#icon-warning\"><\/use><\/svg><\/span>\n            <p><strong>Beta notice:<\/strong> The Xbox version of Rec0m88 is in beta. The Xbox app <strong>will not auto-update<\/strong> or notify you of updates \u2014 please check back on the downloads page manually.<\/p>\n          <\/div>\n\n          <h3><span class=\"icon icon-md icon-green\"><svg><use href=\"#icon-package\"><\/use><\/svg><\/span>Step 1 \u00b7 Install the app<\/h3>\n          <ol>\n            <li><span>Download <code>Rec0m88-Xbox.zip<\/code> and <strong>extract it<\/strong> on your PC.<\/span><\/li>\n            <li><span>Boot your Xbox Series X|S into <strong>Developer Mode<\/strong>.<\/span><\/li>\n            <li><span>On your PC, open a browser and go to your Xbox's <strong>Device Portal<\/strong> IP address.<\/span><\/li>\n            <li><span>Click <strong>Add<\/strong> under \"My games &amp; apps.\"<\/span><\/li>\n            <li><span>Select <code>Rec0m88_x64.msix<\/code> (or <code>.appxbundle<\/code>) from the extracted folder.<\/span><\/li>\n            <li><span>When prompted for dependencies, upload the files from the extracted <strong>Dependencies<\/strong> folder.<\/span><\/li>\n            <li><span>Click <strong>Install<\/strong>. Launch Rec0m88 from your Xbox Dev Dashboard.<\/span><\/li>\n          <\/ol>\n\n          <h3><span class=\"icon icon-md icon-green\"><svg><use href=\"#icon-folder\"><\/use><\/svg><\/span>Step 2 \u00b7 Set up your ROM folder<\/h3>\n          <p>Put your ROMs on an external USB hard drive (formatted as NTFS or exFAT) and plug it into your Xbox.<\/p>\n          <ol>\n            <li><span>Open Rec0m88 on Xbox. Go to <strong>File \u2192 Set ROM Folder<\/strong> (or open the Library and click <strong>Set ROM Folder &amp; Scan<\/strong>).<\/span><\/li>\n            <li><span>Use the built-in file browser to navigate to your external drive and select the folder containing your ROMs.<\/span><\/li>\n            <li><span>That's it \u2014 the app remembers this folder across sessions. You only need to do this once.<\/span><\/li>\n          <\/ol>\n          <div class=\"tip-box\">\n            <span class=\"icon icon-md icon-cyan\"><svg><use href=\"#icon-bulb\"><\/use><\/svg><\/span>\n            <p><strong>Tip:<\/strong> You can organize ROMs into subfolders (e.g. <code>Games\/SNES\/<\/code>, <code>Games\/N64\/<\/code>). The scanner finds everything recursively.<\/p>\n          <\/div>\n\n          <h3><span class=\"icon icon-md icon-green\"><svg><use href=\"#icon-scan\"><\/use><\/svg><\/span>Step 3 \u00b7 Auto-scan your library<\/h3>\n          <p>No more building a JSON catalog on your PC. Rec0m88 scans your ROM folder directly on the Xbox.<\/p>\n          <ol>\n            <li><span>Go to <strong>File \u2192 Auto-Scan Library<\/strong>, or click the <strong>Scan<\/strong> button in the Library overlay.<\/span><\/li>\n            <li><span>The scanner runs <strong>in the background<\/strong> \u2014 you'll see a progress badge in the title bar.<\/span><\/li>\n            <li><span>It walks every subfolder, identifies ROMs by file extension, and detects the platform automatically.<\/span><\/li>\n            <li><span>Games appear in the Library <strong>live as they're found<\/strong>.<\/span><\/li>\n            <li><span><strong>Progress saves every 5 seconds.<\/strong> If you turn off your Xbox mid-scan, it picks up exactly where it left off next time.<\/span><\/li>\n          <\/ol>\n\n          <h3><span class=\"icon icon-md icon-green\"><svg><use href=\"#icon-key\"><\/use><\/svg><\/span>Step 4 \u00b7 Import API keys (optional)<\/h3>\n          <p>Typing API keys on a controller is painful. Instead, create a JSON file on your PC and import it.<\/p>\n          <div class=\"step-grid\">\n            <div class=\"step-card step-card--green\">\n              <div class=\"step-num\">1<\/div>\n              <h5>Create the key file<\/h5>\n              <p>On your PC, create a file called <code>rec0m88-keys.json<\/code> with this content:<\/p>\n              <div class=\"rw-code\">\n                <div class=\"rw-code__bar\">\n                  <span class=\"rw-code__label\">rec0m88-keys.json<\/span>\n                  <button type=\"button\" class=\"rw-copy\">\n                    <span class=\"icon icon-sm\"><svg><use href=\"#icon-copy\"><\/use><\/svg><\/span><span class=\"rw-copy__label\">Copy<\/span>\n                  <\/button>\n                <\/div>\n                <pre><code>{\n  \"rawg_api_key\": \"your-key\",\n  \"igdb_client_id\": \"your-id\",\n  \"igdb_client_secret\": \"your-secret\"\n}<\/code><\/pre>\n              <\/div>\n            <\/div>\n            <div class=\"step-card step-card--green\">\n              <div class=\"step-num\">2<\/div>\n              <h5>Copy to USB drive<\/h5>\n              <p>Save <code>rec0m88-keys.json<\/code> to your external HDD \u2014 anywhere the Xbox can see it.<\/p>\n            <\/div>\n            <div class=\"step-card step-card--green\">\n              <div class=\"step-num\">3<\/div>\n              <h5>Import in the app<\/h5>\n              <p>On Xbox, go to <strong>Settings \u2192 Import API Keys from File<\/strong> and select your JSON file.<\/p>\n            <\/div>\n          <\/div>\n\n          <h3><span class=\"icon icon-md icon-green\"><svg><use href=\"#icon-target\"><\/use><\/svg><\/span>Step 5 \u00b7 Auto-match games (cover art)<\/h3>\n          <p>After scanning, Auto-Match populates your library with cover art, descriptions, and metadata.<\/p>\n          <ol>\n            <li><span>Ensure you have a RAWG API key configured (see Step 4).<\/span><\/li>\n            <li><span>Open the Library and click the <strong>Match<\/strong> button \u2014 or go to <strong>File \u2192 Auto-Match All Games<\/strong>.<\/span><\/li>\n            <li><span>The matcher runs in the background. Cover art, ratings, release dates, and genres populate automatically.<\/span><\/li>\n            <li><span>For games that fail to match, click the <strong>Fix Match<\/strong> button on their card.<\/span><\/li>\n          <\/ol>\n        <\/section>\n\n        <!-- ---------- BIOS ---------- -->\n        <section class=\"content-section content-section--violet\" id=\"config-bios\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-violet\"><svg><use href=\"#icon-settings\"><\/use><\/svg><\/span><\/span>Loading content &amp; configuration<\/h2>\n\n          <p>\n            Rec0m88 automatically detects the system for any game based on its file extension\n            (e.g. <code>.sfc<\/code>, <code>.psx<\/code>). For systems that require a BIOS file, the game\n            will not launch until the correct file is configured.\n          <\/p>\n          <p>\n            <strong>.zip files are supported too.<\/strong> If you load a .zip file directly, you will be\n            prompted to choose the correct system from a list.\n          <\/p>\n\n          <h3><span class=\"icon icon-md icon-violet\"><svg><use href=\"#icon-chevron\"><\/use><\/svg><\/span>How to set a BIOS file<\/h3>\n          <ol>\n            <li><span>Navigate to <strong>Settings \u2192 BIOS<\/strong> from the top menu bar.<\/span><\/li>\n            <li><span>Hover over the system you wish to configure (e.g. PSX, Sega CD).<\/span><\/li>\n            <li><span>Click <strong>Change\u2026<\/strong> and locate the BIOS file on your device.<\/span><\/li>\n            <li><span>The menu will update from \"Not Set\" to showing your file path.<\/span><\/li>\n          <\/ol>\n\n          <blockquote class=\"disclaimer-box\">\n            <span class=\"icon icon-lg icon-warn\"><svg><use href=\"#icon-warning\"><\/use><\/svg><\/span>\n            <p><strong>Disclaimer:<\/strong> Rec0m88 does not provide BIOS files or game ROMs. Users are responsible for sourcing their own legally obtained files.<\/p>\n          <\/blockquote>\n        <\/section>\n\n        <!-- ---------- GameCube & Wii ---------- -->\n        <section class=\"content-section content-section--violet\" id=\"install-gamecube-wii\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-violet\"><svg><use href=\"#icon-disc\"><\/use><\/svg><\/span><\/span>GameCube &amp; Wii system files<\/h2>\n\n          <p>\n            GameCube and Wii games run through the <strong>Dolphin<\/strong> core, which needs a small set\n            of free system files to work \u2014 especially for Wii titles. These files are <strong>not<\/strong>\n            included with Rec0m88 and must be installed once, manually. They come from the Dolphin\n            emulator project and are free to download.\n          <\/p>\n\n          <blockquote class=\"disclaimer-box warn-amber\">\n            <span class=\"icon icon-lg icon-amber\"><svg><use href=\"#icon-warning\"><\/use><\/svg><\/span>\n            <p>\n              <strong>Seeing a \"Wii system memory\" error?<\/strong> If a Wii game shows\n              <em>\"Could not write to\/read from Wii system memory,\"<\/em> it means the system files below\n              haven't been installed yet. Follow the three steps and you're set.\n            <\/p>\n          <\/blockquote>\n\n          <h3><span class=\"icon icon-md icon-violet\"><svg><use href=\"#icon-chevron\"><\/use><\/svg><\/span>Three-step setup<\/h3>\n          <div class=\"step-grid\">\n            <div class=\"step-card step-card--cyan\">\n              <div class=\"step-num\">1<\/div>\n              <h5>Download Dolphin's <code>Sys<\/code> folder<\/h5>\n              <p>\n                Get the Dolphin emulator from <a href=\"https:\/\/dolphin-emu.org\" target=\"_blank\" rel=\"noopener\">dolphin-emu.org<\/a>.\n                The <code>Sys<\/code> folder ships with it (next to the Dolphin app on Windows; inside\n                <code>Contents\/Resources\/Sys<\/code> on macOS). You only need that <code>Sys<\/code> folder \u2014 not all of Dolphin.\n              <\/p>\n            <\/div>\n            <div class=\"step-card step-card--cyan\">\n              <div class=\"step-num\">2<\/div>\n              <h5>Open the target folder in Rec0m88<\/h5>\n              <p>\n                In Rec0m88, when a GameCube or Wii game needs the files, the setup screen has an\n                <strong>Open the folder<\/strong> button that opens the exact destination for you. Drop the\n                <code>Sys<\/code> folder inside it. (Manual paths are listed below.)\n              <\/p>\n            <\/div>\n            <div class=\"step-card step-card--cyan\">\n              <div class=\"step-num\">3<\/div>\n              <h5>Launch your game<\/h5>\n              <p>\n                Click <strong>I've installed it \u2014 retry<\/strong> on the setup screen (or just relaunch the\n                game). The error is gone, and Wii saves now persist between sessions.\n              <\/p>\n            <\/div>\n          <\/div>\n\n          <h3><span class=\"icon icon-md icon-violet\"><svg><use href=\"#icon-folder\"><\/use><\/svg><\/span>Where the files go<\/h3>\n          <p>\n            Copy the <code>Sys<\/code> folder into Rec0m88's Dolphin system directory so you end up with\n            <code>Sys\/Wii<\/code> and <code>Sys\/GC<\/code> inside it. The exact location depends on your OS:\n          <\/p>\n\n          <h4><span class=\"icon icon-sm icon-cyan\"><svg><use href=\"#icon-windows\"><\/use><\/svg><\/span>Windows<\/h4>\n          <div class=\"rw-code\">\n            <div class=\"rw-code__bar\">\n              <span class=\"rw-code__label\">Path<\/span>\n              <button type=\"button\" class=\"rw-copy\"><span class=\"icon icon-sm\"><svg><use href=\"#icon-copy\"><\/use><\/svg><\/span><span class=\"rw-copy__label\">Copy<\/span><\/button>\n            <\/div>\n            <pre><code>%APPDATA%\\Rec0m88\\rec0m88-system\\dolphin-emu\\Sys\\<\/code><\/pre>\n          <\/div>\n          <p>Paste that path (minus the trailing <code>Sys\\<\/code>) into the File Explorer address bar, then drop the <code>Sys<\/code> folder inside.<\/p>\n\n          <h4><span class=\"icon icon-sm icon-cyan\"><svg><use href=\"#icon-apple\"><\/use><\/svg><\/span>macOS<\/h4>\n          <div class=\"rw-code\">\n            <div class=\"rw-code__bar\">\n              <span class=\"rw-code__label\">Path<\/span>\n              <button type=\"button\" class=\"rw-copy\"><span class=\"icon icon-sm\"><svg><use href=\"#icon-copy\"><\/use><\/svg><\/span><span class=\"rw-copy__label\">Copy<\/span><\/button>\n            <\/div>\n            <pre><code>~\/Library\/Application Support\/Rec0m88\/rec0m88-system\/dolphin-emu\/Sys\/<\/code><\/pre>\n          <\/div>\n          <p>In Finder, press <kbd>Cmd<\/kbd> + <kbd>Shift<\/kbd> + <kbd>G<\/kbd>, paste the path, then drop the <code>Sys<\/code> folder inside.<\/p>\n\n          <h4><span class=\"icon icon-sm icon-cyan\"><svg><use href=\"#icon-linux\"><\/use><\/svg><\/span>Linux<\/h4>\n          <div class=\"rw-code\">\n            <div class=\"rw-code__bar\">\n              <span class=\"rw-code__label\">Path<\/span>\n              <button type=\"button\" class=\"rw-copy\"><span class=\"icon icon-sm\"><svg><use href=\"#icon-copy\"><\/use><\/svg><\/span><span class=\"rw-copy__label\">Copy<\/span><\/button>\n            <\/div>\n            <pre><code>~\/.config\/Rec0m88\/rec0m88-system\/dolphin-emu\/Sys\/<\/code><\/pre>\n          <\/div>\n\n          <div class=\"tip-box\">\n            <span class=\"icon icon-md icon-cyan\"><svg><use href=\"#icon-bulb\"><\/use><\/svg><\/span>\n            <p><strong>Tip:<\/strong> If your file manager asks to merge folders, choose <strong>Merge<\/strong> \u2014 the directories already exist and you're adding files into them. When done, you should see <code>Sys\/Wii<\/code>, <code>Sys\/GC<\/code>, and <code>Sys\/Resources<\/code> present.<\/p>\n          <\/div>\n\n          <h3><span class=\"icon icon-md icon-violet\"><svg><use href=\"#icon-chevron\"><\/use><\/svg><\/span>Good to know<\/h3>\n          <ul>\n            <li><span>This is a <strong>one-time<\/strong> setup. The files stay in place across Rec0m88 updates.<\/span><\/li>\n            <li><span><strong>GameCube<\/strong> games often run even without these files, but <strong>Wii<\/strong> games require them.<\/span><\/li>\n            <li><span>For an <code>.iso<\/code>, <code>.rvz<\/code>, <code>.gcz<\/code>, or <code>.wia<\/code> disc, Rec0m88 asks whether it's a GameCube or Wii game when you load it.<\/span><\/li>\n          <\/ul>\n\n          <blockquote class=\"disclaimer-box\">\n            <span class=\"icon icon-lg icon-warn\"><svg><use href=\"#icon-warning\"><\/use><\/svg><\/span>\n            <p><strong>Disclaimer:<\/strong> These system files are part of the open-source Dolphin project. Rec0m88 does not distribute copyrighted Nintendo firmware, and none is required for the Dolphin core.<\/p>\n          <\/blockquote>\n        <\/section>\n\n        <!-- ---------- API keys ---------- -->\n        <section class=\"content-section content-section--amber\" id=\"config-api\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-amber\"><svg><use href=\"#icon-key\"><\/use><\/svg><\/span><\/span>API keys (cover art)<\/h2>\n          <p>To enable automatic game cover art in the Game Library, configure your API keys.<\/p>\n\n          <div class=\"api-info-box\">\n            <h4><span class=\"icon icon-sm icon-amber\"><svg><use href=\"#icon-key\"><\/use><\/svg><\/span>Setup steps<\/h4>\n            <ol>\n              <li><span>Go to <strong>Settings \u2192 APIs \u2192 Configure API Keys\u2026<\/strong><\/span><\/li>\n              <li><span>Enter your RAWG and\/or IGDB API keys.<\/span><\/li>\n              <li><span>Click <strong>Save<\/strong>. The Library will now fetch artwork when you match games.<\/span><\/li>\n            <\/ol>\n            <a href=\"https:\/\/rec0m88.com\/game-library-organizer\/\" class=\"api-link-btn\" target=\"_blank\" rel=\"noopener\">\n              Get your free API keys guide <span>\u2192<\/span>\n            <\/a>\n          <\/div>\n        <\/section>\n\n        <!-- ---------- Cheats ---------- -->\n        <section class=\"content-section content-section--amber\" id=\"config-cheats\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-amber\"><svg><use href=\"#icon-book\"><\/use><\/svg><\/span><\/span>Adding &amp; editing cheats<\/h2>\n          <p>\n            Rec0m88 uses JSON files to store and load cheat codes. These files are saved in a persistent\n            user data folder, which means they will not be deleted, reverted, or removed when the\n            application updates.\n          <\/p>\n          <ol>\n            <li><span>From the top menu bar, navigate to <strong>Settings<\/strong>.<\/span><\/li>\n            <li><span>Click on <strong>Open Cheats Folder<\/strong>.<\/span><\/li>\n            <li><span>Your operating system's file explorer will open the directory containing the cheat JSON files (e.g. <code>psx.json<\/code>, <code>snes.json<\/code>).<\/span><\/li>\n            <li><span>You can now edit, add, or remove the JSON files as needed. Rec0m88 will automatically read the updated files on launch or when a game is loaded.<\/span><\/li>\n          <\/ol>\n        <\/section>\n\n        <!-- ---------- RA: login ---------- -->\n        <section class=\"content-section content-section--amber\" id=\"ra-login\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-amber\"><svg><use href=\"#icon-trophy\"><\/use><\/svg><\/span><\/span>RetroAchievements \u2014 logging in<\/h2>\n          <p>\n            Rec0m88 features a deep, native integration with <strong>RetroAchievements<\/strong>. Track your\n            mastery of classic games, compete on leaderboards, and view your progress right inside the\n            emulator.\n          <\/p>\n\n          <h3><span class=\"icon icon-md icon-amber\"><svg><use href=\"#icon-chevron\"><\/use><\/svg><\/span>Logging in<\/h3>\n          <p>To start earning achievements, you must link your RetroAchievements.org account:<\/p>\n          <ol>\n            <li><span>Click <strong>Settings \u2192 RetroAchievements \u2192 Login to RetroAchievements\u2026<\/strong><\/span><\/li>\n            <li><span>Enter your username and password.<\/span><\/li>\n            <li><span>Your password is used <strong>once<\/strong> to securely fetch a session token. Rec0m88 never stores your password.<\/span><\/li>\n          <\/ol>\n          <p>Once logged in, the Achievements button on your bottom toolbar will light up.<\/p>\n        <\/section>\n\n        <!-- ---------- RA: hardcore ---------- -->\n        <section class=\"content-section content-section--amber\" id=\"ra-hardcore\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-amber\"><svg><use href=\"#icon-shield\"><\/use><\/svg><\/span><\/span>Hardcore vs Softcore mode<\/h2>\n          <p>\n            RetroAchievements defines two ways to play. You can toggle your preference at any time from\n            the <strong>Settings \u2192 RetroAchievements<\/strong> menu.\n          <\/p>\n\n          <div class=\"mode-head\">\n            <span class=\"badge-hardcore\">Hardcore<\/span>\n            <span class=\"mode-note\">Recommended<\/span>\n          <\/div>\n          <ul>\n            <li>\n              <div>\n                <p><strong>Strict rules.<\/strong> To ensure a level playing field, the following emulator features are <strong>strictly disabled<\/strong> while Hardcore mode is active:<\/p>\n                <ul class=\"nested-rules\">\n                  <li><span>Loading save states (saving may be permitted depending on the core, but loading is blocked)<\/span><\/li>\n                  <li><span>Cheat codes and cheat search tools<\/span><\/li>\n                  <li><span>Rewinding and frame-stepping<\/span><\/li>\n                  <li><span>Slow-motion and fast-forward capabilities<\/span><\/li>\n                  <li><span>Debuggers and memory viewers<\/span><\/li>\n                  <li><span>Tool-assisted speedrun (TAS) tools or macro inputs<\/span><\/li>\n                <\/ul>\n              <\/div>\n            <\/li>\n            <li><span><strong>Refusals.<\/strong> Attempting to use any of the above restricted features will show a red error notification (\"Disabled in Hardcore Mode\"), or the input will simply be ignored to prevent accidental disqualification.<\/span><\/li>\n            <li><span><strong>Leaderboards.<\/strong> Speedrun times and high scores are actively tracked and automatically submitted to the RetroAchievements server.<\/span><\/li>\n            <li><span><strong>Indicator.<\/strong> A visible <code>HARDCORE<\/code> chip appears in your top \"Now Playing\" bar to prove the mode is active.<\/span><\/li>\n          <\/ul>\n\n          <div class=\"mode-head\">\n            <span class=\"badge-softcore\">Softcore<\/span>\n          <\/div>\n          <ul>\n            <li><span><strong>Casual play.<\/strong> Save states and cheats are completely allowed.<\/span><\/li>\n            <li><span><strong>Achievements.<\/strong> You still earn achievements, but they count towards a separate Softcore score on the website.<\/span><\/li>\n            <li><span><strong>Leaderboards.<\/strong> Leaderboards still track your progress on-screen for fun, but they state <em>\"SOFTCORE (not submitted)\"<\/em> and are not uploaded to the server.<\/span><\/li>\n          <\/ul>\n        <\/section>\n\n        <!-- ---------- RA: UI ---------- -->\n        <section class=\"content-section content-section--amber\" id=\"ra-ui\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-amber\"><svg><use href=\"#icon-layout\"><\/use><\/svg><\/span><\/span>In-game UI &amp; overlay<\/h2>\n\n          <h4>The full achievements panel<\/h4>\n          <p>While a game is running, press <kbd>F10<\/kbd> (or click the <strong>Achievements<\/strong> button on the toolbar) to open the full RetroAchievements overlay.<\/p>\n          <ul>\n            <li><span>View all <strong>locked<\/strong> and <strong>unlocked<\/strong> achievements for the current game.<\/span><\/li>\n            <li><span>Check the <strong>Leaderboards<\/strong> tab to view your personal best times and scores compared to active leaderboards.<\/span><\/li>\n            <li><span>Filter, sort, and search the list easily.<\/span><\/li>\n          <\/ul>\n\n          <h4>Live side panels<\/h4>\n          <p>Rec0m88 automatically opens minimal, non-intrusive side panels on wide screens:<\/p>\n          <ul>\n            <li><span><strong>Left panel (achievements).<\/strong> A grid of icons showing your earned and locked badges. Clicking a badge jumps you straight to its details in the main overlay.<\/span><\/li>\n            <li><span><strong>Right panel (leaderboards).<\/strong> A live-updating tracker. When a leaderboard challenge starts (e.g. a speedrun level), this panel tracks your live time or score, and flashes green when successfully submitted, or red if you fail or cancel the run.<\/span><\/li>\n          <\/ul>\n\n          <div class=\"tip-box\">\n            <span class=\"icon icon-md icon-cyan\"><svg><use href=\"#icon-bulb\"><\/use><\/svg><\/span>\n            <p><strong>Tip:<\/strong> You can hide these panels at any time by clicking the \u00d7 in their corners. A small tab remains on the edge of the screen to reopen them later.<\/p>\n          <\/div>\n        <\/section>\n\n        <!-- ---------- RA: offline ---------- -->\n        <section class=\"content-section content-section--amber\" id=\"ra-offline\">\n          <h2><span class=\"sec-icon\"><span class=\"icon icon-md icon-amber\"><svg><use href=\"#icon-offline\"><\/use><\/svg><\/span><\/span>Offline queues &amp; library tracking<\/h2>\n\n          <h4>Offline queue &amp; auto-sync<\/h4>\n          <p>If your internet connection drops while playing, Rec0m88 protects your hard-earned achievements:<\/p>\n          <ul>\n            <li><span>Unlocks are securely cached to your local drive.<\/span><\/li>\n            <li><span>A red badge with a number (e.g. <strong>2<\/strong>) appears on your Achievements toolbar button, indicating pending unlocks.<\/span><\/li>\n            <li><span>The app silently retries syncing these unlocks to RetroAchievements every 60 seconds in the background until successful.<\/span><\/li>\n          <\/ul>\n\n          <h4>Game library integration<\/h4>\n          <p>As you unlock achievements, your Game Library Organizer gets smarter:<\/p>\n          <ul>\n            <li><span>Games in your library display a <strong>progress strip<\/strong> at the bottom of their card.<\/span><\/li>\n            <li><span>It shows your exact unlock count (e.g. <em>15 \/ 50<\/em>), total points earned, and a percentage bar.<\/span><\/li>\n            <li><span>If you unlock everything, the card gets a gold <strong style=\"color:var(--r-amber);\">MASTERED<\/strong> badge.<\/span><\/li>\n            <li><span>You can click <strong>View<\/strong> on these cards to browse the game's achievements even when the emulator isn't running.<\/span><\/li>\n          <\/ul>\n        <\/section>\n\n      <\/main>\n    <\/div>\n\n    <!-- Bottom link back to downloads -->\n    <div style=\"padding: 0 0 72px;\">\n      <a href=\"https:\/\/rec0m88.com\/download-rec0m88\" class=\"rw-backlink\" style=\"margin-bottom:0;\">\n        <span class=\"icon icon-sm\"><svg><use href=\"#icon-arrow-left\"><\/use><\/svg><\/span>\n        Back to downloads\n      <\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n\/* =========================================================\n   REC0M88 \u2014 setup page behaviour\n     1. Sidebar scrollspy (which section am I reading?)\n     2. Smooth scrolling for sidebar links\n     3. Copy buttons on command and path blocks\n   ========================================================= *\/\n(function () {\n  const page = document.querySelector('.setup-page');\n  if (!page) return;\n\n  const init = () => {\n    const sections = Array.from(page.querySelectorAll('.content-section[id]'));\n    const navLinks = Array.from(page.querySelectorAll('.sidebar-nav a'));\n    const shell    = page.querySelector('.sidebar-shell');\n    const reduced  = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n    \/\/ --- 0. NAV DEFAULT STATE ---\n    \/\/ The markup ships with the panel open, because on desktop the summary is\n    \/\/ hidden and a closed <details> would hide the nav entirely. On narrow\n    \/\/ screens it sticks over the content, so start it collapsed instead.\n    const narrow = window.matchMedia('(max-width: 980px)');\n    const syncNav = () => {\n      if (!shell) return;\n      if (narrow.matches) shell.removeAttribute('open');\n      else shell.setAttribute('open', '');\n    };\n    syncNav();\n    if (narrow.addEventListener) narrow.addEventListener('change', syncNav);\n    else if (narrow.addListener) narrow.addListener(syncNav);\n\n    \/\/ --- 1. SCROLLSPY ---\n    \/\/ The original marked whichever section fired last, which meant scrolling\n    \/\/ up could leave a lower section highlighted. Tracking the full visible\n    \/\/ set and picking the topmost one keeps the marker honest in both\n    \/\/ directions.\n    if (sections.length && navLinks.length && 'IntersectionObserver' in window) {\n      const visible = new Set();\n\n      const setActive = () => {\n        let current = null;\n        if (visible.size) {\n          current = sections.filter(s => visible.has(s))\n                            .sort((a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top)[0];\n        }\n        if (!current) return;\n        const id = current.getAttribute('id');\n        navLinks.forEach(link => {\n          link.classList.toggle('active', link.getAttribute('href') === '#' + id);\n        });\n      };\n\n      const observer = new IntersectionObserver(entries => {\n        entries.forEach(entry => {\n          if (entry.isIntersecting) visible.add(entry.target);\n          else visible.delete(entry.target);\n        });\n        setActive();\n      }, { root: null, rootMargin: '-15% 0px -55% 0px', threshold: 0 });\n\n      sections.forEach(section => observer.observe(section));\n    }\n\n    \/\/ --- 2. SMOOTH SCROLL ---\n    navLinks.forEach(link => {\n      link.addEventListener('click', function (e) {\n        const href = this.getAttribute('href') || '';\n        if (href.charAt(0) !== '#') return;\n        const target = document.getElementById(href.substring(1));\n        if (!target) return;\n\n        e.preventDefault();\n        const y = target.getBoundingClientRect().top + window.pageYOffset - 20;\n        window.scrollTo({ top: y, behavior: reduced ? 'auto' : 'smooth' });\n        history.replaceState(null, '', href);\n\n        \/\/ On narrow screens the nav is a collapsible panel sitting over the\n        \/\/ content, so close it once a destination is chosen.\n        if (shell && shell.hasAttribute('open') && window.matchMedia('(max-width: 980px)').matches) {\n          shell.removeAttribute('open');\n        }\n      });\n    });\n\n    \/\/ --- 3. COPY BUTTONS ---\n    page.querySelectorAll('.rw-copy').forEach(btn => {\n      const block = btn.closest('.rw-code');\n      const code  = block && block.querySelector('pre code');\n      if (!code) { btn.style.display = 'none'; return; }\n\n      const label = btn.querySelector('.rw-copy__label');\n      const use   = btn.querySelector('use');\n      let resetTimer = null;\n\n      const flash = (text, ok) => {\n        if (label) label.textContent = text;\n        if (use) use.setAttribute('href', ok ? '#icon-check' : '#icon-copy');\n        btn.classList.toggle('is-done', ok);\n        clearTimeout(resetTimer);\n        resetTimer = setTimeout(() => {\n          if (label) label.textContent = 'Copy';\n          if (use) use.setAttribute('href', '#icon-copy');\n          btn.classList.remove('is-done');\n        }, 2000);\n      };\n\n      btn.addEventListener('click', async () => {\n        const text = code.textContent;\n        try {\n          if (navigator.clipboard && window.isSecureContext) {\n            await navigator.clipboard.writeText(text);\n          } else {\n            \/\/ Fallback for pages not served over HTTPS.\n            const ta = document.createElement('textarea');\n            ta.value = text;\n            ta.setAttribute('readonly', '');\n            ta.style.cssText = 'position:absolute;left:-9999px;top:0;';\n            document.body.appendChild(ta);\n            ta.select();\n            document.execCommand('copy');\n            document.body.removeChild(ta);\n          }\n          flash('Copied', true);\n        } catch (err) {\n          \/\/ Never leave the button looking like it worked when it didn't.\n          flash('Press Ctrl+C', false);\n          try {\n            const range = document.createRange();\n            range.selectNodeContents(code);\n            const sel = window.getSelection();\n            sel.removeAllRanges();\n            sel.addRange(range);\n          } catch (e) {}\n        }\n      });\n    });\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Setup &amp; Instructions \u2014 Rec0m88 Back to downloads Rec0m88 Documentation Setup &amp; instructions Everything needed to get Rec0m88 installed and configured \u2014 per platform, plus BIOS files, Dolphin system files, API keys, cheats, and the full RetroAchievements integration. Windows \u00b7 macOS \u00b7 Linux Xbox Series X|S 12 sections Contents Installation Windows setup macOS setup Linux&#8230;<\/p>","protected":false},"author":1,"featured_media":247,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"wpai_generated_summary":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-10388","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/rec0m88.com\/pt\/wp-json\/wp\/v2\/pages\/10388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rec0m88.com\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rec0m88.com\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rec0m88.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rec0m88.com\/pt\/wp-json\/wp\/v2\/comments?post=10388"}],"version-history":[{"count":1,"href":"https:\/\/rec0m88.com\/pt\/wp-json\/wp\/v2\/pages\/10388\/revisions"}],"predecessor-version":[{"id":10837,"href":"https:\/\/rec0m88.com\/pt\/wp-json\/wp\/v2\/pages\/10388\/revisions\/10837"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rec0m88.com\/pt\/wp-json\/wp\/v2\/media\/247"}],"wp:attachment":[{"href":"https:\/\/rec0m88.com\/pt\/wp-json\/wp\/v2\/media?parent=10388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}