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/serverlessdriver) - About 15 minutes
Install in 4 steps
# 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
# 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 | |
|---|---|
| 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) orPOST /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 |
|---|---|---|
| Configured email add-on, SMTP fallback | Reservation, reminder, cancellation, payment | |
| 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
- Installation Guide — detailed setup
- Deployment Guide — ship to production
- Admin Guide — run your rental business day-to-day
- API Documentation — the REST surface, plus the live reference at
/api/docs/v1 - Add-on Development Guide — extend Jobs Hub
- Customization Guide — change the vertical's fields, filters and vocabulary
© CreativeCape Solutions · creative-cape.com · support@creative-cape.com