Where roleplay is happening in Star Wars: The Old Republic.
A desktop companion for roleplayers. Pick a server and a planet and see who is In Character where, on the game's own maps, down to the floor of the building. Set your status, flag that you are looking for RP, keep friends, notes and a journal. Hydian reads the combat log the game writes and needs no account.
Hydian is a free, open-source, non-profit fan project made by players, for players.
hydian.org · Download · Discussions
- Live map: you and everyone who shares their position, on the in-game artwork: planet maps, regions and every interior floor, with the game's names. Floors come from the log's height ("Nar Shaddaa › Lower Promenade"); stacked floors show one level at a time, or all of them in the 3D view.
- Status: In Character, Out of Character or Invisible, a Looking for RP beacon and the server instance you are in. Sharing is per character and starts Invisible.
- Registry: active characters sharing on your server, where they are and when they were last active. Invisible characters stay off the map and public lists; your own characters remain available privately.
- Friends, notes, journal: friend the people you play with; names on your in-game friends lists come across on their own (read only, the game's lists are never written). Notes on characters (your in-game notes are imported) and a rich-text journal of your character's story, both stored on your device.
- Heat map & activity: where and when roleplay happens on a server, as counts per area and hour, shown once ten different players have contributed.
- In-game overlay: a transparent, click-through card over the game: who is on Hydian near you, LFRP
beacons, instance numbers, your floor.
Ctrl+Shift+Otoggles it,Ctrl+Shift+Llocks it. - Always on: starts at login, lives in the tray, follows the log while you play.
Others see a name, a faction, a status and a place. Profiles have no free text and no class.
Now: Windows and macOS (Apple Silicon and Intel), live map, registry, overlay, friends, notes, journal, heat map and activity, automatic updates.
Next: more planets and interiors, localisation.
With enough support: verified characters and optional accounts, a guild registry, guild tools (rosters, events, recruitment) and a Discord integration that posts who is in character to your server. All in this repository.
Made by humans, crafted with AI. We were developers before the AI boom and still hold our work to that standard. AI tools help us build faster; the design, the decisions and the final word are ours. Every feature was planned, reviewed and tested by a person. We firmly stand against soulless AI slop, and that applies to contributions too: a pull request is welcome when it is understood, tested and written with care, whatever tool helped write it. See CONTRIBUTING.md.
The badges are from Made by Human (MIT).
One monorepo, MIT licensed:
apps/desktop Tauri 2 (Rust) + React: the app
apps/api Fastify 5 + Postgres (Node 24)
apps/web hydian.org (Next.js)
The map artwork, planet icons and emblems are BioWare/EA assets and are not part of this repository or its licence:
see GAME-CONTENT.md. The app loads artwork from https://tiles.hydian.org/, configurable with
VITE_ASSET_BASE. apps/desktop/src/data/maps.json and apps/desktop/src/data/planet-icons.json carry only the
metadata (names, ids, bounds, file names). Local development uses the hosted artwork without starting a separate
artwork server. Optional artwork-hosting tools are kept in apps/tiles; they need images
supplied outside Git and are not required to run the app, API or website.
Use Node.js 24 (see .nvmrc) and the pinned pnpm version. The native app also needs Rust 1.95 or later and the
platform prerequisites.
pnpm install --frozen-lockfile
pnpm dev # desktop app (needs Rust: https://rustup.rs)
pnpm preview # browser preview on :1420, log access through a small Node bridge
pnpm api # backend on :8080 (needs DATABASE_URL)
pnpm web # website on :4321
pnpm -C apps/desktop tauri build --config '{"bundle":{"createUpdaterArtifacts":false}}' # local installerRun the website at http://localhost:4321 and the app preview at http://localhost:1420 in separate terminals.
pnpm dev and pnpm preview share port 1420, so choose one. The browser demo at
http://localhost:1420/?demo=1 uses synthetic characters and skips reading game logs. Tray, overlay, autostart and
update features require the native app.
CI runs types, lint, formatting, JavaScript regressions against an isolated Postgres database, native Rust tests,
and frontend builds, then builds the installers for Windows, macOS
(Apple Silicon) and macOS (Intel) whenever a pull request or a push to main changes the app. To release, run
node scripts/bump.mjs patch (or minor / major) on a PR branch and commit the version files.
After that PR is merged, CI tags and builds the reviewed commit. Publication requires
maintainer approval and successful signing, notarization and updater-signature checks for every platform.
The app defaults to the hosted Hydian backend and artwork. For a local API, create a PostgreSQL database, copy
apps/api/.env.example to apps/api/.env, and set DATABASE_URL before starting pnpm api. Then copy
apps/desktop/.env.example to apps/desktop/.env.development.local and restart pnpm dev or pnpm preview to use
http://localhost:8080. Installer builds always use the hosted API.
VITE_ASSET_BASE=/ uses artwork you provide in apps/desktop/public/ and includes it in builds.
See local development for a full local setup and a synthetic demo, and releases for how a version is cut, signed and published.
Windows: logs in %USERPROFILE%\Documents\Star Wars - The Old Republic\CombatLogs, characters from
%LOCALAPPDATA%\SWTOR\swtor\settings. On macOS, Hydian looks for the same folders inside CrossOver or Whisky
bottles. If detection misses your installation, use Settings › Game link › Game folders to choose them.
In SWTOR, turn on Preferences → Combat Logging → Enable Combat Logging to File, enter combat to create a log,
then choose Check for logs in Hydian.
Releases are cut by CI from main (release.yml) and land on hydian.org/download.
Installed copies check for a new version on start and every six hours, download it in the background and offer a
restart. You can also check in Settings › About, or on macOS in the Help menu. Updates are signed; the public key is in
apps/desktop/src-tauri/tauri.conf.json. macOS gets native traffic lights, an optional menu-bar icon, autostart and
the ⌘⇧O / ⌘⇧L shortcuts.
apps/desktop/branding/ holds the mark (hydian.svg), the 1024 px icon master and the Icon Composer bundle
(hydian.icon, layered for macOS 26). pnpm -C apps/desktop tauri icon branding/hydian-icon.png -o src-tauri/icons
regenerates the platform icons; the menu-bar template PNGs are rendered from the SVG. Type: Inter for text, Space
Grotesk for titles, both bundled.
Log format (7.x). Every line carries [@Name#id|(x,z,height,heading)|(hp/max)] for source and target;
AreaEntered … {areaId} (serverId) gives the area and server. core/parser.ts turns lines into positions, area
changes and sightings; core/gamelink.ts scans recent logs on start and tails the newest one. The game logs a
position only when something happens, so a pin can lag while people stand and talk; the map shows the age.
Coordinates. Log tuple = (x, z, height), map units = log units / 10. Map images are uniform-scaled to the
longer side of their bounds, centred, min z at the top. A tile drawn over another (room over region, region over
planet) gets an opaque backing so only one artwork shows.
Uplink (core/uplink.ts). While a character is shared: a ping on login, zone change, movement ≥ 5 m, status
change and every 30 s; players the log mentions go up as sightings. On first start core/backfill.ts uploads the
movement history from the logs on disk for shared characters, so the maps have history from day one.
What the server serves. Presence and the registry: name, id, server, faction, planet, position while on the map,
status.
Heat and activity: counts from live In-Character pings once ten distinct characters contribute. History uploads
and sightings are stored separately from these public results. DELETE /v1/me removes installation links and
replaces identifiers in retained gameplay records (Settings › Privacy); see the privacy page for details.
Story phases. Class-story rooms and personal hangars are instanced and hidden by default (Settings › Map).
Classic planets are classified from the game's map notes; expansion planets from a hand-kept override list. Both
end up as the phase flags in src/data/maps.json.
Factions. Planets one side cannot visit (the fleets, Dromund Kaas and Coruscant, the origin worlds) carry a faction badge in the planet list, and Balmorra and Taris exist as two worlds with separate area ids, listed once per faction. A character's own faction comes from its class. The server instance is set by hand; the log does not carry it.
The maps are the game's own map textures (<map>_r.dds, 1024², one per floor), the planet icons and faction emblems
its galaxy-map art, converted to WebP once per game patch and served by the tiles service with immutable cache
headers. Each map's world bounds (x/z) and height range come from the game's map table and sit next to the file name
in src/data/maps.json; that is what turns a combat-log position into a dot on the right floor. The conversion
happens on our side and is not part of this repository; the app never touches the game's files for it.
You do not need any of it to work on Hydian: a clone loads the artwork from the hosted tiles service, in development
too. To add a planet or an interior that has no map yet, open an issue with the area id from the log and we add the
tile and its entry in maps.json.
See CONTRIBUTING.md and SECURITY.md. Code: MIT. Game artwork: GAME-CONTENT.md.
Hydian is a fan project by SithCult, not affiliated with Electronic Arts, BioWare, Broadsword or Lucasfilm. Star Wars: The Old Republic and related marks belong to their owners.