I made this while trying to understand operational transforms from http://www.codecommit.com/blog/java/understanding-and-applying-operational-transformation and https://github.com/fitzgen/erl-ot/blob/master/src/ot.erl. I'm not sure if the client logic is the same because I can't read Erlang. This code seems to work but I didn't know anything about OT until this morning so I wouldn't necessarily use this. I'm just putting it here so I don't lose it.
The server is a dumb server that consists of a list of commands and a sequence number. It only accepts commands from clients that build off that sequence number. If a client's change is rejected, the client has to transform its changes and try again. That way all of the expensive integration work is done on the client and the server is very lightweight.