https://github.com/twelvehouse/chatanywhere
Dalamud plugin that lets you read and send FFXIV chat from a web browser
https://github.com/twelvehouse/chatanywhere
dalamud-plugin ffxiv-plugin
Last synced: about 2 months ago
JSON representation
Dalamud plugin that lets you read and send FFXIV chat from a web browser
- Host: GitHub
- URL: https://github.com/twelvehouse/chatanywhere
- Owner: twelvehouse
- Created: 2026-03-18T07:33:05.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-04-07T01:54:35.000Z (2 months ago)
- Last Synced: 2026-04-07T03:28:17.082Z (2 months ago)
- Topics: dalamud-plugin, ffxiv-plugin
- Language: TypeScript
- Homepage:
- Size: 9.4 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
ChatAnywhere
Read and send your FFXIV in-game chat from any browser — at home or on the go.
ChatAnywhere is a [Dalamud](https://github.com/goatcorp/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.
> **A note on ChatTwo:**
> ChatAnywhere started as a personal reimplementation of the ideas first realized by **ChatTwo** — one of the best chat plugins ever made for FFXIV.
> The channel handling, UI concept, and overall approach all owe a deep debt to that project and its author.
> I have enormous respect for ChatTwo. If you haven't tried it, please do.
> *(I would have asked permission before publishing this, but the language barrier made that difficult — I'm sorry for that.)*
---
## 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
- **Sound notification** — plays an in-browser SE sound on new messages

### 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
### 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`, 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.
### 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

- 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. Add the custom repository
Open **Dalamud Settings → Experimental** and paste the following URL into **Custom Plugin Repositories**:
```
https://raw.githubusercontent.com/twelvehouse/DalamudPlugins/main/pluginmaster.json
```
Click **+**, save, then search for **ChatAnywhere** in the plugin browser 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](https://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](https://github.com/Infiziert90/ChatTwo) | Original inspiration — concept, channel handling, and UI approach |
| [Dalamud](https://github.com/goatcorp/Dalamud) | Plugin framework and FFXIV game API |
| [NetStone](https://github.com/xivapi/NetStone) | Lodestone character avatar lookups |
| [OpenGraph-Net](https://github.com/ghorsey/OpenGraph-Net) | URL Open Graph preview metadata |
| [Watson.Lite](https://github.com/jchristn/WatsonWebserver) | Embedded HTTP server and SSE support |
| [@dnd-kit](https://dndkit.com/) | Drag-and-drop filter and folder reordering |
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
```