Kaenz is an end-to-end yacht platform for Commute, Tour, and Special Occasion trips worldwide. Pay with Stripe.
LifestyleTypeScript · JavaScriptGitHub @Salvazion-IncOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Kaenz origin platform — leave the car and travel by yacht. Next.js + Grok + Supabase.
Taken from the repository README
Loading the full README.
Read the full 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.