Skip to main content
You don’t have to write a plugin yourself. Describe the routine in chat, and the agent builds it for you. For example:
Create a plugin with a skill that compares my spending this month to the previous month and shows where I spent more.

Plugin folder layout

Put the folder at ~/.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 under skills/ 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’s references/ 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’s scripts/ 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:
uv installs the pinned packages into an environment of its own on the first run. Pin every package to an exact version. The script can pull anything from PyPI, and a reader of your repository should see exactly what runs. Write scripts for the agent, not for a person:
  • 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.
Then name the command in the skill’s steps. For this script, tell the agent to run 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:
They appear in the / 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

  1. Open Settings → Plugins and check the plugin is listed without an error.
  2. Type / in the message box and pick the skill by its plugin:skill name.
  3. Ask in your own words, without the picker, to check that the description triggers it.
If a skill does not appear, open Settings → Plugins and look for an error on the plugin’s row.

Publish to the marketplace

Publishing takes two steps, with no form to fill in and no review queue:
  1. Push the plugin to a public GitHub repository with plugin.json at the root. One repository holds one plugin.
  2. Add the topic accountant24-plugin to the repository (the gear next to About on the repository page).
The plugin appears in the marketplace at the next refresh, within about 30 minutes. Anyone can then install it from Settings → Plugins. The app installs the tip of your default branch, so what you push is what the next install gets. A user moves to your latest version by uninstalling and installing again. accountant24/skills is a complete example of the layout.

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.json at the root, with a name that matches the folder and follows the naming rules, and a description of what the plugin does.
  • At least one skills/<name>/SKILL.md, its frontmatter name matching 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-plugin topic, previewed with the command above.

How the app installs a plugin

  1. When a user confirms the install, the app downloads the repository as an archive over HTTPS and unpacks it to a temporary folder.
  2. It reads plugin.json and the skills, and refuses anything that isn’t a usable plugin.
  3. It copies the plugin into ~/.accountant24/plugins/<plugin-name>/.
  4. It records the source repository in app-settings.json.
  5. The agent restarts, and the new skills are available in chat.
A plugin’s instructions and scripts run later, when the agent uses one of its skills.

Troubleshooting

The app shows these messages in the install dialog when an install fails. A broken installed plugin shows its message on its own row in Settings → Plugins.