Quick Start

Welcome to Jobs Hub — a production-ready Australian vacation-rental marketplace built with Next.js 16 (App Router), React 19, TypeScript, PostgreSQL and Tailwind CSS. This page gets you from a fresh download to a running site in about 15 minutes.

Jobs Hub ships as a vertical pack product: the engine is generic, and a pack supplies the vocabulary, fields, filters, master data and demo content for one business. The pack included is Jobs Hub — hosts publish a property with a nightly rate and a calendar, and guests reserve a check-in → check-out date range and pay. Switching the pack changes every noun on the site (property → consultation, host → practitioner, guest → patient) without touching engine code.

New here? Read Product Overview for the big picture, then come back to install.

What you need

  • Node.js 20+ and npm
  • A PostgreSQL database (we recommend Neon — Jobs Hub uses the @neondatabase/serverless driver)
  • About 15 minutes

Install in 4 steps

Terminal
# 1. Install dependencies
npm install

# 2. Create your environment file
#    Create .env.local with at least DATABASE_URL (JWT_SECRET / SECRET_KEY
#    are auto-generated by the install wizard's database step if unset).

# 3. Initialise the database (schema + seed)
npm run db:init

# 4. Start the dev server
npm run dev

Open http://localhost:3000. The first run launches the install wizard at /install — it walks you through the database check, admin account, and store settings.

Load the demo

Terminal
# Apply the vertical pack: master data, categories, fields, filters, copy
npx tsx scripts/apply-vertical.ts jobs-hub --yes

# Seed demo hosts, Australian properties, calendars, bookings and reviews.
# Imagery comes from Pexels — set PEXELS_API_KEY in .env for real photos,
# otherwise deterministic placeholders are used.
npm run vertical:demo

# Move the demo photos/videos off Pexels' CDN onto your own Storage
# channel (Settings → Channels → Storage must be connected first).
npx tsx scripts/pexels-media.ts

# Subscription plans for the demo hosts (cascades off hosts, so re-run after a re-seed)
npx tsx scripts/seed-plans.ts --hosts

# Storefront pages (privacy, cookies, terms, refunds, about)
npx tsx scripts/seed-site-pages.ts

# Account emails, plus booking/waitlist templates for Email, WhatsApp, SMS and Push
npx tsx scripts/seed-message-templates.ts
npx tsx scripts/seed-notification-templates.ts

Demo logins — password Password@1:

Role Email
Host host1@jobshubdemo.com … host5@jobshubdemo.com
Guest (customer) guest1@jobshubdemo.com … guest5@jobshubdemo.com

The three booking mechanics

Mode How availability works Used by
seat The host publishes dated sittings (experience_sessions) with a place count. Classes, tours, events
slot The host sets weekly hours (availability_rules); slots are expanded on read and only become a row when booked. Appointment businesses — clinics, salons, tutors
stay The host sets a nightly rate + calendar (blocked dates, per-date price overrides); guests reserve a check-in → check-out range directly on bookings — no session row at all. Jobs Hub (Australia)

The active pack declares which one it uses; the booking engine, calendar and checkout follow. Jobs Hub runs in stay mode — see src/product/booking/stay-schema.ts and src/lib/booking/stay.ts for the availability/pricing model.

What the Jobs Hub pack gives you

Eight categories — Entire Homes, Apartments, Villas, Beachfront, CBD & City Views, Outback Retreats, Unique Stays and Serviced Apartments — plus its own master tables on top of the shared ones: property_type, stay_style, property_amenity, safety_item, house_rule, bed_type and certification. Booking runs on the stay engine — hosts set a nightly rate, minimum/maximum nights and a blocked-dates calendar, and guests pick a date range priced server-side (nights × rate + a one-time cleaning fee). All master tables are admin-editable under Master Data, and they drive the listing editor, the browse facets and the host profile. The demo catalogue is Australia-based (Sydney, Melbourne, the Gold Coast, Hamilton Island, the Red Centre and more), priced in AUD.

Host calendar & rates

The nightly-stay engine's own set of tools, distinct from the seat/slot course machinery below:

  • Rates — listings.nightly_rate/cleaning_fee/min_nights/max_nights/max_guests/check_in_from/check_out_by, edited from the host listing form's Capacity & Budget tab.
  • Calendar — resource_days (resource_type = 'listing') holds per-date overrides: block a date or override its price. Managed from the host Calendar page (src/components/host/StayCalendar.tsx) or POST /api/v1/host/stay-calendar.
  • Availability guard — an exclusion constraint (bookings_stay_no_overlap) makes two guests reserving overlapping dates a database-level race the same way seat capacity is, rather than an application-level check that can be beaten.

Courses, blocks and waitlists (seat-mode packs)

Two things a class-based studio needs that a plain drop-in engine does not have — not used by the active stay pack, but available if you switch to a seat-mode vertical:

  • Courses (session_series) — one purchase covering a block of dated sessions: a six-week beginners' course, a teacher training, a retreat. A series owns no seat counter of its own; enrolling claims a place in every session in the block, so a course and a drop-in compete for the same room and can never oversell each other.
  • Waitlists (session_waitlist) — a full class is no longer a dead end. Students queue for a date, and when a booking is cancelled the front of the queue is notified automatically. An offer is a head start, not a hold: the student still checks out normally.

Notifications

Four channels, all template-driven from Settings → Notifications and all silent until their provider is connected under Settings → Channels:

Channel Transport Fired on
Email Configured email add-on, SMTP fallback Reservation, reminder, cancellation, payment
WhatsApp Connected WhatsApp add-on Reservation, reminder, cancellation, payment
SMS Connected SMS add-on Reservation, reminder, cancellation, payment
Push Firebase Cloud Messaging → the mobile app Reservation, cancellation

Every seeded template is worded from the active pack's own vocabulary and, for stay bookings, shows check-in → check-out and nights rather than a single session time (scripts/seed-message-templates.ts / scripts/seed-notification-templates.ts — re-run either after switching packs). Push additionally needs a Firebase service account under Settings → Push. The mobile app registers each device with POST /api/v1/customer/fcm/token; tokens are pruned automatically when FCM reports them unregistered, and every send respects the guest's notify_push preference.

Core environment variables

Variable Purpose
DATABASE_URL PostgreSQL connection string
JWT_SECRET Signs admin/customer session tokens
SECRET_KEY AES-256-GCM key that encrypts stored integration secrets
PEXELS_API_KEY Optional — real demo imagery instead of placeholders
LICENSE_SERVER_URL License server (defaults to https://creative-cape.com)

See the Installation Guide for the full list and the License Guide for activation.

Where to go next


© CreativeCape Solutions · creative-cape.com · support@creative-cape.com