Most of the time I prefer *.turbo_stream.erb templates, but for small one-off responses it can be nice to generate streams directly in the controller using Turbo::Streams::TagBuilder. This keeps the logic close to the action and avoids creating a template file just to replace a couple targets. The trick is to render with render turbo_stream: and build operations like replace, append, and remove using a builder initialized with view_context. I use this sparingly—templates are still easier to read when they get big—but it’s great for tiny toggles or “mark read” actions. It also makes it explicit which targets are being manipulated, and it’s easy to unit test at the request level.