Introduction

Write an html/template and a small Go controller. The browser posts a form, the server re-renders, and only the changed parts of the page get patched.

A client framework does this too, and for a canvas editor it should. But for a settings screen it means keeping two copies of the same data in sync. That cost is the one thing this is trying to avoid.

The defining idea is that you never leave HTML. A <button name="increment"> is the action — you don't annotate it to make it reactive. You reach for an lvt-* attribute only for behavior HTML itself cannot express (a debounce, a keyboard shortcut, a reactive class toggle), never as boilerplate.

When LiveTemplate fits

Good fit: app screens in Go that need live behavior. Forms with inline validation, multi-tab sync, dashboards that update themselves, views shared across users. All of it without standing up a separate frontend.

The same program works as a plain form POST first, so it keeps working where JavaScript is off, and picks up WebSockets where you want them.

Weaker fit: canvas editors, offline-first apps, animation-heavy UIs. The logic really does belong in the browser there, and this would be fighting you.

How it compares

If you've used other tools, the short version: LiveTemplate keeps HTML standard and moves reactivity to the server, instead of layering a new vocabulary on top of it.

Where to go next

Once the model clicks, the Concepts section goes a level deeper, and the Recipes and Apps sections are copy-paste starting points.

source: livetemplate/docs · path: content/getting-started/introduction.md