Build a Custom Site

This page discusses some of the options for building a custom decentralized website (without a template).

You can build a custom decentralized website using any tool or platform, such as Mobirise, GoHugo, or even convert an existing static website to IPFS. You can also build a custom website manually and store all HTML, CSS, and javascript files inside of the same folder.

Keep in mind that all IPFS websites must adhere to the following configuration rules:

  • All of the content for your website must be contained in one build folder, with an index.html file.

  • All links within your files should be relative links.

To build a custom website, you might consider uploading the website files to a pinning service, like or, and saving the IPFS hash output to connect with your domain.

Upload Directly to IPFS (GitHub Action)

There is a GitHub Action which allows you to upload a D-website directly to IPFS.

Input parameters:







Directory’s path to upload.



Type of target service to upload. Supported services [ipfs, pinata, infura]. Default ipfs



Request timeout. Default 60000 (1 minute)



Level of verbosity [false - quiet, true - verbose]. Default false




IPFS host. Default




IPFS host’s port. Default 443




IPFS host’s protocol. Default https




Pinata Api Key. Required for pinata service.




Pinata Secret Api Key. Required for pinata service.




Human name for pin.

In order to use it, you need to add one step to main.yml:

- uses: aquiladev/[email protected]
id: upload
path: ./build

There will be a build artifact on a runner after steps (usually in directory build or dist). You need to pass the directory as a path parameter.

The step will have hash output — it will be needed later to connect your d-website to your domain. Token ${{ steps.upload.outputs.hash }} can be used in next steps where upload is the id of current step.

Upload to Pinata using GitHub Action

The same GitHub Action allows you to upload a D-website to Pinata pinning service. Pinata simplifies immutable data with a simple IPFS API and toolkit.

In order to use it, you need to add one step to main.yml:

- uses: aquiladev/[email protected]
id: pinata
path: ./build
service: pinata
pinataKey: ${{ secrets.PINATA_KEY }}
pinataSecret: ${{ secrets.PINATA_SECRET }}
pinataPinName: {pin_name}

The output of the upload action is similar to the previous example. You will need to save the hash output to connect to your domain.

Upload to Website Interface

The following guide explains how to upload files to IPFS via Pinata website interface.

  • Go to and sign-up / sign-in.

  • Ensure the Pin Manager tab is selected and click Upload.

Locate the Pin Manager tab for uploading files to
  • Then, click Folder and select the folder containing the website files you wish to upload.

  • When the upload is complete, the IPFS CID (or IPFS hash) will appear under the Pin Manager tab.

Locate the IPFS Hash for your d-website in

Convert a Static Website for IPFS

A few options exist for converting a static website to the proper IPFS configuration for d-websites.

IPFS Deploy

The first option is IPFS Deploy, which is a zero-config CLI designed specifically for deploying a static website to IPFS. Pinning service configuration options include Infura, DAppNode, IPFS Cluster, and Pinata.

For more information on this tool for building d-websites, please review the IPFS Deploy README file.

WordPress Websites

If you have a Wordpress website that you'd like to configure for use as a d-website, then you can test out a few plugins. One plugin to consider is Simply Static, which converts your existing WordPress website to a static website that you can host on your server, a static hosting provider, or a CDN.

For more information on this feature and how it works for d-websites, please see our Guide on Converting Wordpress for IPFS.