So pleased to see this. Had fun playing with the language but at the time learning OTP seemed a big ask
Those are enough to get started with processes, including setting up two-way connections by sending local PID with the self function so the spawn:ed process knows where to send responses.
GenServer/gen_server is more or less a convenience wrapper around those, that makes more complicated processes easier to design but harder to get started with.