diff --git a/content/changelog/livetemplate.md b/content/changelog/livetemplate.md index 45585bf..d800c61 100644 --- a/content/changelog/livetemplate.md +++ b/content/changelog/livetemplate.md @@ -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 @@ -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 diff --git a/content/contributing/livetemplate.md b/content/contributing/livetemplate.md index 25fbd03..b970a01 100644 --- a/content/contributing/livetemplate.md +++ b/content/contributing/livetemplate.md @@ -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 @@ -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 @@ -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 diff --git a/content/guides/ephemeral-components.md b/content/guides/ephemeral-components.md index 0d0594b..a3c42fe 100644 --- a/content/guides/ephemeral-components.md +++ b/content/guides/ephemeral-components.md @@ -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 diff --git a/content/guides/observability.md b/content/guides/observability.md index b90d2d8..135e7d8 100644 --- a/content/guides/observability.md +++ b/content/guides/observability.md @@ -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 @@ -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 diff --git a/content/guides/progressive-complexity.md b/content/guides/progressive-complexity.md index 3464f96..43997d7 100644 --- a/content/guides/progressive-complexity.md +++ b/content/guides/progressive-complexity.md @@ -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 diff --git a/content/guides/scaling.md b/content/guides/scaling.md index 6bd6605..86ad482 100644 --- a/content/guides/scaling.md +++ b/content/guides/scaling.md @@ -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 @@ -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 --- diff --git a/content/guides/standard-html-reactivity.md b/content/guides/standard-html-reactivity.md index 36aff4c..7a4f0b1 100644 --- a/content/guides/standard-html-reactivity.md +++ b/content/guides/standard-html-reactivity.md @@ -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 @@ -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. | diff --git a/content/reference/api.md b/content/reference/api.md index 07762b3..066e465 100644 --- a/content/reference/api.md +++ b/content/reference/api.md @@ -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 @@ -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 | diff --git a/content/reference/authentication.md b/content/reference/authentication.md index 26c052d..51a3eee 100644 --- a/content/reference/authentication.md +++ b/content/reference/authentication.md @@ -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 diff --git a/content/reference/client-attributes.md b/content/reference/client-attributes.md index a69dacb..864f2ee 100644 --- a/content/reference/client-attributes.md +++ b/content/reference/client-attributes.md @@ -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 @@ -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 diff --git a/content/reference/configuration.md b/content/reference/configuration.md index bb8fe47..3590779 100644 --- a/content/reference/configuration.md +++ b/content/reference/configuration.md @@ -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 @@ -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 diff --git a/content/reference/controller-pattern.md b/content/reference/controller-pattern.md index f7b880d..78a3737 100644 --- a/content/reference/controller-pattern.md +++ b/content/reference/controller-pattern.md @@ -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 diff --git a/content/reference/error-handling.md b/content/reference/error-handling.md index 1e54026..7d3492a 100644 --- a/content/reference/error-handling.md +++ b/content/reference/error-handling.md @@ -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 diff --git a/content/reference/limitations.md b/content/reference/limitations.md index 82d94b2..45ab969 100644 --- a/content/reference/limitations.md +++ b/content/reference/limitations.md @@ -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. @@ -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. --- @@ -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 diff --git a/content/reference/navigate.md b/content/reference/navigate.md index b45e186..3997c30 100644 --- a/content/reference/navigate.md +++ b/content/reference/navigate.md @@ -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 @@ -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. --- diff --git a/content/reference/progressive-complexity.md b/content/reference/progressive-complexity.md index d5ee24e..6d1366b 100644 --- a/content/reference/progressive-complexity.md +++ b/content/reference/progressive-complexity.md @@ -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 diff --git a/content/reference/pubsub.md b/content/reference/pubsub.md index 625a125..bf8c782 100644 --- a/content/reference/pubsub.md +++ b/content/reference/pubsub.md @@ -2,8 +2,8 @@ title: "PubSub Reference" source_repo: "https://github.com/livetemplate/livetemplate" source_path: "docs/references/pubsub.md" -source_ref: "v0.23.0" -source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6" +source_ref: "v0.24.0" +source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378" --- # PubSub Reference @@ -160,7 +160,7 @@ LiveTemplate uses two independent isolation models: ### Session Isolation (State Boundaries) -Handled by the session store and connection registry. All connections with the same `groupID` share the same state instance. Different groups have completely separate state. This is unaffected by pubsub. See [Multi-Session Isolation](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/design/multi-session-isolation.md) for details. +Handled by the session store and connection registry. All connections with the same `groupID` share the same state instance. Different groups have completely separate state. This is unaffected by pubsub. See [Multi-Session Isolation](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/design/multi-session-isolation.md) for details. ### Message Routing Isolation (PubSub) @@ -265,6 +265,6 @@ Grep for `event=topic_action_subscribe_failed` in production logs (the structure - [Server Actions Reference](/reference/server-actions) — `TriggerAction` API - [Session Reference](/reference/session) — Session stores and connection management -- [Multi-Session Isolation](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/design/multi-session-isolation.md) — State isolation model +- [Multi-Session Isolation](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/design/multi-session-isolation.md) — State isolation model - [Scaling Guide](/guides/scaling) — Redis configuration and scaling tiers - [Configuration Reference](/reference/configuration) — Environment variables and WebSocket settings diff --git a/content/reference/server-actions.md b/content/reference/server-actions.md index a982f62..ccaab6e 100644 --- a/content/reference/server-actions.md +++ b/content/reference/server-actions.md @@ -2,8 +2,8 @@ title: "Server Actions Reference" source_repo: "https://github.com/livetemplate/livetemplate" source_path: "docs/references/server-actions.md" -source_ref: "v0.23.0" -source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6" +source_ref: "v0.24.0" +source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378" --- # Server Actions Reference @@ -504,7 +504,7 @@ buffer or replay it. The cookie-bound `groupID` is stable across reconnects, so the *next* `TriggerAction` after the WebSocket comes back will reach the user, but the dispatch that fired during the gap is gone. -This is a deliberate design — see the [TriggerAction reconnect-buffering proposal](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/proposals/triggeraction-reconnect-buffering.md). +This is a deliberate design — see the [TriggerAction reconnect-buffering proposal](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/proposals/triggeraction-reconnect-buffering.md). ### Detecting the gap @@ -585,7 +585,7 @@ Two rules cover the gap: 1. **Push handlers must be idempotent.** A handler that runs once must produce the same final state as one that runs twice. The - [reconnect-during-loading double-fire race documented under Implementation Notes in `patterns.md`](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/proposals/patterns.md#implementation-notes-accumulated-from-completed-sessions) + [reconnect-during-loading double-fire race documented under Implementation Notes in `patterns.md`](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/proposals/patterns.md#implementation-notes-accumulated-from-completed-sessions) makes this concrete: if the client disconnects and reconnects while a goroutine is still sleeping, two goroutines may race to dispatch — both land successfully on the new connection. Idempotent handlers absorb @@ -670,7 +670,7 @@ once-only audit log, paid-API result stream, etc.) the implicit contract is not enough. Open a new issue referencing [#342](https://github.com/livetemplate/livetemplate/issues/342) and describing the exact non-idempotency. The -[buffering proposal](https://github.com/livetemplate/livetemplate/blob/v0.23.0/docs/proposals/triggeraction-reconnect-buffering.md) +[buffering proposal](https://github.com/livetemplate/livetemplate/blob/v0.24.0/docs/proposals/triggeraction-reconnect-buffering.md) captures the design sketch for the durable variant that would solve it, gated on a real use case. diff --git a/content/reference/session.md b/content/reference/session.md index 17940bb..129398c 100644 --- a/content/reference/session.md +++ b/content/reference/session.md @@ -2,8 +2,8 @@ title: "Session Reference" source_repo: "https://github.com/livetemplate/livetemplate" source_path: "docs/references/session.md" -source_ref: "v0.23.0" -source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6" +source_ref: "v0.24.0" +source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378" --- # Session Reference diff --git a/content/reference/template-support-matrix.md b/content/reference/template-support-matrix.md index ee84c85..c18eeb0 100644 --- a/content/reference/template-support-matrix.md +++ b/content/reference/template-support-matrix.md @@ -2,8 +2,8 @@ title: "LiveTemplate Go Template Support Matrix" source_repo: "https://github.com/livetemplate/livetemplate" source_path: "docs/references/template-support-matrix.md" -source_ref: "v0.23.0" -source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6" +source_ref: "v0.24.0" +source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378" --- # LiveTemplate Go Template Support Matrix diff --git a/content/reference/uploads.md b/content/reference/uploads.md index 8479966..2324372 100644 --- a/content/reference/uploads.md +++ b/content/reference/uploads.md @@ -2,8 +2,8 @@ title: "Upload Reference" source_repo: "https://github.com/livetemplate/livetemplate" source_path: "docs/references/uploads.md" -source_ref: "v0.23.0" -source_commit: "8294ce439a46a6a1f92e2a77b8a4978c9e526cc6" +source_ref: "v0.24.0" +source_commit: "5a4633f246e41650479fbbf1b5361d599fe5a378" --- # Upload Reference