I recently based a hobby project on an ESP32. I recently had to get a pacemaker and I made a personal EKG holter monitor that logs to SD with real-time display over wifi. SD was straight forward. Wifi was straight forward. Creating tasks was as straight forward as FreeRTOS makes it. A lot of example code is exceptionally crufty and would be confusing to someone with a lot of experience.
The internal ADC is a steaming pile. In software triggered mode, it intermittently acts as if the external pin isn't electrically connected to the sampling circuit. I was trying to sample very large magnitude 350uS pulses (my pacemaker impulses) sampling at 8Khz, and it would completely miss them half the time. It isn't a bandwidth issue. Sampling a function generated waveform would just look nasty too, regardless of frequency.
I eventually got the poorly documented I2S sample mode running. It doesn't use the same "Real Time Controller" middleman. It picks up all the 350uS pulses reliably now and is "good enough" for my purpose, but it's still rather ugly. I have the I2S oversampling 5x at 40Khz and averaging in software and it looks equally bad, so it might just have laughably bad non-linearity.
I probably spent 30 hours battling that ADC. It is really too bad, because otherwise the ESP32 seems like a great chip.