I haven't used it yet, but at a cursory glance, there's probably some overlap, and some unique features to both. This is what stuck out to me.
Common:
1. Turbo Frame; looks very much like `up-target` and `up-hungry` combined.
2. Turbo Stream; as far as the websocket portion is concerned, nothing built-in to Unpoly 1 but some people have done it with their own Websocket/SSE/setTimeout+up.reload. Unpoly 2 will have up-poll which will be simpler from an operational point of view (no need to worry about websocket upgrades on the lb), but at the sacrifice that there's a delay for updates. For the append/prepend feature, up-target has supported pseudo selectors for a while (ie. :after, :before), so there's some similarity here. Both replace and remove on Turbo can be simulated on Unpoly by just replacing the parent element or a parent of that element (to remove).
Unique to Unpoly:
1. Unpoly 2's infinite layer support seems like it will be incredibly more powerful, but you might be able to "fake it" with turbo-frame and re-rendering the same thing over and over (similar to Unpoly 1).
2. Unpoly 2's structured communication from the server.
Unique to Hotwire:
1. Native bindings for iOS and Android; I'm curious to see how deep these go and if they are something we could duplicate for Unpoly.
2. Frame specific caching levels (unique TTL per frame, etc). I find this one interesting as well, but we do have _some_ control of this through Unpoly but its not incredibly granular at this point.
Adam