Agent skill

Developing Standalone

by TriliumNext in TriliumNext/Trilium

A skill your agent uses when working on Trilium's standalone in-browser build (apps/standalone, deployed at app.triliumnotes.org and embedded by the mobile app) — the service worker (sw.ts), the…

AGPL-3.0Auto-check passedDatabases

Install Developing Standalone

skills CLI
$ npx skills add TriliumNext/Trilium --skill developing-standalone -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install TriliumNext/Trilium developing-standalone --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/developing-standalone .claude/skills/developing-standalone && rm -rf skills-src

Use ~/.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/

Facts

Skill name
developing-standalone
GitHub stars
38k
Token cost
~3.4k tokens
SKILL.md length
1,427 words
Files
1
Skills in repo
22
Repo updated
First seen
Licence
AGPL-3.0

At a glance

A skill your agent uses when working on Trilium's standalone in-browser build (apps/standalone, deployed at app.triliumnotes.org and embedded by the mobile app) — the service worker (sw.ts), the…

  • Works in 5 steps: main.ts requires a service worker… → Leader election (leader_election.ts):… → The leader answers its own API calls.… → …
  • Working on Triliums standalone in-browser build (apps/standalone
  • SKILL.md covers Layout, Request flow, The provider set… and Bundle discipline…, plus 2 more sections
  • Calls pnpm

What it does

Developing Standalone is an agent skill from TriliumNext/Trilium. Use when working on Trilium's standalone in-browser build (apps/standalone, deployed at app.triliumnotes.org and embedded by the mobile app) — the service worker (sw.ts), the leader-tab election and multi-tab request forwarding, the SQLite worker (local-server-worker.ts, @sqlite.org/sqlite-wasm on OPFS SAHPool), the lightweight/ provider implementations that initializeCore() needs in the browser, standalone-only routes, window.standaloneApi, backup/restore in OPFS, the Vite bundle stubs (officeparser, pdfjs…

Its SKILL.md is about 3.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 Databases. It works with SQLite, WebAssembly and Vite. The repository describes itself as: Build your personal knowledge base with Trilium Notes. The licence is AGPL-3.0.

When your agent uses it

  • Working on Triliums standalone in-browser build (apps/standalone
  • Deployed at app.triliumnotes.org and embedded by the mobile app) — the service worker (sw.ts)
  • The leader-tab election and multi-tab request forwarding
  • The SQLite worker (local-server-worker.ts

Example prompts

  • “/developing-standalone”

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. main.ts requires a service worker (secure context: HTTPS or localhost — otherwise it throws a message explaining that), registers ./sw.js…
  2. Leader election (leader_election.ts): the OPFS SAHPool VFS takes exclusive sync-access handles, and createSyncAccessHandle exists only in…
  3. The leader answers its own API calls. Winning the lock also publishes localFetch (local-bridge.ts) on window.standaloneApi, and the client…
  4. Service worker (sw.ts): cache-first for hashed assets, network-first otherwise; requests under LOCAL_API_PREFIXES (/bootstrap, /api/…
  5. The worker (local-server-worker.ts): waits for the previous worker's OPFS access handles to be released (waitForSahPoolRelease — a reload…

What it can do on your machine

Read from SKILL.md and the folder at commit 134a865. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Developing Standalone loads about 3.4k tokens when it runs. Until then it costs about 192 tokens; SKILL.md has 1,427 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~192
When it runs · the whole SKILL.md, loaded when a task matches
~3.4k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from TriliumNext/Trilium at commit 134a865, republished under its AGPL-3.0 licence (© TriliumNext). 1,427 words, ~3,449 tokens.

Download SKILL.mdSave it as .claude/skills/developing-standalone/SKILL.md (or your agent's skills folder).
name
developing-standalone
description
Use when working on Trilium's standalone in-browser build (`apps/standalone`, deployed at app.triliumnotes.org and embedded by the mobile app) — the service worker (`sw.ts`), the leader-tab election and multi-tab request forwarding, the SQLite worker (`local-server-worker.ts`, `@sqlite.org/sqlite-wasm` on OPFS SAHPool), the `lightweight/*` provider implementations that `initializeCore()` needs in the browser, standalone-only routes, `window.standaloneApi`, backup/restore in OPFS, the Vite bundle stubs (officeparser, pdfjs, sqlite wasm copies), startup errors, or running/testing/deploying it. Also load it when a change to `packages/trilium-core` adds a provider, a Node import, or a top-level side effect — standalone is where that breaks.

Developing the standalone (in-browser) build

apps/standalone runs the entire Trilium stack in the browser with no server: the ordinary apps/client UI on the page, and @triliumnext/core — plain JS, the same code the server runs — inside a dedicated Web Worker on top of SQLite compiled to WASM (@sqlite.org/sqlite-wasm, not sql.js) persisted in the origin's OPFS through the SAHPool VFS. It ships as a PWA to app.triliumnotes.org (Cloudflare Pages, deploy-app.yml, PR previews included) and is the webDir of the Capacitor mobile app (developing-capacitor-mobile skill). There is no apps/standalone-desktop.

Layout

apps/standalone/
  src/index.html, main.ts         # page bootstrap: SW registration, leadership claim, worker start, standaloneApi
  src/desktop.ts                  # re-exports apps/client/src/desktop — the client entry
  src/sw.ts                       # service worker: caches assets, forwards follower tabs' API requests to the leader
  src/leader_election.ts          # Web Lock decides which tab owns the database worker
  src/local-bridge.ts             # page ⇄ worker protocol (LOCAL_REQUEST/RESPONSE, WS_MESSAGE, HTTP_REQUEST, backup/restore)
  src/local-server-worker.ts      # the worker: opens SQLite, initializeCore(), routes requests
  src/ios-interceptors.ts         # iOS Capacitor only (see mobile skill)
  src/error-overlay.ts            # full-screen surface for fatal startup failures
  src/lightweight/                # browser implementations of every core provider + standalone-only routes
  src/services/                   # image provider, Capacitor HTTP handler
  src/stubs/                      # officeparser entry + Buffer polyfill, empty stubs for pdfjs/tesseract/puppeteer
  src/test_setup.ts               # boots core with the real lightweight providers under vitest/happy-dom
  public/_headers, manifest.webmanifest, favicon.ico
  e2e/multi_tab.spec.ts, extra_window.spec.ts
  vite.config.mts                 # root is src/; aliases, stubs, asset copies, worker + SW build, vitest config

Request flow

  1. main.ts requires a service worker (secure context: HTTPS or localhost — otherwise it throws a message explaining that), registers ./sw.js with scope /, reloads once if the SW installed but doesn't control the page yet, and exposes window.standaloneApi (restore.importBackup, backup.downloadDatabase) — the client's escape hatch for things carrying a whole file, the twin of desktop's window.electronApi. The leader also publishes localFetch there (step 3).
  2. Leader election (leader_election.ts): the OPFS SAHPool VFS takes exclusive sync-access handles, and createSyncAccessHandle exists only in a dedicated worker, so exactly one tab per origin can own the database. A Web Lock (trilium-standalone-db, held for the tab's lifetime) picks it; only the winner calls startLocalServerWorker(); when it closes the browser releases the lock and a waiting tab is promoted. Where Web Locks are missing (some WebViews) the tab assumes it is alone.
  3. The leader answers its own API calls. Winning the lock also publishes localFetch (local-bridge.ts) on window.standaloneApi, and the client prefers it over its XHR transport — in ajax() (apps/client/src/services/server.ts) and in setupGlob()'s /bootstrap (apps/client/src/index.ts). Without it the leader's own request leaves as an XHR, is intercepted by the service worker, and is posted back into the page it started in, to reach a worker that page owns. localAjax() matches the XHR path's contract — headers, JSON body, CSRF refresh-and-retry-once, the silent* suppressions, raw, and a timeout of opts.timeoutMs ?? DEFAULT_TIMEOUT. Build with VITE_DISABLE_LOCAL_FETCH=true to take the service worker's route instead, which is what compares the two transports. Follower tabs leave localFetch unset; so do upload(), chunked_upload.ts and the LLM stream, which carry FormData or want the body as it arrives.
  4. Service worker (sw.ts): cache-first for hashed assets, network-first otherwise; requests under LOCAL_API_PREFIXES (/bootstrap, /api/, /sync/, /search/, from local-bridge.ts) are forwarded with LOCAL_FETCH to the leader client, found via a cached id, WHO_IS_LEADER / LEADER_REPLY probing, and one retry on NOT_LEADER (leadership can flip while a request is in flight). Since step 3 this carries follower tabs, engine-initiated loads (<img src="api/images/…">, fonts, themes) and the call sites that reach past server.ts, rather than the whole API surface. Backup downloads stream over a MessageChannel from the leader. It must let /_trilium_native_http/ fall through (Android native proxy) and has a defensive guard for capacitor://.
  5. The worker (local-server-worker.ts): waits for the previous worker's OPFS access handles to be released (waitForSahPoolRelease — a reload races the browser's asynchronous release, and installOpfsSAHPoolVfs() reacts to an acquisition failure by deleting the pool directory, so the pool must be acquirable before it runs — a wait that reaches its deadline ends the boot instead of installing anyway), then installs the SAHPool VFS once — failure is a fatal startup error painted by error-overlay.ts, never an in-memory fallback (TRILIUM_INTEGRATION_TEST=memory builds seed a fixture into the pool, so writes survive reloads within a test). It then calls initializeCore({...}) with the lightweight/* providers, registers createConfiguredRouter() (BrowserRouter mimicking Express, path params + query strings), then answers LOCAL_REQUEST messages. DbLock (lightweight/db_lock.ts) serialises createAsyncRoute handlers (imports) that hold a transaction across awaits against the single connection — synchronous routes keep a zero-overhead path. WS_MESSAGE replaces the WebSocket in both directions. Anything that escapes after startup is reported as WORKER_ERROR for one background task; before startup it means the app never came up and error-overlay.ts paints it (the async worker init is invisible to main.ts's try/catch).

The provider set (src/lightweight/)

initializeCore() takes every environment-specific capability as a provider; the browser build supplies its own for each. A new provider or provider method in core needs an implementation here, or standalone will not boot — the server-side one in apps/server/src/*_provider.ts is the pair to mirror.

ProviderFileNotes
SQLsql_provider.tswraps sqlite-wasm statements to core's Statement interface; SAHPool VFS install; nested transactions become SAVEPOINTs
Execution context (CLS)cls_provider.tsper-request context stack with a grace period for unawaited promises
Cryptocrypto_provider.tsWebCrypto + scrypt-js (pure JS, slow under coverage)
Zip / exportzip_provider.ts, zip_export_provider_factory.tsbytes only — no filesystem path source
Request (outbound HTTP, sync)request_provider.ts (fetch), bridged_request_provider.ts (Capacitor native, via HTTP_REQUEST to the page)
Messagingmessaging_provider.tspostMessage in place of WS
Backup / restorebackup_provider.ts, backup-stream.ts, backup-download.ts, database_restore.tsSAH pool has no rename: restore writes the new DB beside the old one and swaps the pointer the next start opens; stale pool entries from interrupted backups are swept
Setup markersetup_marker.tssetup.json in the origin's private FS, read before the DB is opened; a page reload is "restart" here
Platformplatform_provider.ts?safeMode → TRILIUM_SAFE_MODE etc.; isElectron/isMac/isWindows false
Translationstranslation_provider.tsi18next in the worker with ns: "server", fetching server-assets/translations/{{lng}}/server.json
In-app helpin_app_help_provider.tspre-built assets/help_meta.json from edit-docs; the User Guide itself is not in this build
Loglog_provider.tsOPFS log file
Imageservices/image_provider.tsformat sniffing only, no resize/compression
LLMllm_skills.tsthis build's half of the LLM stack (registerStandaloneLlmExtensions), dynamically imported so skill sheets don't join the startup bundle

Standalone-only routes (integrity checks, the LLM channel, upload handling that arrives as a buffer instead of a temp file) are registered in lightweight/browser_routes.ts; everything else is core's shared route table (adding-internal-api-route skill).

Show full SKILL.md (523 more words)Show less

Bundle discipline (vite.config.mts)

The worker's top-level imports are its startup cost — prefer dynamic imports for anything not needed to answer /bootstrap (the LLM skills and restore paths already do this).

  • officeparser is aliased to src/stubs/officeparser_entry.ts, which loads the package's Node ESM entry plus the buffer polyfill (buffer_polyfill.ts, must be imported first) instead of the prebuilt browser monolith that inlines pdfjs (2.7 MB → 0.4 MB); pdfjs-dist, tesseract.js, puppeteer are aliased to stubs/empty.ts. office_preview.spec.ts guards the alias against upstream layout changes.
  • @sqlite.org/sqlite-wasm and @triliumnext/core are excluded from optimizeDeps; the sqlite .wasm and OPFS async proxy are copied unhashed so the worker can resolve them by convention; apps/server/src/assets/** (minus the User Guide) is copied to server-assets/.
  • The service worker keeps a stable sw.js URL (registering a hashed one would orphan the old worker); everything else under src/ is content-hashed. public/_headers matches: immutable for /src/*, must-revalidate for /sw.js, plus Cross-Origin-Opener-Policy: same-origin.
  • Vite root is src/, base is "" — paths in config and coverage globs resolve relative to src/.
Where a dynamic import actually splits — and where it does nothing

Core is not code-split the way its module layout suggests. Rollup folds the packages/trilium-core modules into a single ~2 MB chunk (named after an arbitrary constituent, e.g. abstract_provider-<hash>.js) that ~33 core modules — becca_loader, browser_routes, crypto_provider, the migrations — import statically, and the worker pulls in at startup. Anything reachable from that graph lands in the eager chunk no matter how the leaf that uses it imports it.

So converting a static import to await import() inside a core module often defers nothing. Lazy-loading sax in enex.ts produced a byte-for-byte identical standalone bundle — same chunk content hash, same total — because sax was reachable statically elsewhere in the eager graph. The prediction that it would save ~12–15 KB came from reasoning by analogy to another module; it did not survive an A/B build, and was reverted.

It is not a universal no-op, though. await import("officeparser") inside services/office_preview.ts did split out (officeparser.browser-<hash>.js, ~2.6 MB, fetched lazily), because nothing else in the eager graph imported officeparser — that one dynamic import was the dep's only path in.

The rule: a dynamic import inside core splits a dep out only if the dep has no other static importer in the core graph. Deferring at the route or service boundary (the import.ts route that statically imports enex.js) is the reliable lever. Either way, confirm with an A/B build — compare chunk hashes and grep the built output for a real import( — and don't bother at all for a ~40 KB dep inside a chunk that always loads.

Running

bash
pnpm standalone:start                                # vite dev
pnpm --filter standalone build                       # dist/ (needs NODE_OPTIONS=--max-old-space-size=4096, set by the script)
pnpm --filter standalone start-prod                  # build + vite preview on :8888
TRILIUM_INTEGRATION_TEST=memory pnpm --filter standalone build   # OPFS DB seeded from a fixture (what e2e uses)
pnpm --filter standalone e2e                         # Playwright: multi-tab leader handoff, extra windows

?safeMode and other TRILIUM_* toggles are passed as URL query parameters (platform_provider.ts).

Testing

pnpm --filter standalone test <pattern> — Vitest, happy-dom, real sqlite-wasm. test_setup.ts shims wasm loading (happy-dom's fetch refuses file:// and its Response breaks instantiateStreaming) and boots core with the real lightweight providers, so a spec exercises the same code path as the browser. local-server-worker.ts is excluded from coverage on purpose (it boots a second core). This suite is also the second runtime for every packages/trilium-core spec — green under pnpm --filter server test is not proof; the cross-runtime traps (capability gaps, provider differences, serialize(), backup) are in the writing-unit-tests skill.

© 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

Files

Just SKILL.md in .claude/skills/developing-standalone of TriliumNext/Trilium.

Open the folder on GitHubat commit 134a865

Compare with similar skills

Developing Standalone 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.

Developing Standalone compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Developing Standalone this skillTriliumNext/Trilium38k—~3.4kAutomated safety check: PassAGPL-3.0
Golem Add Sqlite Rustgolemcloud/golem1.5k—~1kAutomated safety check: PassCustom licence
Golem Add Sqlite TSgolemcloud/golem1.5k—~927Automated safety check: PassCustom licence
Blueprint Local Scaffoldreceptron/mulmoterminal236—~647Automated safety check: PassMIT
Wasm Interopandymai/brepjs114—~3kAutomated safety check: PassApache-2.0
Frontend Devnteract/nteract178—~5.4kAutomated safety check: PassBSD-3-Clause

Similar skills

  • Golem Add Sqlite Rust

    golemcloud/golem

    Use embedded SQLite from a Rust Golem agent with rusqlite and the WASI VFS.

    1.5k GitHub stars~1k tokensUpdated today
    DatabasesAuto-check passed
  • Golem Add Sqlite TS

    golemcloud/golem

    Use embedded SQLite from a TypeScript Golem agent with node:sqlite.

    1.5k GitHub stars~927 tokensUpdated today
    DatabasesAuto-check passed
  • Blueprint Local Scaffold

    receptron/mulmoterminal

    Create the app skeleton: Express API, SQLite through node:sqlite, a Vue screen, and the test harness, following the layout the later checks rely on.

    236 GitHub stars~647 tokensUpdated today
    DatabasesAuto-check passed
  • Wasm Interop

    andymai/brepjs

    This skill should be used when working across the JS/WASM boundary in brepjs — writing or debugging code in src/kernel/occt, src/kernel/occtWasm, or src/kernel/brepkit, or diagnosing symptoms like…

    114 GitHub stars~3k tokensUpdated yesterday
    DevOps & CloudAuto-check passed
  • Frontend Dev

    nteract/nteract

    Frontend development for nteract UI/product surfaces, Elements fixtures, hot reload, dev daemon setup, MCP server workflow, TypeScript bindings via ts-rs, and reactive state work that touches RxJS…

    178 GitHub stars~5.4k tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Pp Toodledo

    mvanhorn/printing-press-library

    Every Toodledo feature from the terminal, plus an offline SQLite mirror, GTD reviews Trigger phrases: what are my next actions, run my weekly review, add a task to toodledo, what's overdue in…

    2.1k GitHub stars~4k tokensUpdated yesterday
    DatabasesAuto-check: notes

More from TriliumNext/Trilium

All 22 skills in this repo
  • Cutting A Release

    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.

    38k GitHub stars~3.2k tokensUpdated today
    Auto-check passed
  • Developing Electron Desktop

    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…

    38k GitHub stars~5.7k tokensUpdated today
    Auto-check passed
  • Evolving The Data Model

    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…

    38k GitHub stars~2.1k tokensUpdated today
    Auto-check passed
  • Adding Internal API Route

    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…

    38k GitHub stars~3.3k tokensUpdated today
    Auto-check passed
  • Adding LLM MCP Tools

    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/ —…

    38k GitHub stars~2.5k tokensUpdated today
    Auto-check passed
  • Ckeditor5 Plugin Development

    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/.

    38k GitHub stars~4.8k tokensUpdated today
    Auto-check passed

Questions about Developing Standalone

What does Developing Standalone do?

A skill your agent uses when working on Trilium's standalone in-browser build (apps/standalone, deployed at app.triliumnotes.org and embedded by the mobile app) — the service worker (sw.ts), the…. Developing Standalone is an agent skill from TriliumNext/Trilium.

When should I use Developing Standalone?

Developing Standalone fits situations like: working on Triliums standalone in-browser build (apps/standalone; deployed at app.triliumnotes.org and embedded by the mobile app) — the service worker (sw.ts); the leader-tab election and multi-tab request forwarding; the SQLite worker (local-server-worker.ts.

How do I install Developing Standalone in Claude Code?

Run `npx skills add TriliumNext/Trilium --skill developing-standalone -a claude-code`. Or copy the skill folder (.claude/skills/developing-standalone in TriliumNext/Trilium) into .claude/skills/developing-standalone in your project. Claude Code loads it when a task matches its description.

How do I install Developing Standalone in Codex?

Run `npx skills add TriliumNext/Trilium --skill developing-standalone -a codex`. Or copy the skill folder (.claude/skills/developing-standalone in TriliumNext/Trilium) into .agents/skills/developing-standalone in your project. Codex loads it when a task matches its description.

Can I use Developing Standalone in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add TriliumNext/Trilium --skill developing-standalone -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-standalone, .gemini/skills/developing-standalone, .github/skills/developing-standalone and .opencode/skills/developing-standalone in your project.

What does Developing Standalone need to run?

Going by SKILL.md and its folder, Developing Standalone needs the command-line tools its instructions call (pnpm).

Does Developing Standalone access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Developing Standalone safe to install?

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.

What licence does Developing Standalone use?

Developing Standalone 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.

How many tokens does Developing Standalone use?

About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Developing Standalone?

Skills that share tags, products or a category with Developing Standalone: Golem Add Sqlite Rust (golemcloud/golem, 1.5k stars), Golem Add Sqlite TS (golemcloud/golem, 1.5k stars), Blueprint Local Scaffold (receptron/mulmoterminal, 236 stars) and Wasm Interop (andymai/brepjs, 114 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Developing Standalone?

TriliumNext (a GitHub organization) maintains it in TriliumNext/Trilium, which has 38,231 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on October 7, 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.