diff --git a/.superpowers/brainstorm/26716-1777131188/content/auth-layout.html b/.superpowers/brainstorm/26716-1777131188/content/auth-layout.html deleted file mode 100644 index a84572e..0000000 --- a/.superpowers/brainstorm/26716-1777131188/content/auth-layout.html +++ /dev/null @@ -1,103 +0,0 @@ -

Auth Page Layout

-

Centered card layout used across all auth pages (login, signup, forgot-password, reset-password)

- -
-
-
Desktop Layout
-
- -
-
- - -
- -
-
๐Ÿ” DeckyVault
-
Sign in to your account
-
- - -
- - -
- - -
-
- or continue with email -
-
- - -
- - -
- - -
- - -
- - - - - -
- Forgot password? - โ€ข - Create account -
-
-
-
- -
-
Mobile Layout
-
- -
-
-
๐Ÿ” DeckyVault
-
Sign in to your account
-
- -
- - -
- -
-
- or email -
-
- - - - - - -
- Forgot password? - โ€ข - Create account -
-
-
-
-
- -
-

Layout Specs

- -
\ No newline at end of file diff --git a/.superpowers/brainstorm/26716-1777131188/content/login-flow.html b/.superpowers/brainstorm/26716-1777131188/content/login-flow.html deleted file mode 100644 index 48f65ba..0000000 --- a/.superpowers/brainstorm/26716-1777131188/content/login-flow.html +++ /dev/null @@ -1,124 +0,0 @@ -

Login Flow โ€” Email-First with Conditional Passkey

-

Two-phase login: email check โ†’ password/passkey

- -
-

Phase 1: Email Entry

-
-
Login โ€” Initial Screen
-
-
-
-
Welcome back
-
Sign in to DeckyVault
-
- - -
- - -
- -
-
- or continue with email -
-
- - - - - - - -
- Don't have an account? - Create one -
-
-
-
-
-

- Key: Only email field is shown initially. The autocomplete="username webauthn" attribute enables passkey conditional UI โ€” browsers with passkey support will offer to autofill passkey credentials. -

-
-
- -
-

Phase 2a: Email Exists โ†’ Password Entry

-
-
Login โ€” Password Step (email exists)
-
-
-
-
Welcome back
-
Signing in as user@example.com change
-
- - - - - -
- Forgot password? -
- - - - -
-
๐Ÿ”‘ Your browser may offer to sign in with a passkey
-
-
-
-
-
-

- Conditional UI: The password field has autocomplete="current-password webauthn". On mount, we call authClient.signIn.passkey({ autoFill: true }) to preload passkeys. Browsers that support Conditional UI (Chrome, Safari, Edge) will show a passkey autofill dropdown when the user interacts with the password field. -

-
-
- -
-

Phase 2b: Email NOT Found โ†’ Error + Signup Link

-
-
Login โ€” Email Not Found
-
-
-
-
Welcome back
-
Sign in to DeckyVault
-
- - - - - - -
- โš  - No account found with this email. - Create one โ†’ -
- - -
-
-
-
- -
-

How Email Check Works

-
-
    -
  1. User enters email and clicks "Continue"
  2. -
  3. Client calls authClient.signIn.email() with email + empty password
  4. -
  5. Better-auth returns an error if email doesn't exist
  6. -
  7. If error: show "No account found" with signup link
  8. -
  9. If email exists: transition to password field with email displayed
  10. -
-

- Note: We use signIn.email() as the check mechanism rather than a separate endpoint. This avoids leaking whether an email exists via a dedicated check API. -

-
-
\ No newline at end of file diff --git a/.superpowers/brainstorm/26716-1777131188/content/password-reset.html b/.superpowers/brainstorm/26716-1777131188/content/password-reset.html deleted file mode 100644 index 55aff6f..0000000 --- a/.superpowers/brainstorm/26716-1777131188/content/password-reset.html +++ /dev/null @@ -1,127 +0,0 @@ -

Password Reset Flow โ€” Email OTP

-

Two-page flow: request reset โ†’ verify OTP + set new password

- -
-

Page 1: Forgot Password โ€” Request OTP

-
-
/forgot-password
-
-
-
-
๐Ÿ”’
-
Forgot your password?
-
Enter your email and we'll send you a verification code to reset your password.
-
- - - - - - -
- โ† Back to sign in -
-
-
-
-
-

- API: Calls authClient.emailOtp.requestPasswordReset({ email }). This triggers the server to send a "forget-password" OTP via the existing sendVerificationOTP handler. -

-
-
- -
-

Page 2: Reset Password โ€” OTP + New Password

-
-
/reset-password?email=user@example.com
-
-
-
-
๐Ÿ“ง
-
Check your email
-
We sent a 6-digit code to user@example.com
-
- - - -
-
_
-
_
-
_
-
_
-
_
-
_
-
- -
- Resend code in - 4:23 -
- - -
-
- then set new password -
-
- - - - - - -
-
-
-
-
-
-
-
-
- - - - - - - -
- โ† Back to sign in -
-
-
-
-
- -
-

Success State

-
-
After successful reset
-
-
-
โœ…
-
Password reset successful
-
Your password has been updated. You can now sign in with your new password.
- -
-
-
-
- -
-

API Flow

-
-
    -
  1. User enters email on /forgot-password
  2. -
  3. Client calls authClient.emailOtp.requestPasswordReset({ email })
  4. -
  5. Server sends OTP with type "forget-password" via sendVerificationOTP
  6. -
  7. User is redirected to /reset-password?email=user@example.com
  8. -
  9. User enters OTP + new password + confirm password
  10. -
  11. Client calls authClient.emailOtp.checkVerificationOtp({ email, otp, type: "forget-password" }) (optional validation)
  12. -
  13. Client calls authClient.resetPassword({ newPassword, otp })
  14. -
  15. On success: show success screen, then redirect to /login
  16. -
-
-
\ No newline at end of file diff --git a/.superpowers/brainstorm/26716-1777131188/content/signup-wizard.html b/.superpowers/brainstorm/26716-1777131188/content/signup-wizard.html deleted file mode 100644 index bfd1a22..0000000 --- a/.superpowers/brainstorm/26716-1777131188/content/signup-wizard.html +++ /dev/null @@ -1,192 +0,0 @@ -

Signup Wizard โ€” Step-by-Step Flow

-

3 steps for email signup, 2 steps for social signup

- -
-

Step 1: Account Creation

-
-
Email Signup โ€” Step 1 of 3
-
-
- -
-
-
-
-
- -
-
Create your account
-
Choose how you'd like to sign up
-
- - -
- - -
- -
-
- or use email -
-
- - - - - - - - - -
-
-
-
-
-
-
-
-
Weak โ€” add uppercase, number, special char
-
- - - -
- Already have an account? - Sign in -
-
-
-
-
- -
-

Step 2: Email Verification (OTP)

-
-
Email Signup โ€” Step 2 of 3
-
-
- -
-
-
-
-
- -
-
Verify your email
-
We sent a 6-digit code to user@example.com
-
- - -
-
4
-
7
-
_
-
_
-
_
-
_
-
- - -
- Resend code in - 4:23 -
- - - -
- โ† Back to signup -
-
-
-
-
- -
-

Step 3: Passkey Setup (Optional)

-
-
Email Signup โ€” Step 3 of 3 (Optional)
-
-
- -
-
-
-
-
- -
-
๐Ÿ”‘
-
Set up a passkey
-
Sign in faster with biometrics or your device's security key. No password needed.
-
- - -
-
- โœ“ Faster sign-in with fingerprint or face -
-
- โœ“ More secure than passwords -
-
- โœ“ Works across your devices -
-
- - - -
-
-
-
- -
-

Social Signup Flow (2 steps)

-
-

- Step 1: User clicks Google/Discord โ†’ OAuth redirect โ†’ authenticated
- Step 2: Passkey setup (optional, same as Step 3 above) โ†’ Done

- OTP step is skipped โ€” email is already verified by the OAuth provider. -

-
-
- -
-

Password Strength Meter โ€” States

-
-
-
-
-
-
-
-
-
-
Weak โ€” add 8+ chars, uppercase, number, special char
-
-
-
-
-
-
-
-
-
-
Fair โ€” add a special character and more length
-
-
-
-
-
-
-
-
-
-
Strong โ€” great password!
-
-
-
\ No newline at end of file diff --git a/.superpowers/brainstorm/26716-1777131188/content/waiting.html b/.superpowers/brainstorm/26716-1777131188/content/waiting.html deleted file mode 100644 index f92c257..0000000 --- a/.superpowers/brainstorm/26716-1777131188/content/waiting.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

Continuing in terminal...

-
\ No newline at end of file diff --git a/.superpowers/brainstorm/26716-1777131188/state/server-stopped b/.superpowers/brainstorm/26716-1777131188/state/server-stopped deleted file mode 100644 index 65871d1..0000000 --- a/.superpowers/brainstorm/26716-1777131188/state/server-stopped +++ /dev/null @@ -1 +0,0 @@ -{"reason":"idle timeout","timestamp":1777134909078} diff --git a/.superpowers/brainstorm/26716-1777131188/state/server.log b/.superpowers/brainstorm/26716-1777131188/state/server.log deleted file mode 100644 index abb8131..0000000 --- a/.superpowers/brainstorm/26716-1777131188/state/server.log +++ /dev/null @@ -1,7 +0,0 @@ -{"type":"server-started","port":54158,"host":"127.0.0.1","url_host":"localhost","url":"http://localhost:54158","screen_dir":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/26716-1777131188/content","state_dir":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/26716-1777131188/state"} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/26716-1777131188/content/auth-layout.html"} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/26716-1777131188/content/signup-wizard.html"} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/26716-1777131188/content/login-flow.html"} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/26716-1777131188/content/password-reset.html"} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/26716-1777131188/content/waiting.html"} -{"type":"server-stopped","reason":"idle timeout"} diff --git a/.superpowers/brainstorm/26716-1777131188/state/server.pid b/.superpowers/brainstorm/26716-1777131188/state/server.pid deleted file mode 100644 index 35e769c..0000000 --- a/.superpowers/brainstorm/26716-1777131188/state/server.pid +++ /dev/null @@ -1 +0,0 @@ -26725 diff --git a/.superpowers/brainstorm/44094-1777186296/content/badge-naming.html b/.superpowers/brainstorm/44094-1777186296/content/badge-naming.html deleted file mode 100644 index a25f64a..0000000 --- a/.superpowers/brainstorm/44094-1777186296/content/badge-naming.html +++ /dev/null @@ -1,33 +0,0 @@ -

Badge Naming โ€” "Native Champion" Alternatives

-

This badge marks games/presets that hit 60+ FPS with zero FSR and zero frame generation. Which name fits the brand best?

- -
-
-
A
-
-

Raw Performer

-

Emphasizes unassisted performance. Technical, no-nonsense. "Raw" signals no upscaling tricks.

-
-
-
-
B
-
-

Pure Performance

-

Clean and clear. "Pure" = untouched settings. Easy to understand at a glance.

-
-
-
-
C
-
-

Native Champion

-

Your original idea. "Champion" has a competitive/gaming feel. Slightly longer.

-
-
-
-
D
-
-

Untouched

-

Short, punchy. Implies the game runs great without any modifications. Memorable.

-
-
-
diff --git a/.superpowers/brainstorm/44094-1777186296/content/game-page-layout.html b/.superpowers/brainstorm/44094-1777186296/content/game-page-layout.html deleted file mode 100644 index 9fc9326..0000000 --- a/.superpowers/brainstorm/44094-1777186296/content/game-page-layout.html +++ /dev/null @@ -1,149 +0,0 @@ -

Game Page Layout โ€” Overall Structure

-

Here's the proposed page structure top-to-bottom. Each section is labeled.

- -
-
Section 1: Hero Header โ€” Card Image + Game Info
-
-
- -
- 2:3 Cover -
- -
-
Game Title Here
-
Developer ยท Publisher ยท Genre, Genre
- -
- ๐ŸŽฎ 42 Benchmarks - โš™๏ธ 8 Presets - ๐Ÿ’ฌ 15 Comments - Metascore: 87 - $29.99 -
- -
- Steam โ†— - ProtonDB โ†— - SteamDB โ†— -
- -
- ๐Ÿ“Š 42 benchmarks - ๐Ÿ“‹ 3 game versions - โœ… 12 verified entries - ๐Ÿ• Last updated 2 days ago -
-
-
-
-
- -
-
Section 2: Overview โ€” Description + Details
-
-
-
-
About
-
Game description text goes here. This is the Steam short description that gets synced from the store page. It provides context about what the game is about...
-
-
-
Details
-
-
Source: Steam
-
AppID: 1234567
-
Added: Jan 15, 2026
-
Last Sync: 2 days ago
-
-
-
-
-
- -
-
Section 3: Device Selector Ribbon + Fine Filters
-
- -
Select Devices
-
-
โœ“ Steam Deck OLED
-
Steam Deck LCD
-
Steam Machine
-
- -
Filters
-
- - - - -
-
-
- -
-
Section 4: Statistics Dashboard (ECharts)
-
-
- -
-
AVG FPS Distribution (Boxplot)
-
- [Boxplot: Min / Q1 / Median / Q3 / Max per device] -
-
- -
-
Historical AVG FPS (Stacked Area)
-
- [Area chart: FPS over time by proton/OS version] -
-
- -
-
FPS by Upscaler & Frame Gen
-
- [Grouped bar: FPS by FSR version ร— frame gen method] -
-
- -
-
Entries per Device
-
- [Pie/donut or bar: count per device] -
-
-
-
-
- -
-
Section 5: Preset Entries
-
-
Community Presets
-
-
-
-
"Best Quality" by @user1
-
Steam Deck OLED ยท โ†‘ 24 ยท 8 settings
-
-
Avg 45 FPS
-
-
-
-
"Battery Saver" by @user2
-
Steam Deck OLED ยท โ†‘ 18 ยท 6 settings
-
-
Avg 60 FPS
-
-
-
-
diff --git a/.superpowers/brainstorm/44094-1777186296/content/game-page-v2.html b/.superpowers/brainstorm/44094-1777186296/content/game-page-v2.html deleted file mode 100644 index 5eee674..0000000 --- a/.superpowers/brainstorm/44094-1777186296/content/game-page-v2.html +++ /dev/null @@ -1,223 +0,0 @@ -

Game Page v2 โ€” Updated Layout

-

Changes: "Raw Performer" badge, no duplicate stats, full-width priority charts, enhanced preset cards.

- - - - -
-
Section 1: Hero Header
-
-
- -
- 2:3 Cover -
- -
-
- Game Title Here - - โšก RAW PERFORMER -
-
Developer ยท Publisher ยท Genre, Genre
- -
- ๐ŸŽฎ 42 Benchmarks - โš™๏ธ 8 Presets - ๐Ÿ’ฌ 15 Comments - Metascore: 87 - $29.99 -
- -
- Steam โ†— - ProtonDB โ†— - SteamDB โ†— -
- -
- ๐Ÿ“‹ 3 versions - โœ… 12 verified - ๐Ÿ• Synced 2 days ago -
-
-
-
-
- - - - -
-
Section 2: Overview
-
-
-
-
About
-
Game description text goes here. This is the Steam short description that gets synced from the store page...
-
-
-
Details
-
-
Source: Steam
-
AppID: 1234567
-
Added: Jan 15, 2026
-
Last Sync: 2 days ago
-
-
-
-
-
- - - - -
-
Section 3: Device Selector Ribbon + Filters
-
-
Select Devices
-
-
โœ“ Steam Deck OLED
-
Steam Deck LCD
- -
-
Filters
-
- - - - -
-
-
- - - - -
-
Section 4: Statistics Dashboard (ECharts)
-
- - -
-
๐Ÿ“ˆ Historical AVG FPS โ€” Full Width
-
- [Stacked Area: AVG FPS trend over time, grouped by Proton/SteamOS version] -
-
- - -
-
๐ŸŽฎ FPS by Upscaler & Frame Gen โ€” Full Width
-
- [Grouped Bar: FPS by FSR version (none/1/2/3) ร— Frame Gen (none/fsr_fg/dlss_fg), with label rotation] -
-
- - -
-
-
๐Ÿ“Š AVG FPS Boxplot
-
- [Boxplot per device: Min/Q1/Median/Q3/Max] -
-
-
-
๐Ÿ–ฅ๏ธ Entries per Device
-
- [Donut: benchmark count per device] -
-
-
- - -
-
-
๐Ÿ“‰ FPS Range (Low vs High)
-
- [Range bar: fpsLow โ†’ fpsHigh per entry] -
-
-
-
โฑ๏ธ Load Times (SSD vs SD)
-
- [Bar: SSD vs SD load times โ€” only shows if data exists] -
-
-
- - -
-
โœ… Community Trust โ€” Full Width
-
- [Horizontal bar: verified badge count + upvote/downvote ratio per benchmark entry] -
-
-
-
- - - - -
-
Section 5: Community Presets
-
-
Community Presets
- - -
-
-
-
- "Vanilla 60fps" - โšก RAW PERFORMER -
-
by @user1 ยท Steam Deck OLED ยท โ†‘ 24 votes ยท 8 settings
-
No FSR ยท No Frame Gen ยท Proton 9.0-4 ยท SteamOS 3.6.20
-
-
-
62 FPS
-
avg ยท 48 low ยท 71 high
-
-
-
- - -
-
-
-
- "Max Quality + FSR" -
-
by @user2 ยท Steam Deck OLED ยท โ†‘ 18 votes ยท 10 settings
-
- FSR 3 ยท FSR Frame Gen ยท Proton 9.0-4 ยท SteamOS 3.6.20 -
-
-
-
85 FPS
-
avg ยท 72 low ยท 94 high
-
-
-
- - -
-
-
-
- "Balanced + DLSS FG" -
-
by @user3 ยท Steam Deck LCD ยท โ†‘ 9 votes ยท 7 settings
-
- FSR 2 ยท DLSS Frame Gen ยท Proton 8.0-5 ยท SteamOS 3.5.19 -
-
-
-
72 FPS
-
avg ยท 58 low ยท 81 high
-
-
-
-
-
diff --git a/.superpowers/brainstorm/44094-1777186296/content/search-badge.html b/.superpowers/brainstorm/44094-1777186296/content/search-badge.html deleted file mode 100644 index 9762868..0000000 --- a/.superpowers/brainstorm/44094-1777186296/content/search-badge.html +++ /dev/null @@ -1,60 +0,0 @@ -

Search Card โ€” Raw Performer Badge

-

How the badge appears on search result cards. Same green pill style as the game page hero.

- -
-
Search Result Card with Raw Performer
-
- -
- -
- 2:3 -
- -
- -
- Baldur's Gate 3 - โšก RAW PERFORMER -
- Larian Studios ยท Publisher -

Gather your party and return to the Forgotten Realms in a tale of fellowship and betrayal...

- -
- RPG - Strategy -
- -
- ๐ŸŽฎ 28 Benchmarks - โš™๏ธ 5 Presets - ๐Ÿ’ฌ 12 Comments -
-
-
- - -
-
- 2:3 -
-
-
- Cyberpunk 2077 - -
- CD Projekt Red ยท Publisher -

An open-world action-adventure story set in Night City...

-
- RPG - Action -
-
- ๐ŸŽฎ 45 Benchmarks - โš™๏ธ 12 Presets - ๐Ÿ’ฌ 34 Comments -
-
-
-
-
diff --git a/.superpowers/brainstorm/44094-1777186296/content/search-card-final.html b/.superpowers/brainstorm/44094-1777186296/content/search-card-final.html deleted file mode 100644 index 7bf2b75..0000000 --- a/.superpowers/brainstorm/44094-1777186296/content/search-card-final.html +++ /dev/null @@ -1,130 +0,0 @@ -

Search Card โ€” Final Design

-

Existing layout preserved. Added: Raw Performer badge, real Avg FPS, real Version. No other layout changes.

- -
-
Local Result โ€” With Raw Performer
-
-
- -
- 2:3 -
- -
- -
- Baldur's Gate 3 - โšก RAW PERFORMER -
- Larian Studios ยท Publisher -

Gather your party and return to the Forgotten Realms...

- -
- RPG - Strategy -
- -
- ๐ŸŽฎ 28 Benchmarks - โš™๏ธ 5 Presets - ๐Ÿ’ฌ 12 Comments -
-
- -
-
-
Deck
-
Native
-
-
-
Best FPS
-
68
-
-
-
Version
-
v4.1.1.6
-
-
-
-
-
- -
-
Local Result โ€” Without Raw Performer (for comparison)
-
-
-
- 2:3 -
-
- - Cyberpunk 2077 - CD Projekt Red ยท Publisher -

An open-world action-adventure story set in Night City...

-
- RPG -
-
- ๐ŸŽฎ 45 Benchmarks - โš™๏ธ 12 Presets -
-
- -
-
-
Deck
-
Proton
-
-
-
Best FPS
-
42
-
-
-
Version
-
v2.13
-
-
-
-
-
- -
-
Steam-Only Result (unchanged โ€” no local data)
-
-
-
- 2:3 -
-
- Elden Ring - FromSoftware ยท Bandai Namco -

THE NEW FANTASY ACTION RPG...

-
- RPG - Action -
- -
- Steam โ†— - ProtonDB โ†— - SteamDB โ†— -
-
- -
-
-
Deck
-
โ€”
-
-
-
Best FPS
-
โ€”
-
-
-
Version
-
โ€”
-
-
-
-
-
diff --git a/.superpowers/brainstorm/44094-1777186296/content/stats-layouts.html b/.superpowers/brainstorm/44094-1777186296/content/stats-layouts.html deleted file mode 100644 index b3928f9..0000000 --- a/.superpowers/brainstorm/44094-1777186296/content/stats-layouts.html +++ /dev/null @@ -1,191 +0,0 @@ -

Stats Dashboard โ€” Layout Alternatives

-

Three layout options for the statistics section. Click the one that feels best.

- - - - - - -
-
A
-

Featured Row + Asymmetric Grid

-

Top chart gets a larger container with summary stats beside it. Remaining charts in a flowing grid.

- -
- -
-
-
๐Ÿ“ˆ Historical AVG FPS FEATURED
-
[Stacked Area Chart โ€” full width of container]
-
-
-
-
Overall Avg
-
54 FPS
-
-
-
Best Device
-
OLED
-
-
-
Entries
-
42
-
-
-
- - -
-
๐ŸŽฎ FPS by Upscaler & Frame Gen FULL
-
[Grouped Bar โ€” FSR version ร— Frame Gen method]
-
- - -
-
-
๐Ÿ“Š Boxplot
-
[FPS distribution per device]
-
-
-
๐Ÿ“‰ FPS Range
-
[Low โ†’ High per entry]
-
-
-
๐Ÿ–ฅ๏ธ Devices
-
[Donut: entries per device]
-
-
- - -
-
โœ… Community Trust FULL
-
[Horizontal bar: verified + vote ratio per entry]
-
-
-
- - - - -
-
B
-

Dashboard Cards with KPI Strip

-

Quick-glance KPI numbers at top, then a clean 2ร—2 grid of charts, with full-width charts breaking the rhythm where needed.

- -
- -
-
-
Avg FPS
-
54
-
-
-
Best
-
71
-
-
-
Worst
-
38
-
-
-
Std Dev
-
ยฑ8
-
-
-
Entries
-
42
-
-
- - -
-
๐Ÿ“ˆ Historical AVG FPS FULL
-
[Stacked Area]
-
- - -
-
-
๐ŸŽฎ FPS by Upscaler & Frame Gen
-
[Grouped Bar]
-
-
-
๐Ÿ“Š FPS Distribution (Boxplot)
-
[Boxplot per device]
-
-
-
๐Ÿ“‰ FPS Range
-
[Low โ†’ High]
-
-
-
๐Ÿ–ฅ๏ธ Entries per Device
-
[Donut]
-
-
- - -
-
โœ… Community Trust FULL
-
[Horizontal bar]
-
-
-
- - - - -
-
C
-

Sectioned with Visual Separator

-

Divides stats into logical groups with subtle dividers. Each group has a label. Full-width charts anchor each section.

- -
- -
-
Performance Overview
-
-
๐Ÿ“ˆ Historical AVG FPS FULL
-
[Stacked Area]
-
-
-
-
๐Ÿ“Š FPS Distribution
-
[Boxplot]
-
-
-
๐Ÿ“‰ FPS Range
-
[Low โ†’ High]
-
-
-
- - -
-
Technology Impact
-
-
๐ŸŽฎ FPS by Upscaler & Frame Gen FULL
-
[Grouped Bar]
-
-
- - -
-
Data Coverage & Trust
-
-
-
๐Ÿ–ฅ๏ธ Devices
-
[Donut]
-
-
-
โœ… Community Trust FULL
-
[Horizontal bar]
-
-
-
-
-
diff --git a/.superpowers/brainstorm/44094-1777186296/content/stats-priority.html b/.superpowers/brainstorm/44094-1777186296/content/stats-priority.html deleted file mode 100644 index 24d8f04..0000000 --- a/.superpowers/brainstorm/44094-1777186296/content/stats-priority.html +++ /dev/null @@ -1,63 +0,0 @@ -

Stats Dashboard โ€” Chart Priority

-

Which charts should be full-width (high importance) vs half-width? Select all that you want full-width.

- -
-
-
๐Ÿ“Š
-
-

AVG FPS Boxplot

-

Min / Q1 / Median / Q3 / Max per device. Shows spread and outliers. Core metric.

-
-
-
-
๐Ÿ“ˆ
-
-

Historical AVG FPS (Stacked Area)

-

FPS trend over time by Proton/SteamOS version. Shows if updates help or hurt performance.

-
-
-
-
๐ŸŽฎ
-
-

FPS by Upscaler & Frame Gen (Grouped Bar)

-

Compare FPS across FSR versions ร— frame gen methods. Shows the real cost/benefit of each combo.

-
-
-
-
๐Ÿ–ฅ๏ธ
-
-

Entries per Device (Donut)

-

Simple count of benchmarks per hardware. Shows data coverage.

-
-
-
-
๐Ÿ“‰
-
-

FPS Range: Low vs High (Range Bar)

-

Visualizes fpsLow to fpsHigh spread per entry. Shows consistency โ€” tight range = stable performance.

-
-
-
-
โฑ๏ธ
-
-

Load Times: SSD vs SD (Bar)

-

Compare storage load times. Only shows when data exists. Useful for games with long loads.

-
-
-
-
๐Ÿง
-
-

Proton Version Breakdown (Stacked Bar)

-

Distribution of entries by Proton version. Shows which Proton builds are most tested.

-
-
-
-
โœ…
-
-

Community Trust: Verified & Votes (Horizontal Bar)

-

Shows verified count + upvote/downvote ratio per entry. Helps identify the most trusted benchmarks.

-
-
-
- -

Charts you select will be full-width (one per row). Unselected charts will be half-width (2 per row).

diff --git a/.superpowers/brainstorm/44094-1777186296/state/server-stopped b/.superpowers/brainstorm/44094-1777186296/state/server-stopped deleted file mode 100644 index f1eba36..0000000 --- a/.superpowers/brainstorm/44094-1777186296/state/server-stopped +++ /dev/null @@ -1 +0,0 @@ -{"reason":"idle timeout","timestamp":1777190496647} diff --git a/.superpowers/brainstorm/44094-1777186296/state/server.log b/.superpowers/brainstorm/44094-1777186296/state/server.log deleted file mode 100644 index 4f016ae..0000000 --- a/.superpowers/brainstorm/44094-1777186296/state/server.log +++ /dev/null @@ -1,16 +0,0 @@ -{"type":"server-started","port":49813,"host":"127.0.0.1","url_host":"localhost","url":"http://localhost:49813","screen_dir":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/44094-1777186296/content","state_dir":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/44094-1777186296/state"} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/44094-1777186296/content/game-page-layout.html"} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/44094-1777186296/content/badge-naming.html"} -{"source":"user-event","type":"click","text":"A\n \n Raw Performer\n Emphasizes unassisted performance. Technical, no-nonsense. \"Raw\" signals no upscaling tricks.","choice":"raw-performer","id":null,"timestamp":1777186841487} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/44094-1777186296/content/stats-priority.html"} -{"source":"user-event","type":"click","text":"๐Ÿ“ˆ\n \n Historical AVG FPS (Stacked Area)\n FPS trend over time by Proton/SteamOS version. Shows if updates help or hurt performance.","choice":"historical","id":null,"timestamp":1777186897413} -{"source":"user-event","type":"click","text":"โœ…\n \n Community Trust: Verified & Votes (Horizontal Bar)\n Shows verified count + upvote/downvote ratio per entry. Helps identify the most trusted benchmarks.","choice":"verified-sentiment","id":null,"timestamp":1777186960801} -{"source":"user-event","type":"click","text":"๐Ÿ–ฅ๏ธ\n \n Entries per Device (Donut)\n Simple count of benchmarks per hardware. Shows data coverage.","choice":"device-pie","id":null,"timestamp":1777186972946} -{"source":"user-event","type":"click","text":"๐Ÿ–ฅ๏ธ\n \n Entries per Device (Donut)\n Simple count of benchmarks per hardware. Shows data coverage.","choice":"device-pie","id":null,"timestamp":1777186978613} -{"source":"user-event","type":"click","text":"๐ŸŽฎ\n \n FPS by Upscaler & Frame Gen (Grouped Bar)\n Compare FPS across FSR versions ร— frame gen methods. Shows the real cost/benefit of each combo.","choice":"upscaler-bar","id":null,"timestamp":1777186980875} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/44094-1777186296/content/game-page-v2.html"} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/44094-1777186296/content/stats-layouts.html"} -{"source":"user-event","type":"click","text":"A\n Featured Row + Asymmetric Grid\n Top chart gets a larger container with summary stats beside it. Remaining charts in a flowing grid.\n\n \n \n \n \n ๐Ÿ“ˆ Historical AVG FPS FEATURED\n [Stacked Area Chart โ€” full width of container]\n \n \n \n Overall Avg\n 54 FPS\n \n \n Best Device\n OLED\n \n \n Entries\n 42\n \n \n \n\n \n \n ๐ŸŽฎ FPS by Upscaler & Frame Gen FULL\n [Grouped Bar โ€” FSR version ร— Frame Gen method]\n \n\n \n \n \n ๐Ÿ“Š Boxplot\n [FPS distribution per device]\n \n \n ๐Ÿ“‰ FPS Range\n [Low โ†’ High per entry]\n \n \n ๐Ÿ–ฅ๏ธ Devices\n [Donut: entries per device]\n \n \n\n \n \n โœ… Community Trust FULL\n [Horizontal bar: verified + vote ratio per entry]","choice":"a","id":null,"timestamp":1777187409898} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/44094-1777186296/content/search-badge.html"} -{"type":"screen-added","file":"/Users/adrianbonpin/Documents/Code/personal/deckyvault/.superpowers/brainstorm/44094-1777186296/content/search-card-final.html"} -{"type":"server-stopped","reason":"idle timeout"} diff --git a/.superpowers/brainstorm/44094-1777186296/state/server.pid b/.superpowers/brainstorm/44094-1777186296/state/server.pid deleted file mode 100644 index 9442c77..0000000 --- a/.superpowers/brainstorm/44094-1777186296/state/server.pid +++ /dev/null @@ -1 +0,0 @@ -44103 diff --git a/app/game/[id]/game-page-client.tsx b/app/game/[id]/game-page-client.tsx index 6626c9d..63402cb 100644 --- a/app/game/[id]/game-page-client.tsx +++ b/app/game/[id]/game-page-client.tsx @@ -367,7 +367,7 @@ export function GamePageClient({ {session && ( Add Benchmark @@ -382,7 +382,7 @@ export function GamePageClient({ href={game.storeUrl} target="_blank" rel="noopener noreferrer" - className="inline-flex items-center gap-1 text-xs text-text/60 hover:text-primary transition-colors" + className="inline-flex items-center gap-1 text-xs text-text/60 hover:text-primary transition-colors cursor-pointer" > Steam @@ -394,7 +394,7 @@ export function GamePageClient({ href={protonDbUrl} target="_blank" rel="noopener noreferrer" - className="inline-flex items-center gap-1 text-xs text-text/60 hover:text-primary transition-colors" + className="inline-flex items-center gap-1 text-xs text-text/60 hover:text-primary transition-colors cursor-pointer" > ProtonDB @@ -405,7 +405,7 @@ export function GamePageClient({ href={steamDbUrl} target="_blank" rel="noopener noreferrer" - className="inline-flex items-center gap-1 text-xs text-text/60 hover:text-primary transition-colors" + className="inline-flex items-center gap-1 text-xs text-text/60 hover:text-primary transition-colors cursor-pointer" > SteamDB @@ -537,7 +537,7 @@ export function GamePageClient({ - ))} - - - {/* Tab Content */} - - {activeTab === "overview" && ( -
-

Recent Contributions

- -
- )} - - {activeTab === "saved" && } - - {activeTab === "settings" && ( -
- {/* Settings sub-tabs */} -
- {([ - { id: "profile" as SettingsTab, label: "Profile" }, - { id: "security" as SettingsTab, label: "Security" }, - { id: "accounts" as SettingsTab, label: "Linked Accounts" }, - ]).map((subTab) => ( - - ))} +
+ {/* Profile header section */} + +
+
+
- {/* Settings sub-tab content */} - {settingsSubTab === "profile" && ( - - )} - {settingsSubTab === "security" && } - {settingsSubTab === "accounts" && } -
- )} - + {/* Stats section */} + +
+ +
+
+ + {/* Tabs + content section */} + +
+ {/* Tabs */} +
+ {tabs.map((tab) => ( + + ))} +
+ + {/* Tab Content */} + + {activeTab === "overview" && ( +
+

+ Recent Contributions +

+ +
+ )} + + {activeTab === "saved" && } + + {activeTab === "settings" && ( +
+ {/* Settings sub-tabs */} +
+ {[ + { + id: "profile" as SettingsTab, + label: "Profile", + }, + { + id: "security" as SettingsTab, + label: "Security", + }, + { + id: "accounts" as SettingsTab, + label: "Linked Accounts", + }, + ].map((subTab) => ( + + ))} +
+ + {/* Settings sub-tab content */} + {settingsSubTab === "profile" && ( + + )} + {settingsSubTab === "security" && ( + + )} + {settingsSubTab === "accounts" && ( + + )} +
+ )} +
+
+
- -
- ) + ) } diff --git a/app/search/page.tsx b/app/search/page.tsx index acf9d79..034fafb 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -374,7 +374,7 @@ function SearchResultCard({ href={`https://store.steampowered.com/app/${result.appId}`} target="_blank" rel="noopener noreferrer" - className="relative z-10 inline-flex items-center justify-center gap-1.5 px-2.5 py-1 rounded-md bg-[#1b2838] border border-[#2a475e] text-[#c6d4df] text-[11px] hover:bg-[#2a475e] transition-colors w-full" + className="relative z-10 inline-flex items-center justify-center gap-1.5 px-2.5 py-1 rounded-md bg-[#1b2838] border border-[#2a475e] text-[#c6d4df] text-[11px] hover:bg-[#2a475e] transition-colors w-full cursor-pointer" onClick={(e) => e.stopPropagation()} title="Open store page on Steam" > @@ -386,7 +386,7 @@ function SearchResultCard({ href={`https://www.protondb.com/app/${result.appId}`} target="_blank" rel="noopener noreferrer" - className="relative z-10 inline-flex items-center justify-center gap-1.5 px-2.5 py-1 rounded-md bg-purple-500/10 border border-purple-500/20 text-purple-400 text-[11px] hover:bg-purple-500/20 transition-colors w-full" + className="relative z-10 inline-flex items-center justify-center gap-1.5 px-2.5 py-1 rounded-md bg-purple-500/10 border border-purple-500/20 text-purple-400 text-[11px] hover:bg-purple-500/20 transition-colors w-full cursor-pointer" onClick={(e) => e.stopPropagation()} title="View Proton compatibility on ProtonDB" > @@ -398,7 +398,7 @@ function SearchResultCard({ href={`https://steamdb.info/app/${result.appId}`} target="_blank" rel="noopener noreferrer" - className="relative z-10 inline-flex items-center justify-center gap-1.5 px-2.5 py-1 rounded-md bg-blue-500/10 border border-blue-500/20 text-blue-400 text-[11px] hover:bg-blue-500/20 transition-colors w-full" + className="relative z-10 inline-flex items-center justify-center gap-1.5 px-2.5 py-1 rounded-md bg-blue-500/10 border border-blue-500/20 text-blue-400 text-[11px] hover:bg-blue-500/20 transition-colors w-full cursor-pointer" onClick={(e) => e.stopPropagation()} title="View app details on SteamDB" > diff --git a/components/auth/forgot-password-form.tsx b/components/auth/forgot-password-form.tsx index 30e5769..ca267bd 100644 --- a/components/auth/forgot-password-form.tsx +++ b/components/auth/forgot-password-form.tsx @@ -85,7 +85,7 @@ export default function ForgotPasswordForm() { Back to sign in diff --git a/components/auth/login-form.tsx b/components/auth/login-form.tsx index dcfb8a8..eea6dd9 100644 --- a/components/auth/login-form.tsx +++ b/components/auth/login-form.tsx @@ -190,7 +190,7 @@ export default function LoginForm() {
Forgot password? @@ -218,7 +218,7 @@ export default function LoginForm() { Don't have an account?{" "} Create one diff --git a/components/auth/otp-verification-step.tsx b/components/auth/otp-verification-step.tsx index 6854e6a..c551f67 100644 --- a/components/auth/otp-verification-step.tsx +++ b/components/auth/otp-verification-step.tsx @@ -133,7 +133,7 @@ export default function OtpVerificationStep({ diff --git a/components/saved-games/bookmark-button.tsx b/components/saved-games/bookmark-button.tsx index 3f9aebb..3dd5d71 100644 --- a/components/saved-games/bookmark-button.tsx +++ b/components/saved-games/bookmark-button.tsx @@ -77,7 +77,7 @@ export function BookmarkButton({ gameId, className = "" }: BookmarkButtonProps) whileTap={{ scale: 0.9 }} onClick={toggleSave} disabled={isToggling} - className={`flex items-center gap-2 px-3 py-2 rounded-lg border transition-colors ${ + className={`flex items-center gap-2 px-3 py-2 rounded-lg border transition-colors cursor-pointer ${ isSaved ? "bg-primary/10 border-primary/30 text-primary" : "bg-text/5 border-border text-text/50 hover:text-text hover:border-primary/30" diff --git a/components/saved-games/saved-games-grid.tsx b/components/saved-games/saved-games-grid.tsx index 2ea5a7d..85d3307 100644 --- a/components/saved-games/saved-games-grid.tsx +++ b/components/saved-games/saved-games-grid.tsx @@ -117,7 +117,7 @@ export function SavedGamesGrid() { @@ -137,7 +137,7 @@ export function StepIndicator({ key={index} type="button" onClick={() => index <= currentStep && onStepClick?.(index)} - className={`h-1.5 rounded-full transition-all ${ + className={`h-1.5 rounded-full transition-all cursor-pointer ${ index === currentStep ? "w-6 bg-primary" : index < currentStep diff --git a/lib/api/user.ts b/lib/api/user.ts index f79ac7d..f530d7f 100644 --- a/lib/api/user.ts +++ b/lib/api/user.ts @@ -311,3 +311,84 @@ export const userRoutes = new Elysia({ prefix: "/user" }) }), }, ) + // Passkey management endpoints (better-auth doesn't provide these) + .post( + "/me/passkey/delete", + async ({ request, body, set }) => { + const session = await auth.api.getSession({ + headers: request.headers, + }) + + if (!session) { + set.status = 401 + return { error: "Unauthorized" } + } + + // Verify the passkey belongs to the user + const [pk] = await db + .select({ id: passkey.id }) + .from(passkey) + .where(and( + eq(passkey.id, body.id), + eq(passkey.userId, session.user.id) + )) + .limit(1) + + if (!pk) { + set.status = 404 + return { error: "Passkey not found" } + } + + await db + .delete(passkey) + .where(eq(passkey.id, body.id)) + + return { success: true } + }, + { + body: t.Object({ + id: t.String(), + }), + }, + ) + .post( + "/me/passkey/update", + async ({ request, body, set }) => { + const session = await auth.api.getSession({ + headers: request.headers, + }) + + if (!session) { + set.status = 401 + return { error: "Unauthorized" } + } + + // Verify the passkey belongs to the user + const [pk] = await db + .select({ id: passkey.id }) + .from(passkey) + .where(and( + eq(passkey.id, body.id), + eq(passkey.userId, session.user.id) + )) + .limit(1) + + if (!pk) { + set.status = 404 + return { error: "Passkey not found" } + } + + await db + .update(passkey) + .set({ name: body.name }) + .where(eq(passkey.id, body.id)) + + return { success: true } + }, + { + body: t.Object({ + id: t.String(), + name: t.String(), + }), + }, + )