Discussion - What's Missing for Motoko Adoption?

This thread is for high-level discussion about Motoko ecosystem gaps. For specific feature requests and library needs, contribute to the Motoko Wishlist 2025 thread.

The Gap

Motoko has strong fundamentals but struggles with production adoption. Most serious IC projects default to Rust, not because Motoko can’t handle the workload, but because the ecosystem isn’t mature enough yet.

Current state:

  • Most IC projects use Rust due to ecosystem maturity
  • Motoko lacks essential libraries/tooling for complex production apps
  • Developer adoption remains limited to experimentation/learning projects

What does Motoko need for it to become the default choice for IC development?

  • Essential missing libraries - What categories need immediate attention?
  • Language features - Core syntax and type system improvements needed
  • Production readiness - What defines “mature enough” for serious adoption?

Tools like Caffeine AI and upcoming WASM Components will help Motoko adoption, but Caffeine AI shouldn’t need to write everything from scratch. A mature ecosystem with robust libraries means AI tools can focus on composing existing solutions rather than reinventing basics.

For specific feature requests and library needs, please contribute to the IC Developer Feature/Library Wishlist thread - this is where we’re building a comprehensive reference for development priorities.

What’s your take on the current ecosystem gaps? What would move the needle for Motoko adoption in your projects?

Previous Context

5 Likes

I think on of the hard parts about this, even as a developer, is coming up with a list of specific libraries that are needed, because each project is different and requires different things. So it seems like a lot are required and maybe there is just a point where its saturated enough to be more broadly adopted.

I think frameworks could be easier to come up with a list of like i just made an HTTP framework Liminal that will make the process of handling HTTP requests much easier.
ORM framework also seems like a solid option.
But still I’m struggling to find specific ones that would be a game changer and have more Motoko adoption.
Also some of these libraries/frameworks are not really possible to do completely due to some current Motoko language feature limitations. Like I have done a serialization libraries, but without some sort of reflection-esque features, we can’t automatically convert from say JSON to motoko, without explicit methods for each conversion.

Any thoughts and conversation would be great because im not sure how to solve this

2 Likes

Tbh its all about the network effects. However since wasm components will allow you to choose any language while still benefiting from the whole ecosystem, that would also make it unnecessary to choose it instead of existing languages that also support the component model. Perhaps the strong integration with IC is a selling point if one is developing for the IC, however you could also perhaps achieve the same with existing languages with some basic tooling / libraries. so all in all, I think wasm components will be a huge boost, but there still needs to be some unique selling point to warrant the investment.

5 Likes

I think EOP is a great USP for Motoko, isn’t it? :slight_smile:

thanks for starting this thread @Gekctek, curious about other opinions out there.

I find the lack of JSON support really painful.

4 Likes

Lack of protobuf support is another pain point (particularly given the abundant use of protobuf encoded data on the IC).

1 Like

Can you elaborate on specifics, just to make sure im aware of all cases
there is a Json library now
But I think its a big issue that we cant say Json.deserialize<T>(json) in the Motoko language right now due to lack of reflection-esque features

2 Likes

@Lorimer I would be curious on your exact needs
I am actually starting work on a protobuf library for IPLD related things and im trying to figure out the minimum that would be helpful
I don’t plan on doing things like auto code generation, but at least basic parsing

Also could you point me to where the protobuf encoded data is on the IC. Would be a good way of testing

1 Like

This would be very useful, thanks @Gekctek.

Two things off the top of my head are:

  • IC ledger blocks (get_blocks)
  • Registry data (such as info about nodes and other infrastructure stuff) - get_chunks
1 Like

Looking at adoption from a differnet angle and I ask - What is Motoko’s use case outside of ICP? I believe more can be done to promote it as a general language and for other specific usage. Without expanding adoption into other areas of development i think Motoko will always be second class to Rust because Rust is used in many other areas of development. Don’t get me wrong, i do like Motoko but as a business you look at how many developers know Rust vs Motoko and the choice is clear. Just my two cents. Big love to DFINITY and the Motoko team

I think the fact that none of the protocol or application canisters managed by the NNS are written in Motoko is problematic for the language being taken seriously (it certainly doesn’t signal that it’s ready for serious projects).

If Motoko is the official language of the IC, there should be an initiative to migrate all protocol canisters to Motoko. Pain points will be discovered and they can be addressed as DFINITY go.

1 Like

Agreed
I have talk to the team a few times about this but there really isn’t a great option that we have seen for WASM based blockchain or actor model environment to expand to
When the environments show up, hopefully there will be some movement
Filecoin FVM was supposed to have WASM support but im not sure if the project died or is just on hold

This has been my concern for a while and I wrote a thread about it a while ago but I get conflicted as a dev because the framing is Motoko is the future but at the same time Dfinity doesn’t give it the love because they only use Rust internally
Im not sure what can make that change
Im not sure if anything will change with Motoko support now with the release Caffeine AI and Enhanced Orthogonal Persistance, but I hope so

1 Like

Thanks @Gekctek, are you able to share a reference to that thread?

@marc0olo, is this something you’re able to comment on, in terms of DFINITY’s perspective and plans regarding Motoko usage?

Will DFINITY ever switch to using Motoko as the primary IC language rather than rust?

I think there are a lot of advantages to having a dedicated language that can be made to prioritise what the IC needs, and also make it easier to develop on the IC. At the moment I think many things are actually harder using Motoko, precisely because it’s not the well trodden path.

Things like orthogonal persistence, build reproducibility, maybe even the ability to compile source code to WASM on-chain (facilitating dapp-based CI pipelines, and automated canister hash verification), are things that could make Motoko the go-to language.

Until DFINITY takes that leap though, I’m not sure why they would expect the community to. I want to make more use of Motoko. but I don’t see it as the path of least resistance - though I really want to.

Wasn’t as pointed to dfinity as i remember but essentially

1 Like

Fun fact: there is actually one NNS canister written in Motoko: lifeline. From the readme:

The lifeline canister is written in Motoko and uses an alternative technology than the other NNS canisters that are written in Rust and use libraries from that ecosystem. This allows for some degree of “galvanic separation” of technologies, such that the risk of inheriting some kind of common flaw from the compiler (and/or libraries) is reduced.

(Not trying to take away from your point, it’s only ~100 lines of Motoko…)

3 Likes

Well you cannot serialize/deserialize types automatically. You have to manually implement serialiation/deserialization yourself. This is time consuming, error prone, and brittle - if you change the type it is easy to forget to change the ser/de.

3 Likes

Also, implicit conversion between Blob and [Nat8], please.

This is an unnecessary pain point given that these types are essentially the same thing. I’m currently battling through similar issues to those mentioned two years ago → Confusing type error when crossing canisters: expression of type MyType cannot produce expected type MyType__1 - Developers - Internet Computer Developer Forum

Everything ran locally fine. I had the ICP index canister defined in dfx.json as a remote canister, pointing to the released did and wasm. I was using get_account_transactions with the subaccount in the account object defined as Blob. As mentioned, all runs fine locally.

As soon as I try to deploy I get the error that the type is expected to be [Nat8]. Not sure why this wasn’t a problem locally, given that the did I am referencing for the index canister also defines it as [Nat8]. Anyway, I’ve just made the changes locally to use [Nat8] instead of Blob (which seems to require clunky conversions that could just be implicit - Option.map<[Nat8], Blob>(acc.subaccount, Blob.fromArray)).

The trouble is I get the opposite error now locally than I was getting when trying to deploy. Locally the compiler wants Blob for that index canister call (despite the vec nat8 in the did I’m using). I’ve tried a clean rebuild. I suspect there’s something I’m missing that I’ll figure out shortly. This is no doubt an unnecessary paint point though.

1 Like

I ran into something similar and it turns out there is a bug in the candid compiler/translator. I think @claudio was working on it.

From what I understand, Blob actually compacts much smaller in motoko than a [Nat8](because each value in an array has its own type header inside the memory). The advantage of [Nat8] was, of course, that you could get a part of the blob by index myBinaryData[35] which you can now do on a blob with myBlob.get(35). What we still don’t have(I don’t think) is a .put that would work on a var Blob. (This would be awesome if we had it and would make manipulating fixed-sized files much more efficient.)

So right now, If you are storing unchageing data(or data that you are fine reconstitutin later use Blob and save a ton of space. If you need to change your data often you may still need to use [var Nat8] and then freeze it to a blob before it is at rest.

@gabor and @claudio, please correct me where I’m wrong.

Source:

1 Like

@Lorimer I have version 0.0.1 of the protobuf encoder/decoder on MOPS for Motoko now
https://mops.one/protobuf

Let me know if it does everything you need
I have a test specifically for ICP ledger blocks and it is working

2 Likes