- Notifications
You must be signed in to change notification settings - Fork147
The framework for building with WebAssembly (wasm). Easily & securely load wasm modules, move data, call functions, and build extensible apps.
License
extism/extism
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Extism is a lightweight framework for building with WebAssembly (Wasm). Itsupports running Wasm code on servers, the edge, CLIs, IoT, browsers andeverything in between. Extism is designed to be "universal" in that it supportsa common interface, no matter where it runs.
Note: One of the primary use cases for Extism isbuilding extensiblesoftware & plugins. You want to be able to execute arbitrary, untrusted codefrom your users? Extism makes this safe and practical to do.
Additionally, Extism adds some extra utilities on top of standard Wasm runtimes.For example, we support persistent memory/module-scope variables, secure &host-controlled HTTP without WASI, runtime limiters & timers, simpler hostfunction linking, and more. Extism users build:
- plug-in systems
- FaaS platforms
- code generators
- web applications
- & much more...
We currently provide releases for the following targets:
- aarch64-apple-darwin
- aarch64-unknown-linux-gnu
- aarch64-unknown-linux-musl
- x86_64-apple-darwin
- x86_64-pc-windows-gnu
- x86_64-pc-windows-msvc
- x86_64-unknown-linux-gnu
- x86_64-unknown-linux-musl
For Android we suggest taking a look at theChicory SDK for a pure JavaExtism runtime.
Pick a SDK to import into your program, and refer to the documentation to getstarted:
| Type | Language | Source Code | Package |
|---|---|---|---|
| Rust SDK | https://github.com/extism/extism/tree/main/runtime | Crates.io | |
| JS SDK | https://github.com/extism/js-sdk (supports Web, Node, Deno & Bun!) | NPM | |
| Elixir SDK | https://github.com/extism/elixir-sdk | Hex | |
| Go SDK | https://github.com/extism/go-sdk | Go mod | |
| Haskell SDK | https://github.com/extism/haskell-sdk | Hackage | |
| Java SDK | https://github.com/extism/java-sdk | Sonatype | |
| .NET SDK | https://github.com/extism/dotnet-sdk (supports C# & F#!) | Nuget | |
| OCaml SDK | https://github.com/extism/ocaml-sdk | opam | |
| Perl SDK | https://github.com/extism/perl-sdk | CPAN | |
| PHP SDK | https://github.com/extism/php-sdk | Packagist | |
| Python SDK | https://github.com/extism/python-sdk | PyPi | |
| Ruby SDK | https://github.com/extism/ruby-sdk | RubyGems | |
| Zig SDK | https://github.com/extism/zig-sdk | N/A | |
| C SDK | https://github.com/extism/extism/tree/main/libextism | N/A | |
| C++ SDK | https://github.com/extism/cpp-sdk | N/A |
Extism Hosts (running the SDK) must execute WebAssembly code that has aPDK, or Plug-in Development Kit, librarycompiled in to the.wasm binary. PDKs make it easy for plug-in / extensioncode authors to read input from the host and return data back, read providedconfiguration, set/get variables, make outbound HTTP calls if allowed, and more.
Pick a PDK to import into your Wasm program, and refer to the documentation toget started:
| Type | Language | Source Code | Package |
|---|---|---|---|
| Rust PDK | https://github.com/extism/rust-pdk | Crates.io | |
| JS PDK | https://github.com/extism/js-pdk | N/A | |
| Python PDK | https://github.com/extism/python-pdk | N/A | |
| Go PDK | https://github.com/extism/go-pdk | Go mod | |
| Haskell PDK | https://github.com/extism/haskell-pdk | Hackage | |
| AssemblyScript PDK | https://github.com/extism/assemblyscript-pdk | NPM | |
| .NET PDK | https://github.com/extism/dotnet-pdk (supports C# & F#!) | Nuget | |
| C PDK | https://github.com/extism/c-pdk | N/A | |
| C++ PDK | https://github.com/extism/cpp-pdk | N/A | |
| Zig PDK | https://github.com/extism/zig-pdk | N/A |
It's often very useful to define a schema to describe the function signaturesand types you want to use between Extism SDK and PDK languages.
XTP Bindgen is an open sourceframework to generate PDK bindings for Extism plug-ins. It's used by theXTP Platform, but can be used outside of the platformto define any Extism compatible plug-in system.
See installation instructionshere.
version:v1-draftexports:CountVowels:input:type:stringcontentType:text/plain; charset=utf-8output:$ref:"#/components/schemas/VowelReport"contentType:application/json# components.schemas defined in example-schema.yaml...
See an example inexample-schema.yaml, or a full"kitchen sink" example onthe docs page.
xtp plugin init --schema-file ./example-schema.yaml > 1. TypeScript 2. Go 3. Rust 4. Python 5. C# 6. Zig 7. C++ 8. GitHub Template 9. Local TemplateThis will create an entire boilerplate plugin project for you to get startedwith. Implement the empty function(s), and runxtp plugin build to compileyour plugin.
For more information about XTP Bindgen, see thedylibso/xtp-bindgen repository andthe officialXTP Schema documentation.
If you experience any problems or have any questions, please join ourDiscord and let us know. Our community is veryresponsive and happy to help get you started.
Head to theproject website for more information and docs.Also, consider reading anoverview of Extismand its goals & approach.
Thank you for considering a contribution to Extism, we are happy to help youmake a PR or find something to work on!
The easiest way to start would be to join theDiscord or open an issue on theextism/proposals issue tracker, whichcan eventually become an Extism Improvement Proposal (EIP).
For more information, please read theContributing guide.
Extism is an open-source product from the team at:
Reach out and tell us what you're building! We'd love to help:hello@dylibso.com
About
The framework for building with WebAssembly (wasm). Easily & securely load wasm modules, move data, call functions, and build extensible apps.
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
