Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/membraneframework/membrane_core/membrane-frameworknpx skills add membraneframework/membrane_core --skill membrane-frameworkgit clone --depth 1 https://github.com/membraneframework/membrane_coreWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/membraneframework/membrane_core/membrane-framework)<a href="https://agentmods.dev/skills/membraneframework/membrane_core/membrane-framework"><img src="https://agentmods.dev/badge/skills/membraneframework/membrane_core/membrane-framework.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00133 | $0.04241 |
| Opus 5 | $0.00067 | $0.02121 |
| Sonnet 5 | $0.00027 | $0.00848 |
| Haiku 4.5 | $0.00013 | $0.00424 |
Grade A, and why
membrane-framework scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 246 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Membrane Framework
Package: membrane_core ~> 1.3 | Docs: https://hexdocs.pm/membrane_core/ | Module index: https://hexdocs.pm/membrane_core/llms.txt | Demos: https://github.com/membraneframework/membrane_demo | All packages: packages_list.md
How to Approach Tasks
- New component — before writing a new element, check packages_list.md to see if it already exists in an existing plugin; if not, identify subtype (Source/Filter/Sink/Endpoint/Bin), define pads, implement required callbacks (
handle_buffer/4for filters/sinks,handle_demand/5for manual-flow sources) - Generating boilerplate — use
mix membrane.gen.filter MyApp.MyFilter,mix membrane.gen.source,mix membrane.gen.sink,mix membrane.gen.endpoint,mix membrane.gen.bin,mix membrane.gen.pipelineinstead of writing component skeletons by hand - Choosing element subtype — prefer
Filterfor transformations (has sensible defaults for stream_format forwarding); useEndpointonly when output is unrelated to input (e.g. a UDP Endpoint); useSource/Sinkfor pure producers/consumers - Flow control — default to
:autoon all pads; only use:manualwhen you need fine-grained backpressure control; Almost the only use case of:pushare output pads of Sources/Endpoints that cannot control when they produce data, e.g. UDP Source/Endpoint. - Pipeline topology — use the ChildrenSpec DSL (
child/2,get_child/1,via_in/2,via_out/2) (more info: Membrane.ChildrenSpec) - Static vs dynamic topology — return
spec:fromhandle_init/2for static pipelines; return additionalspec:actions from any callback (e.g.handle_child_notification/4) to grow the topology at runtime - Naming children — use atoms (
:source) for singletons, tuples ({:decoder, track_id}) for multi-instance children of the same type - Detecting pipeline completion — implement
handle_element_end_of_stream/4in the pipeline to know when a sink's input pad received EOS; then return{[terminate: :normal], state}(doesn't work if sink is a Membrane.Bin - then expect a custom message from the bin inhandle_child_notificationcallback instead, if the bin sends it) - Dynamic tracks (demuxers, variable inputs) — use the Dynamic Pads Pattern below
- Crash isolation — group children with
{spec, group: <name>, crash_group_mode: :temporary}; handle recovery inhandle_crash_group_down/3; see Crash Groups guide - Inserting debug probes — add
child(:probe, %Membrane.Debug.Filter{handle_buffer: &IO.inspect(&1, label: :buffer)})between any two elements to log buffers without changing pipeline logic. You can use different logging functions thanIO.inspect/2. More info: Membrane.Debug.Filter. - Linking children - linked children pads accepted formats must have non-empty intersections
- Debugging — check pad
accepted_formatcompatibility - Callback context — every callback receives
ctx; key fields:ctx.children,ctx.pads,ctx.playback; crash callbacks also havectx.crash_initiator,ctx.exit_reason,ctx.group_name; see Pipeline.CallbackContext, Bin.CallbackContext, Element.CallbackContext - Logging — utilize
Membrane.Loggerinstead ofLoggerin Membrane components; it prepends component path and name to log messages. Requiresrequire Membrane.Loggerin the module before calling any logging functions. - Use
mix hex.info <plugin name>when you need to check the newest version of a plugin - Search for appropriate plugins in packages_list.md before writing one
- Check input and output pad definitions of elements in
deps/(usecat <filename> | grep def_input_padandcat <filename> | grep def_output pad) to make sure output pad'saccepted_stream_formatis compatible withaccepted_stream_formatof the input pad which it is linked to. - If the
accepted_stream_formatdoesn't match, search for an element which can act as an adapter - When constructing Membrane Pipeline, lean towards using most powerful Membrane Components, which are Boombox.Bin and Membrane.Transcoder, instead of using many smaller plugins
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 3d ago First seen · 246 lines · 133 tokens per session scan A fc650be60289
membrane-framework is a skill published in the GitHub repository membraneframework/membrane_core (1,508 stars, last pushed 2d ago), licensed Apache-2.0. It adds 133 tokens to every session and 4,241 once invoked, about $0.0007 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
app-implement-feature
Guide for implementing features in baguette — a Swift CLI + WebSocket server that drives iOS simulators via private SimulatorKit. Use this skill when: (1) Adding a new gesture, button, keyboard surface, stream format, or device-chrome behaviour (anything that lands across Domain / Infrastructure / App +…
baguette
Drive iOS simulators programmatically via the baguette CLI — taps, swipes, multi-finger gestures, hardware buttons (Home / Lock / Volume / Action / Power), ASCII keyboard text, and frame capture, all without opening Xcode. Use when: (1) an agent needs to drive a booted iOS simulator from a script — tap a coordinate…
spotatui-dj
Be the DJ for spotatui, the terminal music player, by driving its MCP server. Use whenever the user asks for music, asks you to DJ, wants tracks queued, played, skipped, or searched, asks what they have been listening to, or mentions spotatui.
host-pattern
Use when adding a new domain to Nuclear's plugin system, or implementing a host. Covers the host pattern (how player functionality is exposed to plugins), the host interface and API class structure, how hosts are implemented in the player, error handling conventions, and what files to create and modify. Trigger…
creating-components
Use when creating new UI components in packages/ui. Covers component structure, tests, stories, and what to avoid.
writing-docs
Use when writing or editing documentation in packages/docs. Covers Gitbook markdown syntax, special blocks, page structure, and the SUMMARY.md table of contents. Trigger phrases include "write docs", "add documentation", "docs page", "gitbook", "user manual".