# User Guide
Using chartered as a user is actually pretty simple, it's very much like your
standard Cargo registry except with two extra concepts: organisations and
permissions.
Organisations are very much like the organisations you'll likely have used on
your preferred SCM host, a group of users that have group-level permissions,
in Chartered case the permissions these users may have are:
### Permissions
- `VISIBLE`
- Essentially the base-level permission meaning the user belongs to the group,
if the user doesn't have this permission they're not in the group, this
permission at the crate-level means the user can download the crate and see
it in the WebUI.
- `PUBLISH_VERSION`
- Gives the ability to publish a new version for crates belonging to the group.
- `YANK_VERSION`
- Gives the ability to yank (and unyank) published versions for crates belonging
to the group.
- `MANAGE_USERS`
- Gives the ability to add (and remove) users from the group, and crates belonging
to the organisation.
- `CREATE_CRATE`
- Gives the ability to create a new crate under the organisation.
All these permissions, with the exception of `CREATE_CRATE`, can also be used at the
crate-level for giving extra permissions to org members for a particular crate - or
even users outside of the org. Bare in mind, however, these permissions are _additive_ -
it is not possible for permissions to be _subtracted_ from a user at the crate-level
if they have been granted them by the organisation.
### Publishing your first crate
With all this in mind, it's about time you started publishing your first crate!
Chartered has excellent integration with Cargo's [alternative registry][arp]
implementation and is used very much like a standard alternative registry. The only
prerequisites for publishing your crate are:
1. Have an SSH key added to your Chartered account, which you can do via the WebUI
2. Belong to an organisation you have the `PUBLISH_VERSION` permission for, anyone can
create a new organisation if you don't already belong to one.
And once you're ready, you can add the organisation's registry to your `.cargo/config.toml`
like so:
```toml
[registries]
my-organisation = { index = "ssh://ssh.chart.rs/my-organisation" }
```
(You should create this file if it doesn't already exist)
You can now publish the crate using cargo as you normally would, except with the
registry specified:
```sh
$ cargo publish --registry my-organisation --token ""
```
Note: the token is purposefully empty, as the token will be vended by the index based
on your SSH key.
[arp]: https://doc.rust-lang.org/cargo/reference/registries.html
### Pulling in dependencies
Again, not too dissimilar from using [crates.io][cio], you can declare your dependencies
as normal with the exception that you need to specify the organisation the crate should
be pulled from provided you've declared the organisation in `.cargo/config.toml` as shown
in the previous section of this guide.
```toml
[dependencies]
my-other-crate = { version = "0.1", registry = "my-organisation" }
```
Your other Cargo dependencies from [crates.io][cio] can be declared as normal alongside
organisation dependencies.
[cio]: https://crates.io/