Runnable application recipes demonstrating LiveTemplate usage with various features and patterns. Each page documents an app under examples/ in this repository — you edit the app and its page together, so a change to one turns up in review beside the other.
The todo app demonstrates LiveTemplate's core features in ~150 lines of Go + ~80 lines of HTML:
ctx.Subscribe(ctx.SelfTopic()) in Mount and an explicit ctx.Publish(ctx.SelfTopic(), ...) from each mutating action<form method="POST" name="add"> routes to Add() with zero configurationChange() auto-wires input events with 300ms debounceErrorTag, AriaInvalid, AriaDisabled template helperslvt-fx:animate="fade" on new rowslvt-el:setAttr:on:add:pending="aria-busy:true" for visual feedback<meta name="color-scheme" content="light dark">All examples follow the progressive complexity model. Prefer Tier 1 (standard HTML); reach for Tier 2 (lvt-* attributes) only when HTML cannot express the interaction.
| Example | Tier | Description | Tier 2 Attributes |
|---|---|---|---|
counter/ |
1 | Counter with logging + graceful shutdown | None |
chat/ |
1+2 | Real-time multi-user chat | lvt-fx:scroll |
seat-picker/ |
1 | Cross-user real-time seat booking (different users, shared topic) | None |
file-tree/ |
1 | Recursive template — a directory tree whose template invokes itself; deep edits scope to one leaf | None |
todos/ |
1+2 | Full CRUD with SQLite, auth, modal + toast components | lvt-on:change, lvt-fx:animate, lvt-fx:highlight, lvt-el:setAttr |
flash-messages/ |
1 | Flash notification patterns | None |
avatar-upload/ |
1 | File upload on the ordinary form submit (Volume mode) — a plain file input, no upload attribute | None |
upload-autoupload/ |
1+2 | Upload that fires on file selection, streaming over the WebSocket | lvt-upload |
upload-modes/ |
1+2 | Four upload modes (Volume/Direct/Proxied/Preview), one input | lvt-upload, lvt-upload-with |
progressive-enhancement/ |
1 | Works with/without JS | None |
ws-disabled/ |
1 | HTTP-only mode | None |
live-preview/ |
1 | Change() live updates | None |
login/ |
1+2 | Authentication + sessions | lvt-form:no-intercept |
shared-notepad/ |
1+2 | BasicAuth + SharedState | lvt-form:preserve |
dialog-patterns/ |
1 | Native <dialog> with command/commandfor |
None (polyfilled by client) |
The directories listed in the table above are individual app recipes. Each folder contains a minimal, self-contained project that demonstrates a specific LiveTemplate pattern or feature.
Each example is self-contained with its own go.mod. To run an example:
cd <example-directory>
go mod download
go run main.go
Run all working examples at once:
./test-all.sh
This script will:
--skip-disabled to attempt them)App recipes include E2E tests using Chromedp:
cd <example-directory>
go test -v
The test script is also used in GitHub Actions. See .github/workflows/test.yml for CI configuration.
App recipes load the client through the framework-provided template functions,
which render the CDN URL for the bundle this server release is wire-compatible
with — pinned, never @latest:
<link rel="stylesheet" href="{{lvtClientStyleURL}}">
<script defer src="{{lvtClientScriptURL}}"></script>
For local development, examples can serve the client library locally using github.com/livetemplate/lvt/testing.
github.com/livetemplate/livetemplate — the version pinned in this repo's go.modgithub.com/livetemplate/lvt@livetemplate/client, pinned to livetemplate.ClientVersion and served via CDN by {{lvtClientScriptURL}}App recipes follow the LiveTemplate core library's major.minor version:
v0.1.5 -> app recipes: v0.1.x (any patch version)v0.2.0 -> app recipes: v0.2.0 (must match major.minor)See CONTRIBUTING.md for guidelines on adding new examples.
MIT License - see LICENSE for details.