DEV Community

Cover image for I Built a Free Open-Source Hotel AI (By Accident)
Arash Karimzadeh
Arash Karimzadeh

Posted on

I Built a Free Open-Source Hotel AI (By Accident)

Hotels pay $200-2,000/month for chatbot SaaS that locks in their data and charges per message. I built a free, self-hosted alternative.

Jack The Butler is an open-source AI concierge that handles guest communication across WhatsApp, SMS, email, and web chat. Hotels deploy it on their own infrastructure; ONE Docker container, ONE SQLite file, ZERO vendor lock-in.

Why I built this

I've been building hospitality tech for over a decade. My first company, Goki, is a smart lock solution now in over 100 cities worldwide that disrupted how hotels handle access control. Through that experience I talked to hundreds of hotel operators and kept seeing the same problem: they want automated guest messaging, but every solution on the market is a $500+/month SaaS with per-message fees and mandatory cloud hosting. A 50-room boutique hotel shouldn't need to spend $6,000/year just to auto-reply "checkout is at 11am" on WhatsApp.

So I built Jack — a single container that does what those platforms do, but runs on the hotel's own server.

The tech stack

I chose boring, reliable technology:

  • Runtime: Node.js 22 + TypeScript
  • Framework: Hono — fast, lightweight, runs anywhere
  • Database: SQLite via Drizzle ORM — single file, zero config, easy backup (just copy the file)
  • Vector search: sqlite-vec — embeddings for the knowledge base, no Postgres/pgvector needed
  • AI: Anthropic Claude, OpenAI, Ollama, or local models via Transformers.js
  • Dashboard: React + Vite + Tailwind
  • Channels: WhatsApp Business API, Twilio SMS, SMTP email, embeddable web chat widget

Everything runs in a single container. No Redis, no Postgres, no message queue. Hotels don't have DevOps teams, the architecture needs to be "deploy and forget."

Architecture decisions worth sharing

SQLite for everything

This is the most controversial choice. "SQLite doesn't scale!". Sure, but a 200-room hotel processes maybe 500 messages/day. SQLite handles millions of rows without breaking a sweat. The operational simplicity is worth it: backup is cp jack.db jack.db.bak, migration is trivial, and there's zero configuration.

I use sqlite-vec for vector embeddings (knowledge base search), which keeps everything in one database file. No need for a separate vector database.

Kernel/adapter architecture

The core business logic (message processing, task routing, escalation) lives in src/core/ and knows nothing about WhatsApp or Claude. External integrations live in src/apps/ as adapters. Adding a new channel or AI provider means implementing an interface, the core doesn't change.

src/
├── core/           # Business logic (channel-agnostic)
│   ├── message-processor.ts
│   ├── task-router.ts
│   └── escalation-engine.ts
├── apps/           # Adapters
│   ├── ai/         # Claude, OpenAI, Ollama, Local
│   ├── channels/   # WhatsApp, SMS, Email, Web Chat
│   └── pms/        # Property Management Systems
Enter fullscreen mode Exit fullscreen mode

AI provider abstraction

Hotels should not be locked into one AI vendor. Jack abstracts the AI layer so you can switch between Claude, GPT, Ollama, or even fully local models (Transformers.js) without changing anything else. The local option means a hotel can run AI responses without any external API calls or costs; useful for privacy-conscious properties or those with unreliable internet.

Web chat widget

The embeddable chat widget is a single JS file that hotels add to their website with one script tag:

<button data-butler-chat>Chat</button>
<script src="https://your-server.com/widget.js"
        data-butler-key="wc_..."></script>
Enter fullscreen mode Exit fullscreen mode

It auto-discovers [data-butler-chat] elements and binds click handlers. Two presets: a floating bubble (position: fixed) or an inline styled button. Hotels customize colors and branding from the dashboard.

What I learned

1. Hotels are not developers. The setup wizard was an afterthought — then I realized it's the most important feature. If a hotel manager can't go from docker run to a working chatbot in 5 minutes, the project fails. I spent more time on the setup UX than on the AI integration.

2. Escalation is the killer feature. Hotels don't want AI that pretends to know everything. They want AI that handles the easy 80% and smoothly hands off the hard 20% to a human with full context. The escalation engine; detecting when the AI is uncertain and routing to the right staff member, is where the real value is.

3. Knowledge base > prompt engineering. Instead of crafting elaborate system prompts, I built a semantic search knowledge base. Hotels paste in their information (or Jack scrapes their website), it gets embedded, and the AI retrieves relevant context per question. This works dramatically better than trying to fit everything into a system prompt.

4. WhatsApp is king internationally. In the US, hotels think of SMS. Everywhere else, it's WhatsApp. Supporting WhatsApp Business API was table stakes and it's more powerful than SMS (rich media, read receipts, template messages, interactive buttons).

Try it

Deploy in one click on Railway, Render, or Zeabur:

# Or run locally with Docker
docker run -d -p 3000:3000 -v jack-data:/app/data \
  ghcr.io/jackthebutler/jackthebutler:latest
Enter fullscreen mode Exit fullscreen mode

Then open http://localhost:3000 and the setup wizard guides you through.

It's free, self-hosted, and the code is open. If you run a hotel, a B&B, or a vacation rental. Give it a TRY. If you're a developer, PRs are welcome.


What do you think? Would love to hear from anyone in hospitality tech or anyone who's built self-hosted SaaS alternatives. Drop a comment or open an issue on GitHub.

Top comments (0)