Yes, Convex queries using useSuspenseQuery with convexQuery will auto-update on the client.
In your example, the loader is used to prefetch the data (using ensureQueryData) for faster client-side navigation, but the actual subscription and live updates happen in the component via useSuspenseQuery(convexQuery(api.messages.list, {})). This means that after the initial render (which can use the prefetched data), the component will stay subscribed to the query and receive live updates as the underlying data changes in Convex.
This is explicitly described in the Convex documentation:
Using TanStack Start and Query with Convex makes it particularly easy to live-update Convex queries on the client while also server-rendering them. useSuspenseQuery() is the simplest way to do this
In the browser all Convex query subscriptions present a consistent, at-the-same-logical-timestamp view of the database: if one query result reflects a given mutation transaction, every other query result will too.
Convex TanStack Start docs
So, even though the loader is used for preloading, the query in the component will auto-update thanks to the subscription established by useSuspenseQuery. The loader does not prevent auto-updating; it just ensures the data is available immediately on navigation.
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: