Skip to content

Claude/hybrid skills platform plan t c ed l#5

Open
cphrealestate wants to merge 123 commits intoAustin1serb:mainfrom
cphrealestate:claude/hybrid-skills-platform-plan-tCEdL
Open

Claude/hybrid skills platform plan t c ed l#5
cphrealestate wants to merge 123 commits intoAustin1serb:mainfrom
cphrealestate:claude/hybrid-skills-platform-plan-tCEdL

Conversation

@cphrealestate
Copy link
Copy Markdown

No description provided.

claude and others added 30 commits April 2, 2026 14:45
Winebob is a wine tasting social platform combining Kahoot (blind tastings),
Polymarket (wine predictions), Vivino (ratings/discovery), and Strava
(activity tracking) — designed iPhone-first with a warm, social aesthetic.

Phase 1 includes:
- Next.js 16 PWA with App Router, Tailwind CSS, iPhone-first design
- Neon serverless PostgreSQL via Prisma 7 ORM
- Full domain schema: User, Wine, Reviews, TasteProfile, BlindTasting,
  PredictionMarket, Activity, CellarItem, Badges, Social graph
- 5 tab pages: Blind Arena, Vine Futures, Wine Cellar, Wine Trail, Profile
- Taste Quiz onboarding (5-question flow generating taste profiles)
- SVG radar chart for taste profile visualization
- Scoring service for blind tasting (friendly & encouraging)
- Recommendation engine (content-based + collaborative filtering)
- Label scanning API via Claude Vision
- Reputation & gamification service (XP, levels, ranks, badges)
- i18n messages (English + Danish)
- Wine seed data (40+ curated wines across 15 countries)
- Warm wine color palette (burgundy, gold, cream, rosé, sage)

https://claude.ai/code/session_01VhhYdrAzTJwaWm29amwEhd
- vercel.json with CPH region, security headers, PWA cache config
- Vercel Analytics + Speed Insights in root layout
- Vercel Blob upload API route for wine labels/photos (10MB max, JPEG/PNG/WebP/HEIC)
- next.config.ts with Vercel Blob image domain whitelist
- Updated .env.example with BLOB_READ_WRITE_TOKEN

https://claude.ai/code/session_01VhhYdrAzTJwaWm29amwEhd
…an, check-in, wine detail

- Add NextAuth.js with Google/Apple providers, proxy auth gate, login page
- Add server actions for taste profile, wine search, reviews, CRUD
- Rewrite Cellar as Server Component with real DB queries + client search/filters
- Add wine detail page (/cellar/wine/[id]) with reviews
- Add check-in flow (/cellar/checkin) with search, rating, tasting notes
- Add label scan page (/cellar/scan) with camera/upload + Claude Vision
- Remove all dead links from Arena, Trail, Profile pages (less is more for MVP)
- Migrate middleware.ts to proxy.ts for Next.js 16 compatibility

https://claude.ai/code/session_01VhhYdrAzTJwaWm29amwEhd
…focus

Phase 2+ features removed (cellar ratings, futures/predictions, trail/activity,
taste profiles, recommendations, badges, social graph). Schema rebuilt with
only what matters for MVP:

- EventTemplate: flexible, curated tasting formats hosts pick from
- BlindTastingEvent: join code + QR, configurable guess fields + scoring
- GuestParticipant: zero-friction join (name, birth year, location, GDPR consent)
- BlindGuess: flexible per-field guessing, scored against actual wines
- Wine: curated database for hosts to build events from

New pages:
- / — Landing with join code input (primary) + host CTA
- /join/[code] — Guest registration (name, birth year, location, consent)
- /play/[eventId] — Live tasting experience (lobby → guess → reveal → scoreboard)
- /arena — Host dashboard with templates + event management
- /arena/create — Multi-step event creation from template or scratch
- /arena/event/[id] — Host control panel (open lobby, advance wines, reveal, score)

Strategy: blind tasting events as viral acquisition loop. Every event brings
5-10 new users with zero friction. Demographic data (age, location, taste
patterns) collected GDPR-compliantly for wine industry insights.

https://claude.ai/code/session_01VhhYdrAzTJwaWm29amwEhd
…m-plan-tCEdL

Winebob MVP — Blind tasting event platform
…m-plan-tCEdL

Fix seed script and prisma config
…m-plan-tCEdL

Claude/hybrid skills platform plan t c ed l
…m-plan-tCEdL

fix: add ws for Neon serverless driver in Node.js (needed for local s…
…animation

- New color system: butter yellow (#FFEEBC) main, cherry red (#74070E) accent,
  baby blue (#C0D8F0), warm leather brown (#6B3A2A)
- Landing animation: sky gradient background with drifting clouds, three wine
  bottles falling from sky and landing on antique wooden table, Winebob logo
  reveals after bottles settle, scene fades to main UI
- SVG wine bottle illustrations (no emoji)
- Move ws to dependencies (needed for local seed script)
- Old wine-burgundy/wine-cream color names kept as aliases for compatibility

https://claude.ai/code/session_01VhhYdrAzTJwaWm29amwEhd
…m-plan-tCEdL

fix: add ws for Neon serverless driver in Node.js (needed for local s…
…m-plan-tCEdL

fix: rewrite seed to use neon() HTTP function — bypasses WebSocket is…
claude and others added 30 commits April 7, 2026 13:42
WineRegionMap upgraded:
- Renders wine regions as colored polygon AREAS (not dots)
- GeoJSON FeatureCollection with fill + border + label layers
- Hover: region highlights (opacity 0.18 → 0.35), border thickens
- Popup on hover: region name, country, grapes, wine count
- Click region → filters wine list
- Region colors per country (cherry for France, etc.)
- Custom Mapbox style: butter land, cream water, muted borders
- Zoom-dependent label sizes

Dynamic data:
- getWineRegionCounts() aggregates wines per region from DB
- Passed from page.tsx → WinesClient → WineRegionMap
- Popup shows real count from database

Waiting on GeoJSON data file + seed script from agents.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Approximate polygon boundaries for major wine regions:
France (Bordeaux, Burgundy, Champagne, Rhône, Loire, Alsace, Provence)
Italy (Piedmont, Tuscany, Veneto, Sicily)
Spain (Rioja, Ribera del Duero, Priorat)
Portugal (Douro, Alentejo)
Germany (Mosel, Rheingau)
USA (Napa Valley, Sonoma, Willamette Valley)
Argentina (Mendoza), Chile (Maipo, Colchagua)
Australia (Barossa, Margaret River)
New Zealand (Marlborough), South Africa (Stellenbosch)

Each region has: name, country, grapes, color per country.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Map fills top of screen (55vh, shrinks to 30vh when sheet expands).
Search bar + add button overlaid ON the map with glass blur.
Type filter pills overlaid at bottom of map.
Wine list as a bottom sheet that slides up with drag handle.
Click region on map → sheet expands, list filters to that region.

- No more giant colored bottle cards — wines shown as compact list
  with type dot, name, producer, region, price badge, heart
- Filters collapse into sheet header area
- Sheet has rounded top corners (-16px overlap with map edge)

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Map: 100% of screen with dark theme (dark land, dark water, muted
roads and borders). Wine regions glow brighter on dark background.

Overlays on map:
- Top: dark glass search bar with Grape icon + Saved bookmark
- Filter pills: dark glass with cherry active state
- Right: floating + button for add wine
- Bottom-right: "Explore Wines" floating CTA

Bottom sheet:
- Collapsed: one featured wine card with thumbnail, dark glass bg
- Drag handle to expand
- Expanded: full wine list with bg-background, rounded top corners
- List items: type dot, name, producer, price badge, heart

Dark popup on region hover with cream text.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Desktop (lg+): split layout
- Map takes left side (flex-1), wine list sidebar (400-440px) right
- Sidebar has header with search title, count, country/price filters
- Wine list scrolls independently
- Search + type pills overlaid on map
- Floating + button on map right side

Mobile: fullscreen map + bottom sheet
- Map 100%, search + pills overlaid top
- Featured wine card at bottom (dark glass)
- Drag handle expands to full wine list sheet
- "Explore Wines" floating CTA
- Layers button on right side

Map component fixes:
- Region labels: light color (#E0D4C0) on dark bg
- Remove default Mapbox nav controls (replaced by custom buttons)
- Remove border/shadow from container (fullscreen)

Wine list: type color strip (1px vertical bar) instead of dot

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Based on deep dive into Strava's Maps tab pattern and
native bottom sheet research.

Layout (cellar):
- Stripped to bare fragment — no header, map is fullscreen

Map component:
- Use mapbox://styles/mapbox/dark-v11 as base (gives real roads,
  terrain, labels) instead of custom style from scratch
- Wine regions as colored polygons with hover/click
- Popup: dark glass, cream text
- Fallback without token: dark bg with clickable region tag cloud
  (still functional, not just an empty white box)
- No border/radius — raw fullscreen

WinesClient — Mobile:
- Map 100% behind everything
- Top: dark glass search bar with grape icon + saved bookmark
- Under: filter type pills (dark glass)
- Right: floating Layers button
- Bottom sheet with 3 snap points (collapsed 140px, half 50vh,
  full 88vh) controlled by touch drag (40px threshold)
- Collapsed: featured wine card preview
- Half/Full: scrollable wine list with header + count
- Drag handle pill at top, tap to cycle states

WinesClient — Desktop (lg+):
- Map fills left (flex-1) with search + pills overlaid
- Sidebar right (400-440px): header, country/price filters, list
- No bottom sheet needed — list always visible

Wine list items:
- 3px vertical color strip (wine type)
- Name 14px semibold
- Producer · Region · Vintage 11px muted
- Price badge (cherry/7% bg)
- Heart favorite

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Replace mapbox dark-v11 with full custom style specification:
- 3D terrain with DEM source (1.3x exaggeration)
- Hillshade layer for relief shadows
- Warm dark palette: bg #110E0A, water #141C28
- Land use differentiated (parks, agriculture, wood)
- 4 road levels (motorway → tertiary) with warm brown tones
- Admin boundaries (country solid, state dashed)
- Place labels: country uppercase gold, city medium, town subtle
- Buildings at zoom 12+
- Initial pitch: 20° for 3D perspective
- Max zoom: 14 for detail

All colors are warm dark tones matching Winebob's leather/cherry
palette — not generic Mapbox dark grey.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Add Mapbox Streets poi_label layers to the custom map style:

Wineries/Restaurants (cherry dots, visible from zoom 9):
- Filter: food_and_drink class, wine-bar/bar/restaurant maki,
  Winery/Wine Bar/Vineyard type
- Cherry (#74070E) circles that grow from 2px to 6px with zoom
- Cream stroke for visibility on dark bg
- Name labels appear at zoom 12+ in warm gold

Hotels/Lodging (gold dots, visible from zoom 11):
- Filter: lodging class
- Gold (#C8A255) circles, 2px to 5px
- Name labels at zoom 13+

POI click interaction:
- Click shows popup with emoji icon (🍷 or 🏨) + name + category
- Dark glass popup matching wine region popups
- Cursor changes to pointer on hover

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Custom style spec requires glyphs property to render text labels.
Added mapbox://fonts/mapbox/{fontstack}/{range}.pbf

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Mapbox terrain-v2 and terrain-dem-v1 sources cause 'i.createBucket
is not a function' error. Removed terrain source, DEM source,
hillshade layer, and pitch. Map is now flat but functional.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Move terrain activation from style spec to style.load event handler
which avoids the createBucket internal error. DEM source stays in
style spec, but setTerrain is called after map initializes.
Wrapped in try/catch in case terrain is not supported.
Pitch restored to 30 degrees.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Click a wine region on the map:
1. Map flies to the region with smooth animation (1.5s, pitch 35°)
2. Zoomed in enough to show POI dots (restaurants, hotels)
3. "Exploring [Region]" cherry badge appears
4. Bottom sheet opens with filtered wines from that region
5. "← World" button to fly back to global view

Map component:
- exploreRegion prop triggers fitBounds animation
- Computes bounding box from GeoJSON polygon coordinates
- Padding accounts for overlays (top: search, bottom: sheet)
- Fly back to world view (center Europe, zoom 3.5) when cleared

Mobile:
- Explore badge on left, World button + Layers on right
- Sheet auto-opens to half when exploring

Desktop:
- Explore badge bottom-left of map
- World button in right floating stack
- Sidebar filters to region wines

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Problem: clicking a region triggered router.push which remounted
the component, resetting the map to default position.

Fix: separate explore (local state, fly-to) from filter (URL nav).
- onRegionClick only sets exploreRegion + search state locally
- Map flies to region and stays there
- "View wines →" button in sheet triggers actual URL navigation
- "← World" button resets local state without navigation

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Replace fitBounds (which zoomed based on polygon size) with flyTo
to center of region at zoom 10. POIs appear from zoom 9, so zoom
10 guarantees restaurants/hotels are visible.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Map style changed from dark to warm butter palette:
- Background: #F0E4CC (cream)
- Water: #C0D0E0 (soft blue)
- Parks: #D8E4C8, agriculture: #E4DCC4, wood: #C8D8B8
- Roads: warm cream/tan tones
- Labels: brown/cherry text with cream halo
- Region labels: cherry (#74070E) with cream halo

POI filter fixes (Mapbox Streets v8 correct fields):
- Use ["==", ["get", "class"], "food_and_drink"] not ["in", "class", ...]
- Add filterrank <= 3 for density control
- Dots visible from zoom 8 (not 9), grow larger with zoom
- Opacity increases with zoom for smooth appearance
- Added food_and_drink_stores layer (wine shops)
- Labels from zoom 11 with filterrank <= 2

Popups: white background, dark text (matching light theme)

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
When exploring a region:
- Region polygons + labels HIDDEN (no more red overlay when zoomed)
- Flies to main wine town (zoom 12) not polygon center
- City-specific coordinates for 10+ regions (Bordeaux→Saint-Émilion,
  Tuscany→Montalcino, etc.)

City hopping pills:
- Appear next to "Exploring" badge when region has sub-cities
- Click a city → map flies there (zoom 13, 1.2s animation)
- Desktop: horizontal pills below badge
- Mobile: vertical stack on left side
- Active state: cherry bg

Sub-cities defined for: Bordeaux (5), Burgundy (5), Champagne (3),
Tuscany (5), Piedmont (4), Rioja (3), Napa Valley (4), Douro (2),
Mosel (3)

Back to world: shows polygons again, flies to Europe overview

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
- City pill clicks use stopPropagation to prevent map region click
- Create new array ref [...coords] so React effect fires each time
- Default explore flies to first sub-city (e.g. Piedmont → Barolo)
  at zoom 13 instead of generic region center at zoom 12

Also: landing page "Get Started" now links to /explore (preview)
instead of /login

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
New public page accessible without login:
- Fullscreen wine region map as background
- Click regions to explore (fly-to with city pills)
- Dark gradient overlay at bottom with signup CTA
- Feature pills: Browse wines, Explore regions, Join live events
- "Sign up free" primary button → /login
- "Already have an account? Log in" secondary → /login
- "Full access requires a free account" subtle note
- Back button to landing page
- Winebob branding in top center

Landing page "Explore the Map" button now links here instead
of directly to /login.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
…ty 0

setLayoutProperty visibility wasn't working reliably. Now using
setPaintProperty to set fill-opacity and line-opacity to 0 when
exploring, and restore to original values when returning to world.
Region labels use setLayoutProperty visibility none/visible.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Replace vertical explore badge + city stack with clean horizontal
pill bar in the same position as filter pills:

[← Piedmont] [Barolo] [Barbaresco] [Asti] [Alba]

- Region name as first cherry pill with ← arrow (tap = back to world)
- Cities as dark glass pills (tap = fly to city)
- Horizontal scroll if many cities
- Replaces filter pills when exploring (same position, swaps)
- No more "EXPLORING" badge, no vertical stack
- Same pattern on both desktop and mobile

Desktop: pills at bottom of map
Mobile: pills under search bar (where filter pills normally are)

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Root causes:
1. setPaintProperty ran before map layers were loaded (mapLoaded ref)
2. flyToCoords and exploreRegion effects fought each other

Fixes:
- mapLoaded ref tracks when on("load") fires
- setRegionVisibility helper function with try/catch
- prevExploreRef prevents re-triggering on same region
- flyToCoords effect is completely separate from explore effect
- flyToCoords only does flyTo, never touches region visibility
- exploreRegion only runs when region actually changes

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Run: DATABASE_URL=... npx tsx prisma/seed-wines.ts

Wines by region:
- France: Bordeaux (10), Burgundy (6), Champagne (4), Rhône (3), Loire (2)
- Italy: Piedmont (5), Tuscany (5), Veneto (2), Sicily (2)
- Spain: Rioja (4), Ribera (2), Priorat (1)
- Portugal: Douro (3), Alentejo (2)
- Germany: Mosel (3), Rheingau (1)
- USA: Napa (6), Sonoma (2), Oregon (2)
- Argentina: Mendoza (4)
- Chile: Maipo/Colchagua (4)
- Australia: Barossa (3), Margaret River (2)
- New Zealand: Marlborough (3)
- South Africa: Stellenbosch (4)

All real producers: Château Margaux, DRC, Dom Pérignon, Sassicaia,
Penfolds Grange, Opus One, Vega Sicilia, etc.

Uses findFirst to skip duplicates on re-run.

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Added 69 more wines:
- More Bordeaux Super Seconds (Cos d'Estournel, Palmer, Ducru)
- More Burgundy (Armand Rousseau, Bonneau du Martray, William Fèvre)
- More Rhône (Chave, Chapoutier, Guigal La Mouline)
- Alsace (Trimbach, Zind-Humbrecht) + Provence rosé
- More Piedmont (Massolino, Aldo Conterno) + Gavi
- More Tuscany (Solaia, Masseto, Flaccianello)
- More Spain (Clos Erasmus, Albariño Pazo de Señorans)
- More Portugal (Quinta do Crasto, Vale Meão, Mouchão)
- More Germany (Molitor, Schloss Johannisberg, von Buhl)
- More USA (Harlan, Scarecrow, Ridge Monte Bello, Beaux Frères)
- More Argentina (Cheval des Andes, Colomé)
- More Chile (Clos Apalta, Errazuriz)
- More Australia (Two Hands, Jim Barry, Tyrrell's)
- More NZ (Felton Road, Kumeu River)
- More SA (Sadie Family Columella + Palladius, Ken Forrester)
- Rest of world: Austria, Greece, Lebanon, Hungary, Georgia

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Data model:
- New Winery Prisma model: name, slug, description, history,
  founded, owner, coordinates, region, featured (paid), verified,
  visitBooking, annualBottles, vineyardSize, grapeVarieties

Mock data: 18 real wineries across 10 regions:
- Château Margaux, Lafite, Lynch-Bages (Bordeaux)
- DRC, Louis Jadot (Burgundy)
- Dom Pérignon (Champagne)
- Gaja, Giacomo Conterno (Piedmont)
- Tenuta San Guido, Antinori (Tuscany)
- López de Heredia, Vega Sicilia (Spain)
- Opus One, Ridge (USA)
- Quinta do Noval (Portugal)
- Penfolds (Australia)
- Cloudy Bay (New Zealand)
- Kanonkop (South Africa)

Map markers:
- Featured wineries: gold (#C8A255), visible from zoom 5, larger
  circles with white stroke, "★ Featured Winery" in popup
- Regular wineries: cherry (#74070E), visible from zoom 7, smaller
- Labels from zoom 8, gold text for featured, brown for regular
- Click popup: 🏰 icon, name, region, founded year, description

https://claude.ai/code/session_01EB6Vp51HXDch3sCNXXLKdj
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants