ChatAnywhere is a Dalamud plugin that runs a lightweight web server inside FFXIV. It streams your in-game chat to any browser in real time, and lets you send messages back without switching to the game window.
Messages arrive instantly via Server-Sent Events (no polling). All FFXIV channel types are supported: FC, LS1–8, CWLS1–8, Party, Tell, Say, Shout, Yell, Alliance, and more.
Each message shows the sender's Lodestone avatar, a coloured channel badge, auto-translate bracket rendering (【 … 】), and FFXIV item link indicators.
Create named filters that show only the channel types you care about. Organise filters into folders and reorder everything with drag-and-drop.
Each filter can have its own:
- Default send channel — the channel used when you press Send
- Unread badge — highlights the filter tab when new messages arrive while it's not active
Click any sender's name to enter Tell mode and reply to them directly.
- Pin the conversation to keep Tell mode active across multiple sends
- Use the channel switcher to switch between Tell and any other channel mid-session
- Recent Tell partners appear in the Direct Messages section of the sidebar — clicking one automatically pins them as the active send target
A built-in picker lets you perform emotes or insert FFXIV special characters without ever leaving the chat window.
Emotes tab — lists every emote you own, pulled live from your game data.
Search by name or /command (tap × to clear), see your recently used emotes at the top, and toggle whether the emote appears in the chat log (with or without the motion suffix).
Enable Confirm mode in Settings to require a second tap before the emote fires — handy on touchscreens.
Symbols tab — gives quick access to every FFXIV private-use symbol: party numbers ①–⑧, raid signs (Attack / Bind / Circle etc.), instance markers, time icons, and more.
After pressing Send, the message waits briefly before being delivered — giving you a moment to catch a typo or stop an accidental send. A countdown ring shows the time remaining. Tap anywhere in the message box to cancel and get your text back.
URLs from trusted sites (Lodestone, YouTube, Twitter/X, Twitch, Imgur, and more) automatically render an inline preview card showing the page title, description, and thumbnail. YouTube links show an embedded player you can watch without leaving the chat window.
Clicking a URL in chat opens a confirmation dialog before leaving the page. You can whitelist trusted domains so subsequent clicks open immediately without prompting.
- Switch between Light, Dark, and System (follows your OS) themes
- Choose any Google Font for the chat window
- Adjust font size
- Toggle italic rendering for system messages
- Enable coloured message backgrounds per channel type (subtle tint behind each message)
Open the Dalamud Plugin Installer, search for ChatAnywhere, and install it.
Before opening the browser UI, set a 4–8 digit numeric passcode in the plugin settings window (ChatAnywhere → Security). This passcode protects the web interface from unauthorised access.
Once the plugin is loaded and you are logged in to a character, open your browser and go to:
http://localhost:3000
You will be prompted to enter your passcode. After authenticating, the page streams your chat in real time.
To access from another device on the same network (phone, tablet, etc.), use your PC's local IP address instead:
http://192.168.x.x:3000
You can find your local IP by running ipconfig in a terminal and looking for the IPv4 address.
Accessing ChatAnywhere from outside your home network (Tailscale)
By default the server only listens on localhost, so it is not reachable from other devices.
To access it from your phone or laptop while away from home, the easiest solution is Tailscale — a free VPN that creates a private network between your devices with zero port-forwarding setup.
Steps:
-
Download and install Tailscale on the PC running FFXIV: tailscale.com/download
-
Install the Tailscale app on the remote device (Android / iOS / another PC) and sign in with the same account.
-
Once both devices appear in your tailnet, find the Tailscale IP of your gaming PC in the Tailscale admin panel or the system-tray icon — it looks like
100.x.x.x. -
On the remote device, navigate to:
http://100.x.x.x:3000
No port forwarding, no firewall rules, no router configuration needed.
ChatAnywhere would not exist without these projects:
| Project | Role |
|---|---|
| ChatTwo | Original inspiration — concept, channel handling, and UI approach |
| Dalamud | Plugin framework and FFXIV game API |
| NetStone | Lodestone character avatar lookups |
| OpenGraph-Net | URL Open Graph preview metadata |
| Watson.Lite | Embedded HTTP server and SSE support |
| React + React Compiler | Frontend framework with automatic memoization |
| Vite | Build tool and dev server |
| TanStack Query | Server-state caching and request deduplication |
| Zustand | Client-state management (settings, session) |
| @dnd-kit | Drag-and-drop filter and folder reordering |
| react-error-boundary | Error boundary for the message list |
| lucide-react | Icon set |
| clsx | Conditional className composition |
| rich-textarea | Textarea with character-range highlighting for the over-limit indicator |
| react-countdown-circle-timer | Animated countdown ring shown while a queued send is pending |
| Vitest + Testing Library | Unit and component testing |
| MSW | HTTP mocking shared between tests and the ?demo page |
| Husky + lint-staged | Pre-commit lint + test gate |
A note on ChatTwo: This project started as a fork of similar functionality found in ChatTwo. It has been largely rewritten for my own needs, but some code and approaches remain. Thanks for the OSS.
P.S. The author mentioned above has taken a keen interest in this project on the official Dalamud Discord — you can search "chat anywhere" (the space matters) to see for yourself.
I've muted him — but my gratitude remains. 😊(Written with Claude Sonnet 4.6)
How it works (technical overview)
FFXIV game process
└─ Dalamud plugin (C#)
├─ Subscribes to Dalamud chat events
├─ Watson.Lite HTTP server (default: port 3000)
│ │
│ │ Authentication
│ ├─ POST /auth → verify passcode (PBKDF2-SHA256 hash stored in config);
│ │ issues an HttpOnly SameSite=Strict session cookie on success
│ │
│ │ Protected endpoints (require valid session cookie)
│ ├─ GET /sse → SSE stream; pushes chat messages as JSON in real time
│ ├─ GET /history → paginated message history (loaded on scroll-up)
│ ├─ GET /channels → list of available chat channels for the logged-in character
│ ├─ POST /send → injects a message into the game's chat input
│ ├─ GET /emotes → list of emotes available to the logged-in character
│ ├─ GET /avatar → Lodestone character avatar lookup (proxied via NetStone)
│ ├─ GET /ogp → Open Graph metadata for URL link preview cards
│ └─ GET/PUT /settings → persists filters, folders, and appearance config
│ (returns 503 if no passcode has been configured yet)
│
│ Public endpoints (no auth required)
├─ GET / → serves the React SPA (dist folder bundled into the plugin at build time)
└─ GET /files/* → static game data files (SSF font, GFD icon data, PS5 fonticon texture)
GET /icon/{id} → emote icon served as PNG from game data
Browser (React + TypeScript SPA, built with Vite)
├─ Shows a passcode modal on load; re-prompts if a session cookie expires mid-use
├─ Connects to /sse SSE stream after authentication (withCredentials)
├─ Filter sidebar with drag-and-drop reordering (@dnd-kit/sortable)
├─ FFXIV Lodestone font (SSF TTF), GFD icon data, and PS5 fonticon texture loaded from the plugin server
├─ Avatar results cached in memory (per session)
└─ Settings and filters persisted server-side via PUT /settings



