Here are some points I'd like to emphasize in addition to the threads above, with the disclaimer that I'm the maintainer of Fay.
Fay tries to be very simple, the code base is small (~4800 LoC). This really lowers the entry barrier for contributions which I think is very important for open source projects. GHCJS is much more complicated since it tries to do so much. For GHCJS I'd be afraid that the developers might eventually abandon the project and then it'd be pretty hard to take over development. Much easier for someone to take over Fay development. I think you can safely expect to find bugs in all compilers, and if you do and you are in a hurry you might have to fix it yourself. Fay has very simple output that is close to both Haskell and JavaScript so it's pretty easy to just add a breakpoint and start debugging.
Even if GHCJS can successfully compile most of hackage, would we want to have these as dependencies in web projects? An output size of 1MiB is nothing when compiling a binary, but for a public website 1MiB can still be quite a lot, add some transitive dependencies and output will explode. Most people don't optimize their packages to have few dependencies, which makes sense since the abstraction usually heavily outweighs code size. So either way you would probably want to write some specific light-weight versions of libraries you want to use, that's one reason both GHCJS and Fay have their own base packages.
One place I think GHCJS can shine is for non standard web applications such as WEBGL games. Nothing stopping you from using Fay for this, but I expect you can really start to leverage GHCJS's threaded runtime here.
I'm not sure if GHCJS or Haste have any out of the box solutions for doing client<->server communication. In Fay you can just serialize any data type automatically on the front and backend to a json format and then deserialize it automatically again on the other end. You can also leverage phantom types (
https://github.com/fpco/yesod-fay/blob/master/Language/Fay/Yesod.hs#L41) to typecheck this communication.
It's hard to know how well GHCJS performs in a real web application. FP Complete uses Fay for their IDE and School of Haskell so it has been battle tested, so if you want something that definitely works today I think Fay is the more reliable option.
It is possible that GHCJS will eventually supercede Fay. But if you want something that's easy to use today you can always write Fay, and then convert it to GHCJS later since Fay is a subset of Haskell.
I think GHCJS needs more time to prove itself. I know the developers are hard at work and I hope they will focus on a lot of learning materials. Once you can `cabal install ghcjs` and just get started I think they will see a lot more interest coming their way.
Let me know if you have more questions. If you decide to use Fay in your tutorial I'd be happy to help out, just send me an e-mail!
- Adam