尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證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.