The put_mutable command is a primitive way for signing and storing data in external storage providers. It uses the storage providers specified in your client.ini under storage_providers=. There currently isn’t a way to override them from the CLI, but I can add that in.
The set_profile command is used for signing and replicating a profile.json file pointed to by your zone file. It actually calls the same methods as put_mutable under the hood. Similarly, it only replicates data to storage providers for which you have specified a storage driver in the config file. If you don’t have a storage driver for the provider (like with a Github gist), you would instead use sign_profile to create a signed profile, and then replicate the signed profile manually.
In 0.14.1, we’re introducing the concept of a datastore to address this concern. You’ll be able to create as many datastores as you like, and fill them with whatever data you want. Each datastore will use a sub-key generated from your data key, and it will use a specific set of storage providers for replicating its data that you specify on creation. You’ll be able to explicitly override which storage provider(s) to use when you upload data. Unlike get_mutable and put_mutable, datastores are hierarchical like filesystems, so you can do things like list or remove collections of data.
In 0.14, put_mutable will insert pointers to the data into your profile.json. get_mutable will first fetch your profile, find the datum in the profile, and then fetch and authenticate the data from the pointers.
This is going to be removed in 0.14.1, and will be replaced with datastores (which do not modify the profile.json).