# n_signer C Client — migrated to `nostr_core_lib` The hand-rolled `nsigner_client.{c,h}` that previously lived in this directory has been **removed**. n_signer now uses the shared, transport-pluggable client stack that lives in [`nostr_core_lib`](../resources/nostr_core_lib): - [`nostr_core/nsigner_transport.{h,c}`](../resources/nostr_core_lib/nostr_core/nsigner_transport.h) — pluggable transport vtable (unix-abstract / tcp / usb-cdc serial / fds) + discovery. - [`nostr_core/nsigner_client.{h,c}`](../resources/nostr_core_lib/nostr_core/nsigner_client.h) — heap-allocated client: 4-byte length-prefixed framing, kind-27235 auth envelope (self-contained), JSON-RPC verbs, cJSON result parsing, RPC error mapping. - [`nostr_core/nostr_signer.{h,c}`](../resources/nostr_core_lib/nostr_core/nostr_signer.h) — high-level `nostr_signer_t` abstraction (local + remote backends, 6 verbs). This is the single source of truth for the n_signer wire contract. See [`nostr_core/NSIGNER_INTEGRATION.md`](../resources/nostr_core_lib/nostr_core/NSIGNER_INTEGRATION.md) for the full integration contract. ## What moved where | Old (`client/`) | New (`nostr_core_lib`) | |---|---| | `nsigner_client_t` (stack) | `nsigner_client_t*` (heap) or `nostr_signer_t*` | | `nsigner_client_init` / `connect_unix` / `close` | `nsigner_transport_open_unix` + `nsigner_client_new` / `nsigner_client_free` | | `nsigner_client_get_public_key` | `nostr_signer_get_public_key` or `nsigner_client_call(..., "get_public_key", ...)` | | `nsigner_client_sign_event` | `nostr_signer_sign_event` or `nsigner_client_call(..., "sign_event", ...)` | | `nsigner_client_set_auth` | `nsigner_client_set_auth` or `nostr_signer_nsigner_set_auth` | | `nsigner_client_request` / `request_raw` | `nsigner_client_call` (returns parsed cJSON result) | ## Consumers (updated) - [`examples/get_public_key_client.c`](../examples/get_public_key_client.c) — uses `nsigner_transport_open_unix` + `nsigner_client_new` + `nsigner_client_call`. - [`examples/sign_event_client.c`](../examples/sign_event_client.c) — same pattern. - [`tests/test_integration.c`](../tests/test_integration.c) — same pattern; cJSON-based assertions. The `nsigner ... client ''` subcommand in [`src/main.c`](../src/main.c) is unaffected — it has its own raw framing pass-through and never used this directory. ## Why Per [`plans/nsigner_integration_plan.md`](../resources/nostr_core_lib/plans/nsigner_integration_plan.md) (Phase 7): retire per-project hand-rolled clients in favor of the shared module in `nostr_core_lib`, so the wire contract has one implementation and downstream projects get unix/tcp/serial/fds transports for free.