KDX Hotline · Packaging & Distribution · Handoff v0.1 · Handoff v0.2 · UI Concept
Work order for the next session — server daemon + desktop client, ready to ship.
~/claude-code/kdx-hotline · Rust workspace, 7 crates ·
Server binary: crates/kdxd ·
Desktop client: apps/kdx-client (Tauri v2, vanilla JS)
Two products to package:
The server binary. Distributed as a compiled executable. SysOps install it on a machine, point it at a TLS cert, run kdxd useradd, start it. Config via kdxd.toml. Traditional port 10700.
The Tauri v2 desktop client. Targets macOS first (.app + .dmg), with Windows and Linux as stretch goals. Needs a proper icon set, bundle metadata, and entitlements.
icons/icon.png is a placeholder. Does a real icon design exist, or does one need to be created? cargo tauri icon <source.png> generates the full set (32×32 through 512×512, .icns, .ico) from one 1024×1024 source. The source must be provided before the icon step can run.
public.app-category.social-networking, public.app-category.utilities, or public.app-category.productivity. Pick one — it affects App Store placement if submitted.SocialNetworking (chat app).
10.15 (Catalina, 2019) or 11.0 (Big Sur, 2020). Most users are 12+; 10.15 is the broadest reasonable floor.10.15.
© 2024–2026 theusual.
crates/kdxd/Cargo.tomlThe workspace already has version, edition, license, repository. Add the crate-specific fields:
# add inside [package] description = "KDX server daemon — early-2000s Hotline-style chat and file sharing over TLS 1.3" authors = ["theusual"] keywords = ["hotline", "chat", "file-sharing", "server", "tls"] categories = ["network-programming", "command-line-utilities"] readme = "../../README.md"
crates/kdxd/kdxd.example.tomlMirrors every field in src/config.rs with its default value and a comment explaining each. SysOps copy it to kdxd.toml and uncomment what they need. Current fields to document:
# KDX server configuration. Copy to kdxd.toml and pass as the first argument: # kdxd kdxd.toml # Address and port to listen on. Traditional KDX port is 10700. bind = "0.0.0.0:10700" # SQLite database path. Created automatically on first run. database = "kdx.db" # Directory where uploaded file bytes are stored. Created automatically. files_root = "files" # Session idle timeout in seconds before the server closes the connection. session_ttl_secs = 1800 # Per-transfer throttles in bytes/sec. 0 = unlimited. max_upload_bytes_per_sec = 0 max_download_bytes_per_sec = 0 # Tracker directory display name and description. server_name = "KDX Server" server_description = "" max_users = 256 # TLS certificate and private key (PEM). When omitted, a self-signed # dev certificate is generated at startup — fine for local testing only. # [tls] # cert_pem = "/etc/kdx/cert.pem" # key_pem = "/etc/kdx/key.pem"
crates/kdxd/kdxd.service (systemd, Linux) stretchStandard [Unit]/[Service]/[Install] unit. Runs as a dedicated kdx system user. Restarts on failure.
crates/kdxd/net.kdx.hotline.server.plist (launchd, macOS) stretchStandard launchd plist for /Library/LaunchDaemons/. Runs at boot under a dedicated user.
cargo tauri iconTauri CLI generates all required sizes from one 1024×1024 PNG source. Produces: 32x32.png, 128x128.png, 128x128@2x.png, icon.icns (macOS), icon.ico (Windows), and square PNGs for Linux. Destination: apps/kdx-client/src-tauri/icons/.
cargo tauri icon apps/kdx-client/src-tauri/icons/source-1024.png
After running, update tauri.conf.json bundle.icon to the full list:
"icon": [ "icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico" ]
apps/kdx-client/src-tauri/tauri.conf.json → bundleFields that are currently missing from the "bundle" block:
"shortDescription": "Hotline-style chat and file sharing", "longDescription": "KDX is a modern rebuild of the early-2000s Hotline client — private servers, chat rooms, file browsing, and resumable transfers, all over TLS 1.3 with challenge-response auth.", "copyright": "© 2024–2026 theusual", "category": "SocialNetworking", // or "Utilities" — open question "macOS": { "minimumSystemVersion": "10.15", "entitlements": "entitlements.plist" }
apps/kdx-client/src-tauri/entitlements.plistRequired for macOS app sandboxing and network access. KDX needs outbound TCP connections only.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>com.apple.security.network.client</key><true/>
<key>com.apple.security.files.user-selected.read-write</key><true/>
</dict></plist>
files.user-selected.read-write is needed for the file-open/save dialogs used in upload and download. Add other entitlements only if sandboxing requires it at build time.
Add "windows": { "nsis": { "displayLanguageSelector": false } } inside bundle. Requires a Windows runner to build; cross-compilation from macOS is not supported by Tauri.
Add "linux": { "deb": { "depends": [] } }. Requires a Linux runner. Add "appimage" and "deb" to targets.
Line says ~110 tests. Current count is 237. Update inline.
Lists tracker and in-app account management as missing. Both shipped (commits b4cef10, da0a43a). Delete the section entirely or replace it with a brief "what's missing" note limited to identity fields (display name / description not yet server-enforced).
Current text: "Pass a TOML config path to either to override — see Config in crates/kdxd/src/config.rs for the fields." After creating kdxd.example.toml, update to: "Copy crates/kdxd/kdxd.example.toml to kdxd.toml and edit as needed."
Current section only covers macOS. After the bundle config work, update it with the full build command and note which platforms are supported. Mention that cargo tauri icon only needs to be run once.
Icon, category, copyright holder, macOS min version, target platforms, server distribution format. These gate everything else.
1024×1024 PNG. If designing from scratch, do it before touching any configs so the icon step isn't blocked.
cargo tauri iconGenerates the full icon set in icons/. One command, no manual resizing.
tauri.conf.jsonAdd shortDescription, longDescription, copyright, category, macOS block, updated icon list.
entitlements.plistTwo entitlements: network.client + files.user-selected.read-write.
crates/kdxd/Cargo.tomlAdd description, authors, keywords, categories, readme.
crates/kdxd/kdxd.example.tomlAll config fields documented with defaults and comments.
README.mdTest count, remove stale section, update config note, expand packaging section.
Run cargo tauri build from apps/kdx-client/src-tauri. Verify the .app launches, the DMG mounts, the app icon appears correctly in Finder and the Dock. Check cargo build -p kdxd --release still compiles clean.
systemd unit (kdxd.service) and/or launchd plist. Drop them in crates/kdxd/ with install instructions appended to the README.