plain.

Compile, test and deploy Solidity in seconds, not minutes

plain is one small binary that compiles, tests, deploys and verifies your contracts. It runs your Foundry project as it is, needs nothing else installed, and turns the minute-long edit-and-test loop into about a second.

curl -fsSL https://getplain.org/install | sh

The installer works on macOS and Linux. With Rust installed, cargo install --git https://github.com/backmeupplz/plain builds it from source.

# a Counter contract and its test, in an empty folder
plain init
# compile and run every test
plain test
# simulate, send, then verify on Sourcify, Etherscan and Blockscout
plain deploy Counter --network base-sepolia --broadcast

The loop you run all day, measured on real projects

These are median wall times on an M1 Max for veydrift, a game with 300 tests in a 7,500-line via-IR test file, and for Uniswap v4-core. Foundry ran the same commands on the same machine. Hardhat 3 ran them too, and its times are in the full tables.

Edit one test, then run the whole suite 56× faster

Foundry56 s
plain0.99 s

Edit a contract function, then run the whole suite 49× faster

Foundry103 s
plain2.1 s

Build everything from scratch 8× faster

Foundry116 s
plain15 s

Rerun v4-core's 598 tests when nothing has changed 7.6× faster

Foundry4.7 s
plain0.61 s

Deploy 40 transactions over an RPC 80 ms away 4× faster

Foundry8.0 s
plain2.0 s

Each edit run makes a new change, each cold build starts with nothing cached anywhere, and what plain deploys is byte-for-byte what solc produces. The full tables also cover no-op builds, fresh clones and solmate.

Nothing to set up before your first test

plain replaces a toolchain with a single command, so a new project or a fresh clone is ready as soon as the binary is on your PATH.

One binary and nothing around it

plain is a single 7 MB executable. You don't need Node, npm or git submodules, and forge-std is built in, so import {Test} from "forge-std/Test.sol" works in an empty folder.

Your Foundry project already works

plain reads foundry.toml, remappings and lib/ the way they are, picks the solc version your pragmas ask for, and downloads it the first time you build.

Deploys that verify themselves

plain deploy runs your script against a fork first, sends the transactions only when every one of them would succeed, and then verifies each new contract on Sourcify, Blockscout and, with your API key, Etherscan.

Every chain by its name

Pass --network base, linea or a chain id, and plain finds a working public RPC on chainlist.org, while your own RPC URLs still take priority.

Why it's fast