diff --git a/website/src/pages/community.tsx b/website/src/pages/community.tsx index 8092655..9bc36ee 100644 --- a/website/src/pages/community.tsx +++ b/website/src/pages/community.tsx @@ -50,7 +50,7 @@ const CITIZENSHIP = [ title: 'Share, and share real files', body: ( <> - Point shares add at the collection you actually listen to. Full albums, + Point shares add at the collection you listen to. Full albums, honest bitrates, nothing transcoded up from a lossy source and relabelled. ), @@ -146,20 +146,10 @@ export const Community = () => { > soulfind {' '} - run in CI, so a green checkmark means it genuinely built and talked to a - server. + run in CI, so a green checkmark means it built and talked to a server.

- That server is{' '} - - soulfind-dev/soulfind - - , an open-source Soulseek server. Run it locally and you can develop and test + soulfind is an open-source Soulseek server. Run it locally and you develop against a real protocol implementation without touching the public network.

@@ -187,10 +177,9 @@ export const Community = () => { eyebrow="being a good member" title="The network is other people's hard drives." > - Soulseek is a gem for music enthusiasts. Decades of records, live sets, and - pressings that never made it anywhere else, kept online by people who care about - them. It works because someone left their collection up for you. None of this is - enforced. It is just how the network stays worth using. + Decades of records, live sets, and pressings that never made it anywhere else, + kept online by people who care about them. None of this is enforced. It is just + how the network stays worth using.
{CITIZENSHIP.map((item) => ( diff --git a/website/src/pages/docs.tsx b/website/src/pages/docs.tsx index 58d9bb8..5641433 100644 --- a/website/src/pages/docs.tsx +++ b/website/src/pages/docs.tsx @@ -97,13 +97,13 @@ export const Docs = () => { />

- On first run soulseek-rs shows a login screen: sign in with an existing - Soulseek account or register a new one, right in the TUI. Your password is - stored in the OS keychain, not in plain text. + On first run you get a login screen: sign in with an existing Soulseek + account or register a new one. Your password goes to the OS keychain, not a + plain-text file.

- Downloads land in a conventional folder by default, and your TUI state - (searches, downloads, rooms) is saved and restored across restarts. + Downloads land in a conventional folder, and TUI state (searches, downloads, + rooms) is restored across restarts.

@@ -202,7 +202,7 @@ export const Docs = () => {

soulseek-rs skills install writes a SKILL.md into - every coding agent on the machine — Claude Code and opencode today,{' '} + every coding agent on the machine: Claude Code and opencode today,{' '} --dir for anything else. After it lands you describe the outcome instead of the pipeline: “mirror that peer’s FLAC folder”, “watch this room for an hour and save anything @@ -210,9 +210,7 @@ export const Docs = () => {

It carries what --help cannot: the JSON keys of every record, - that exit 4 means widen the query rather than retry it, that remote paths go - back byte-identical, and that --follow never returns so an agent - passes --duration. Run it again after an upgrade to update it;{' '} + and what each exit code means. Rerun it after an upgrade;{' '} skills uninstall takes it back out.

@@ -233,8 +231,8 @@ export const Docs = () => {

- Deeper docs live where they stay current: the full README on GitHub, and the - generated API reference for the library on docs.rs. + The README on GitHub and the library API reference on docs.rs stay current + with the code.

diff --git a/website/src/pages/home.tsx b/website/src/pages/home.tsx index bc9cea8..595eef3 100644 --- a/website/src/pages/home.tsx +++ b/website/src/pages/home.tsx @@ -27,10 +27,10 @@ const FEATURES = [ cmd: 'soulseek-rs skills install', body: ( <> - Run it once and asking beats scripting: your agent knows the record shapes, the - exit codes, and the filters, so “find the 1998 pressing, lossless only” - becomes a pipeline it writes itself. No MCP server, no wrapper — the skill ships - inside the binary and finds Claude Code and opencode on its own. + Run it once and your agent knows the record shapes, the exit codes, and the + filters: “find the 1998 pressing, lossless only” becomes a pipeline it + writes itself. No MCP server, no wrapper. The skill ships in the binary and finds + Claude Code and opencode on its own. ), }, @@ -205,16 +205,15 @@ export const Home = () => {

soulseek-rs speaks that protocol. It’s a third-party client, not the - official app, and not affiliated with the Soulseek project. It shares, - browses, and does rooms and private messages, because a client that only - downloads takes from the network without giving anything back. + official app. It shares, browses, and does rooms and private messages, + because a client that only downloads takes without giving anything back.

Reach for soulseek-rs-lib to build a custom client or an agent - on the protocol directly.{' '} + on the protocol.{' '} Use the library @@ -224,8 +223,8 @@ export const Home = () => {

Every command runs as a one-off from the shell. Point cron, a script, or an agent at them and read JSON records back off stdout. No daemon, no API to - stand up — and skills install teaches the agent the surface - for you.{' '} + stand up. skills install teaches the agent the surface for + you.{' '} See the commands @@ -238,8 +237,7 @@ export const Home = () => {

Everything happens in the TUI, and every command also runs as a one-off from the - shell, so the same client works for scripting, cron jobs, and agents driving it - programmatically. + shell.
{FEATURES.map((feature, i) => ( @@ -259,8 +257,8 @@ export const Home = () => {
- A CLI an agent can drive is not the same as a CLI an agent knows how to drive. - skills install closes that gap in one command. + An agent can run any CLI. skills install teaches it to run this one + well. {

--help lists flags. It cannot say which JSON keys a record - carries, that exit 4 means widen the query rather than retry it, that a - remote path is backslash-separated and has to go back byte-identical, or - that --follow never returns so an agent passes{' '} - --duration. An agent without that guesses, and guessing against - a stranger’s file server hangs the job. + carries, or that exit 4 means widen the query rather than retry it. An agent + without that guesses, and guessing against a stranger’s file server + hangs the job.

skills install fills that in. The requests stop being pipelines - you write: mirror a peer’s FLAC folder overnight, watch a room and save - anything that mentions a label, check whether a user is worth queueing behind - before a 2 GB transfer. + you write: mirror a peer’s FLAC folder overnight, or check whether a + user is worth queueing behind before a 2 GB transfer.

It stays a CLI: no daemon, no MCP server, no API key. Upgrading the binary diff --git a/website/src/pages/install.tsx b/website/src/pages/install.tsx index c7d31dc..3623195 100644 --- a/website/src/pages/install.tsx +++ b/website/src/pages/install.tsx @@ -58,8 +58,8 @@ const INSTALLS: readonly InstallRoute[] = [ ], alt: ( <> - A prebuilt binary for both Apple silicon and Intel, so no Rust toolchain. With one - installed, cargo install soulseek-rs builds it from crates.io instead. + A prebuilt binary for Apple silicon and Intel, no Rust toolchain needed. With a + toolchain, cargo install soulseek-rs builds from crates.io instead. ), }, @@ -116,7 +116,7 @@ const PLATFORMS: readonly PlatformNote[] = [ config: '~/.config/soulseek-rs/config.toml', state: '~/.local/share/soulseek-rs/state', downloads: '~/Downloads/Soulseek', - note: 'macOS deliberately follows the XDG layout rather than Application Support, so config sits beside your other dotfile config.', + note: 'Follows the XDG layout rather than Application Support.', }, { id: 'linux', @@ -185,9 +185,9 @@ const SETTINGS: readonly Setting[] = [ fallback: 'the download folder', body: ( <> - Folders offered to the network, as a list. An explicitly empty list shares - nothing. shared_dir is the older single-folder spelling and still - reads; shares add writes the list form. + Folders offered to the network. An empty list shares nothing.{' '} + shares add writes this; the older shared_dir spelling + still reads. ), }, @@ -388,9 +388,10 @@ export const Install = () => {

The port is your --listener-port (env{' '} - SOULSEEK_LISTENER_PORT, default 2234); it’s - renewed automatically and removed on exit. Pass --no-listener to - turn it off. Check your own network without launching the client: + SOULSEEK_LISTENER_PORT, default 2234); soulseek-rs + renews it while it runs and removes it on exit. Pass{' '} + --no-listener to turn it off. Check your own network without + launching the client:

{ - Your password goes to the OS keychain, never a plain-text file. If you would - rather it never be stored at all, have password_cmd shell out to - your own password manager and print it on demand. For CI and containers,{' '} + Your password goes to the OS keychain, never a plain-text file. Point{' '} + password_cmd at your own password manager and it is never stored + at all. For CI and containers,{' '} --password-stdin reads it off a pipe so it never reaches{' '} ps or the environment. config.toml is layered: flags beat environment variables, which - beat the file, which beats the defaults. config get and{' '} - config set read and write that file without opening an editor. - State (searches, downloads, rooms) is versioned JSON and restores on restart; - anything unreadable is set aside as .bak instead of being - overwritten. + beat the file, which beats the defaults. State (searches, downloads, rooms) is + versioned JSON and restores on restart; soulseek-rs sets anything unreadable + aside as .bak rather than overwriting it.
- Every one has a working default, so an empty file — or no file — is valid. Flags - beat environment variables, which beat this file, which beats the defaults.{' '} + Every one has a working default, so an empty file, or no file at all, is valid.{' '} config list prints the effective value of each. @@ -509,10 +507,10 @@ export const Install = () => {

config path prints the file in use, config get{' '} - reads one setting and config set writes one. Unknown keys are - rejected rather than silently ignored, so a typo fails loudly instead of - quietly doing nothing. --no-config ignores the file entirely - and --config FILE points at another one. + reads one setting and config set writes one. It rejects + unknown keys, so a typo fails instead of doing nothing.{' '} + --no-config ignores the file entirely and{' '} + --config FILE points at another one.

@@ -521,9 +519,8 @@ export const Install = () => {
- Three things exist on disk: the binary, the config, and the state. Nothing else is - written unless you pointed --log-file at a file, and there is no - telemetry to opt out of. + Three things exist on disk: the binary, the config, and the state. Nothing else, + unless you point --log-file somewhere. No telemetry to opt out of. {

- Your downloads and your shared directories are yours: they stay exactly where - they are. On macOS, delete the keychain entry for soulseek-rs in + Your downloads and your shared directories are yours: they stay where they + are. On macOS, delete the keychain entry for soulseek-rs in Keychain Access if you saved a password.