A curated index of extensions for MarkEdit.
- extensions/<id>.json: one entry per extension (the source of truth). Extensions change the editor's behavior.
- themes/<id>.json: one entry per theme. Themes change the editor's styling.
- index.json: the generated feed the app reads. Do not edit by hand.
- schemas/: JSON Schemas for
extensions,themes, andindex.json. - site/: the generated gallery, published to GitHub Pages. Generated, not committed.
The folder an entry lives in determines its kind, so an entry's category (extension or theme) is derived from the folder, not stored in the file. In most cases, adding or updating an entry only requires changes under extensions/ or themes/.
{
"$schema": "https://github.com/MarkEdit-app/extensions/raw/refs/heads/main/schemas/extension.schema.json",
"id": "markedit-preview",
"name": "MarkEdit Preview",
"description": "A live preview pane for the current document.",
"author": "MarkEdit-app",
"homepage": "https://github.com/MarkEdit-app/MarkEdit-preview",
"versions": [
{
"version": "1.8.1",
"url": "https://raw.githubusercontent.com/MarkEdit-app/MarkEdit-preview/v1.8.1/dist/markedit-preview.js",
"sha256": "1532295f78826ed78e161ffdc0c7fdcf307bf0ac4664fbf7eb50dc4c741be0c8"
}
]
}idis kebab-case and must equal the filename.versionslists builds newest-first; the newest becomeslatestinindex.json. Older entries are kept as verified history (every listed build is hash-checked), not served to the app.urlpoints at the.jsfile committed at a release tag (an immutable ref, served raw from GitHub).sha256pins the exact bytes aturl.minAppVersion(optional) is the lowest MarkEdit version a build supports; it defaults to1.0.0and is carried intolatest.notes(optional) is a short release note for the build, carried intolatest.
A theme is an extension that only restyles the editor, via the MarkEdit-theming mechanism. Put its entry under themes/ (which marks it as a theme) and use theme.schema.json. Themes require two extra fields:
colorSchemeislight,dark, orboth, the schemes the theme supports.screenshotsis a non-empty list of HTTPS image URLs, shown in the gallery and the Extension Manager.
{
"$schema": "https://github.com/MarkEdit-app/extensions/raw/refs/heads/main/schemas/theme.schema.json",
"id": "markedit-theme-catppuccin",
"name": "Catppuccin",
"description": "Soothing pastel theme for MarkEdit.",
"author": "MarkEdit-app",
"homepage": "https://github.com/MarkEdit-app/MarkEdit-theme-catppuccin",
"colorScheme": "both",
"screenshots": [
"https://raw.githubusercontent.com/MarkEdit-app/MarkEdit-theme-catppuccin/main/screenshots/light.png",
"https://raw.githubusercontent.com/MarkEdit-app/MarkEdit-theme-catppuccin/main/screenshots/dark.png"
],
"versions": [
{
"version": "1.0.0",
"url": "https://raw.githubusercontent.com/MarkEdit-app/MarkEdit-theme-catppuccin/v1.0.0/dist/markedit-theme-catppuccin.js",
"sha256": "ae27ae2f81e5865028e8c1d7d1a87254a18097e78e9dfcda113ed6f7882614d6"
}
]
}-
Add or update extensions/<id>.json (or themes/<id>.json for a theme).
-
Compute the hash for each
url:curl -fsSL -o file "<url>" && shasum -a 256 file
-
Open a pull request.
CI validates the schema, id/filename match, and that each sha256 matches the fetched bytes. On merge, index.json and the site are regenerated.
yarn install --frozen-lockfile
yarn build # validate + fetch + hash-check, then write index.json and site/
CHECK_INTEGRITY=false yarn build # schema-only, no downloadsWe review provenance and integrity: the source is identifiable, the url is HTTPS and reachable, and sha256 matches. We also do a basic quality pass: the extension should do what it claims and must not be malicious, but we don't judge taste or completeness.