The New Generation of Web3 Frontend Frameworks
As a Solana network extension, Neon allows developers to execute Ethereum bytecode within the Solana runtime.
What does that mean for frontend developers building UIs for Neon dApps?
The smart contracts behind Neon apps are written in Solidity, using familiar Ethereum frameworks. Consequently, the frontend will also be built using Ethereum-native frontend libraries, such as ethers.js
or viem
.
Only a few years ago, the default choices would have been web3.js
or ethers.js
. But today, a new framework has become a worthy contender - Viem
, “a TypeScript Interface for Ethereum that provides low-level stateless primitives for interacting with Ethereum” (see Viem docs).
What’s curious is that Viem’s evolution parallels Solana’s own transition from @solana/web3.js
to gill
, a high-level toolkit built atop @solana/kit
.
Since Neon developers operate in this borderland between Ethereum and Solana, building Solidity-based dApps with Solana wallet connections and native Solana program access, it’s important to understand how these two new frontend frameworks compare not only to their predecessors, but also to each other, and how Solana’s and Ethereum’s architectural differences define the evolution of its respective frontend frameworks.
In other words, what is possible now for frontend developers building on Ethereum and on Solana? How different is their developer experience? And how does it change with the new frontend frameworks?
Towards a better DX for building UX
Early libraries like web3.js
(Ethereum) and @solana/web3.js
(Solana) defined the first generation of dApp tooling. But as projects scaled, developers began demanding lighter bundles, stronger typing, and better developer ergonomics.
On Ethereum, this shift led to the evolution web3.js
→ ethers.js
→ viem
.
On Solana, from solana/web3.js
to @solana/kit
to gill
.
Both ecosystems now share a clear design goal: improve performance, composability, and developer experience without losing control.
So, how has this evolution unfolded so far?
Brief evolution overview
Ethereum
Ethers.js
was among the first broadly adopted high-level libraries for Ethereum. It introduced “providers” as abstractions for connecting to Ethereum nodes and bundled common dApp features, such as contract interaction, event listening, wallet integration, into a single unified interface. Its combination of maturity, stability, and comprehensive tooling has made it a go-to option in the ecosystem.
That all-in-one paradigm, of course, has downsides: ethers.js
generally produces larger bundles, hides internal complexity behind abstraction layers, and offers a rather limited static type inference.
Viem
is aimed to solve these issues. It does an interesting twist - it replaces Ethers’ class-based abstractions with typed clients and explicit actions, which results in a flatter, more predictable architecture where every operation is a pure, typed function rather than a method on an object.
Another distinctive change is that it removes the long-standing “provider vs. signer” split entirely. Instead, it separates concerns through lightweight, stateless clients like publicClient
for reads and walletClient
for writes. This makes data flow explicit and easier to reason about, while its modular design enables tree-shaking (to import only the specific functions or clients you need) and significantly smaller bundles (~35–60 kB vs. ~130 kB for Ethers
).
Solana
solana/web3.js v1
played the same role as web3.js
- it was the canonical JavaScript SDK that powered most Solana dApps, providing account management, RPC calls, transaction construction, and on-chain interactions.
It worked, but it was tightly coupled to legacy dependencies and lacked modularity, which is crucial to Solana to maintain performance.
solana/kit
(formerly web3.js v2
) rebuilt this foundation into small, explicit primitives: RPC factories, transaction builders, and WebSocket subscriptions, which are all importable separately.
However, Kit
is intentionally low-level, which makes it more suitable for protocol developers, not app builders.
That’s where gill
comes in. Built directly on solana/kit
, it provides a high-level, ergonomic interface with built-in utilities and type-safe wrappers for app-building use cases (instead of building at protocol level).For example, instead of manually wiring RPCs and transactions, you can set up everything with a single call to createSolanaClient()
, which bundles RPC, subscriptions, and transaction handling into one object.It also includes built-in helpers for frequently used Solana programs (Memo, Token, and Compute Budget) packaged as type-safe, modular imports. Basically, it’s the same tree-shaking as in viem
- you can bring in only what they need, keeping builds small and clean.
Technical differences: new vs. previous & Solana vs. Ethereum
Putting these frameworks side by side can reveal more than just syntax or feature updates - it shows how each ecosystem approaches the same core challenge: connecting frontend apps to blockchain logic. And since Ethereum and Solana architectures and runtime models are so different, they shape different design priorities.
In the tables below, we bring together the Ethereum and Solana stacks (Ethers.js
→ Viem
and solana/kit
→ Gill
) to see how each ecosystem solves the same frontend challenges in its own way. The goal isn’t just to compare features, but to understand how differences in runtime design and contract architecture shape what developers need from their tools.
Providers / clients / connectivity
Signers & accounts
Contracts / programs interaction
Reading chain data
Encoding / serialization
Fees / gas / compute units
Events / subscriptions
Transactions & deployment
Both ecosystems’ frontend frameworks ultimately reflect the architectural logic of their blockchains.
Ethereum’s smart contracts are stateful and self-contained, which means dApp interaction happens through contract calls, e.g. read, write, and event listening. Hence, both ethers.js
and viem
revolve around ABI-driven contracts and wallet-based signing. The abstractions evolve from classes (ethers
) to lightweight, functional clients (viem
), but their purpose remains the same: make contract-level interaction simpler and safer.
Solana’s model, by contrast, is instruction-based and account-oriented. Programs are pre-deployed and stateless, so app logic happens through transactions composed of discrete instructions rather than direct contract calls. SDKs like solana/ki
t expose these primitives explicitly, while gill
builds a convenience layer on top, streamlining signer setup, compute budgeting, and program utilities without hiding Solana’s explicit structure.
In short, the evolution from web3.js
→ ethers
→ viem
and solana/web3.js
→ solana/kit
→ gill
shows two chains converging on similar frontend goals - type safety, modularity, and clear developer experience, while still preserving the distinct execution philosophies of their architectures:
Ethereum’s “call a contract and listen for events” vs. Solana’s “compose and send instructions.”
If you’re curious to give these new frameworks a try, here’re some helpful resources:
- Gill documentation - https://www.gillsdk.com/
- Gill SDK GitHub - https://github.com/gillsdk/gill/tree/master
- Viem documentation - https://viem.sh/docs/introduction
- Viem Examples - https://github.com/wevm/viem/tree/main/examples
And don’t forget to get them from an MCP server directly into your build (e.g. by using https://context7.com/).
Let us know what you’ve built and feel free to ask for our assistance in the Discord dev channel.