{"id":47597406,"url":"https://github.com/twelvehouse/chatanywhere","last_synced_at":"2026-04-14T01:01:12.299Z","repository":{"id":345261619,"uuid":"1185053090","full_name":"twelvehouse/ChatAnywhere","owner":"twelvehouse","description":"Dalamud plugin that lets you read and send FFXIV chat from a web browser","archived":false,"fork":false,"pushed_at":"2026-04-07T01:54:35.000Z","size":9861,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-07T03:28:17.082Z","etag":null,"topics":["dalamud-plugin","ffxiv-plugin"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/twelvehouse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-18T07:33:05.000Z","updated_at":"2026-04-07T01:54:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/twelvehouse/ChatAnywhere","commit_stats":null,"previous_names":["twelvehouse/chatanywhere"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/twelvehouse/ChatAnywhere","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twelvehouse%2FChatAnywhere","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twelvehouse%2FChatAnywhere/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twelvehouse%2FChatAnywhere/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twelvehouse%2FChatAnywhere/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twelvehouse","download_url":"https://codeload.github.com/twelvehouse/ChatAnywhere/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twelvehouse%2FChatAnywhere/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31777348,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T00:11:49.126Z","status":"ssl_error","status_checked_at":"2026-04-14T00:10:29.837Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dalamud-plugin","ffxiv-plugin"],"created_at":"2026-04-01T18:22:36.127Z","updated_at":"2026-04-14T01:01:12.292Z","avatar_url":"https://github.com/twelvehouse.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"images/icon.png\" alt=\"ChatAnywhere icon\" width=\"96\"\u003e\n  \u003ch1\u003eChatAnywhere\u003c/h1\u003e\n  \u003cp\u003eRead and send your FFXIV in-game chat from any browser — at home or on the go.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"images/readme-chat.png\" alt=\"Chat view on desktop\" width=\"640\"\u003e\n  \u0026nbsp;\u0026nbsp;\n  \u003cimg src=\"images/readme-mobile.png\" alt=\"Chat view on mobile\" width=\"200\"\u003e\n\u003c/div\u003e\n\nChatAnywhere is a [Dalamud](https://github.com/goatcorp/Dalamud) plugin that runs a lightweight web server inside FFXIV.\nIt streams your in-game chat to any browser in real time, and lets you send messages back without switching to the game window.\n\n\u003e **A note on ChatTwo:**\n\u003e ChatAnywhere started as a personal reimplementation of the ideas first realized by **ChatTwo** — one of the best chat plugins ever made for FFXIV.\n\u003e The channel handling, UI concept, and overall approach all owe a deep debt to that project and its author.\n\u003e I have enormous respect for ChatTwo. If you haven't tried it, please do.\n\u003e *(I would have asked permission before publishing this, but the language barrier made that difficult — I'm sorry for that.)*\n\n---\n\n## Features\n\n### Real-time chat streaming\n\nMessages arrive instantly via Server-Sent Events (no polling).\nAll FFXIV channel types are supported: **FC, LS1–8, CWLS1–8, Party, Tell, Say, Shout, Yell, Alliance,** and more.\n\nEach message shows the sender's Lodestone avatar, a coloured channel badge, auto-translate bracket rendering (`【 … 】`), and FFXIV item link indicators.\n\n### Custom filters\n\nCreate named filters that show only the channel types you care about.\nOrganise filters into folders and reorder everything with drag-and-drop.\n\nEach filter can have its own:\n- **Default send channel** — the channel used when you press Send\n- **Unread badge** — highlights the filter tab when new messages arrive while it's not active\n- **Sound notification** — plays an in-browser SE sound on new messages\n\n![Filter editor](images/readme-filter.png)\n\n### Tell mode\n\nClick any sender's name to enter **Tell mode** and reply to them directly.\n- **Pin** the conversation to keep Tell mode active across multiple sends\n- Use the **channel switcher** to switch between Tell and any other channel mid-session\n- Recent Tell partners appear in the **Direct Messages** section of the sidebar\n\n### Emote \u0026 symbol picker\n\nA built-in picker lets you perform emotes or insert FFXIV special characters without ever leaving the chat window.\n\n**Emotes tab** — lists every emote you own, pulled live from your game data.\nSearch 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).\nEnable *Confirm mode* in Settings to require a second tap before the emote fires — handy on touchscreens.\n\n**Symbols tab** — gives quick access to every FFXIV private-use symbol:\nparty numbers ①–⑧, raid signs (Attack / Bind / Circle etc.), instance markers, time icons, and more.\n\n### Link preview\n\nURLs from trusted sites (Lodestone, YouTube, Twitter/X, Twitch, Imgur, and more) automatically render an inline preview card showing the page title, description, and thumbnail.\nYouTube links show an embedded player you can watch without leaving the chat window.\n\n![URL preview card](images/readme-ogp.png)\n\n### Link safety\n\nClicking a URL in chat opens a confirmation dialog before leaving the page.\nYou can whitelist trusted domains so subsequent clicks open immediately without prompting.\n\n### Appearance\n\n![Appearance settings](images/readme-appearance.png)\n\n- Choose any **Google Font** for the chat window\n- Adjust **font size**\n- Toggle **italic rendering** for system messages\n- Enable **coloured message backgrounds** per channel type (subtle tint behind each message)\n\n---\n\n## Setup\n\n### 1. Add the custom repository\n\nOpen **Dalamud Settings → Experimental** and paste the following URL into **Custom Plugin Repositories**:\n\n```\nhttps://raw.githubusercontent.com/twelvehouse/DalamudPlugins/main/pluginmaster.json\n```\n\nClick **+**, save, then search for **ChatAnywhere** in the plugin browser and install it.\n\n### 2. Set a passcode\n\nBefore opening the browser UI, set a **4–8 digit numeric passcode** in the plugin settings window (**ChatAnywhere → Security**).\nThis passcode protects the web interface from unauthorised access.\n\n### 3. Open the chat UI\n\nOnce the plugin is loaded and you are logged in to a character, open your browser and go to:\n\n```\nhttp://localhost:3000\n```\n\nYou will be prompted to enter your passcode. After authenticating, the page streams your chat in real time.\n\nTo access from another device on the same network (phone, tablet, etc.), use your PC's local IP address instead:\n\n```\nhttp://192.168.x.x:3000\n```\n\nYou can find your local IP by running `ipconfig` in a terminal and looking for the IPv4 address.\n\n\u003cdetails\u003e\n\u003csummary\u003eAccessing ChatAnywhere from outside your home network (Tailscale)\u003c/summary\u003e\n\nBy default the server only listens on `localhost`, so it is not reachable from other devices.\nTo 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.\n\n**Steps:**\n\n1. Download and install Tailscale on the PC running FFXIV:\n   [tailscale.com/download](https://tailscale.com/download)\n\n2. Install the Tailscale app on the remote device (Android / iOS / another PC) and sign in with the same account.\n\n3. 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`.\n\n4. On the remote device, navigate to:\n\n   ```\n   http://100.x.x.x:3000\n   ```\n\nNo port forwarding, no firewall rules, no router configuration needed.\n\n\u003c/details\u003e\n\n---\n\n## Acknowledgements\n\nChatAnywhere would not exist without these projects:\n\n| Project | Role |\n|---|---|\n| [ChatTwo](https://github.com/Infiziert90/ChatTwo) | Original inspiration — concept, channel handling, and UI approach |\n| [Dalamud](https://github.com/goatcorp/Dalamud) | Plugin framework and FFXIV game API |\n| [NetStone](https://github.com/xivapi/NetStone) | Lodestone character avatar lookups |\n| [OpenGraph-Net](https://github.com/ghorsey/OpenGraph-Net) | URL Open Graph preview metadata |\n| [Watson.Lite](https://github.com/jchristn/WatsonWebserver) | Embedded HTTP server and SSE support |\n| [@dnd-kit](https://dndkit.com/) | Drag-and-drop filter and folder reordering |\n\n\u003cdetails\u003e\n\u003csummary\u003eHow it works (technical overview)\u003c/summary\u003e\n\n```\nFFXIV game process\n └─ Dalamud plugin (C#)\n      ├─ Subscribes to Dalamud chat events\n      ├─ Watson.Lite HTTP server (default: port 3000)\n      │    │\n      │    │  Authentication\n      │    ├─ POST       /auth       → verify passcode (PBKDF2-SHA256 hash stored in config);\n      │    │                           issues an HttpOnly SameSite=Strict session cookie on success\n      │    │\n      │    │  Protected endpoints (require valid session cookie)\n      │    ├─ GET        /sse        → SSE stream; pushes chat messages as JSON in real time\n      │    ├─ GET        /history    → paginated message history (loaded on scroll-up)\n      │    ├─ GET        /channels   → list of available chat channels for the logged-in character\n      │    ├─ POST       /send       → injects a message into the game's chat input\n      │    ├─ GET        /emotes     → list of emotes available to the logged-in character\n      │    ├─ GET        /avatar     → Lodestone character avatar lookup (proxied via NetStone)\n      │    ├─ GET        /ogp        → Open Graph metadata for URL link preview cards\n      │    └─ GET/PUT    /settings   → persists filters, folders, and appearance config\n      │                                (returns 503 if no passcode has been configured yet)\n      │\n      │    Public endpoints (no auth required)\n      ├─ GET        /           → serves the React SPA (dist folder bundled into the plugin at build time)\n      └─ GET        /files/*    → static game data files (SSF font, GFD icon data, PS5 fonticon texture)\n         GET        /icon/{id}  → emote icon served as PNG from game data\n\nBrowser (React + TypeScript SPA, built with Vite)\n ├─ Shows a passcode modal on load; re-prompts if a session cookie expires mid-use\n ├─ Connects to /sse SSE stream after authentication (withCredentials)\n ├─ Filter sidebar with drag-and-drop reordering (@dnd-kit/sortable)\n ├─ FFXIV Lodestone font (SSF TTF), GFD icon data, and PS5 fonticon texture loaded from the plugin server\n ├─ Avatar results cached in memory (per session)\n └─ Settings and filters persisted server-side via PUT /settings\n```\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwelvehouse%2Fchatanywhere","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwelvehouse%2Fchatanywhere","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwelvehouse%2Fchatanywhere/lists"}