2.2 KiB
ema
ema is a WIP next-gen Haskell static site generator that is change-aware. In addition to static site generation, it provides a live server that hot-reload's on code or data change.
The ultimate goal of ema is to make it possible to easily implement your own neuron, or just about any app that creates a browser view of arbitrarily changing data (on disk, database, or whatever). ema is designed to facilitate creation of apps whose data is normally edited via traditional mechanisms (eg: text editor) but rendered as a delightful web page - so as to provide an economical read-only view, of your data, on desktop & mobile.
The simplest ema app looks like this:
main :: IO ()
main = do
let name :: Text = "Ema"
runEmaPure $
encodeUtf8 $ "<b>Hello</b>, from " <> name
Quick Preview
If you have Nix installed with Flakes, give Ema a test-drive by running it to serve its own documentation:
PORT=8000 nix run
Hacking
Run bin/run
(or Ctrl+Shift+B in VSCode). This runs the clock example; modify ./.ghcid
to run a different example.
TODO
- MVP
- Implement hot reload, and ditch browser-sync
- server to client refresh
- client to server reconnect (on ghcid reload, or accidental client disconnect)
- or, investigate https://hackage.haskell.org/package/ghci-websockets
- Multi-websocket-client support
- Static site generation mode
- add common examples,
- filesystem watcher
- docs site for self (w/ sidebar and possibly even search)
pre-announce,
- CLI UX (opts, logging, etc.)
- How to serve non-generated files (css, img, etc.)
- Publish Data.LVar to Hackage
- documentation (howto)
doc notes,
- hot reload fast, morphdom
- html templates + tailwind for fast style feedback
- use async:race to avoid ghcid ghosts
- at most one ws client supported right now
- tailwind + blaze-html layout (BlazeWind?) for no-frills getting started
- dealing with errors
- messaging re: hakyll
- safer/ simpler routes system
- bring your own templates / DSL
- message cmp: svelte
- SSE