DesktopMof
커서를 따라다니거나, 피하거나, 화면 가장자리에서 졸기도 한다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Kaenz origin platform — leave the car and travel by yacht. Next.js + Grok + Supabase.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Leave the car and travel by yacht. Kaenz is an end-to-end platform — not a charter operator — for Commute, Tour, and Special Occasion trips on yachts worldwide.
This is the origin platform rebuilt from kaenz.com (Canva site) as a Next.js app.
grok-4.6)#00a1d6#050a30#f4f6fcnpm install
cp .env.example .env.local
npm run dev
Open http://localhost:3000. Spanish: /es.
The Uber-style app (web + installable mobile PWA) lives at /app with five tabs:
Add to Home Screen on iOS/Android for the standalone mobile shell.
| Variable | Purpose |
|---|---|
XAI_API_KEY | Grok concierge (server-only) |
NEXT_PUBLIC_MAP_API_KEY | CARTO basemap key for the Kaenz map |
NEXT_PUBLIC_SUPABASE_URL | Supabase project |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Client/anon key |
SUPABASE_SERVICE_ROLE_KEY | Optional server writes |
STRIPE_SECRET_KEY | Stripe Checkout (server) |
STRIPE_WEBHOOK_SECRET | Stripe webhook signature |
AUTH_SECRET | Signs Kaenz sessions. Required in production (the server throws if it is missing). Payout onboarding stays disabled without it. |
Signup, join, resend, password reset, and funnel rate limits are in-memory and per instance. Vercel KV and Upstash are not configured, and no rate-limit table is added, so the limits are not shared across instances and reset when an instance stops.
Without Supabase, booking and join requests still succeed locally (no persistence). GET /api/yachts and GET /api/marinas still return seed-real South Florida inventory so guests can book. Without XAI_API_KEY, the concierge nav and chat stay hidden, /concierge redirects home, and POST /api/chat returns 503 {"error":"concierge_disabled"}. Setting the key turns the concierge back on. Without STRIPE_SECRET_KEY, trip checkout returns an error until Stripe is configured.
After a request, the client pays the algorithm fare plus optional captain gratuity with Stripe Checkout. The fare splits owner 38% / captain 30% / Kaenz 25% / pickup marina 3.5% / dropoff marina 3.5%. Gratuity is on top and goes only to the captain. Each partner connects their own Stripe account from Account → Receive your earnings (Accounts v2, Express dashboard, recipient configuration). After payment the webhook at /api/stripe/webhook transfers each share to that partner's own account (separate charges and transfers, transfer_group + source_transaction). A share whose partner has not connected yet stays on the Kaenz platform balance in pending_payouts and is released automatically once that partner's account is active. There is no fixed fallback account.
A verified account books from /fleet/{id} (bookable yachts) → POST /api/checkout → Stripe Checkout. Success lands on /book/confirmed. POST /api/checkout/guest is closed (410). Owners and captains still list boats from /join. There is no demo pay path.
Run supabase/schema.sql in the SQL editor, then set the env vars on Vercel.
yacht_listings / marina_listings are optional (operator-submitted inventory). If those tables are missing, the API serves seed-real rows from the origin FL catalog (Galeon, Tempest 42, SAVVY, Pink Lady, Amani at Miami Beach Marina, Island Gardens, Las Olas Marina, Hollywood Marina, Palm Beach Town Docks) and upserts them into public.yachts when the service role key is present.
If the Supabase project is paused, unpause it in the dashboard. Minimum env: NEXT_PUBLIC_SUPABASE_URL + NEXT_PUBLIC_SUPABASE_ANON_KEY. Writes need SUPABASE_SERVICE_ROLE_KEY.
curl -s https://kaenz.com/api/yachts
curl -s https://kaenz.com/api/marinas
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://kaenz.com/api/checkout/guest
The guest route answers 410. A signed-in, verified account uses POST /api/checkout from the yacht page. Click path: /fleet → Bookable now → a yacht. Without a session the page links to /signup?next= and /login?next=. With a verified session the booking form posts to /api/checkout and Stripe Checkout. Cancel returns to /fleet/{id}?checkout=cancel. Success shows /book/confirmed. Catalog cards stay on /fleet/{id}. Owners/captains apply on /join. /app stays behind login and a verified email.
Fare is always computed server-side from yacht + kind + hours. Client amount / price / total on POST /api/checkout are ignored. Unknown yachtId is rejected. Email must be valid. Bookings are marked paid only after a verified Stripe webhook (checkout.session.completed or checkout.session.async_payment_succeeded, and only when payment_status is not unpaid).
Kaenz is an end-to-end platform, not a charter operator. Independent owners, captains, and marinas run Commute, Tour, and Special Occasion trips.
An algorithm prices each trip from trip type, duration, yacht type, guests, and date.
Fee split: owner 38% / captain 30% / Kaenz 25% / pickup marina 3.5% / dropoff marina 3.5%. Optional captain gratuity (15–20%) is on top and goes directly to the captain. Payments: Stripe.