diff --git a/apps/desktop/src/app/chat/index.tsx b/apps/desktop/src/app/chat/index.tsx
index b9f0b1a75c2..fb8175102b0 100644
--- a/apps/desktop/src/app/chat/index.tsx
+++ b/apps/desktop/src/app/chat/index.tsx
@@ -499,7 +499,7 @@ export function ChatView({
)}
{showChatBar && }
{/* Vibe hearts rise from the composer only when no pet is out (else
- they play on the pet). DEV Shift+H to preview; not wired to ily/<3 yet. */}
+ they play on the pet). Fired by the core `reaction` event. */}
{!petPresent && (
emitter.burst(count)
/**
- * Fire a vibe burst from anywhere (hotkey, future `ily`/`<3` wiring). Routes to
- * where the affection should land:
+ * Fire a vibe burst (from the core `reaction` event). Routes to where the
+ * affection should land:
* - pet popped out → forward to the overlay window + celebrate (mirrored)
* - pet in-window → play here (on the pet) + celebrate
* - no pet → play here (composer)
@@ -75,29 +75,6 @@ export const burstVibeHearts = (count?: number) => {
}
}
-/** DEV-only preview: Shift+H, firing even while the composer is focused. Mount
- * once in an always-present component (FloatingPet) — a single listener. */
-export function useHeartPreviewHotkey() {
- useEffect(() => {
- if (!import.meta.env.DEV) {
- return
- }
-
- const onKeyDown = (e: KeyboardEvent) => {
- if (!e.shiftKey || e.repeat || e.altKey || e.ctrlKey || e.metaKey || e.code !== 'KeyH') {
- return
- }
-
- e.preventDefault()
- burstVibeHearts()
- }
-
- window.addEventListener('keydown', onKeyDown)
-
- return () => window.removeEventListener('keydown', onKeyDown)
- }, [])
-}
-
export interface HeartFieldProps {
config?: Partial
className?: string
diff --git a/apps/desktop/src/components/pet/floating-pet.tsx b/apps/desktop/src/components/pet/floating-pet.tsx
index 3d89c57c460..399ed1bf485 100644
--- a/apps/desktop/src/components/pet/floating-pet.tsx
+++ b/apps/desktop/src/components/pet/floating-pet.tsx
@@ -4,7 +4,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'
import { useGatewayRequest } from '@/app/gateway/hooks/use-gateway-request'
import { useOnProfileSwitch } from '@/app/hooks/use-on-profile-switch'
import { useRouteOverlayActive } from '@/app/hooks/use-route-overlay-active'
-import { PetHeartField, useHeartPreviewHotkey } from '@/components/chat/vibe-hearts'
+import { PetHeartField } from '@/components/chat/vibe-hearts'
import { persistString, storedString } from '@/lib/storage'
import {
$petAtRest,
@@ -121,10 +121,6 @@ export function FloatingPet() {
const roamDir = useStore($petRoamDir)
const routeOverlayOpen = useRouteOverlayActive()
- // DEV Shift+H heart preview lives here — FloatingPet is always mounted
- // (app-shell), so one listener covers every route whether a pet is out or not.
- useHeartPreviewHotkey()
-
const [position, setPosition] = useState(loadPosition)
const containerRef = useRef(null)
// The facing mirror lives on the sprite wrapper, not the container, so the