Skip to content

twelvehouse/ChatAnywhere

Repository files navigation

ChatAnywhere icon

ChatAnywhere

Host your chat on a web server so you can talk from anywhere.

Download count
Chat view on desktop Chat view on mobile

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.


Features

Real-time chat streaming

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.

Custom filters

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

Filter editor

Tell mode

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

Emote & symbol picker

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.

Send queue

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.

Link preview

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.

Link safety

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.

Appearance

Appearance settings

  • 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)

Setup

1. Install the plugin

Open the Dalamud Plugin Installer, search for ChatAnywhere, and install it.

2. Set a passcode

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.

3. Open the chat UI

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:

  1. Download and install Tailscale on the PC running FFXIV: tailscale.com/download

  2. Install the Tailscale app on the remote device (Android / iOS / another PC) and sign in with the same account.

  3. 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.

  4. On the remote device, navigate to:

    http://100.x.x.x:3000
    

No port forwarding, no firewall rules, no router configuration needed.


Acknowledgements

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

About

Dalamud plugin that lets you read and send FFXIV chat from a web browser

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors