<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arash Karimzadeh</title>
    <description>The latest articles on DEV Community by Arash Karimzadeh (@arashkay).</description>
    <link>https://dev.to/arashkay</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3772481%2Fd1ae4d91-009d-4b4a-8ec9-839f7f2f20e9.jpg</url>
      <title>DEV Community: Arash Karimzadeh</title>
      <link>https://dev.to/arashkay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arashkay"/>
    <language>en</language>
    <item>
      <title>I Built a Free Open-Source Hotel AI (By Accident)</title>
      <dc:creator>Arash Karimzadeh</dc:creator>
      <pubDate>Sat, 14 Feb 2026 10:41:50 +0000</pubDate>
      <link>https://dev.to/arashkay/i-built-a-free-open-source-hotel-ai-by-accident-309i</link>
      <guid>https://dev.to/arashkay/i-built-a-free-open-source-hotel-ai-by-accident-309i</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jackthebutler.com" rel="noopener noreferrer"&gt;Jack The Butler&lt;/a&gt;&lt;/strong&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;p&gt;I chose boring, reliable technology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js 22 + TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; &lt;a href="https://hono.dev" rel="noopener noreferrer"&gt;Hono&lt;/a&gt; — fast, lightweight, runs anywhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; SQLite via &lt;a href="https://orm.drizzle.team" rel="noopener noreferrer"&gt;Drizzle ORM&lt;/a&gt; — single file, zero config, easy backup (just copy the file)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector search:&lt;/strong&gt; &lt;a href="https://github.com/asg017/sqlite-vec" rel="noopener noreferrer"&gt;sqlite-vec&lt;/a&gt; — embeddings for the knowledge base, no Postgres/pgvector needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; Anthropic Claude, OpenAI, Ollama, or local models via Transformers.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard:&lt;/strong&gt; React + Vite + Tailwind&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channels:&lt;/strong&gt; WhatsApp Business API, Twilio SMS, SMTP email, embeddable web chat widget&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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."&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture decisions worth sharing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SQLite for everything
&lt;/h3&gt;

&lt;p&gt;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 &lt;code&gt;cp jack.db jack.db.bak&lt;/code&gt;, migration is trivial, and there's zero configuration.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Kernel/adapter architecture
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AI provider abstraction
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web chat widget
&lt;/h3&gt;

&lt;p&gt;The embeddable chat widget is a single JS file that hotels add to their website with one script tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;data-butler-chat&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Chat&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://your-server.com/widget.js"&lt;/span&gt;
        &lt;span class="na"&gt;data-butler-key=&lt;/span&gt;&lt;span class="s"&gt;"wc_..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It auto-discovers &lt;code&gt;[data-butler-chat]&lt;/code&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;2. Escalation is the killer feature.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Knowledge base &amp;gt; prompt engineering.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. WhatsApp is king internationally.&lt;/strong&gt; 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).&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Deploy in one click on Railway, Render, or Zeabur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Or run locally with Docker&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="nt"&gt;-v&lt;/span&gt; jack-data:/app/data &lt;span class="se"&gt;\&lt;/span&gt;
  ghcr.io/jackthebutler/jackthebutler:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://localhost:3000&lt;/code&gt; and the setup wizard guides you through.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://jackthebutler.com" rel="noopener noreferrer"&gt;jackthebutler.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/JackTheButler/JackTheButler" rel="noopener noreferrer"&gt;github.com/JackTheButler/JackTheButler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://demo.jackthebutler.com" rel="noopener noreferrer"&gt;demo.jackthebutler.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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




&lt;p&gt;&lt;em&gt;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.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
