diff --git a/README.md b/README.md
index ff5d91c..8d40a34 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,11 @@ a WebAssembly build of the real [Visual Pinball](https://github.com/vpinball/vpi
## Features
- **Play any self-contained `.vpx` table** — drag a file onto the landing page, or click to browse.
+- **ROM support for real-hardware ("SS") tables** — attach the table's PinMAME ROM `.zip` alongside
+ the `.vpx` upload; most tables don't need this.
+- **A local table library** — uploads are saved in the browser (IndexedDB) so you don't have to
+ re-upload the same table (and its ROM) on your next visit. Nothing leaves your browser; there's
+ no server-side storage.
- **Demo mode** — a bundled table plays instantly with no upload required.
- **Fullscreen**, a live **FPS/stats** readout, and a **game info** panel (table name, size, load
time) in an in-game HUD styled after a pinball cabinet's coin door.
@@ -88,10 +93,11 @@ pnpm run sw:bump
| Key | Action |
| -------------- | ------------- |
+| 4 | Insert coin |
+| 1 | Start game |
+| Enter | Launch ball |
| Left Shift | Left flipper |
| Right Shift | Right flipper |
-| Enter | Plunger |
-| 1 | Start game |
On touch devices, an on-screen control overlay appears automatically once a table is running.
@@ -101,12 +107,19 @@ Inherited from the underlying engine:
- Only self-contained `.vpx` tables are supported — tables that reference an external `.vbs`
script override or a `Music/` folder won't load correctly.
-- No PinMAME, DOF, or FlexDMD plugin support.
+- PinMAME (`VPinMAME.Controller`) ROM-driven emulation runs, but on-screen DMD/backglass output
+ and hands-on switch/solenoid/scoring behavior aren't yet confirmed end-to-end — see the engine's
+ own README for the current state. No DOF, FlexDMD, or backglass (`.directb2s`) plugin support.
+ ROM files are copyrighted; only supply ones you're legally entitled to use.
+- The ROM `gameName` PinMAME needs is derived from the uploaded zip's filename (e.g.
+ `hvymetal.zip` → `hvymetal`) — rename the zip to match if a table doesn't recognize its ROM.
- Single-threaded (no `SharedArrayBuffer`) — performance depends on your device's single-core
WebGL2 throughput.
- Initial engine download is ~34 MB (cached after the first visit).
- Gamepad input and DMD rendering are implemented but not yet confirmed on real hardware/tables.
- Raw cabinet hardware input (real nudge/plunger boards) has no browser equivalent.
+- The table library lives in the browser's IndexedDB storage — clearing site data removes it, and
+ it doesn't sync across browsers/devices.
## License
diff --git a/app/globals.css b/app/globals.css
index 9209844..352d695 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -9,7 +9,7 @@
--color-arc: #4ce0d2; /* fluorescent-tube cyan — focus rings, secondary */
--color-paper: #f3efe6; /* aged-backglass cream — high-contrast body text */
- --font-display: var(--font-big-shoulders), "Arial Narrow", sans-serif;
+ --font-display: var(--font-display-face), "Arial Narrow", sans-serif;
--font-body: var(--font-space-grotesk), system-ui, sans-serif;
--font-mono: var(--font-plex-mono), "IBM Plex Mono", ui-monospace, monospace;
}
diff --git a/app/layout.tsx b/app/layout.tsx
index cbea4be..6521a7d 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,17 +1,12 @@
import type { Metadata, Viewport } from "next";
-import { Big_Shoulders, Space_Grotesk, IBM_Plex_Mono } from "next/font/google";
+import { Barlow_Condensed, Space_Grotesk, IBM_Plex_Mono } from "next/font/google";
import RegisterServiceWorker from "@/components/RegisterServiceWorker";
import "./globals.css";
-const bigShoulders = Big_Shoulders({
- variable: "--font-big-shoulders",
+const displayFont = Barlow_Condensed({
+ variable: "--font-display-face",
weight: ["700", "900"],
subsets: ["latin"],
- // Next's fallback-metrics table has no entry for this (newer, merged
- // variable-font) family name, so the automatic CLS-reducing fallback
- // override it would otherwise generate always fails with a build
- // warning — opt out instead of leaving that warning unresolved.
- adjustFontFallback: false,
});
const spaceGrotesk = Space_Grotesk({
@@ -39,7 +34,7 @@ export default function RootLayout({ children }: LayoutProps<"/">) {
return (
{children}
diff --git a/app/page.tsx b/app/page.tsx
index c924d2d..bb46bcf 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,12 +1,11 @@
import AttractHero from "@/components/landing/AttractHero";
+import TableLibrary from "@/components/landing/TableLibrary";
export default function Home() {
return (
-
- Pinball plays best in landscape or fullscreen — rotate your device once a table loads.
-