Voyant
The open-source travel commerce framework for OTAs, tour operators, and DMCs.
Documentation | Website
Voyant ships deployable starter apps, durable workflow orchestration, and a wide set of headless domain modules (catalog, commerce, inventory, operations, relationships, quotes, bookings, finance, distribution, legal, charters, cruises, accommodation resale, and more) that you compose into your own travel platform.
Getting started
Install the CLI, scaffold an app from a first-party starter, and run it locally.
# 1. Install the CLI
npm install -g @voyant-travel/cli
# 2. Scaffold a project from the operator starter
voyant new my-travel-app
cd my-travel-app
pnpm install
# 3. Configure the app
cp .env.example .env
# set your secrets (DATABASE_URL, BETTER_AUTH_ADMIN_SECRET, …) in .env
# 4. Run the app
pnpm db:migrate
pnpm dev
voyant newscaffolds from theoperatorstarter by default. Pass--starter <name>to pick another built-in starter (downloaded from GitHub Release assets for the matching CLI release), or point it at a custom local starter directory.
Visit the documentation to learn more.
What is Voyant?
Voyant is a framework for building travel commerce platforms. Instead of a monolithic booking system, it gives you composable, headless domain modules and deployable application shells that you own and extend.
- Deployable application shells, not just isolated packages. First-party starters ship as real, runnable apps.
- A normalized travel operations data model on PostgreSQL + Drizzle.
- Headless domain modules for catalog, commerce, inventory, operations, relationships, quotes, bookings, finance, distribution, legal, charters, cruises, accommodation resale, and more.
- Hono-based API transport with optional Next.js route helpers.
- Durable, step-based workflow orchestration that runs on self-host infrastructure or Voyant Cloud's hosted runtime.
- Better Auth wiring in first-party starters, with core packages staying auth-provider agnostic.
- Versioned React packages per domain (
relationships-react,inventory-react,commerce-react,bookings-react, …) consumed as ordinary dependencies: hooks, clients, providers, query keys, and reusable UI that wrap each module's HTTP contract. - Optional integrations for payments, e-invoicing, storage, CMS sync, and notifications.
Voyant supports accommodation as catalog inventory for resale, packaging, and
trip composition. It is not positioned as a hotel PMS or first-party
hotel-operations system. See
docs/architecture/accommodation-resale-boundary.md.
Starters
Voyant ships one first-party starter:
| Starter | Purpose | Stack |
|---|---|---|
starters/operator |
Tour operator workflows | Cloudflare Workers, TanStack Start, Hono, Better Auth, Drizzle |
The framework surface
Core platform
| Package | Description |
|---|---|
@voyant-travel/core |
Module system, container, event bus, and plugins |
@voyant-travel/db |
Drizzle schemas, TypeID, and database adapters |
@voyant-travel/hono |
createApp, middleware, auth, and actor guards |
@voyant-travel/react |
Shared React provider and typed fetch client |
@voyant-travel/auth |
Better Auth wiring for first-party starters |
@voyant-travel/auth-react |
Auth React hooks and components |
@voyant-travel/types |
Shared workspace types |
@voyant-travel/utils |
Shared utility functions |
@voyant-travel/voyant-test-utils |
Test helpers (db, http, seq, cli) |
@voyant-travel/cli |
The voyant CLI: scaffolding, generators, and db tooling |
@voyant-travel/storage |
StorageProvider abstraction (local, R2, S3) |
@voyant-travel/i18n |
Internationalization primitives |
Travel domain modules
| Package | Description |
|---|---|
@voyant-travel/catalog |
Products, tours, packages, and media |
@voyant-travel/commerce |
Pricing, offers, and sellability |
@voyant-travel/inventory |
Bookable inventory and availability |
@voyant-travel/operations |
Suppliers and operational logistics |
@voyant-travel/bookings |
Booking lifecycle and participants |
@voyant-travel/finance |
Invoicing, payments, tax, and profitability |
@voyant-travel/legal |
Contracts and policies |
@voyant-travel/notifications |
Email/SMS provider abstraction |
@voyant-travel/distribution |
Channel distribution |
@voyant-travel/relationships |
CRM: people, organizations, and pipelines |
@voyant-travel/quotes |
Quotes and trip revisions |
@voyant-travel/trips |
Trip composition and itineraries |
@voyant-travel/identity |
Contact points, addresses, and named contacts |
@voyant-travel/storefront |
Public booking-portal surface |
@voyant-travel/accommodations |
Accommodation resale inventory |
@voyant-travel/charters |
Charter products |
@voyant-travel/cruises |
Cruise products |
@voyant-travel/flights |
Flight products |
Workflows (durable orchestration)
Step-based workflows with durable state, retries, and a shared wire protocol, runnable on self-host infrastructure or Voyant Cloud's hosted runtime.
| Package | Description |
|---|---|
@voyant-travel/workflows |
Authoring SDK, with ./bindings, ./config, and ./errors subpaths |
@voyant-travel/workflows-orchestrator |
Orchestrator engine and Postgres self-host runtime primitives |
@voyant-travel/workflows-react |
Run-inspection hooks, plus an importable admin UI at ./ui |
Self-hosting composes the ./selfhost export of
@voyant-travel/workflows-orchestrator (the Node runtime) with the
@voyant-travel/workflows-react/ui dashboard; Voyant Cloud provides the same
runtime as a managed service.
UI and React families
Reusable frontend surfaces live in the matching -react package for each
domain module. Those packages own hooks, clients, providers, query keys,
view-model helpers, reusable components, and ./ui owner paths where needed.
For example, @voyant-travel/relationships-react,
@voyant-travel/quotes-react,
@voyant-travel/inventory-react,
@voyant-travel/commerce-react, and
@voyant-travel/bookings-react. Bookings requirements
live under @voyant-travel/bookings-react/requirements; checkout UI lives under
@voyant-travel/finance-react/checkout-ui. The shared admin shell lives in
@voyant-travel/admin; cross-cutting primitives in
packages/ui.
Plugins
| Package | Description |
|---|---|
@voyant-travel/plugin-netopia |
Netopia payments |
@voyant-travel/plugin-smartbill |
SmartBill e-invoicing (Romanian tax compliance) |
@voyant-travel/plugin-payload-cms |
Payload CMS sync |
@voyant-travel/plugin-sanity-cms |
Sanity CMS sync |
Architecture
Voyant keeps a strict boundary between reusable business logic and deployment shells:
packages/*hold reusable business logic, schemas, services, routes, adapters, and contractsstarters/*and app shells own UI, auth wiring, deployment shape, and runtime-specific configuration- Core packages stay framework-agnostic even when first-party starters use React, TanStack Start, Hono, Better Auth, and Cloudflare Workers
- Transport adapters stay thin and call shared domain services rather than owning business logic
- Workflow business logic ships as plain SDK packages; orchestrator/runner apps wrap them for a given runtime
Architecture decisions live in docs/adr/; domain conventions
live in docs/architecture/; per-minor migration notes
live in docs/migrations/.
Security model
One Postgres database + one runtime per organization. Tenancy is enforced
at the deployment boundary, not by in-process middleware, so new package work
under packages/* should not add in-process tenant scoping. See
ADR-0001 for the full rationale, the
alternatives considered, and the conditions under which the decision should be
revisited.
Contributing
This repository is the workspace that powers the framework, starters, runners, and examples.
| Area | What it contains |
|---|---|
packages/* |
Reusable business logic, schemas, services, transport adapters, and integrations |
packages/plugins/* |
First-party plugin bundles (payments, invoicing, CMS sync) |
starters/* |
First-party starter apps |
apps/* |
Reference/demo apps, the shadcn registry host, and agent workers |
examples/operator-demo |
Destructive and generated Operator demo fixtures |
Monorepo commands
Voyant uses pnpm workspaces and Turborepo.
| Command | Description |
|---|---|
pnpm install |
Install workspace dependencies |
pnpm build |
Build the workspace with Turborepo |
pnpm typecheck |
Run workspace typechecks |
pnpm test |
Run workspace tests |
pnpm test:bookings:integration |
Start or reuse the Docker test Postgres, ensure the bookings test schema, and run the bookings integration files serially |
pnpm lint |
Run Biome checks across the repo |
pnpm generate:schema-docs |
Regenerate SCHEMA.md from the Drizzle table definitions |
pnpm -F operator dev |
Start the operator starter on port 3300 |
Integration test database
The shared Docker test Postgres is defined in
docker-compose.test.yml.
- default host port:
5436 - override with
TEST_DATABASE_PORT - override the full connection string with
TEST_DATABASE_URL
For the bookings package, contributors can use:
pnpm test:bookings:integration
That helper starts or reuses the Docker test DB, applies starter migrations, ensures the current additive bookings-session table exists, and runs the bookings DB-backed integration files serially to avoid deadlocks from concurrent table truncation.
Community & support
- Documentation: guides, references, and concepts
- GitHub Issues: bugs and feature requests
- @voyant_travel: news and updates
Credits
Voyant is created and maintained by PixelMakers.
License
Licensed under the Apache License, Version 2.0 (Apache-2.0).