SharpClient connects to text-based MUSH / MUD servers over Telnet, with the modern MU* protocol stack and a clean Blazor interface. A single, fully-testable core drives both a native Android app and a Blazor web client, speaking Telnet through TelnetNegotiationCore.
- Modern MU* protocols — GMCP, MSSP, MSDP, NAWS and CHARSET, plus MXP and Pueblo, with EOR/GA prompt handling and UTF-8.
- Rich rendering — full ANSI/SGR colour & styling, MXP links, and MXP/Pueblo markup.
- Automation — per-world and per-character triggers and aliases.
- Sessions that stay put — multiple worlds & characters, saved connect credentials, and automatic reconnect with backoff.
- Truly cross-platform — one shared core behind a MAUI Blazor Hybrid Android app and a Blazor Server web client.
- Built to be tested — all connection, parsing and automation logic lives in a MAUI-free core with a TUnit suite.
![]() Mobile |
![]() Tablet |
![]() Web |
Signed APKs are attached to every release. You can sideload the .apk directly, but the easiest way to install and stay updated is Obtainium, which tracks this repo's releases for you:
- Install Obtainium.
- Add an app with this source URL:
or, on your phone, paste this deep link (GitHub can't render it as a clickable link, so copy it as-is):
https://github.com/SharpMUSH/SharpClientobtainium://add/https://github.com/SharpMUSH/SharpClient - Obtainium picks up the universal signed APK from each release and notifies you when a new version ships.
Each release ships a single universal APK — no ABI/architecture filter needed — and its versionName/versionCode are derived from the release tag, so Obtainium and Android both see the correct version and can update in place. If a release is marked pre-release on GitHub, enable "include prereleases" for the app in Obtainium or it will be skipped.
dotnet run --project src/SharpClient.WebThen open the printed URL (default http://localhost:5220).
The day-to-day loop needs no Android SDK — it runs on the Core, Data and UI projects and the test suites:
dotnet build SharpClient.slnx # solution (skips the App head if it can't build)
dotnet run --project tests/SharpClient.Tests # run the TUnit suitedotnet build src/SharpClient.App/SharpClient.App.csproj -f net10.0-androidBuilding SharpClient.App requires the maui-android workload plus the Android SDK and JDK 17 (the .NET for Android toolchain rejects newer JDKs). Machine-specific SDK/JDK paths are wired in via a gitignored Directory.Local.props. On a fresh machine:
# Install the Android SDK (accepts licenses, downloads platform-tools/build-tools/platform)
dotnet build src/SharpClient.App/SharpClient.App.csproj -f net10.0-android \
-t:InstallAndroidDependencies -p:AcceptAndroidSdkLicenses=True \
-p:AndroidSdkDirectory=$HOME/Android/Sdk -p:JavaSdkDirectory=<jdk-17-path>
# Then point Directory.Local.props at your AndroidSdkDirectory and JavaSdkDirectory.MAUI has no Linux desktop head, so on Linux the App head builds/deploys to an Android device or emulator while the inner loop stays on Core + Tests.
A MAUI-free core holds all the logic; the platform heads are thin hosts around it.
| Project | Kind | Responsibility |
|---|---|---|
src/SharpClient.Core |
class library (net10.0) |
The engine: telnet connection, ANSI/MXP parsing, triggers & aliases, world/character model, sessions. Runs on plain .NET. |
src/SharpClient.Data |
class library (net10.0) |
Persistence — worlds, characters and session history (EF Core / SQLite). |
src/SharpClient.UI |
Razor class library (net10.0) |
Shared Blazor UI components. |
src/SharpClient.App |
MAUI Blazor Hybrid (net10.0-android) |
Android app head — hosts the UI, provides platform services, wires DI. |
src/SharpClient.Web |
Blazor Server (net10.0) |
Web client head. |
tests/* |
TUnit / bUnit | Unit tests for Core & Data, component tests for UI. |
Shared build settings (warnings-as-errors, nullable, modern C#) live in Directory.Build.props; the SDK is pinned to .NET 10 via global.json. The design spec and visual-design brief live in docs/superpowers/specs.
.NET 10 · MAUI Blazor Hybrid · Blazor Server · TUnit & bUnit · EF Core (SQLite) · TelnetNegotiationCore
Issues and pull requests are welcome. The inner loop runs entirely on Core + Tests (no Android SDK required) — see Build from source. CI builds and runs the test suites on every push.
Licensed under the Apache License 2.0.
- TelnetNegotiationCore — the Telnet / MU* protocol engine.
- Part of the SharpMUSH project.



