- Use `GMainLoop` for the event loop and `g_signal_connect()` for event-driven programming with GObject signals.
- Manage memory with `g_malloc()`/`g_free()` and GLib's reference counting (`g_object_ref`/`g_object_unref`) — never mix with raw `malloc`.
- Use `GHashTable`, `GList`, `GArray` instead of hand-rolled data structures — they handle memory and resizing correctly.
- Use `g_autoptr()` and `g_autofree` macros (GCC/Clang) for automatic cleanup scope-based resource management.
- Use `g_autoptr` and `g_autofree` macros for automatic cleanup of GLib-allocated memory.
- Use `GMainLoop` with `GSource` for event-driven programming — integrate I/O, timers, and idle callbacks.
- Use `g_signal_connect` for event handling in GObject-based applications.
- Use `GError` for error propagation — pass `GError **` out parameters and check before using results.