Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 26 additions & 2 deletions content/changelog/livetemplate.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Changelog"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "CHANGELOG.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Changelog
Expand All @@ -13,6 +13,30 @@ All notable changes to LiveTemplate will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [v0.24.0] - 2026-08-03

### Fixed

- **`ctx.GetBool()` now reads a checkbox on both transports.** It accepted
`bool` and the strings `"true"`/`"false"` — and neither is what a checkbox
actually sends. Over the WebSocket the client serializes a lone checkbox as
`input.checked` (a bool; the `value` attribute is discarded), which worked.
With the client not running, the browser posts the box's `value` attribute —
`"1"`, or `"on"` when it has none — and `GetBool` read `false` for a ticked
box. Since `GetString` does not accept a bool either, no accessor read a
checkbox correctly on both paths, so a handler could not be written once and
stay correct across them — the opposite of what the `progressive_enhancement`
capability promises. `GetBoolOk` now accepts `"1"`/`"on"`/`"true"` as true and
`"0"`/`"off"`/`"false"` as false (case-insensitive), plus numbers in every
width `GetFloatOk` accepts — a numeric-looking hidden input is what the
client's `parseValue()` turns into a number before sending it. `NaN` and
`±Inf` are rejected rather than read as true, and a string that is neither
boolean-shaped nor `1`/`0` (say `"2"`) stays unrecognized rather than being
guessed at. An absent key still reads `(false, false)` — that is how an
unchecked box arrives on the POST path, where it is not submitted at all.
`docs/proposals/patterns.md` has documented `ctx.GetBool()` as the way to read
checkbox state all along.

## [v0.23.0] - 2026-08-02

### Added
Expand Down
8 changes: 4 additions & 4 deletions content/contributing/livetemplate.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Contributing to LiveTemplate Core Library"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "CONTRIBUTING.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Contributing to LiveTemplate Core Library
Expand Down Expand Up @@ -226,7 +226,7 @@ livetemplate/
└── scripts/ # Development scripts
```

For the complete file-by-file map with line counts and dependencies, see [docs/design/CODE_STRUCTURE.md](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/design/CODE_STRUCTURE.md).
For the complete file-by-file map with line counts and dependencies, see [docs/design/CODE_STRUCTURE.md](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/design/CODE_STRUCTURE.md).

**Note:** The client library, CLI tool, and examples are now in separate repositories:
- Client: https://github.com/livetemplate/client
Expand Down Expand Up @@ -528,7 +528,7 @@ Look for issues labeled `good first issue` - these are:
### Learning the Codebase

1. **Start with the Contributor Walkthrough**
- [`docs/guides/new-contributor-walkthrough.md`](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/guides/new-contributor-walkthrough.md) - **START HERE!** Comprehensive guide to the 5-phase architecture with links to all code and tests
- [`docs/guides/new-contributor-walkthrough.md`](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/guides/new-contributor-walkthrough.md) - **START HERE!** Comprehensive guide to the 5-phase architecture with links to all code and tests

2. **Read the architecture docs**
- `CLAUDE.md` - Development guidelines
Expand Down
4 changes: 2 additions & 2 deletions content/guides/ephemeral-components.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Ephemeral Components Guide"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/guides/ephemeral-components.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Ephemeral Components Guide
Expand Down
8 changes: 4 additions & 4 deletions content/guides/observability.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "LiveTemplate Observability Guide"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/guides/OBSERVABILITY.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# LiveTemplate Observability Guide
Expand Down Expand Up @@ -409,6 +409,6 @@ func RequestIDMiddleware(next http.Handler) http.Handler {

## Related Documentation

- [ARCHITECTURE.md](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/design/ARCHITECTURE.md) - System architecture overview
- [internal/observe/](https://github.com/livetemplate/livetemplate/tree/v0.23.0/internal/observe) - Package implementation
- [ARCHITECTURE.md](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/design/ARCHITECTURE.md) - System architecture overview
- [internal/observe/](https://github.com/livetemplate/livetemplate/tree/v0.24.0/internal/observe) - Package implementation
- [Go slog documentation](https://pkg.go.dev/log/slog) - Standard library reference
4 changes: 2 additions & 2 deletions content/guides/progressive-complexity.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Progressive Complexity Guide"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/guides/progressive-complexity.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Progressive Complexity Guide
Expand Down
8 changes: 4 additions & 4 deletions content/guides/scaling.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "LiveTemplate Scaling Guide"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/guides/SCALING.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# LiveTemplate Scaling Guide
Expand Down Expand Up @@ -1869,8 +1869,8 @@ redis_connected_clients{instance="redis1"} > 9000 # 90% of Redis max clients

## Next Steps

- **Roadmap:** See [ROADMAP.md](https://github.com/livetemplate/livetemplate/blob/v0.23.0/ROADMAP.md) for upcoming scaling features
- **Architecture:** See [ARCHITECTURE.md](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/design/ARCHITECTURE.md) for system design
- **Roadmap:** See [ROADMAP.md](https://github.com/livetemplate/livetemplate/blob/v0.24.0/ROADMAP.md) for upcoming scaling features
- **Architecture:** See [ARCHITECTURE.md](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/design/ARCHITECTURE.md) for system design

---

Expand Down
6 changes: 3 additions & 3 deletions content/guides/standard-html-reactivity.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Standard HTML Reactivity"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/guides/standard-html-reactivity.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Standard HTML Reactivity
Expand Down Expand Up @@ -151,7 +151,7 @@ LiveTemplate is inspired by Phoenix LiveView but does not yet cover its full fea
| **Stateful Components** | `LiveComponent` with own lifecycle | Stateless templates only | `{{template}}` invocations work but have no component-level state or event handling. |
| **Streams** | `stream/3` for large lists | Not yet | LiveView streams handle large/infinite lists without keeping all items in server memory. Streaming-range rendering (PRs #366/#368/#369/#370) is the latest step toward this. |
| **JS Commands** | `JS.push`, `JS.toggle`, `JS.show` | Partial | [`lvt-*` reactive attributes](/reference/client-attributes) cover common cases (disable, add/remove class, set attribute) but aren't as composable as LiveView's server-defined JS chains. |
| **Client Hooks** | `phx-hook` lifecycle callbacks | Proposed | [`lvt-hook` proposal](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/proposals/lifecycle-hooks-proposal.md) covers third-party JS library integration; not yet shipped. |
| **Client Hooks** | `phx-hook` lifecycle callbacks | Proposed | [`lvt-hook` proposal](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/proposals/lifecycle-hooks-proposal.md) covers third-party JS library integration; not yet shipped. |
| **Presence** | `Phoenix.Presence` | Not built-in | Can be built on LiveTemplate's session stores; requires manual implementation. |
| **Testing Helpers** | `live/2`, `render_click/3` | Minimal | `AssertPureState` exists; no view-level test DSL. Browser tests use chromedp. |
| **Form Recovery** | Automatic on reconnect | Partial — `lvt-form:preserve` retains specific fields across re-renders | Full automatic recovery on WS reconnection is not yet built in. |
Expand Down
19 changes: 16 additions & 3 deletions content/reference/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Go Library API Reference"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/references/api-reference.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Go Library API Reference
Expand Down Expand Up @@ -278,8 +278,21 @@ Primarily useful in tests. In production, Context is created internally and pass
| `GetString` | `(key string) string` | Get a string value from action data |
| `GetInt` | `(key string) int` | Get an integer value |
| `GetFloat` | `(key string) float64` | Get a float value |
| `GetBool` | `(key string) bool` | Get a boolean value |
| `GetBool` | `(key string) bool` | Get a boolean value — this is the accessor for checkbox state (see below) |
| `Has` | `(key string) bool` | Check if a key exists in action data |

**Reading a checkbox.** Use `GetBool`, not `GetString`. The same box reaches the
handler as a different type depending on how the form was submitted: over the
WebSocket the client sends `input.checked` (a bool — the `value` attribute is
discarded), while a plain POST carries the `value` attribute as a string
(`"1"`, or `"on"` when the input has no `value`). An unchecked box is not
posted at all, so the key is simply absent. `GetBool` accepts all of these and
reads an absent key as `false`, which is what lets one handler serve both
transports:

```go
enabled := ctx.GetBool("notifications") // correct with and without JS
```
| `Get` | `(key string) interface{}` | Get a raw value |
| `Bind` | `(v interface{}) error` | Unmarshal action data into a struct |
| `BindAndValidate` | `(v interface{}, validate *validator.Validate) error` | Bind and validate in one step |
Expand Down
4 changes: 2 additions & 2 deletions content/reference/authentication.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Authentication Reference"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/references/authentication.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Authentication Reference
Expand Down
6 changes: 3 additions & 3 deletions content/reference/client-attributes.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Client Attributes Reference"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/references/client-attributes.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Client Attributes Reference
Expand Down Expand Up @@ -1214,5 +1214,5 @@ form.addEventListener('lvt:pending', (e) => {
- **[Go API Reference](https://pkg.go.dev/github.com/livetemplate/livetemplate)** - Server-side API
- **[Error Handling Reference](/reference/error-handling)** - Validation, error display, client-side handling
- **[Template Support Matrix](/reference/template-support-matrix)** - Supported Go template features
- **[Architecture](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/design/ARCHITECTURE.md)** - System architecture
- **[Architecture](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/design/ARCHITECTURE.md)** - System architecture
- **[Contributing Guide](/contributing/livetemplate)** - How to contribute
6 changes: 3 additions & 3 deletions content/reference/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "LiveTemplate Configuration Guide"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/references/CONFIGURATION.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# LiveTemplate Configuration Guide
Expand Down Expand Up @@ -425,6 +425,6 @@ if err := envConfig.Validate(); err != nil {

## See Also

- [ROADMAP.md](https://github.com/livetemplate/livetemplate/blob/v0.23.0/ROADMAP.md) - Project roadmap
- [ROADMAP.md](https://github.com/livetemplate/livetemplate/blob/v0.24.0/ROADMAP.md) - Project roadmap
- [OBSERVABILITY.md](/guides/observability) - Logging and metrics guide
- [SCALING.md](/guides/scaling) - Scaling recommendations
4 changes: 2 additions & 2 deletions content/reference/controller-pattern.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Controller+State Pattern Reference"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/references/controller-pattern.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Controller+State Pattern Reference
Expand Down
4 changes: 2 additions & 2 deletions content/reference/error-handling.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Error Handling Reference"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/references/error-handling.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Error Handling Reference
Expand Down
16 changes: 8 additions & 8 deletions content/reference/limitations.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
title: "Current Limitations"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/references/current-limitations.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Current Limitations

Known limitations of LiveTemplate, organized by category. Each entry includes the impact, workaround, and current status. For planned improvements, see the [Roadmap](https://github.com/livetemplate/livetemplate/blob/v0.23.0/ROADMAP.md).
Known limitations of LiveTemplate, organized by category. Each entry includes the impact, workaround, and current status. For planned improvements, see the [Roadmap](https://github.com/livetemplate/livetemplate/blob/v0.24.0/ROADMAP.md).

All limitations verified against the current codebase.

Expand All @@ -27,7 +27,7 @@ These Go template constructs trigger a fallback to HTML segmentation, which prod
| `{{block}}` with dynamic template names | Use `{{template "name" .}}` with static names | By design (fallback) |
| `iter.Seq` ranges | Collect iterator to slice before passing to template | Blocked on Go templates |

See [HTML Fallback Coverage](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/roadmap/html-fallback-coverage.md) for test coverage details and [Template Support Matrix](/reference/template-support-matrix) for full Go template feature support.
See [HTML Fallback Coverage](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/roadmap/html-fallback-coverage.md) for test coverage details and [Template Support Matrix](/reference/template-support-matrix) for full Go template feature support.

---

Expand Down Expand Up @@ -102,14 +102,14 @@ Use `ctx.IsHTTP()` to check which transport is active in an action method.
| State cloning JSON round-trip | Per-session cost on first request | Keep state small; subsequent renders are fast (~3 KB, 61 allocs) |
| HTML fallback parsing (3.05% of allocations) | Triggered by unsupported template constructs (see Template Features above) | Improve template construct coverage to reduce fallback frequency |

See [Known Bottlenecks](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/performance/known-bottlenecks.md) for detailed profiling data and optimization history.
See [Known Bottlenecks](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/performance/known-bottlenecks.md) for detailed profiling data and optimization history.

---

## See Also

- [Roadmap](https://github.com/livetemplate/livetemplate/blob/v0.23.0/ROADMAP.md) — Planned improvements and feature timeline
- [Roadmap](https://github.com/livetemplate/livetemplate/blob/v0.24.0/ROADMAP.md) — Planned improvements and feature timeline
- [Session Reference — State Safety](/reference/session#state-safety) — Enforcement layers for state purity and session isolation
- [Template Support Matrix](/reference/template-support-matrix) — Supported Go template features
- [HTML Fallback Coverage](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/roadmap/html-fallback-coverage.md) — Fallback trigger test coverage
- [Known Bottlenecks](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/performance/known-bottlenecks.md) — Performance profiling and optimization
- [HTML Fallback Coverage](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/roadmap/html-fallback-coverage.md) — Fallback trigger test coverage
- [Known Bottlenecks](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/performance/known-bottlenecks.md) — Performance profiling and optimization
6 changes: 3 additions & 3 deletions content/reference/navigate.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Navigate Action Reference"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/references/navigate.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Navigate Action Reference
Expand Down Expand Up @@ -121,7 +121,7 @@ The load-bearing test is `TestNavigateActionReMountsWithNewQueryData` in `naviga
3. Sends `{action: "__navigate__", data: {s: "beta"}}` over the same WS.
4. Confirms the next render flips `Selected` to `"beta"` and bumps `MountCount` to `2` — proving Mount re-ran without any reconnect.

Browser-level chromedp tests live in the lvt repo at `e2e/livetemplate_core_test.go` per the [test strategy](https://github.com/livetemplate/livetemplate/blob/v0.23.0/CLAUDE.md). Both layers must stay green.
Browser-level chromedp tests live in the lvt repo at `e2e/livetemplate_core_test.go` per the [test strategy](https://github.com/livetemplate/livetemplate/blob/v0.24.0/CLAUDE.md). Both layers must stay green.

---

Expand Down
4 changes: 2 additions & 2 deletions content/reference/progressive-complexity.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title: "Progressive Complexity Reference"
source_repo: "https://github.com/livetemplate/livetemplate"
source_path: "docs/references/progressive-complexity-reference.md"
source_ref: "v0.23.0"
source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6"
source_ref: "v0.24.0"
source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378"
---

# Progressive Complexity Reference
Expand Down
Loading
Loading