Your own avatar on bitcoin, forever.

What is Bitpic?

bitpic is a protocol for hosting and using Paymail avatars on the Bitcoin blockchain.

You can think of it as Gravatar, but for Bitcoin.

Step 1. Upload avatar to Bitcoin

Create a Bitcoin transaction which uploads a signed image using the Bitpic protocol.

  [FILE Binary]

Here's an example:

Bitpic Transaction Explorer

Here's Bitcom Terminal (Bterm) for bitpic:


Step 2. Use

Once uploaded, you can use the image from anywhere, simply by referencing:[Paymail]

Here's an example:

Step 3. Update

Bitpic is a Planaria node which implements a mutable database and file system.

This means whenever you upload a new avatar, your bitpic address will be updated to serve the newly uploaded avatar image.

How does it work?

Bitpic is powered by Planaria, a Bitcoin crawler which indexes Bitcoin transactions in realtime into a database.

Why use Bitpic?

  1. Your avatar forever: Paymail providers and wallet providers may disappear in hundreds of years, but your Bitpic avatar will never go away because it's on the blockchain. If you post something tied to your Paymail, you probably want the avatar to show up forever even after thousands of years. Bitpic allows that, because Bitpic is an infinite state machine powered by Planaria.
  2. App developers: No need to roll your own avatar system: As an application developer, you don't need to build a user avatar system from scratch. Just start using the avatar by referencing[Paymail]! If an avatar doesn't exist for that paymail address, you will instead see the default image. For example, here's what looks like:
  3. 100% Open: Bitpic is open source and powered by Planaria, which means anybody can run their own Bitpic Planaria node to operate the avatar system. In fact, you don't even have to use the[Paymail] if you run your own Bitpic node!
  4. Interoperable and Permissionless: If you are an app developer or a wallet company, you only need to worry about implementing Bitpic on your side. You don't need to ask other wallets or applications for permission to use their avatars tied to their paymails, because the avatars are served from the single source of truth: the Bitcoin blockchain.

How to use Bitpic

1. For users

Once you upload your avatar to the blockchain, you can use it from anywhere. For example you can embed your Bitpic in your website simply with an HTML tag: <img src="<YOUR_PAYMAIL>">

2. For app developers

No need to roll your own avatar system: As an app developer, you don't need to roll your own custom avatar system. Bitpic is an avatar owned by the user through Paymail. Outsource your Avatar system to the Bitcoin blockchain.

Uploading Avatars: Allowing your users to upload avatars is also easy. Whenever you need to allow your user to upload avatars, all you need to do is to send them to the Bitpic upload interface.

100% Customizable: The Bitpic upload interface is a server-less application made up of static HTML and JavaScript. Which means, if are a wallet provider, or an app developer, and you want your own custom Avatar uploading UI within your app, you can easily do so. Just take a look at the frontend code at Upload page, and build your own version which creates transactions that follow the protocol. Then you can run your own Bitpic planaria node, or simply use the default URL. Just make sure to say "Powered by Bitpic", so people know where they're uploading to.


1. Powered by Planaria

Bitpic is powered by Planaria. The Bitpic planaria node creates a mutable database which updates the image tied to a paymail address.

2. 100% Open and Portable

Anyone can run a Bitpic avatar node because:

  1. The avatar files are fully stored on-chain
  2. Bitpic is powered by Planaria
  3. The Bitpic Planaria node is open source
  4. The entire Bitpic frontend is open source


  1. /u/<paymail> the image url you can embed in your apps. Example:
  2. /exists/<paymail> returns "1" if the paymail has an associated bitpic avatar. returns "0" if it doesn't exist yet.. Example:

Default Image

By default Bitpic returns a fixed default image if an image doesn't yet exist for the corresponding paymail address. Here's what it looks like:

However it is possible to specify your own default image when the image doesn't load. You can do this by adding a d=<default image url> parameter at the end. Here's an example: