Every time I added AI to a React app, I rewrote the same 200+ lines. Streaming loop. Manual message history. Tool call orchestration. Error handling. setIsLoading(false) only if I remembered.

After the third project I stopped and asked: why is nobody solving this the way RTK Query solved REST APIs?

So I built Strand (https://github.com/strand-js/strand).

Before

const [messages, setMessages] = useState([])