- Make a copy of this repo as a template with the Use this template button, please note that the repo name
must be the same as the plugin name, the default branch must be
main - Clone your repo to a local development folder. For convenience, you can place this folder in
your
{workspace}/data/plugins/folder - Install NodeJS and pnpm, then run
pnpm iin the command line under your repo folder - Execute
pnpm run devfor real-time compilation - Open SiYuan marketplace and enable plugin in downloaded tab
- i18n/*
- icon.png (160*160)
- index.css
- index.js
- plugin.json
- preview.png (1024*768)
- README*.md
- Fontend API
- Backend API
In terms of internationalization, our main consideration is to support multiple languages. Specifically, we need to complete the following tasks:
- Meta information about the plugin itself, such as plugin description and readme
descriptionandreadmefields in plugin.json, and the corresponding README*.md file
- Text used in the plugin, such as button text and tooltips
- src/i18n/*.json language configuration files
- Use
this.i18.keyto get the text in the code
- Finally, declare the language supported by the plugin in the
i18nfield in plugin.json
It is recommended that the plugin supports at least English and Simplified Chinese, so that more people can use it more conveniently.
A typical example is as follows:
{
"name": "plugin-sample",
"author": "Vanessa",
"url": "https://github.com/siyuan-note/plugin-sample",
"version": "0.4.2",
"minAppVersion": "3.3.0",
"backends": ["all"],
"frontends": ["all"],
"disabledInPublish": false,
"displayName": {
"default": "Plugin Sample",
"zh_CN": "插件示例"
},
"description": {
"default": "This is a plugin development sample",
"zh_CN": "这是一个插件开发示例"
},
"readme": {
"default": "README.md",
"zh_CN": "README_zh_CN.md"
},
"funding": {
"custom": ["https://ld246.com/sponsor"]
},
"keywords": [
"开发者参考",
"developer reference",
"示例插件"
]
}name: Plugin package name, must be the same as the GitHub repository name, and cannot be duplicated with other plugins in the marketplaceauthor: Plugin author nameurl: Plugin repo URLversion: Plugin version number, needs to follow the semver specificationminAppVersion: Minimum SiYuan version required to use this plugindisabledInPublish: Whether to disable the plugin when using the publish service, defaults to false, i.e., not disabledbackends: Backend environment required by the plugin, optional values arewindows,linux,darwin,docker,android,ios,harmonyandallwindows: Windows desktoplinux: Linux desktopdarwin: macOS desktopdocker: Dockerandroid: Android APPios: iOS APPharmony: HarmonyOS APPall: All environments
frontends: Frontend environment required by the plugin, optional values aredesktop,desktop-window,mobile,browser-desktop,browser-mobileandalldesktop: Desktopdesktop-window: Desktop window converted from tabmobile: Mobile APPbrowser-desktop: Desktop browserbrowser-mobile: Mobile browserall: All environments
displayName: Plugin name, displayed in the marketplace list, supports multiple languages, it is recommended to provide at least Chinese and Englishdefault: Default language, must exist, it is recommended to use Englishzh_CN,en_USand other languages: optional
description: Plugin description, displayed in the marketplace list, supports multiple languages, it is recommended to provide at least Chinese and Englishdefault: Default language, must exist, it is recommended to use Englishzh_CN,en_USand other languages: optional
readme: Readme file name, displayed in the marketplace details page, supports multiple languages, it is recommended to provide at least Chinese and Englishdefault: Default language, must exist, it is recommended to use Englishzh_CN,en_USand other languages: optional
funding: Plugin sponsorship information, only one type will be displayed in the marketplaceopenCollective: Open Collective namepatreon: Patreon namegithub: GitHub login namecustom: Custom sponsorship link list
keywords: Search keyword list, used for marketplace search function, supplements search keywords beyond the values of name, author, displayName, and description fields
No matter which method is used to compile and package, we finally need to generate a package.zip, which contains at least the following files:
- i18n/*
- icon.png (recommended size: 160*160, file size should not exceed 20KB)
- index.css
- index.js
- plugin.json
- preview.png (recommended size: 1024*768, file size should not exceed 200KB)
- README*.md
- Execute
pnpm run buildto generate package.zip - Create a new GitHub release using your new version number as the "Tag version". See here for an example: https://github.com/siyuan-note/plugin-sample/releases
- Upload the file package.zip as binary attachments
- Publish the release
If this is the first release, you also need to create a PR to the Community Bazaar repository and modify the plugins.json file in it. This file is the index of all community plugin repositories, the format is:
{
"repos": [
"username/reponame"
]
}After the PR is merged, the bazaar will automatically update the index and deploy through GitHub Actions. For subsequent plugin releases, you only need to follow the above steps to create a new release, and you don't need to PR the community bazaar repository.
Under normal circumstances, the community bazaar repository will automatically update the index and deploy every hour, and you can check the deployment status at https://github.com/siyuan-note/bazaar/actions.
Developers need to pay attention to the following specifications.
If plugins or external extensions require direct reading or writing of files under the data directory, please use the kernel API to achieve this. Do not call fs or other electron or nodejs APIs directly, as it may result in data loss during synchronization and cause damage to cloud data.
Related APIs can be found at: /api/file/* (e.g., /api/file/getFile).
When creating a daily note in SiYuan, a custom-dailynote-yyyymmdd attribute will be automatically added to the document to distinguish it from regular documents.
For more details, please refer to Github Issue #9807.
Developers should pay attention to the following when developing the functionality to manually create Daily Notes:
- If
/api/filetree/createDailyNoteis called to create a daily note, the attribute will be automatically added to the document, and developers do not need to handle it separately - If a document is created manually by developer's code (e.g., using the
createDocWithMdAPI to create a daily note), please manually add this attribute to the document