Discord New message on /pricing — “Hey, do you ship to Shopify too?” just now

Make your website
alive & social

Add a chat room to any page in 3 seconds. Visitors
become 3D avatars - help them in real-time.

<script src="https://floorsjs.com/embed.js" data-key="flr_..." ></script>
This page is the demo. Look at the bottom-right corner. That building icon? Click it. You're already inside. Open a second tab to see yourself appear.

Your website feels static.

You check your analytics. 200 visits yesterday. Zero conversations. They came, they read, they left. You'll never know what they thought or wanted.

What if you could talk to them directly? floors.js turns your site into a place

Paste once. Done.

No backend. No SDK. No config. Works on anything — static sites, Next.js, WordPress, Shopify.

1

Paste one line

Drop the script tag in your HTML. Your pages become rooms automatically — no config needed.
2

Visitors appear as avatars

Everyone gets a random name and a blocky 3D avatar. No signup, no prompt, no friction.
3

Talk to them. Really.

Visitors move around and chat. You can message them directly while they're still on your page.

Here's what you get

Fast to add, fast to load, impossible to forget.

See your visitors, live

The moment someone lands, they appear. WebSocket-powered — no polling, no refresh, no guessing who's on your site right now.

Isometric 3D rooms

Each page becomes a Habbo-style room — checkerboard floor, walls, window. Click anywhere to walk. Other visitors watch it happen in real-time.

Smart real-time chat

Speech bubbles, @mentions, /commands and private whispers — perfect for 1-on-1 help or to send an exclusive discount code!

Zero setup

Scans your nav links and turns them into rooms automatically. No config file, no list of routes. Override with data-pages if you want.

No friction for visitors

No account. No name prompt. Visitors get a random name (everyone can rename) and connect instantly on page load.

SPA-ready

Hooks into pushState and popstate. React, Next.js, Vue, Nuxt, Astro — room changes happen on route change, automatically.

Every conversation, saved

All chat messages are archived for 3 days. Request your logs anytime — see what visitors talked about, what questions they asked, even after they leave.

No cookies. No tracking.

A random pseudonym in localStorage. Nothing else. No IP logs, no personal data. GDPR-friendly without trying.

One price. Yours forever.

Works on all your websites.

🏆 Product of the Day on Uneed • 200+ votes on Product Hunt

Common questions

How does the visitor limit work?
Anyone connected at the same moment counts as one slot. Slots free up when a tab is closed or when they navigate away. If the building is full, new visitors queue and join automatically when a spot opens.
Will it slow down my site?
No. The widget shell loads instantly (< 1 KB inline). Three.js is loaded asynchronously from a CDN after your page is ready — it never blocks rendering. No impact on your Core Web Vitals.
Do my visitors need to sign up or install anything?
No. Visitors get a random name and avatar automatically — zero prompts, zero friction. They just land on your page and they're in.
Does it work with Next.js, WordPress, Shopify?
Yes. For static sites, WordPress, and Shopify — paste the script tag in your theme's footer. For SPAs (Next.js, Vue, Nuxt, Astro), room changes happen automatically on route change. No extra config either way. See all integrations →
Can visitors spam or abuse the chat?
It's locked down by default. Links and promo are blocked, chat is rate-limited (1 msg/sec), repeated messages are auto-muted, and offensive names are rejected. As the owner, you can kick or ban anyone in one click, and whisper them privately. You can also enable private mode — visitors only see you, not each other.
Can I use it on multiple websites?
Yes! Just add your key to all your websites!
What if it's not for me?
You have 7 days to try it. If you're not happy, email us and we'll refund you!
Another question? Ask it in the chat →

Customise your widget.

Drop the attributes on your script tag as needed.

Setup
data-key
Required
Your site identifier. Scopes all visitors and rooms to your site.
data-key="flr_..."
data-name
default: page <title>
Display name shown in the widget header.
data-name="My Product"
data-open
default: "false"
Open the widget panel automatically on page load.
data-open="true"
data-owner-name
default: none
Shows a golden crown on your avatar. Set this to your name, enter the same name in the widget, then verify with your settings code (sent by email).
data-owner-name="Vincent"
data-owner-always
default: "false"
Always show the owner's avatar in the home room, even when the owner is offline or in another room. Requires data-owner-name. No more empty rooms.
data-owner-always="true"
Rooms
data-pages
default: auto-detect
Comma-separated list of pages to show as rooms. When set, the widget only loads on these pages. Auto-detected from your <nav> if omitted. Up to 10 rooms.
data-pages="/,/about,/pricing"
data-exclude
default: none
Comma-separated paths to hide the widget on. Supports wildcards (*). Widget disconnects on these pages.
data-exclude="/login,/signup,/app/*"
Appearance
data-accent
default: "#6366f1"
Custom accent color for the widget UI. Match it to your brand.
data-accent="#FF6B00"
data-theme
default: "dark"
Default color theme for the widget. Visitors who toggle the theme manually keep their preference via localStorage.
data-theme="light"
data-theme-toggle
default: "false"
Show a sun/moon toggle in the widget header so visitors can switch between light and dark mode.
data-theme-toggle="true"
Chat
data-pinned-message
default: none
A message pinned at the top of the chat. Use a JSON map for per-room messages.
data-pinned-message="Hey, ask me anything!"
data-pinned-message='{"*":"Welcome!","/pricing":"Check our plans!"}'
data-room-chat
default: "false"
Scope chat messages to the current room. When enabled, visitors only see messages sent from the same page. By default, chat is shared across all rooms.
data-room-chat="true"
data-no-links
default: "true"
Block messages containing URLs or links in the chat. Prevents spam and self-promotion. Set to "false" to allow links.
data-no-links="false"
data-no-promo
default: "true"
Block promotional messages (buy, discount, promo, subscribe, follow me…) from the chat. Set to "false" to allow promo.
data-no-promo="false"
data-auto-reply-keyword
data-auto-reply-message
default: none
Auto-reply whisper triggered when a visitor types an exact keyword (case-sensitive). Only the visitor who typed it sees the reply. Use both attributes together.
data-auto-reply-keyword="DISCOUNT"
data-auto-reply-message="Here's your code: CHAT25"
Visitors
data-allow-rename
default: "false"
Allow visitors to change their display name after entering. Disabled by default — set to "true" to let visitors rename themselves.
data-allow-rename="true"
data-private
default: "false"
Private mode — visitors are isolated from each other. Each visitor only sees the owner. Visitor messages are only visible to the owner. Owner messages are broadcast to all visitors. Ideal for support or helpdesk use cases.
data-private="true"

Discord notifications

Get pinged on Discord when a visitor sends a message on your site.

1

After your payment, you'll receive an email with a private settings link.

2

Click the link, paste your Discord webhook URL, and hit Save. Done.

Your webhook URL never leaves our server. Visitors and anyone viewing your site's source code cannot see it. Notifications are rate-limited to one per minute per site.
Widget not showing up?
Check your browser console. If you see a Content-Security-Policy error, your site blocks external scripts. Add floorsjs.com to your CSP:
script-src ... https://floorsjs.com
connect-src ... https://floorsjs.com wss://floorsjs.onrender.com
Using Cloudflare? Check your security settings — Cloudflare may block inline scripts or WebSocket connections. Whitelist the domains above.

Bring your website to life.

One script tag. Get the launch deal now
and own floors.js forever.

Get lifetime access