I think it is possible by using a web3 provider that runs on the mainnet. I think that infura (i.e. the same company of metamask) can be used to perform what you ask. Essentially you need this piece of code (taken from [this github link][1]): const Web3 = require('web3') // connect to Infura node const web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/INFURA_KEY')) Then you can actually send transactions (and therefore deploy contracts) as if you were running a geth instance locally, by following the common procedures. You need an infura key that can be obtained [on this link][2]. You will need node and the web3 node package (`npm install web3`), but this approach does not require neither a graphical user interface nor a synced geth instance on your raspberry. [1]: https://gist.github.com/raineorshine/c8b30db96d7532e15f85fcfe72ac719c [2]: https://infura.io/signup