After the release of our public beta, our team has been actively iterating on the feedback provided by the community. This release focuses on improving the developer experience and softening the learning curve encountered when onboarding to EXM.
EXM 0.1.5 has been tagged and released with the following features and changes:
- EXM Functions as URLs
result
is now available during execution alongside the stateEXM.getDate()
,SmartWeave.arweave.crypto.(sign|verify|hash|jwkToPublicCryptoKey|jwkToCryptoKey)
has been stabilized
You can install for the first time or upgrade to EXM’s latest version by running:
1$ npm i -g @execution-machine/cli
New features and changes
Functions as URLs
Our #1 goal as a platform is to enable web2 and web3 developers to build and iterate on trustless applications as quickly as possible. From the feedback we’ve received on beta, we realized moving away from generalized API keys and treating each EXM Function as its own endpoint would greatly improve the developer experience.```
“Functions as URLs” enable any person to interact with EXM’s function through a unique URL. The syntax for this URL is the following:
1https://{EXM_Function_Id}.exm.run
Let’s take a look at function 4EBGfbWNweoq4ER84N_YoETGo8LAcGchBeIZBUhS2S0
which follows the user registry example in our documentation.
If we wanted to interact with it through URLs, we would do the following:
1curl --location --request POST 'https://4EBGfbWNweoq4ER84N_YoETGo8LAcGchBeIZBUhS2S0.exm.run' \2--header 'Content-Type: application/json' \3--data-raw '{4 "username": "Andres Pirela"5}'
In the example above, we are sending a POST
request to our EXM Function’s URL where the JSON body
of the request will be equivalent to action.input
. Now, if we take a look at the state of it here, we can see the following state:
1{"users":[{"username":"Andres Pirela"}]}
We are pumped to enable this new feature starting today and can’t wait to see how you leverage it in your own applications.

Property result
available during execution
The result
property is part of the SmartWeave Contract Design and it enables returning information that is not part of the state. This feature was not previously exposed in EXM. Today, we are pleased to announce you can now make use of result
as part of the returning object of your functions.

The result
property is now available in the optimistic response when sending a write operation. This new feature enables EXM Functions to make use of input data against a state without mutation for use cases such as indexing. We hope this can help improve the way your application handles state.
API Stabilizations
We are excited to announce we have stabilized:
EXM.getDate()
SmartWeave.arweave.crypto.sign(jwk, buffer)
SmartWeave.arweave.crypto.verify(jwk.n, buffer, signature)
SmartWeave.arweave.crypto.hash(buffer, algorithm = "SHA-256")
SmartWeave.arweave.crypto.jwkToPublicCryptoKey(jwk)
SmartWeave.arweave.crypto.jwkToCryptoKey(jwk)
You can request API stabilization by opening an issue here and indicating what API you would like to see as stable.
Local Testing
While Local Testing is not part of this release, we are excited to announce it officially. EXM’s local testing APIs enable you to deeply test EXM functions without having to deploy them.
You can read more about testing functions locally here.
Follow @exmbuild on Twitter or Github and be on the lookout for exciting new developments that will be rolling out shortly.