Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
5e1e969
Add catalog format 2, validation CI and contributor docs
nwparker Oct 24, 2026
57accdf
List six official plugins in catalog format 2
nwparker Oct 24, 2026
351cad7
Pin licensed plugin releases and validate with hardened Orca
nwparker Oct 24, 2026
68ddb13
Pin Orca 1.4.240 plugin releases, move schema URL, validate with fina…
nwparker Oct 24, 2026
b3b95d9
Move the six official plugins into plugins/<name>
nwparker Oct 24, 2026
7acd795
List plugins/ releases from this repository and check their pins in CI
nwparker Oct 24, 2026
1b711ee
Pin plugins/ releases to the commit that added them
nwparker Oct 24, 2026
95ea192
Add cover images and screenshots to the six official plugins
nwparker Oct 24, 2026
1bb738e
Pin official releases with their new images and list the images in th…
nwparker Oct 24, 2026
2ca3f75
Require Orca 1.4.241 for every official plugin and pin CI to the fina…
nwparker Oct 25, 2026
3a149be
Pin official releases to the 1.4.241 manifests
nwparker Oct 25, 2026
1c25d99
Add Orca OLED, a true-black theme and terminal theme
nwparker Oct 26, 2026
ddc2d38
List Orca OLED in the catalog
nwparker Oct 26, 2026
c665d5b
Require Orca 1.4.242 for every official plugin and pin CI to the 1.4.…
nwparker Oct 26, 2026
6746aab
Pin official releases to the 1.4.242 manifests
nwparker Oct 26, 2026
31ef661
Pin CI to the final plugin stack Orca validator (b04037f517d)
nwparker Oct 26, 2026
f24b89c
Remove Orca Navigation Shortcuts from the v2 catalog
nwparker Oct 27, 2026
7e2c087
excalidraw: add official Excalidraw custom editor plugin
nwparker Oct 27, 2026
00561a9
List Excalidraw in the catalog
nwparker Oct 27, 2026
44684f5
ci: pin Orca with customEditors support
nwparker Oct 27, 2026
fa99069
Add Gleam Language, Prisma Syntax and Dusk & Ember Themes
nwparker Oct 27, 2026
926c527
List Gleam Language, Prisma Syntax and Dusk & Ember Themes in the cat…
nwparker Oct 27, 2026
55855a7
spreadsheet: add official Spreadsheet Viewer custom editor plugin
nwparker Oct 27, 2026
035b51c
excalidraw: use the official orca- id prefix
nwparker Oct 27, 2026
bd8a0a4
List Spreadsheet Viewer and rename Excalidraw to stablyai.orca-excali…
nwparker Oct 27, 2026
b411f46
Official themes color code: tokenColors for Midnight, Nord, OLED, Dus…
nwparker Oct 27, 2026
ed7575e
List the tokenColors releases of Midnight 2.1.0, Nord 2.1.0, OLED 1.1…
nwparker Oct 27, 2026
b1e49c7
Spreadsheet Viewer: cap the bytes a workbook really inflates to, not …
nwparker Oct 27, 2026
2a59e6c
Excalidraw: name the document version on every edit and read the cont…
nwparker Oct 28, 2026
5922d73
List the Excalidraw and Spreadsheet Viewer fixes with editorFileTypes…
nwparker Oct 28, 2026
07fd88b
Spreadsheet Viewer: drop the removed readonly field; it views only, w…
nwparker Oct 28, 2026
e5618f0
Re-pin the Spreadsheet Viewer release to the readonly removal
nwparker Oct 28, 2026
c8881aa
Rename manifest fields for the Orca plugin interface v1: themes and s…
nwparker Oct 28, 2026
336c472
Re-pin every release to the renamed manifests
nwparker Oct 28, 2026
2696042
Drop superseded releases written in the pre-rename manifest format; e…
nwparker Oct 28, 2026
fcab059
Pin catalog CI to Orca with the interface v1 manifest names
nwparker Oct 28, 2026
99e4be7
Excalidraw and Spreadsheet Viewer: talk to Orca through window.orca
nwparker Oct 28, 2026
30e429f
Re-pin Excalidraw and Spreadsheet Viewer to the window.orca editors; …
nwparker Oct 28, 2026
bcd4835
Spreadsheet Viewer: Orca opens custom editor files of up to 64 MiB
nwparker Oct 28, 2026
37f1de8
Re-pin Spreadsheet Viewer; pin catalog CI to Orca with window.orca an…
nwparker Oct 28, 2026
d825d2f
Raise every plugin's engines.orca to 1.4.244, the first release that …
nwparker Oct 28, 2026
90c81a7
Pin every release to the 1.4.244 manifests; pin catalog CI to the Orc…
nwparker Oct 28, 2026
086515c
Pin catalog CI to the final Orca plugin stack head
nwparker Oct 28, 2026
8f4275f
Pin catalog CI to the final Orca plugin stack head
nwparker Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions .github/workflows/validate-catalog.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Validate catalog

on:
pull_request:
push:
branches: [main]

permissions:
contents: read

env:
# Orca commit whose validator and legacy export the catalog is checked with. Bump it deliberately.
ORCA_REF: 7f05eec8e9af8da6736110b478ea4c41ed4ae69e

jobs:
validate:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Check out catalog
uses: actions/checkout@v4
with:
path: catalog
# Why full history: releases pin the last commit that changed each plugin directory.
fetch-depth: 0
persist-credentials: false

- name: Check out Orca
uses: actions/checkout@v4
with:
repository: stablyai/orca
ref: ${{ env.ORCA_REF }}
path: orca
persist-credentials: false

- uses: pnpm/action-setup@v4
with:
package_json_file: orca/package.json

- uses: actions/setup-node@v4
with:
node-version: 24
cache: pnpm
cache-dependency-path: orca/pnpm-lock.yaml

# Why no install scripts: the validator needs only the JavaScript dependencies, not Electron.
- name: Install Orca validator
working-directory: orca
run: |
pnpm install --frozen-lockfile --ignore-scripts
pnpm run build:packages

- name: Check plugins/ release entries are current
working-directory: catalog
env:
ORCA_DIR: ${{ github.workspace }}/orca
run: node scripts/release-entry.mjs

- name: Validate catalog, releases, images and orca-marketplace.json
working-directory: catalog
env:
ORCA_DIR: ${{ github.workspace }}/orca
run: node scripts/check-catalog.mjs
92 changes: 92 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Adding or updating a plugin

This repository holds Orca's official plugin catalog and the official plugins themselves.
`orca-catalog.json` pins every release to an exact commit and a hash of the plugin's files. Orca
refuses to install bytes that differ from what is listed.

- **Official plugins** (published by `stablyai`) live in `plugins/<name>/`, one directory each.
Orca installs only that directory, so changing one plugin never changes another's hash.
- **Community plugins** stay in their authors' own repositories. List them in the community
directory; don't copy their code here.

The field reference is in Orca's
[catalog reference](https://github.com/stablyai/orca/blob/main/docs/reference/plugin-catalog.md)
and the
[plugin author guide](https://github.com/stablyai/orca/blob/main/docs/reference/plugin-authoring.md).

You need a checkout of [Orca](https://github.com/stablyai/orca) with dependencies installed
(`pnpm install`, then `pnpm run build:packages`). Below, `ORCA_DIR` is its path. CI uses the Orca
commit in `ORCA_REF` of `.github/workflows/validate-catalog.yml`.

## 1. Change the plugin and commit it

Use manifest format 2 (`"manifestVersion": 2`) and choose the lowest `execution` profile that
fits: `data` for themes, syntaxes and translations; `declarative` for commands, shortcuts and
recipes; `sandboxed-ui` for panels; `trusted-worker` only when you need code running in Orca.
Keep a `LICENSE` file in the plugin directory and set `license` in the manifest to match.

Bump `version` in `orca-plugin.json` for any change to a plugin that has already been merged:
a released version is never rebuilt with different bytes.

- **New official plugin:** create `plugins/<name>/` and add an entry to `orca-catalog.json` with
`id` (`<publisher>.<id>` from the manifest), `source`
(`{"kind": "git", "url": "https://github.com/stablyai/orca-plugins.git", "ref": "main", "path": "plugins/<name>"}`),
a `description`, `categories` and `"releases": []`.

Commit the plugin change on its own. The release pins the last commit that changed the plugin's
directory, and a commit cannot name itself.

## 2. Write the release entry

```sh
ORCA_DIR=/path/to/orca node scripts/release-entry.mjs --write
```

For every directory in `plugins/`, this runs Orca's validator and writes the release it prints
(version, commit, `contentHash`, execution profile, minimum Orca, contributions, capabilities,
file types) into `orca-catalog.json`. A new version goes **first** in `releases`; an unchanged
version is updated in place. Don't edit these fields by hand: CI recomputes them and fails when
they are stale. Commit `orca-catalog.json`.

When a release raises `engines.orca`, keep the previous release listed beneath it. Older Orca
installs the first release it supports, so removing the old one leaves those users with nothing
to install.

You may add display-only fields to a release: `changelog`, `updatedAt`, `license`, `homepage`,
`themePreview`, `images`. The script keeps them.

## 3. Add a cover image (recommended)

Put images under `assets/<plugin id>/` and reference them from the release's `images`, with
`path`, `alt` text, `sha256`, `width` and `height`. Limits:

| Image | Formats | Size |
| --- | --- | --- |
| icon | PNG, WEBP, square | at least 128×128, at most 256 KB |
| cover | PNG, JPEG, WEBP | at least 800×500 (1600×1000 recommended), at most 1024 KB |
| screenshots (up to 6) | PNG, JPEG, WEBP | at least 1280×800, at most 1536 KB |

Images must be static, show the real plugin, and not imitate Orca's trust badges. CI fails on any
file under `assets/` that no release references.

## 4. Check locally

Orca builds released before catalog format 2 read only `orca-marketplace.json`. Don't edit it.
Plugins in `plugins/` are left out of it, because those builds cannot install a subdirectory;
older builds keep the original listings. Run the same checks CI runs:

```sh
ORCA_DIR=/path/to/orca node scripts/release-entry.mjs
ORCA_DIR=/path/to/orca node scripts/check-catalog.mjs
```

If `check-catalog.mjs` says `orca-marketplace.json` is out of date, regenerate it with
`--write-legacy` rather than editing it.

## 5. Open a pull request

CI checks that every release in `plugins/` is current, validates the catalog with Orca's own
validator and fetches every listed commit to recompute its `contentHash`. It also checks images
and that `orca-marketplace.json` matches the export. An
Orca maintainer then reviews the plugin against [REVIEW_POLICY.md](REVIEW_POLICY.md). Say in
the PR what the plugin does and, for anything above `data`, why it needs that profile.
39 changes: 39 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Orca plugins

The official plugin catalog for [Orca](https://github.com/stablyai/orca), and the source of the
official plugins. Orca reads the catalog to show the plugins you can install from Settings →
Plugins.

| Path | What it is |
| --- | --- |
| `plugins/<name>/` | Official plugins, one directory each, with its own manifest and licence. |
| `orca-catalog.json` | Read by Orca builds that support catalog format 2. Each release is pinned to an exact commit and file hash. |
| `orca-marketplace.json` | Read by older Orca builds. Frozen: it keeps the original listings, which install from each plugin's old repository, including plugins later dropped from `orca-catalog.json` (such as Orca Navigation Shortcuts). |
| `legacy-v1-only.json` | The ids in `orca-marketplace.json` that the export does not produce. |
| `assets/` | Listing images referenced by releases. |
| `scripts/release-entry.mjs` | Prints and checks the catalog release of every plugin in `plugins/`. |
| `scripts/check-catalog.mjs` | Validates the catalog, every release, images and `orca-marketplace.json`. |

## Official plugins

| Plugin | Directory | What it adds |
| --- | --- | --- |
| Orca Midnight | `plugins/midnight-theme` | A dark app theme |
| Nord for Orca | `plugins/nord-theme` | A cool, low-contrast app theme |
| Orca OLED | `plugins/oled-theme` | A true-black app theme and terminal theme |
| Dusk & Ember Themes | `plugins/dusk-ember` | A dark and a light app theme, with matching terminal themes |
| Orca Minimal Icons | `plugins/minimal-icons` | A monochrome file icon theme |
| Solarized Terminal | `plugins/solarized-terminal` | Solarized Dark terminal colors |
| Gleam Language | `plugins/gleam` | Highlighting for `.gleam` files |
| Prisma Syntax | `plugins/prisma` | Prisma-aware highlighting for `.prisma` files |
| Excalidraw | `plugins/excalidraw` | An editor for `.excalidraw` diagrams |
| Multipass VM Recipes | `plugins/multipass-recipes` | Disposable Multipass VM workspaces |

Community plugins live in their authors' own repositories. The catalog can list them, but their
code is not copied here.

- To add or update a plugin, see [CONTRIBUTING.md](CONTRIBUTING.md).
- To learn how plugins are reviewed and taken down, see [REVIEW_POLICY.md](REVIEW_POLICY.md).

Every pull request is checked by `.github/workflows/validate-catalog.yml`, which runs Orca's own
validator at a pinned Orca commit.
56 changes: 56 additions & 0 deletions REVIEW_POLICY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Review policy

## Who merges

At launch, only Orca maintainers merge into this repository. Every new plugin and every new
release needs a maintainer's review and a green CI run. No release is merged on CI alone.

This repository holds only official plugins, in `plugins/<name>/`, published under `stablyai`.
Community plugins stay in their authors' own repositories and are listed in the community
directory, not copied here.

## Checklist

CI proves that each release in `plugins/` is current, that every release is the exact bytes at
its pinned commit, and that the listing matches the manifest. A reviewer checks what CI cannot:

- [ ] **Lowest execution profile that fits.** `data` for themes, syntaxes and translations;
`declarative` for commands, shortcuts and recipes; `sandboxed-ui` only for panels;
`trusted-worker` only when the plugin needs code running in Orca. Ask for a lower profile
when the contributions allow it.
- [ ] **Capabilities are justified.** Each requested capability is explained and used.
- [ ] **No impersonation.** The name, publisher, description and images don't pose as Orca, as
an "official" or "verified" plugin, or as another project or company the author doesn't
represent. Only Orca maintainers publish under `stablyai` or use the `official` category.
- [ ] **Licence present.** The plugin directory has its own `LICENSE` file, and the manifest's
`license` matches it.
- [ ] **Version bumped.** A change to a plugin that is already merged raises its `version`, so a
released version never gets different bytes. `release-entry.mjs --write` updates a release
in place when the version is unchanged, which is only right before first merge.
- [ ] **Honest images.** Icons, covers and screenshots show the real plugin, with accurate alt
text. No fake trust badges, ratings, download counts or Orca interface chrome that suggests
endorsement.
- [ ] **No bundled binaries.** The release has no compiled executables, native modules, or
obfuscated or minified code that can't be reviewed. Generated JavaScript is acceptable only
when its source is in the same repository.
- [ ] **Extra scrutiny for `trusted-worker`.** These plugins run code with full access to the
machine. Read the worker source, check what it sends over the network and what it runs,
and confirm that the publisher is who they say they are. Re-review on every release, not
just the first.
- [ ] **Updates.** A new release that raises its profile or asks for new capabilities is
reviewed like a new plugin. Orca asks users to approve it again, but the catalog should not
offer it unreviewed.

## Takedown

When a listed plugin turns out to be malicious, deceptive or broken:

1. Open a PR that removes its entry, or the bad releases, from `orca-catalog.json`, and
regenerate `orca-marketplace.json`. This stops new installs.
2. Orca maintainers add the plugin's `<publisher>.<id>` to Orca's plugin kill list, served from
`https://onorca.dev/plugins/kill-list.json`, with a short reason and optionally an advisory
URL. Orca reads that list and disables copies that are already installed, which removing the
catalog entry alone does not do.

Report a suspected malicious plugin privately to the Orca maintainers rather than in a public
issue.
Empty file added assets/.gitkeep
Empty file.
12 changes: 12 additions & 0 deletions legacy-v1-only.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"note": "Listings kept in orca-marketplace.json for Orca builds that predate catalog format 2. They install each plugin from its original repository at v1.0.0. The export leaves out plugins in plugins/ (a source.path), so these stay as they are; never add new ones.",
"ids": [
"stablyai.orca-midnight-theme",
"stablyai.orca-workflow-skills",
"stablyai.orca-nord-theme",
"stablyai.orca-minimal-icons",
"stablyai.orca-solarized-terminal",
"stablyai.orca-multipass-recipes",
"stablyai.orca-navigation-shortcuts"
]
}
Loading
Loading