[piston.web] First Open Source Steem GUI - Searching for alpha testers

in piston •  3 years ago  (edited)

Piston.web - Standalone User Interface

Many may already know piston as a tool that simplifies interaction with Steem/Steemit. You can read, post, comment, edit, transfer funds and much more, if you are willing to use the command line.

This changes now. With piston.web, the toolbox now comes with graphical user interface that you can access via your browser. It is fully independent of steemit.com, which means that you can do what you love doing on Steem, even if steemit.com goes down.

Available Features

  • browsing steem posts
  • reading full posts and comments
  • reply to topics and comments
  • upvote/downvote
  • read account details
    • recommended posts
    • blog posts
    • funds
    • transaction history
  • integrated wallet
  • full encrypted (AES + BIP32) for private keys
  • import keys from account name and password








Until we leave pre-alpha, piston.web is on a different branch.

git clone https://github.com/xeroc/piston
cd piston
git checkout feature/standalone-web
make install-user
# install extra requirements for piston.web
pip install -r requirements-web.txt


piston web

On first run, you will be asked to provide a passphrase for your new wallet. Empty password are allowed but result in private keys being stored in plain text.

After that, you will see

 * Running on (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 227-869-909

Ignore the debugging output and start using piston.web in your browser
by accessing

NOTE: piston.web will only be reachable from the same machine (localhost).



The backend is written in python using

  • Flask (with Jinja2)
  • python-steem.

It offers the HTML files and a Socket-IO for real-time communications.


These technologies have been used so far in piston.web:

  • Bootstrap
  • Markdown
  • Font-Awesome
  • Plain Javascript


The wallet is only accessible from the backend. All keys are encrypted with a random master password that is stored in an SQLite3 database in its AES encrypted form. Each private key is encrypted with the master password using BIP32 and stored in a SQLite3 database. The wallet will make backups of the SQLite3 database every week and keep several weeks of backup.


  • Transfer of funds
  • PowerUp, PowerDown
  • Trading
  • Account Administration (changing keys etc)
  • Allow to attach JSON object to posts
  • Secure socket.io with a password
  • layout and style improvements


Currently, we are looking for the bravest of the bravest to help us test what is already there and give

  • bug reports
  • improvement proposals
  • feature request

Please use the github issue tracker to make it easier for us to remember all the feedback.

Important Note

piston.web is alpha software. For that reason, you need to expect it to break at any time. Use at your own risk.

Update 1

I'd like to clarify that this GUI is not meant to replace steemit.com or be used as a hosted, public site. It rather offers a personal, localhost-only page that you can use to access your wallet. Exposing the piston.web to a publicly accessible port is not recommended!

Update 2

I fixed the sqlite3.OperationalError: unable to open database file error earlier today so that people can actually take a look.

Update 3

More short-term fixes for the weekend-testers:

* [2016-07-23][bf3dae5] | [setup] make sure the user uses python3
* [2016-07-23][c31eec7] | [web] highlight own posts
* [2016-07-23][03e0d2f] | [web] fix reply identifier not in the form
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

I'm so geeked about this... I feel like I just need to take the day off and dive right in (though I also want to do a code review). This, to me, is the key to this whole experiment which will, in a sense, save the Internet. This gets us closer to what the Internet was supposed to be: an interconnected web of decentralized content which could be modified with a POST or PUT and retrieved with a GET. When people can run a copy of their own favorite social media platform from any device any where in the world and "the server" never goes down because there is no server besides the blockchain, that's just amazing. Might also be amazing to have contributor keys which allow people to edit/post on shared accounts. Man, the possibilities are mind blowing.

Thanks for putting this out there, @xeroc.

Wow, I think I get what you are saying here... I've never thought of it like this... that's amazing. I'm thinking the server is replaced with a peer to peer datasource/database ? (Well I guess that's what the blockchain is). Kind of operates like DNS? So each node doesn't need to store the whole blockchain, just the parts it has accessed. Something like that, or am I missing it?

There are public API nodes (such as this.piston.rocks) that run the same database as steemit.com (technically, that database is a blockchain). That said, you can

  • use steemit.com and their semi-public API
  • connect to this.piston.rocks and use that one
  • or deploy your own node and use that one

Technically, there is a way for public APIs to profit from offering a public API node and that is: People are asking for the latest posts in a category with a certain sorting, but no one prevents the API provider to put their own posts higher in the ranking. No one actually even prevents them to give your wrong data. That said, you shouldn't trust any public API unless you trust the operator but on the other hand, the API provider can use it to monetize their public api service.
This of this as a google ranking. If you get the posts from steemit.com, you will see their ranking while when you use another service, you will see another ranking (potentially added extra posts to fund their server) .. the only way to get a neutral picture is to use your own server or maybe pay for a neutral party to provide a neutral point of view.

As a note, this.piston.rocks currently provides the most neutral point of view there is but that might, or might not change ..

Ok, yes I see.
I'm wondering if there is a way to avoid having to store the entire blockchain on a node. There are probably many problems with this idea. But I can see blockchains growing very large over time. I'm sure the steem or other blockchains have figured this problem out or are working on it.
Now that I think about it, my idea of not storing the entire blockchain, violates one of the fundamental ideas of blockchains, trust. But as you said, you also have that problem when using someone else's API to the blockchain.
Sorry, just thinking out loud here.

The idea is to let them be hosted by companies and witnesses and people only interact with the public API nodes .. pretty much like blockchain.info or electrum use light-weight clients.

Hey am new on steemit please support me to grow.
Hope you will help me out....


Similar to SP, SMD tokens cannot be purchased directly on an external exchange. SMD are primarily earned through contributing but can be purchased by converting STEEM tokens to SMD tokens.

Actually Steem Dollars can now purchased on external exchanges !

PS Abbreviation of SBD = Steem Backed Dollars
or just SD = Steem Dollars (not SMD please edit)

"from any device any where in the world and "the server" never goes down because there is no server besides the blockchain, that's just amazing"

This! Remember all the times your favorite sites have downtime and/or DDOS and/or something else. No downtime on blockchain, ever!

Currently, there still is a central point of failure and that is the this.piston.rocks API server. However, I plan to extend this quite a bit and use geolocated DNS with several servers around the globe to make it more robust ..

I think it would be more impotent to have a way for independent community members to run API nodes them self, then having a nice geo redundant deployment managed by one party.

What dose the API Server consists of? Is this just the API of steemd or is there another service involved and if so would it be possible to have the code available to play around with and try to build a independent setup connecting to a local steem-node?

Not to be ungrateful, my first reaction to this post was off course: awesome, finally a way to use steem independent of steemit.com like a real decentralized app. And it still locks to me a lot like that, only this small part seems missing, so thanks a lot for this awesome project!


Wouldn't it be a good idea to offer an incentive for running an API server in steemd itself? Like Masternodes for DASH, or an Incentive Node for VCASH.

Absolutely, I think it can be easily done by just asking Steem to pay for their public APIs. A post about the APIs statistics now and then might bring in enough money to continue service. Time will tell.

Is it hard to run your own API server?

I think someone has even created a docker image for steem .. search on steemit or github

  ·  3 years ago Reveal Comment

Funny, my original comment mentioned having thousands of clones of this.piston.rocks, but I ended up removing that part before I posted and talked about how this gets us a step closer. Maybe some day that code can also be decentralized, self-hosted, and distributed. Either way, thanks again for all your hard work, @xeroc! To me, stuff like this is the difference between success and... something else that isn't success. :)

In the realm of decentralized services, I think that consul is really, really overlooked, especially the potential of consul, coupled with ultra-low-cost servers. Once a machine is in a consul cluster, it is "bound" to the consul master and that master can execute commands on it as though it were root.

Consul also manages services and service discovery.

It can be run alongside Nomad, which can schedule anything that can be run on linux in an extremely neat, tight fashion.

I wanted to add the ability to change the API node. piston allows that already, but the gui has no feature for that yet. It will come for sure.

  ·  3 years ago Reveal Comment

It's not entirely correct. The default piston setup connects to this.piston.rocks as the backend API server. However you can already change it to your own node by running

piston set node ws://ip:port

There will be a nicer gui feature to do this eventually.

WoW 40 grand dollar fot this post, thats way beyond sick :o

Would be interesting if this became a successful method for funding open source projects wouldn't it?

Absolute ;)

Considering the work Xeroc does? This is like maybe half what a single developer would make in a year. Xeroc has been giving away tons of free code for the bitshares community as long as there has been a bitshares. I just did the math at 40g's he's made about $1.50 per hr.

Yeah it's sick. This man is probably the least appreciated contributor here. This tool is friggin awesome! I don't do python but I'm reading the code and learning the internals of how this stuff works, which is great because our devs don't do documentation.

Wish there was a tipping option for people like Xeroc!


WoW 40 grand dollar fot this post, thats way beyond sick :o

I tend to agree. Thought it might reach a couple $k, but >$40k is .. quite some appreciation :)

Me also. But you deserve it. You did an super jobb making this. This is why steemit is so amazing. It helps out who deserve it. Keep up the good work mate. Im suprised

Good comment

A dream come true :D

I still have that Acidyo BitcoinTalk account available for sale 60 Steem and its yours.

Hey am new on steemit please support me to grow.
Hope you will help me out....


I need to learn how to build/install it. Do you know any good tutorial on how to build this kind of built?

Tutorials will come when the product is read for the masses. The current code is rather a Proof of Concept and in Alpha stage, even though it can already be used for quite some things. Give me some time to improve it further and I am sure I can release something stable in a bit .. (no ETAs in software development)

one step closer and piston is crushingit :)

Buufaaaa... Uuuuuuh buaaaaaahhh 44.000$ and increasing! ! Its a buuuuuuuuuufff....

i asked myself how is it possible to make so much cash for few words

I'm more geeked by the fact that pistons can generate steem, piston, steem, seewutididthar?

Cool GUI bro.

Thanks @trogdor!

I don't think the early Internet pioneers were as excited as we are right now. When they typed out SMTP commands in their terminal or transferred a file from one university campus to another, I can't imagine they had any idea what they were birthing. We, on the other hand, live with those results all around us. It's hard not to imagine an even more amazing future given the results of the past we currently enjoy.

but the blockchain rely on infrastructure no?

As in internet connectivity between nodes? Yes. This is also something people are working to solve by building mesh networks, custom wifi networks, or even balloons such as the Google Loon project. https://outernet.is/ is another interesting example using micro satellites. Hopefully soon we will decentralize all the things!

Already been solved, you just need to use it.

Yep, one more I forgot to mention in my list! :)

It might sound great in theory, but in reality it might be much harder to realize. Due to the blockchain size after a few years you might need a very powerful computer to host the blockchain, which isn't possible for "normal" devices. Just my 2 steem.
Anyway xeroc's libraries are always top notch. Thump up for him.

I don't think you will need a lot of "power" to host the Steem network long-term. You will need a lot of disk space, but disks are cheap. The only difficult things for the node to do is a replay. Those currently take about 2 minutes (a joke if you conpare to other blockchain techs). Either way, the underlying technology is soooo awesome, that I don't see a scalability issue in near future.

Oh, btw, on this.piston.rocks, there are actually two witness nodes running in parallel, connected to nginx via fail-over/load balancing. That means, I can update the code and replay the one node, while still serving the traffic with the other node and vise versa :)

I read your codes and learn a lot from it. Thanks Fabian.

Hey am new on steemit please support me to grow.
Hope you will help me out....


Steems away!

Not usually upvoting animated gifs, but that one is cool, original and relevant so exceptionally...

firing on all cylinders

It's refreshing to see a new gif aside from that Game of Thrones one =P

Ok, now that deserves a 5-figures payout!
@xeroc: do you have a witness account to help you support developments?

I do not run t apprecitae your offer for an upvote.

Ping me on Slack when/if you do: @talerecursion

Looks pretty awesome! I may try to run it up on one of my servers. If I do I'll definitely get linked up on github to keep you updated.

This is for personal use .. it does not allow others to login .. if you expose the web to the public, you will compromise your private keys. The purpose of this is not to host a new website, but to offer a standalone app that people can run at home .. locally!

Oh, haha, I've gotten so used to experimenting with things on my server I just jumped to assuming it was to be a web app. Thanks for the clarification.

You might want to make a big fat warning on this post and in the READMEs about this point. It was only clear after a bit of thinking, that this really is intended to be something you run locally.

You might even consider adding some strong speed-bumps before anyone can use something other than to serve content.

This is definitely a game changer. It brings decentralization to a whole nother level. The analogy is now like BitTorrent, where in this P2P setup all can just run a client node and connect to the network. Here, even if steemit.com were brought down, people can start up their own node and connect to the blockchain! Genius!

Really cool! I'll be trying this out. Does it support voting % changes? I'd love to see a unique feature or two that Steemit doesn't support yet.

The backend can do that but the frontend does not .. if you point me to a nice UI element to offer that feature, it can surely be added ..

Could it just be a locally-saved text box where the user would enter -100 to 100 to save a default vote? (negative numbers would be useful for spam fighting)

How about these:

I't love to have one that you can adjust with the mouse wheel.
I will also make it possible to

Looking great. I'm a UI designer and I'm think it was definitely a good decision to use Boostrap for the graphic interface, it's very clean and easy to navigate.

I absolutely love this! I have some ideas for a few things I'd love to see added that could make things even easier.

I assume you're open to pull requests? Expect some chatter from me via slack too :)

Yea feel free to contribute, i will also start work on the GUI design improvements this weekend.

I am glad you will take more rewards than she did...

so true

xerox, looks great. Lets get it tested and out of alpha. Could the piston toolbox be used for an App or DApp!? Or maybe package it with a server for mobile use!

@xeroc I tried to use your piston.web, put there's an error that I cannot figure out. This is it:

Traceback (most recent call last):
File "/usr/local/bin/piston", line 9, in < module>
load_entry_point('steem-piston==0.2.3a0', 'console_scripts', 'piston')()
File "/usr/local/lib/python3.5/site-packages/pkg_resources/init.py", line 542, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/local/lib/python3.5/site-packages/pkg_resources/init.py", line 2569, in load_entry_point
return ep.load()
File "/usr/local/lib/python3.5/site-packages/pkg_resources/init.py", line 2229, in load
return self.resolve()
File "/usr/local/lib/python3.5/site-packages/pkg_resources/init.py", line 2235, in resolve
module = import(self.module_name, fromlist=['name'], level=0)
File "/usr/local/lib/python3.5/site-packages/steem_piston-0.2.3a0-py3.5.egg/piston/main.py", line 9, in < module>
from .storage import configStorage as config
File "/usr/local/lib/python3.5/site-packages/steem_piston-0.2.3a0-py3.5.egg/piston/storage.py", line 321, in < module>
if not configStorage.exists_table():
File "/usr/local/lib/python3.5/site-packages/steem_piston-0.2.3a0-py3.5.egg/piston/storage.py", line 120, in exists_table
connection = sqlite3.connect(sqlDataBaseFile)
sqlite3.OperationalError: unable to open database file

I ran into this problem and reported the bug to @xeroc already.

The workaround is to do:

mkdir ~/.local/share/piston

When do I type in this code?

I missed two lines of code to generate the above directory. You can create that directory by hand to fix the error. I will fix the repository asap

I fixed this issuer earlier today, you may want to run a git pull and reinstall

Thanks for the help, but... I have encountered another problem... here it is :

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/private/var/folders/7x/_dsd44s94_nft92r9myn3y0h0000gq/T/pip-build-MsWRmL/websockets/setup.py", line 17, in <module>
    with open(os.path.join(root, 'README'), encoding='utf-8') as f:
TypeError: 'encoding' is an invalid keyword argument for this function


Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/7x/_dsd44s94_nft92r9myn3y0h0000gq/T/pip-build-MsWRmL/websockets/

Note : I am running a Mac OS X

Thanks for the help, but... I have encountered another problem... here it is :

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/private/var/folders/7x/_dsd44s94_nft92r9myn3y0h0000gq/T/pip-build-MsWRmL/websockets/setup.py", line 17, in <module>
    with open(os.path.join(root, 'README'), encoding='utf-8') as f:
TypeError: 'encoding' is an invalid keyword argument for this function

Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/7x/_dsd44s94_nft92r9myn3y0h0000gq/T/pip-build-MsWRmL/websockets/

Note : I am running a Mac OS X

Please make sure to run Python3!

Looking at the Post function in the screen shot, I don't see any of the Editor formatting commands. Is that coming?

Currently, the editor just takes plain (markdown) text. I will add a preview asap and maybe even add a nicer steemit-style editor eventually. Give me some time for this.

  ·  3 years ago Reveal Comment

With only that fraction of error, I can't tell much about the reason, but I would assume that you try to install it using python2 and not python3.
I've added a check in the setup.py so people can see the error right away

i'm in this weekend 8] good job @xeroc

  ·  3 years ago (edited)


Collecting websockets==2.0 (from -r requirements-web.txt (line 37))
  Using cached websockets-2.0.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/v2/9vnp2_3x5pv2ncqhlnc3vg9c0000gn/T/pip-build-FNNORu/websockets/setup.py", line 17, in <module>
        with open(os.path.join(root, 'README'), encoding='utf-8') as f:
    TypeError: 'encoding' is an invalid keyword argument for this function
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/v2/9vnp2_3x5pv2ncqhlnc3vg9c0000gn/T/pip-build-FNNORu/websockets/

hit me that error in the last command

you need to use python 3 and cannot use python2. I should probably add a check for the version somewhere

Looks awesome! I was really waiting for a third party GUI for Steemit! Hope to see an app next.

I hope to figure out how to do apps like electrum (which is a python app) and make it installable with a simple msi installer, but I am not there yet .. need to get the code base done first.

  ·  3 years ago (edited)

Well, you are in luck, I am precisely beginning at this, but I need a little help at navigating the codebase. Mine will not target Qt, I'm a gnome man and I'll wave the flag for Stallman all day long. The black flag, of course. I am not exactly flush at the moment and although I would love to help with documentation, I need help myself to navigate the code. Your python code is far advanced on my beginner level knowledge. If there is any way I can help this progress, I am so on for it.

I quite like the idea of making a simple binary-based installer that gives you the option to put a witness node on a machine, and maybe we can set up some kind of DHT directory to distribute the load, move this from client-server model to a more distributed model, in keeping with the whole philosophy of all of this. With this, people could , with their nice shiny 1st world machines, help boost access to steem even further by providing a cloud of RPC endpoints. Indeed, I know a little about building debian packages, and I know Steem is still in beta, but it would be truly amazing if we could scale this thing up really fast and by next year be looking at something that is all set to trounce bitcoin itself..

Blockpay already now accepts Steem payments. I see no reason why this should not explode, not least for the reason that development itself is being funded within its framework. This in itself is revolutionary.

edit: i found the API at readthedocs: http://piston.readthedocs.io/en/develop/lib.html

massive kudos to xeroc!

So this will work even if steemit.com is down, for the most part, right?

Correct .. Steemit.com uses the Steem network (a blockchain) .. so does piston.

Most people are unwilling to use command line. The GUI will make this more accessible to a larger user base.

@xeroc you rock !!!

Gotta be feeling pretty good. Well done, well deserved.

Did you do it alone or did you get help ? If you did it alone ... WOW.

I did most of the code alone. @cass helped me bigtime with the logo and wants to assists with design/layout aswell. Hoping for @svk to assist on the trading page eventually.
Piston itself build on top of 2 more libraries that I wrote as well:

  • python-steem (which itself build on)
  • python-graphenelib (mostly known from the BitShares community, graphene is the underlying technology)

Been working on python-graphenelib for years now :)

Can someone explain how the blockchain replaces a server? I understand how the block chain can contain data, but what mechanism is creating the web server application? Where does the DNS point to?

The blockchain is maintained via a decentralized p2p network running steemd nodes. These nodes have the whole STEEM database stored on disk and the operator of those nodes can choose to open a public API for people to query against that database (e.g. get content, posts, users or even send new posts etc)
For those that know about Bitcoin, the public API is pretty much what blockchain.info API offers .. just that it is a standardized API that anyone can decide to run.

Formal education will make you a living. Self-education will make you a fortune

Thanks for that answer, is steemit.com a single point of failure or is the website hosting distributed as well?

They are working on a more robust setup to my knowledge. I am pretty sure they haven't expected that kind of growth.

Super! When will be beta? Is there open testing for Win?

Hehe .. its done when its done :)

hehe, laconically. But i hope it will be soon. very cool work!


So in effect, what this means, is that everyone will have their own personal library of all content thats ever existed up to that point??

Not quite allthough technically possible. All data is on a public blockchain and you can download that blockchain entirely. Piston however talks to one of these nodes that hold the blockchain in storage and answers specific queries. One of these nodes is operated by me and available on this.piston.rocks.

Well there goes my weekend ;)

I started playing with your python-steemlib first and I really like and appreciate it. Will play around piston for sure too.

You can get started with something simple as this:

from piston.steem import Post, Steem
post = Post(Steem(), "@xeroc/piston")
post.reply("Title", "body", author="YOURACCOUNT")

Or you go through piston using the command line tool:

piston read @xeroc/piston-cli-quickstart

thank you, will try it

This is brilliant, holy shit well done.

@xeroc This is super epic.

Btw I have placed Piston.Web also on SteemTools ... so we keep a handy overview of apps & tools & services for the community.

SteemTools - indexing all tools & services for Steemit users

Wonderful work @xeroc! No wonder why you don't have time to update the python lib because you've been working on this project!

The problem here is that I do changes to underlying libraries as well .. (mostly extensions) but I don't want to break compatibilities in the master branch .. that's why I usually release new versions of all of the libraries at the same time:

  • python-graphenelib
  • python-steem
  • piston
  ·  3 years ago (edited)

Hi @xeroc, I was recently wondering if there were other ways to access steemit than the website steemit.com well I guess this answers the question. Also I think it makes no sense having only 1 point of access if the thing is decentralized. I'll be happy to participate in the testing. Where do I get it?

Where do I get it?

The code is on github:


AMAZING! Count me in as a tester! I'm here all day everyday anyway!

Over $40,000 for the First Open Source Steem GUI, Justified!

Wow this must be the best project for Steemit. You've done a great Job. This will help a lot of people very much.

How long did it take you to build it ?

Given that python-graphene, python-steem an some corefunctionalities already existed, the web application took about 10 days of full time developent. Of course one needs to first know some libraries and tool and there are many work days yet to be put into this before i consider it stable

You know what is next...

Very very cool project :) Did you ever thought about providing Piston as a Docker Container Image? This would help to get it runnung easy on all operating systems :)

great, im already using it, awesome design aswell

$40,000 fro the post. Wish I am as geek as you. Don't know much about technology but know lot about children.

  ·  3 years ago (edited)

gotta add a

cd piston

to the install directions. The full install reads like

git clone https://github.com/xeroc/piston
cd piston
git checkout feature/standalone-web
make install-user
# install extra requirements for piston.web
pip3 install -r requirements-web.txt

Please include in the install steps:

git clone https://github.com/xeroc/piston.git
cd piston/
git checkout feature/standalone-web

Done .. Thanks!

error: pathspec 'feature/standalone-web' did not match any file(s) known to git.