Develop Extension
PostHog/posthog-js
Author a new PostHog browser extension, or port a posthog-js v1 extension, against the @posthog/browser-common Client/Extension contract.
A skill your agent uses when working on Trilium's browser extension, the web clipper (apps/web-clipper, built with WXT for Chrome MV3 and Firefox MV2) — its background script, content script…
$ npx skills add TriliumNext/Trilium --skill developing-web-clipper -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install TriliumNext/Trilium developing-web-clipper --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/developing-web-clipper .claude/skills/developing-web-clipper && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "developing-web-clipper" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/developing-web-clipper into .claude/skills/developing-web-clipper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-web-clipper", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/developing-web-clipperType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add TriliumNext/Trilium --skill developing-web-clipper -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install TriliumNext/Trilium developing-web-clipper --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/developing-web-clipper .agents/skills/developing-web-clipper && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "developing-web-clipper" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/developing-web-clipper into .agents/skills/developing-web-clipper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-web-clipper", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TriliumNext/Trilium --skill developing-web-clipper -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install TriliumNext/Trilium developing-web-clipper --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/developing-web-clipper .cursor/skills/developing-web-clipper && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "developing-web-clipper" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/developing-web-clipper into .cursor/skills/developing-web-clipper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-web-clipper", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/TriliumNext/Trilium.git --path .claude/skills/developing-web-clipper--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add TriliumNext/Trilium --skill developing-web-clipper -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install TriliumNext/Trilium developing-web-clipper --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/developing-web-clipper .gemini/skills/developing-web-clipper && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "developing-web-clipper" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/developing-web-clipper into .gemini/skills/developing-web-clipper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-web-clipper", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install TriliumNext/Trilium developing-web-clipperInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add TriliumNext/Trilium --skill developing-web-clipper -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/developing-web-clipper .github/skills/developing-web-clipper && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "developing-web-clipper" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/developing-web-clipper into .github/skills/developing-web-clipper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-web-clipper", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TriliumNext/Trilium --skill developing-web-clipper -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install TriliumNext/Trilium developing-web-clipper --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/developing-web-clipper .opencode/skills/developing-web-clipper && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "developing-web-clipper" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/developing-web-clipper into .opencode/skills/developing-web-clipper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-web-clipper", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
developing-web-clipperA skill your agent uses when working on Trilium's browser extension, the web clipper (apps/web-clipper, built with WXT for Chrome MV3 and Firefox MV2) — its background script, content script…
Developing Web Clipper is an agent skill from TriliumNext/Trilium. Use when working on Trilium's browser extension, the web clipper (apps/web-clipper, built with WXT for Chrome MV3 and Firefox MV2) — its background script, content script (Readability, screenshots, toasts), the Preact popup and options page, wxt.config.ts (manifest, keyboard commands, the Firefox sources zip), or the server side it talks to (apps/server/src/routes/api/clipper.ts, /api/login/token, the desktop port). Covers the message protocol between the extension's parts, how it finds and authenticates to…
Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Knowledge Management, covering Web clipping and read-later, Browser extensions and Plain language and style rules. It works with Preact, Chrome Extensions and JavaScript. The repository describes itself as: Build your personal knowledge base with Trilium Notes. The licence is AGPL-3.0.
Read from SKILL.md and the folder at commit 4d9cb6d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmgitFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
wxt.devFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Developing Web Clipper loads about 4k tokens when it runs. Until then it costs about 227 tokens; SKILL.md has 1,863 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from TriliumNext/Trilium at commit 4d9cb6d, republished under its AGPL-3.0 licence (© TriliumNext). 1,863 words, ~4,022 tokens.
.claude/skills/developing-web-clipper/SKILL.md (or your agent's skills folder).apps/web-clipper is a browser extension built with WXT (0.21, on Vite 8).
One source tree produces two builds: Chrome, Manifest V3 (pnpm build, .output/chrome-mv3)
and Firefox, Manifest V2 (pnpm build:firefox, .output/firefox-mv2). There is no Safari or
Edge target. The manifest is generated from wxt.config.ts; there is no manifest.json in the
repository.
| Entrypoint | Runs in | Does |
|---|---|---|
entrypoints/background/index.ts | service worker (MV3) / background page (MV2) | context menus, keyboard commands, every save, image download, toasts |
entrypoints/background/trilium_server_facade.ts | background | finds Trilium, authenticates, callService() |
entrypoints/content/index.ts | every page (<all_urls>) | Readability extraction, selection, crop overlay, toast UI |
entrypoints/popup/main.tsx | the toolbar popup | Preact Popup: capture buttons, link-with-note form, connection status |
entrypoints/options/main.tsx | the options page | Preact Options: desktop port, server login |
entrypoints/offscreen/ | MV3 only (Chrome) | crops screenshots on a canvas, since an MV3 service worker has no DOM |
Everything goes through browser.runtime.sendMessage / browser.tabs.sendMessage, keyed by a
name field:
save-cropped-screenshot, save-whole-screenshot, save-whole-page,
save-link-with-note (title, content), save-tabs, trigger-trilium-search,
send-trilium-search-status, trigger-trilium-search-note-url, openNoteInTrilium (noteId),
closeTabs.trilium-search-status (triliumSearch: TriliumSearchStatus, which
starts as searching) and trilium-previously-visited (searchNote). Both types
are exported from trilium_server_facade.ts; the popup imports them.trilium-save-selection, trilium-save-page,
trilium-get-rectangle-for-screenshot (the content script answers with the payload), and toast
(message, noteId, tabIds).{ type: "CROP_IMAGE" }, the one message keyed by type.Every user action in the background runs inside showFailures(), which turns an exception into a
toast. A new action belongs inside it too, or it fails silently. A toast cannot show on browser
pages or the extension stores, where no content script runs.
getPort() returns the port from the options page, or 37840 (production)
/ 37743 (development build, the port pnpm desktop:start uses). It tries that one port — there is no port scan — with
GET http://127.0.0.1:<port>/api/clipper/handshake, then falls back to the configured server.
It repeats every 60 seconds, and on the popup's check button.protocolVersion (CLIPPER_PROTOCOL_VERSION in
packages/trilium-core/src/services/app_info.ts); the extension compares the major version and
reports version-mismatch.apps/server/src/services/desktop_network_gate.ts. A server needs an ETAPI token: the options
page posts the password and the optional TOTP code to POST /api/login/token, which creates a
token named "Trilium Sender / Web Clipper", stored in browser.storage.sync.apps/server/src/routes/routes.ts (/api/clipper/*) with the handlers
in apps/server/src/routes/api/clipper.ts (spec: clipper.spec.ts). They are server-only, not
in packages/trilium-core, so the standalone and mobile builds cannot receive clippings.TRILIUM_PORT in apps/desktop/package.json's dev script; when one
changes, change getPort() and the Developer Guide's Web Clipper page with it.Users update the extension and Trilium independently, so a change on one side must keep working against older versions of the other. Prefer changes that need nothing new from the server.
/api/login/token has verified TOTP since v0.99.0, but only recent servers report which factor
failed ({ message, factor }); older ones answer a 401 with a plain string. That is why the
options page always shows the optional code field and sends it on the first try, and treats the
factor only as a hint for the error message (requestToken() catches the JSON parse failure).
Asking for the code only after a reported failure would have locked out every older 2FA server.downloadImages() retries it on every version./api/sender/login (Trilium Sender) shares the token handler; keep its 401 status unchanged.apps/server/src/routes/transport.spec.ts
used /api/login/token to check plain-text tuple results, and the JSON body broke it. Grep the
server specs for the route (grep -rn "api/login/token" apps/server/src apps/server/spec) and run
every hit, not only the route's own spec.<img src> with a random 20-character placeholder
(randomString(20)) and lists the images; the background fetches each one into a data URL; the
server stores them as attachments and rewrites the placeholder. downloadImages() in core skips
20-character URLs on purpose, so an image left with its placeholder is a broken image.
postProcessImages() therefore restores the original URL (escaped with escapeHtml()) for every
image it cannot download and reports the count in the toast.replaceAll()/replace() replacement built from page data is a callback
(replaceAll(id, () => escapeHtml(src))). A string replacement reads $&, $$, $` and
$' as patterns, so an image URL containing $& came back with the placeholder inside it.escapeHtml() — the
save-tabs list once put tab titles in raw. Tabs can also lack a url (still loading), and
new URL("") throws, so saveTabs() filters them out.fetchImage() rejects a non-OK response and a non-image Content-Type — otherwise an error page
gets saved as the "image".@mozilla/readability, installed from npm; Firefox
review flags its innerHTML use, which the README explains to the reviewer.Both pages are Preact 11 (preact, preact/hooks), with JSX compiled by oxc.jsx in
wxt.config.ts and jsx/jsxImportSource in tsconfig.json. Each index.html is only a
#root and a <script src="main.tsx">; main.tsx renders the component and also exports it and
its pure helpers (parseLinkNote, textToHtml, requestToken) for the specs.
Styling follows the share theme's approach (packages/share-theme/src/content/app_globals.ts,
base.css): import the client's own stylesheets, carry the Next theme's colors.
assets/theme.css, imported first by both pages, imports
@triliumnext/client/src/stylesheets/theme-next/forms.css (which imports buttons.css). Those
rules style elements by class, so use the app's markup:<button className="btn btn-secondary">, btn-primary for the main action,
btn btn-sm for small ones. They only match button.btn — an <input type="submit"> stays
unstyled.<input type="text|password"> and <textarea> are styled as they are.<label className="tn-checkbox"><input type="checkbox" /> text</label>.theme.css carries the values of theme-next-light.css and
theme-next-dark.css that those stylesheets read, under :root and
@media (prefers-color-scheme: dark) — an extension page has no Trilium theme setting. A rule
reading a new --variable needs its light and dark value added there, copied from those files.
The connection status uses --status-ok/warning/error-color, the app's log status colors.theme.css also adds the bits of Bootstrap's reboot the app relies on (font: inherit on form
controls, button cursor and line height) and the Inter font from apps/client/src/fonts/Inter/.popup.css, options.css) is nested under the page's root class (.popup,
.options) and uses the tokens; no inline styles.FormTextBox, FormSelect) can be imported; Button, FormCheckbox, NoteAutocomplete and
the like pull in appContext, froca, i18n or Bootstrap's JS, which an extension page does not
have. Build the small component the page needs on the same classes.href="javascript:" — Manifest V3's CSP can block it. Use href="#" with an onClick that
calls preventDefault().The cost of the theme: Inter is 349 kB and the shared CSS chunk 24 kB of the build.
commands in wxt.config.ts. A command the background
handles but the manifest omits never fires and does not appear on the browser's shortcut page
(saveTabs was missing for years).suggested_keys; declare further commands without one, so users
bind them themselves (about:addons → gear → Manage Extension Shortcuts; chrome://extensions/shortcuts).Ctrl+Shift+S is its screenshot tool).offscreen is an MV3-only permission and entrypoint (include/exclude meta in its index.html).pnpm --filter web-clipper dev # Chrome with the extension loaded, hot reload
pnpm --filter web-clipper dev:firefox
pnpm --filter web-clipper build # .output/chrome-mv3
pnpm --filter web-clipper build:firefox # .output/firefox-mv2
pnpm --filter web-clipper zip # store zips (+ sources zip for Firefox: zip:firefox)Check a manifest change in the built manifest.json, e.g.
grep -o '"saveTabs":{[^}]*}' apps/web-clipper/.output/firefox-mv2/manifest.json.
CI (.github/workflows/web-clipper.yml) builds both zips; it runs no tests, so a
web-clipper-v* tag ships whatever the tagged commit holds — the tests run only in dev.yml, on
pushes and pull requests. Mozilla's review rebuilds from the
sources zip, which the zip:sources:* hooks assemble from apps/web-clipper plus a copied
tsconfig.base.json and the Chrome-only offscreen page. Since the pages import
@triliumnext/client stylesheets and fonts, those files must go into the sources zip as well — the
hook does not do that yet, so fix it before the next Firefox submission.
To compare bundle sizes with main, build it in a temporary git worktree (never stash). main
may still need dependencies the branch removed (cash-dom): give the worktree its own
node_modules copy rather than touching the shared one.
Specs are Vitest with happy-dom (vitest.config.mts, .ts and .tsx), run with
pnpm --filter web-clipper test [pattern]. The extension has no i18n, so strings are asserted
literally.
Coverage is held at 100% of lines, statements, functions and branches by the thresholds in
vitest.config.mts. CI runs the suite in its own dev.yml step
(pnpm run --filter=web-clipper test --coverage, excluded from "Run the rest of the tests") and
uploads to Codecov under the web-clipper flag (codecov.yml). Run the same command locally; for
the exact uncovered lines and branches, use the analyzing-coverage skill on
apps/web-clipper/test-output/vitest/coverage/lcov.info. A branch no input can reach is restructured
(narrow the type instead of re-checking it), not tested around.
fakeBrowser (wxt/testing/fake-browser): call fakeBrowser.reset()
in beforeEach, override what the code calls with Object.assign(fakeBrowser.runtime, { sendMessage, openOptionsPage }), and deliver a message with
await fakeBrowser.runtime.onMessage.trigger(message, {}). browser.storage.sync works for real.background.main() after mocking
./trilium_server_facade; its listeners are captured by replacing addListener
(entrypoints/background/index.spec.ts). __MANIFEST_VERSION__ on globalThis switches between
the MV2 and MV3 code paths (see manifestVersionGlobal() in vitest.config.mts).render(<Popup />, container) inside act() from
preact/test-utils; unmount with render(null, container) in act(). After an effect starts an
async storage read, flush with a setTimeout inside act() before asserting.fetch with vi.stubGlobal and window.close with vi.spyOn — the popup closes itself.
happy-dom has no window.alert, so vi.spyOn(window, "alert") throws; use
vi.stubGlobal("alert", vi.fn()). Undo stubs in afterEach (vi.unstubAllGlobals(),
vi.unstubAllEnvs()), not at the end of a test, so a failing assertion does not leak them.Response can be read once. fetchMock.mockResolvedValue(response) hands the same
object to every call, so the second text() throws "body already used" and the code takes its
error path instead of the branch under test. Use mockImplementation(async () => Response.json(…)).document.title = … creates a <title> element, so it cannot test a page without one; clear
document.head and leave the title unset.vi.stubEnv("DEV", false); Vitest runs with DEV true.#root at the top of each main.tsx is covered by appending a #root
element, calling vi.resetModules() and await import("./main").sed one change, run, restore with cp) and make sure each break fails a test; one
that passes shows an assertion to add.Hardcoded English is expected: reviewers (Greptile) cite CLAUDE.md's translation rule, but its
catalogues are the app's. Translating the extension is a project of its own (_locales or i18next),
not something to start for a few new strings.
The VS Code TypeScript server can keep showing "Cannot use JSX" after tsconfig.json changes;
"TypeScript: Restart TS Server" clears it. pnpm typecheck is the authority.
The User Guide page is docs/User Guide/User Guide/Installation & Setup/Web Clipper.md (shortcuts,
configuration, the port, two-factor login, failures and missing images). A user-facing change to
the extension updates it in the same commit; follow the writing-documentation skill and revert
the pages docs.mjs sync reformats but you did not touch.
© TriliumNext, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/developing-web-clipper of TriliumNext/Trilium.
Open the folder on GitHubat commit 4d9cb6d
Developing Web Clipper next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Developing Web Clipper this skillTriliumNext/Trilium | 38k | — | ~4k | Automated safety check: Pass | AGPL-3.0 | |
| Develop ExtensionPostHog/posthog-js | 634 | — | ~2.3k | Automated safety check: Pass | Custom licence | |
| Browser Extension Launchsickn33/agentic-awesome-skills | 47k | 1 repos | ~1.4k | Automated safety check: Pass | MIT | |
| Notebooklm Connectormohitagw15856/pm-claude-skills | 1.4k | — | ~2.3k | Automated safety check: Pass | MIT | |
| Web To Markdownrookie-ricardo/erduo-skills | 935 | — | ~894 | Automated safety check: Pass | MIT | |
| Canvas Capture Extensionremotion-dev/remotion | 63k | — | ~907 | Automated safety check: Pass | Custom licence |
PostHog/posthog-js
Author a new PostHog browser extension, or port a posthog-js v1 extension, against the @posthog/browser-common Client/Extension contract.
sickn33/agentic-awesome-skills
Builds, tests, packages, and prepares Chrome extensions for store launch from a plain-language idea; use for new extensions, fixes, releases, and submission recovery.
mohitagw15856/pm-claude-skills
Automates NotebookLM from Claude Code using browser automation via the Claude Chrome extension — creating notebooks, adding sources, and triggering outputs without manual clicking.
rookie-ricardo/erduo-skills
Convert a web URL into cleaned Markdown with deterministic routing.
remotion-dev/remotion
Rebuild, install, and reload the private Remotion Canvas Capture unpacked Chrome extension.
vantezzen/skip-silence
WXT browser extension performance optimization guidelines. An agent skill from vantezzen/skip-silence.
TriliumNext/Trilium
A skill your agent uses when cutting, preparing, or debugging a Trilium release — bumping the monorepo version, tagging, or diagnosing a failed "Release" workflow run.
TriliumNext/Trilium
A skill your agent uses when working on the Trilium Electron desktop app (apps/desktop) — adding or changing an electronApi method / IPC channel, touching preload.ts, main.ts, services/window.ts or…
TriliumNext/Trilium
A skill your agent uses when adding a DB migration or a new column/field to a Becca entity in Trilium ("add a migration", "new column on notes/attributes", "ALTER TABLE", "add a field to…
TriliumNext/Trilium
A skill your agent uses when adding, moving, or wiring an internal REST endpoint in Trilium (a new /api/ route) — choosing between a core-shared handler (packages/trilium-core/src/routes/index.ts…
TriliumNext/Trilium
A skill your agent uses when adding, changing, or reviewing an LLM/MCP tool in Trilium (the defineTools definitions under packages/trilium-core/src/services/llm/tools/ —…
TriliumNext/Trilium
Write, extend, and review CKEditor 5 plugins in the Trilium (TriliumNext Notes) monorepo — the rich-text-note editor under packages/ckeditor5, whose plugins live in src/plugins/.
Works with
Categories
A skill your agent uses when working on Trilium's browser extension, the web clipper (apps/web-clipper, built with WXT for Chrome MV3 and Firefox MV2) — its background script, content script…. Developing Web Clipper is an agent skill from TriliumNext/Trilium.ts, /api/login/token, the desktop port).
Developing Web Clipper fits situations like: working on Triliums browser extension; the web clipper (apps/web-clipper; built with WXT for Chrome MV3 and Firefox MV; — its background script.
Run `npx skills add TriliumNext/Trilium --skill developing-web-clipper -a claude-code`. Or copy the skill folder (.claude/skills/developing-web-clipper in TriliumNext/Trilium) into .claude/skills/developing-web-clipper in your project. Claude Code loads it when a task matches its description.
Run `npx skills add TriliumNext/Trilium --skill developing-web-clipper -a codex`. Or copy the skill folder (.claude/skills/developing-web-clipper in TriliumNext/Trilium) into .agents/skills/developing-web-clipper in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add TriliumNext/Trilium --skill developing-web-clipper -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/developing-web-clipper, .gemini/skills/developing-web-clipper, .github/skills/developing-web-clipper and .opencode/skills/developing-web-clipper in your project.
Going by SKILL.md and its folder, Developing Web Clipper needs the command-line tools its instructions call (pnpm and git).
SKILL.md names 1 domain. As links in the text: wxt.dev. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Developing Web Clipper is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Developing Web Clipper: Develop Extension (PostHog/posthog-js, 634 stars), Browser Extension Launch (sickn33/agentic-awesome-skills, 47k stars), Notebooklm Connector (mohitagw15856/pm-claude-skills, 1.4k stars) and Web To Markdown (rookie-ricardo/erduo-skills, 935 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
TriliumNext (a GitHub organization) maintains it in TriliumNext/Trilium, which has 38,274 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 11, 2026.
Source: TriliumNext/Trilium on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.