The easiest way to build a custom CMS for your next website.

Install Webhook

Free hosting for 14-days. Only $9 a month per site afterwards. Webhook is Open Source.

This is how Webhook works.

Watch a 2-minute demo
  • Install

    Install Webhook as an app or through the command line on your local computer.

  • Design the CMS

    Open the browser and use the drag-and-drop form builder to create your CMS.

  • Edit templates

    SWIG based templates. {{ cms.articles }} is available on every page immediately.

  • Deploy and share

    One-click to deploy your website. Once live, invite your friends to add content.

This is what makes Webhook different.

Say goodbye to configuration files and backend logic.

Drag and Drop Forms

Build your CMS forms in the actual CMS itself.

We've got a widget library full of text fields, galleries, video, maps and more to build out whatever you need. Wow your clients when you add "it'd be nice if it had" features in minutes.

With Webhook, not everything is a "post". Make it whatever you want. The names you set in your forms become the names you use in your template. Your "Articles" form data can be called as {{ cms.articles }} immediately in any of your templates.

{# Let's grab only articles with the category of interview. #}
{% set interviews = cms.articles|where('Category','Interview') %}

{# When you want to paginate the above data, use the following format. #}
{% set interviews = paginate(interviews, 5) %}

{# A simple forloop listing our interviews. #}
<ul>
  {% for interview in interviews %}
    <li>
      <a href="{{ url(interview) }}">{{ interview.name }} ({{ interview.genre }})</a>
      {# Webhook can handle on-the-fly image resizes! #}
      <img src="{{ interview.image|imageSize(50) }}" />
    </li>
  {% endfor %}
</ul>

{% include "templates/partials/paginator.html" %}

template code only

Webhook's only code is at the template layer. There's no PHP or similar backend code to write. If you need data on a page, just call {{ cms.your_form_name }} into your pages and the data is there! We use the SWIG template engine.

with image resizing

Webhook also allows you to dynamically resize your images at the template layer. Don't worry about what size image your client uploaded. Use filters like |imageSize(300) and |imageCrop(300) to resize those images directly in the template.

We watch for edits in the CMS, then rebuild the site.

static websites

Webhook builds static websites. That means your sites are delivered as fast as possible to the people requesting it. There's not a complex rendering and caching layer that can break down when you get lots of traffic.

With real-time data

Unlike other static systems though Webhook stores your data in a Firebase, which gives you real-time access to the data so that you can call it at anytime. That means you can build secondary applications or trigger rebuilds from outside services.

cms form movies relationship actors cms form people
{# movies/individual.html #}
{# This is our individual movie page. It'll render at /movies/movie-name/ #}

<h2>Actors in {{ item.name }}</h2>
{% for actor in item.actors|sort('first_name') %}
  <a href="{{ url(actor) }}">
    {{ actor.first_name }}
    {{ actor.image|imageCrop(100) }}
  </a>

  {# List movies that actor is in other than this one.  #}
  {% for movie in actor.movies|exclude('Name', item.name) %}
    {{ movie.name }}
  {% endfor %}
{% endfor %}

For more than a blog

Webhook allows for complex data relationships.

The forms you create can be linked together through relations. This allows you to build IMDB-style sites. Relate a person to a movie (as an "actor") and you can now grab that data on either side of the relationship.

The created relations are aware of each other too. Delete a person from your movie form and it'll delete that movie from the person as well.

Frequently asked questions

  • Can I import my WordPress site?

    Yes. Webhook has an importer for WordPress content. It'll even bring over all your images.

  • What is Webhook built with?

    Webhook is built with Node JS, Grunt, Firebase and Swig. We use Google Cloud Services for our backend infrastructure.

  • Is there Internationalization support?

    We support multiple languages in the CMS. We'll be adding internationalization of the output frontend in a future release.

  • How much bandwidth do I get?

    $9 hosting covers 25GB monthly bandwidth, with pay as you go $0.12 / per GB afterwards. That's essentially 250,000 pageviews a month.

  • User login? Forums? Shopping cart?

    Nope. Webhook was built with content websites in mind. You can always use a different service like Shopify or Discourse on a subdomain though.

  • Can I self-host?

    Yes. Check the documentation here for detailed instructions on setting it up.

Our Roadmap

Complete Relationship code rebuild.
Complete NGINX style 301 redirects.
Weeks away Google Analytics integration.
Weeks away CI testing for CMS app
Weeks away CI testing for Generator
Months away Refine relationship widget
Months away Grid / repeater widget
Months away Collaborative editing in the CMS.
Months away Internationalized frontend.

Let's get started

It'll take about 30 seconds to see your first Hello World!

Download the app

The Webhook App will install everything you need to get started developing Webhook sites.

Webhook for Mac Webhook for Windows

Prefer command line?


  # Install via NPM
  npm install -g wh grunt-cli

  # Create an account / site
  wh create my_site_name

  # Load the local runserver
  wh serve

  # Deploy your site live
  wh deploy