id: license title: The project has no license, and three different things need one status: open crates: [] dependsOn: [] exitCriterion: > A LICENSE file exists at the repository root, the lexicons state their own license independent of the code's, and every vendored corpus's license has been checked for compatibility with whatever is chosen. #
license #
The decision has already been made by metadata, and the file it names does
not exist. Cargo.toml declares license = "MIT" at the workspace root and
every crate inherits it through license.workspace = true — so the code ships
under a stated licence today. There is no LICENSE file anywhere in the
repository. That is the gap this epic's exit criterion is really about: not
choosing a licence, which has effectively happened, but writing it down where
a reader looks for it, and checking it against the vendored licences below.
There is no LICENSE file anywhere in this repository. That is a decision
by omission — under most jurisdictions' default copyright rules, "no
license" means no rights are granted to reuse the code at all, which is
probably not what a project inviting federation intends, and is certainly
not something a stranger reading docs/deployment.md or building against
bot.did.* can safely assume either way.
This epic does not pick a license. It lays out what the decision covers, because "the project's license" is actually three separable decisions with different audiences and different consequences, and picking one without naming the other two leaves the other two undecided by default rather than by choice.
The code #
The Rust workspace under crates/, docs/, and everything else that is
this project's own implementation. The choice here is the ordinary
open-source one — permissive versus copyleft, and whether contributions
need a CLA — and it mostly affects other implementers who might build on
didbot itself rather than build a different server that talks the same
protocol.
The lexicons #
bot.did.* is this project's schema contribution, and
pds-xrpc already flags the domain as unregistered and the
namespace as "a placeholder." A schema is different from code in one way
that matters here: others may need to implement against it. A relay, an
indexer, or a competing server implementation that wants to read a
bot.did.registration record needs to know the record's shape, and a
restrictive code license sitting over the lexicon JSON could be read as
restricting implementing the schema, not just reusing this project's
Rust. Bluesky's own app.bsky.* and com.atproto.* lexicons ship under
terms chosen specifically to keep that door open.
The vendored interop corpus #
vendor/atproto-lexicons/ and vendor/atproto-interop-tests/ are copied
into this tree — vendor/atproto-lexicons/, per
pds-xrpc's Done list, "copied unedited from the atproto
repository" and used as the source of truth the conformance harness checks
responses against. Both directories carry their own license files already:
vendor/atproto-lexicons/ ships LICENSE.txt, LICENSE-APACHE.txt and
LICENSE-MIT.txt; vendor/atproto-interop-tests/ ships LICENSE-CC0.
Done #
Nothing closed yet.