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
  • 1. Install

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

  • 2. Design the CMS

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

  • 3. Edit templates

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

  • 4. Deploy and share

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

This is what makes Webhook different.

Webhook provides static site reliability with a cutting edge, real-time CMS that builds itself.

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 at site.com/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 a real-time API

Unlike other static systems Webhook stores your data in a Firebase, which gives you real-time access to the data so that you can call it at anytime. We even provide API endpoints so you can trigger remote builds or insert data immediately from a third-party.

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.
Complete Groups and permissions
Complete Frontend Search
Complete Grid / repeater widget
Months away CI testing for CMS app
Months away Internationalized frontend.
Months away CI testing for Generator
Months away Refine relationship widget
Months away Collaborative editing in the CMS.

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