# Apps

Extras that sit beside the signer under `apps/`, each its own crate with its own workspace and `Cargo.lock`. They are not part of the signer: `just check`, the `ci` workflow, the release binaries, the Docker image and the signer's version leave them out, and a change to one does not bump `sa-forge-signer`. A separate `apps` workflow runs the grant page's and the IDL table generator's own gates when something under `apps/` changes, and weekly; the console's gate runs only locally.

None of them holds keys or signs with the signer's keys. The grant page has the human's own browser wallet sign; it holds no keys itself. Each runs as the human, not the agent, and the [isolation rule](../setup.md#isolation) still applies: nothing here should give the agent's OS user a way into the signer's keys, config or state.

| App | For |
|---|---|
| [Console](console.md) | A read-only desktop view of a running signer: `serve` health, the audit log and per-key limits |
| [Grant page](grant.md) | A local web page where the profile wallet grants and revokes a session key (Path B) |
| [IDL table](idl-table.md) | Generates the signer's instruction table from the programs' IDLs, without copying them |

Install an app from a release tag by naming its package (`cargo install --locked --git https://github.com/ttdonovan/sa-forge-signer --tag vX.Y.Z <package>`), or from a checkout with `cargo install --locked --path apps/<app>`.
