Plugin folder layout
~/.accountant24/plugins/<plugin-name>. The app picks it up within a few seconds. It appears under Settings → Plugins, and its skills are ready to use in chat.
The folder name must match the name in plugin.json.
plugin.json
plugin.json is the plugin’s manifest. It gives the plugin its name and tells the app and the marketplace what the plugin is.
A minimal example:
Every field
Any other field, or a field of the wrong type, fails the install with an error.
Naming rules
Plugin names use lowercase letters, digits and hyphens, with hyphens only in the middle.monthly-review is fine, while Monthly_Review, -review and my--plugin are not. Up to 64 characters. The name is also the namespace for the plugin’s skills, so keep it short.
The same rules apply to skill folder names.
Requiring a minimum app version
Anything specific to Accountant24 lives under the app’s own namespace:minAppVersion must read as major.minor.patch. An older app refuses to install the plugin and says which version it needs. The marketplace still lists it and shows the reason in the row.
ai.accountant24 is reserved for Accountant24. Other agents ignore it, and Accountant24 ignores theirs, so the same plugin stays portable.
Write each skill in a SKILL.md
Each folder underskills/ holds one skill, defined by a SKILL.md with frontmatter and instructions:
This skill appears in the
/ picker as monthly-review:monthly-review, since the plugin and the skill are both named monthly-review.
A plugin needs at least one usable skill.
Reference material
Put reference material in the skill’sreferences/ folder. Point the agent at a file in the step that needs it. The agent loads reference files through progressive disclosure. It reads them only when they are needed.
Helper scripts
Put helper code in the skill’sscripts/ folder, and tell the agent in the instructions when to run it. Most skills need no script. The agent already has hledger, pdftotext, tesseract and bash, plus its own tools to query and change the ledger. Write a script only for a step those cannot do.
Scripts are Python, and the agent runs them with uv run scripts/<name>.py. The app ships uv, a Python runner, so there is nothing to install. The first run downloads Python once, over the network, and keeps it in the workspace. After that, everything runs locally.
Every script opens with an inline metadata header, as PEP 723 defines it, that names the Python version and pins the packages the script imports.
Here is an example that reads a spreadsheet the user attached, a format none of the built-in tools open:
- Take everything as command-line arguments, and never prompt for input.
- Print the result as JSON on stdout.
- On failure, print what went wrong on stderr and exit with a non-zero code.
uv run scripts/budget.py with the path of the spreadsheet from the skill’s folder, and to read the rows it prints.
Several skills in one plugin
A plugin can provide any number of skills, one folder each:/ picker as budget:monthly-review and budget:yearly-review. The marketplace lists up to 50 skills per plugin.
Two plugins cannot provide skill folders with the same name, even though the app shows them namespaced.
Test the plugin
- Open Settings → Plugins and check the plugin is listed without an error.
- Type
/in the message box and pick the skill by itsplugin:skillname. - Ask in your own words, without the picker, to check that the description triggers it.
Publish to the marketplace
Publishing takes two steps, with no form to fill in and no review queue:- Push the plugin to a public GitHub repository with
plugin.jsonat the root. One repository holds one plugin. - Add the topic
accountant24-pluginto the repository (the gear next to About on the repository page).
What gets listed
Check your entry before publishing
To see the entry the index would publish for a repository, or the reason it skipped something:Moderation
blocklist.json lists repositories that are never indexed.
Publishing checklist
plugin.jsonat the root, with anamethat matches the folder and follows the naming rules, and adescriptionof what the plugin does.- At least one
skills/<name>/SKILL.md, its frontmatternamematching its folder, with a description written for matching. - No unknown fields in the manifest.
- Scripts, if any, are Python files with an inline metadata header and every package pinned to a version.
- Tested in the app, both from the
/picker and by asking in your own words. - Public repository with the
accountant24-plugintopic, previewed with the command above.
How the app installs a plugin
- When a user confirms the install, the app downloads the repository as an archive over HTTPS and unpacks it to a temporary folder.
- It reads
plugin.jsonand the skills, and refuses anything that isn’t a usable plugin. - It copies the plugin into
~/.accountant24/plugins/<plugin-name>/. - It records the source repository in app-settings.json.
- The agent restarts, and the new skills are available in chat.