* Would using a snapshot-based revision control system like Git be an
option? If yes, you could use the [filestore] library.
* Another option is to run an insertion-only relational model on
really any database system you want like PostgreSQL. There is
nothing about preserving history that needs special handling to be
efficient.
* Yet another option is to model your application state with history
and use [acid-state]. However, acid-state only makes an in-memory
Haskell value (the "database") persistent with ACID guarantees. If
you mostly work with the current state, keeping the whole history in
memory all the time would be a waste. Therefore this option may be
less useful.