Projects can be created either within the context of Juicebox with a call to JBController3_1.launchProjectFor(...) which also configures its funding cycle properties and sets it up to receive payments, or by itself with a call to JBProjects.createFor(...). The launchProjectFor(...) transaction calls createFor(...) as part of its routine.
A project can accommodate arbitrary metadata for any number of domains that can be updated by the project owner at any time using the JBProject.setMetadataOf(...) transaction. This can be used by clients to store a reference to metadata stored on IPFS (or anywhere else). The protocol does not define standards for this metadata. A project's current metadata for any particular domain can be found by reading from JBProject.metadataContentOf(...).
Look through the JBProjects contract for a complete list of relevant read functions, write functions, and emitted events.