This is the part I thought about the most. Folia splits the world into regions that are processed in parallel, with no single main thread in the classic sense. A block's data may only be touched by the thread that owns its region. A plugin that calls the old Bukkit scheduler simply crashes on this model.
So I wrote BlackTimber for Folia from the ground up. Since the break event already runs on the thread that owns the log, a normal tree is felled in place without ever crossing a thread boundary. When a fell is very large, say a giant sequoia, I spread the work across ticks with the region scheduler. A fixed number of logs is broken each tick so that no single region stalls.
I also took care not to allocate needlessly on the hot path. Block types are checked through cached tags, the search walks a single ArrayDeque, and visited positions are packed into one long. I did not set up a database to remember the logs a player places either; the positions sit in the chunk's own data container (the chunk PersistentDataContainer). They are written to disk with the chunk, so they survive even when the server restarts.