- Use `uv_loop_t` as the central event loop — never block it with synchronous I/O or CPU-heavy work.
- Handle all libuv callbacks asynchronously; use `uv_queue_work()` for blocking operations to offload to the thread pool.
- Always call `uv_close()` on handles before freeing them — skipping this causes memory leaks and dangling callbacks.
- Use `uv_tcp_t` for TCP servers and `uv_pipe_t` for IPC; prefer `uv_stream_t` abstractions for protocol-agnostic code.
- Structure code around the event loop: register callbacks, run the loop, clean up handles on close.
- Use `uv_handle_t` lifecycle correctly: init → start → stop → close → free.
- Never block the event loop — use `uv_queue_work` for CPU-bound work and `uv_fs_*` for async file I/O.
- Use `uv_async_t` for thread-safe signaling between worker threads and the event loop.