1
0
silverbullet/website/🔌 Plugs.md

96 lines
5.1 KiB
Markdown
Raw Normal View History

SilverBullet at its core is bare bones in terms of functionality, most of its power it gains from **plugs**.
2022-10-29 14:57:12 +00:00
2023-08-29 19:17:29 +00:00
Plugs are an extension mechanism (implemented using a library called [[PlugOS]] thats part of the silverbullet repo) that runs “plug” code in the browser using [web workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers).
2022-11-27 10:21:03 +00:00
Plugs can hook into SB in various ways:
2022-11-27 08:12:24 +00:00
* Extend the Markdown parser and its syntax
* Define new commands and keybindings
* Respond to various events triggered either on the server or client-side
* Run recurring and background tasks.
* Define their own extension mechanisms through custom events
Each plug runs in its own _sandboxed environment_ and communicates with SB via _syscalls_ that expose a vast range of functionality. Plugs can be loaded, unloaded, and updated without having to restart SB itself.
2022-06-28 12:14:15 +00:00
Plugs are distributed as self-contained JavaScript bundles (ending with `.plug.js`). Upon boot, SB will load all core plugs bundled with SB itself (listed below), as well as any additional plugs stored in the `_plug` folder in your space. Typically, management of plugs in the `_plug` folder is done using [[🔌 Core/Plug Management]].
2022-11-27 10:21:03 +00:00
2022-11-25 15:01:05 +00:00
## Core plugs
These plugs are distributed with SilverBullet and are automatically enabled:
2022-11-25 15:01:05 +00:00
<!-- #query page where type = "plug" and uri = null order by name render [[template/plug]] -->
* [[🔌 Directive]]
2023-08-29 19:17:29 +00:00
* [[🔌 Editor]]
* [[🔌 Emoji]]
2023-08-29 19:17:29 +00:00
* [[🔌 Index]]
* [[🔌 Markdown]]
* [[🔌 Share]]
2023-08-29 19:17:29 +00:00
* [[🔌 Tasks]]
* [[🔌 Template]]
2022-11-25 15:01:05 +00:00
<!-- /query -->
2022-11-25 15:01:05 +00:00
## Third-party plugs
2022-11-27 08:12:24 +00:00
These plugs are written either by third parties or distributed separately from the main SB distribution:
2022-11-25 15:01:05 +00:00
<!-- #query page where type = "plug" and uri != null order by name render [[template/plug]] -->
* [[🔌 Backlinks]] by **Guillermo Vayá** ([repo](https://github.com/silverbulletmd/silverbullet-backlinks))
* [[🔌 Ghost]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-ghost))
* [[🔌 Git]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-git))
* [[🔌 Github]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-github))
2023-07-24 09:27:54 +00:00
* [[🔌 Graph View]] by **Bertjan Broeksema** ([repo](https://github.com/silverbulletmd/silverbullet-graphview))
* [[🔌 KaTeX]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-katex))
* [[🔌 Mattermost]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-mattermost))
* [[🔌 Mermaid]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-mermaid))
* [[🔌 Serendipity]] by **Pantelis Vratsalis** ([repo](https://github.com/m1lt0n/silverbullet-serendipity))
* [[🔌 Twitter]] by **SilverBullet Authors** ([repo](https://github.com/silverbulletmd/silverbullet-twitter))
<!-- /query -->
2022-07-16 10:18:31 +00:00
## How to develop your own plug
2022-10-29 14:57:12 +00:00
The easiest way to get started is to click the “Use this template” on the [silverbullet-plug-template](https://github.com/silverbulletmd/silverbullet-plug-template) repo.
2022-10-12 09:47:13 +00:00
Generally, every plug consists of a YAML manifest file named `yourplugname.plug.yml`. This file defines all functions that form your plug. To be loadable by SilverBullet (or any PlugOS-based system for that matter), it needs to be compiled into a JSON bundle (ending with `.plug.json`).
2022-10-29 14:57:12 +00:00
Generally, the way to do this is to run `silverbullet plug:compile` as follows:
2022-07-16 10:18:31 +00:00
2022-11-27 10:21:03 +00:00
```shell
silverbullet plug:compile yourplugname.plug.yaml
```
2022-07-16 10:18:31 +00:00
During development, you may want to compile plugs in debug mode, which will not minify them and generate source maps:
```shell
silverbullet plug:compile --debug yourplugname.plug.yaml
```
If you use the plug template, this command is wrapped in your `deno.jsonc` file, so you can just run either:
2022-07-16 10:18:31 +00:00
2022-11-27 10:21:03 +00:00
```shell
deno task build
```
2022-07-16 10:18:31 +00:00
2022-10-29 14:57:12 +00:00
to build it once, or
2022-07-16 10:18:31 +00:00
2022-11-27 10:21:03 +00:00
```shell
deno task watch
```
2022-07-16 10:18:31 +00:00
to build it and rebuild it when files are changed. This will write a `yourplugname.plug.js` file into the same folder.
2022-07-16 10:18:31 +00:00
Once you have a compiled `.plug.js` file you can load it into SB in a few ways by listing it in your spaces `PLUGS` page.
2022-10-29 14:57:12 +00:00
For development its easiest to simply copy the `.plug.js` file into your spaces `_plug/` folder:
2022-07-16 10:18:31 +00:00
```shell
cp myplug.plug.js ~/myspace/_plug/
2022-11-27 10:21:03 +00:00
```
2022-07-16 10:18:31 +00:00
Within seconds (watch your browsers JavaScript console), your plug should be picked up, synced to your browser and loaded. No need to even reload the page.
2022-07-16 10:18:31 +00:00
## Debugging
Since plugs run in your browser, you can use the usual browser debugging tools. When you console.log things, these logs will appear in your browsers JavaScript console.
2022-07-16 10:18:31 +00:00
## Distribution
Once youre happy with your plug, you can distribute it in various ways:
2022-07-16 10:18:31 +00:00
- You can put it on github by simply committing the resulting `.plug.js` file there and instructing users to point to by adding
`- github:yourgithubuser/yourrepo/yourplugname.plug.js` to their `PLUGS` file
- Add a release in your github repo and instruct users to add the release as `- ghr:yourgithubuser/yourrepo` or if they need a specific release `- ghr:yourgithubuser/yourrepo/release-name`
- You can put it on any other web server, and tell people to load it via https, e.g., `- https://mydomain.com/mypugname.plug.js`.