I'd like to move away from using yesod for the web app, for a number of reasons:

  • It's by far the largest use of TH in git-annex, and TH is of course very painful for the android port, other builds like debian mips that don't currently support TH, etc. (Update: mips does support it now, it seems!)
  • I think it's responsible for at least 50% of the executable size, and I suspect a lot of that is unnecessary bloat for parts of yesod that git-annex doesn't really use.
  • Hamlet constantly annoys me by rejecting any file that contains tabs. Rage
  • Hamlet contains code that's not really haskell, but looks a lot like it. This is a continual frustration when dealing with the hamlet files.
  • I find that Hamlet does not lend itself to being refactored, everything is essentially an IO action with side effects of generating html, so can't really bring proper FP tools to bear.

At the moment, servant seems like the nicest place to end up. Just as type safe as yesod afaik, and very lightweight and simple and rather awesome.

As for the html generation, lucid seems like a good way to do it. Just as fast as hamlet, and pure haskell code.

Game plan:

  1. Upload a yesod-lucid to hackage. (done)
  2. Get servant (done), lucid (done), maybe yesod-lucid, packaged in Debian
  3. Start converting individual yesod Handler Html to Handler LucidHtml. This will ditch the hamlet. This is by far the most work, but it can be done incrementally w/o breaking the build.
  4. Need to find a way to deal with Hamlet widgets that add CS and JS to the page. Hamlet basically serves as a Writer monad to collect the HTML, CS, and JS that widgets add to a page, so a replacement for that would need to be developed.
  5. Once all the hamlet is gone, remove the rest of the yesod stuff and re-implement the routing etc with servant.