尚未检测到更新。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.