How can I implement a custom RNN (specifically an ESN) in Tensorflow?

To give a quick summary:

Look in the TensorFlow source code under python/ops/rnn_cell.py too see how to subclass RNNCell. It's usually like this:

class MyRNNCell(RNNCell):
  def __init__(...):

  @property
  def output_size(self):
  ...

  @property
  def state_size(self):
  ...

  def __call__(self, input_, state, name=None):
     ... your per-step iteration here ...

I may arrive a bit late but for anybody trying to do the same, tensorflow-addons added an implementation of ESNCell and ESN layer.