Can a torrent be created when no one member has all the data, but the initial seed group does?

No, this is not how a torrent works. When you create a torrent, you push what the data is supposed to be and clients compare what they have to what is stored on the server. So rather than it adding to the torrent on the server, the server would delete their data.

What you want to do is have a global torrent server where each member can add their part as torrent so the whole project group can download all individual torrents and get a whole. You only need one torrent server that keeps track of all the torrents, but that is a requirement anyway, unless you go peer distribution only. I'm not experienced with that so I don't know how easy that is to work with.

Also, keep in mind that once the torrent is created, the initial creator can't just edit their files and expect it to update. Instead the torrent will overwrite their changes with what's in the torrent as well.

A new torrent would have to be created each time there is an update.

Torrent is only a distribute based on snapshot, not an update service. If updating is what you want, use a cloud based storage solution instead, such as OneDrive, Google Drive, DropBox, etc...


Each member of the community has a complete version of their own data, but no member has anyone else's data. If a torrent already existed, no problem! Each member seeds the chunks they have while receiving the chunks they don't...this is exactly how BitTorrent is designed to work. But in this scenario, no torrent has yet been created. Can it be? If so, how?

In theory it is possible, but I don't think there are existing tools for that.

The core process of creating a .torrent file is, roughly:

  1. Start with:
    torrent = {
        "info": {
            "files": [],
            "piece size": 4194304,
            "pieces": bytearray(),
        },
    }
    
  2. Determine a list of all files (with their sizes in bytes) and store in torrent["info"]["files"];
  3. Concatenate all files into a single stream, in the same order as the list;
  4. Divide the stream into fixed-size "pieces" (e.g. 4 MB);
  5. Calculate SHA-1 of each piece;
  6. Concatenate the SHA-1 hashes of all pieces and store in torrent["info"]["pieces"].
  7. Serialize the entire torrent structure using Bencode and dump into a .torrent file.

There is no fundamental reason why in step 1 you couldn't assemble the list from several sources, determine which source has which piece ranges, and in step 4 you couldn't ask each machine to provide hashes for its own pieces. You'd just need to write your own tools for doing all of this.

(It helps if file lengths are an exact multiple of the piece size, but some BitTorrent apps already insert empty "padding" files to keep files piece-aligned, so you could do the same.)

It might be simpler for one member to just download everyone else's data first (e.g. creating individual torrents for each component) and then create a super-torrent from those in the usual way of creating a torrent.

Alternatively, you might look into other software such as dat.