One thing I still haven’t really figured out how to best do is sharing of templates, useful pages, space script etc. I’ve tried a few things:
Initially a lot would simply be built into SB: slash commands such as /task
. This worked, but meant to add anything you’d have to dive into the (typescript) code, add a command, and maybe put it in a plug for distribution. Advantage: distribution is simple, as once a new template is added to SB, everybody automatically gets it on the next upgrade, or users use the plug and upgrade it from time to time. Still, the barrier to entry is fairly high and I become a bottleneck of reviewing these things and deciding what’s good enough to include and what is not.
Then, I upgraded the template system to no longer require having to modify SB itself (or create a plug) to do a lot of things and you could just do them in your space: templates, useful pages (such as Library/Core/Page/Maintenance) and more recently space script.
That’s all cool, but then the challenge became: ok, should I just rip everything out of the core SB distribute and figure out distribution of these templates later? I decided yes, this is the way. So now, SB itself ships with as little built in as possible (although I could probably remove even more) and moving as much as possible to “user space”.
My short term solution to distribution of these templates is now Libraries. I think this is a nice and simple model, but the open question remains: how do you update and maintain these things?
In the current iteration, I suggest people just “import” a library, which means to simply keep a copy in their space. They just have to press a button, so it’s easy enough. This is nice and simple. However, work will be done on this core library. You may want to pull a newer version. The best way to do this is to simply import again, but that will then overwrite any local changes, which I also encourage people make.
Another option, which already works but I just am not advertising it is using Federation. Using federation, you say: “this other place on the Interwebs is part of my space, please consider it as such”. So you can add silverbullet.md/Library/Core
to your federate
list and automatically get everything there (virtually) synced into your space and kept up to date. Great! But… these federated bits are read only. You cannot make changes. This would be fine, but there may be templates you want to disable or tweak slightly, and… you can’t. Potentially, some users may also not like that their SB instance is pinging a central server (silverbullet.md in this case) to pull these templates. Now it’d be possible to conceive of a system where you can influence what templates do without modifying them e.g. through SETTINGS, but that complicates them quite a bit.
So… what would be a better system? How do we balance the flexibility of “owning your templates and tweak them however you want” with “but also give me the latest and greatest updates”?
Ideas?