diff --git a/examples/event.rs b/examples/event.rs
index cb9764c7a6c56727432c516a33825dc9f913f830..0fab3f3edd38d788d02ec568f0fce9453caa6242 100644
--- a/examples/event.rs
+++ b/examples/event.rs
@@ -1,33 +1,33 @@
+use console_log;
+use log::{error, info, Level};
+use wasm_bindgen::JsValue;
+use wasm_sockets;
 use console_error_panic_hook;
-use log::{debug, error, info, trace, warn, Level};
-use std::cell::RefCell;
 use std::panic;
-use std::rc::Rc;
-use wasm_bindgen::prelude::*;
-use wasm_sockets;
 
 fn main() -> Result<(), JsValue> {
     panic::set_hook(Box::new(console_error_panic_hook::hook));
+    // console_log and log macros are used instead of println!
+    // so that messages can be seen in the browser console
     console_log::init_with_level(Level::Trace).expect("Failed to enable logging");
     info!("Creating connection");
 
     let mut client = wasm_sockets::EventClient::new("wss://echo.websocket.org")?;
-    client.set_on_error(Some(Box::new(|e| {
-        error!("{:#?}", e);
+    client.set_on_error(Some(Box::new(|error| {
+        error!("{:#?}", error);
     })));
-    client.set_on_connection(Some(Box::new(|c: &wasm_sockets::EventClient, e| {
-        info!("Connected: {:#?}", e);
-        info!("{:#?}", c.status);
+    client.set_on_connection(Some(Box::new(|client: &wasm_sockets::EventClient, e| {
+        info!("{:#?}", client.status);
         info!("Sending message...");
-        c.send_string("test...").unwrap();
-        c.send_binary(vec![20]).unwrap();
+        client.send_string("Hello, World!").unwrap();
+        client.send_binary(vec![20]).unwrap();
     })));
     client.set_on_close(Some(Box::new(|| {
-        info!("Closed");
+        info!("Connection closed");
     })));
     client.set_on_message(Some(Box::new(
-        |c: &wasm_sockets::EventClient, e: wasm_sockets::Message| {
-            info!("New Message: {:#?}", e);
+        |client: &wasm_sockets::EventClient, message: wasm_sockets::Message| {
+            info!("New Message: {:#?}", message);
         },
     )));
 
diff --git a/examples/polling.rs b/examples/polling.rs
index 8d5029a99696ecb1c1c357e461132039de957ef7..cd40040c5d8f756402230ca0dcf949e6e8804474 100644
--- a/examples/polling.rs
+++ b/examples/polling.rs
@@ -1,11 +1,10 @@
 use console_error_panic_hook;
-use log::{debug, error, info, trace, warn, Level};
+use log::{info, Level};
 use std::cell::RefCell;
 use std::panic;
 use std::rc::Rc;
 use wasm_bindgen::prelude::*;
-use wasm_bindgen_futures;
-use wasm_sockets::{self, ConnectionStatus};
+use wasm_sockets::{self};
 
 fn main() -> Result<(), JsValue> {
     panic::set_hook(Box::new(console_error_panic_hook::hook));
diff --git a/src/lib.rs b/src/lib.rs
index 3e449f438a2d0808249ead6aa7a413d28fae95e6..f40300aa0db73f1c8115bf03f247f5878e41ef8e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,3 +1,81 @@
+//! This crate offers 2 (wasm-only) websocket clients.
+//! The first client offered is the [`EventClient`]. This client is event based and gives you the most control.
+//! ```
+//! use log::{error, info, Level};
+//! use wasm_bindgen::JsValue;
+//! use wasm_sockets;
+//! use console_log;
+//!
+//! fn main() -> Result<(), JsValue> {
+//!     // console_log and log macros are used instead of println!
+//!     // so that messages can be seen in the browser console
+//!     console_log::init_with_level(Level::Trace).expect("Failed to enable logging");
+//!     info!("Creating connection");
+//!
+//!     let mut client = wasm_sockets::EventClient::new("wss://echo.websocket.org")?;
+//!     client.set_on_error(Some(Box::new(|error| {
+//!         error!("{:#?}", error);
+//!     })));
+//!     client.set_on_connection(Some(Box::new(|client: &wasm_sockets::EventClient, e| {
+//!         info!("{:#?}", client.status);
+//!         info!("Sending message...");
+//!         client.send_string("Hello, World!").unwrap();
+//!         client.send_binary(vec![20]).unwrap();
+//!     })));
+//!     client.set_on_close(Some(Box::new(|| {
+//!         info!("Connection closed");
+//!     })));
+//!     client.set_on_message(Some(Box::new(
+//!         |client: &wasm_sockets::EventClient, message: wasm_sockets::Message| {
+//!             info!("New Message: {:#?}", message);
+//!         },
+//!     )));
+//!
+//!     info!("Connection successfully created");
+//!     Ok(())
+//! }
+//! ```
+//! The second client offered is the [`PollingClient`]. This client is ideal for games, because it is designed to be used with a loop.
+//! This client is also much simpler than the [`EventClient`]. However, you can access the main [`EventClient`] that it is using
+//! if you want access to lower level control.
+//! ```
+//! use log::{info, Level};
+//! use std::cell::RefCell;
+//! use std::panic;
+//! use std::rc::Rc;
+//! use wasm_bindgen::prelude::*;
+//! use wasm_sockets::{self};
+//!
+//! fn main() -> Result<(), JsValue> {
+//!     // console_log and log macros are used instead of println!
+//!     // so that messages can be seen in the browser console
+//!     console_log::init_with_level(Level::Trace).expect("Failed to enable logging");
+//!     info!("Creating connection");
+//!
+//!     // Client is wrapped in an Rc<RefCell<>> so it can be used within setInterval
+//!     // This isn't required when being used within a game engine
+//!     let client = Rc::new(RefCell::new(wasm_sockets::PollingClient::new(
+//!         "wss://echo.websocket.org",
+//!     )?));
+//!
+//!     let f = Closure::wrap(Box::new(move || {
+//!         // receive() gives you all new websocket messages since receive() was last called
+//!         info!("New messages: {:#?}", client.borrow_mut().receive());
+//!     }) as Box<dyn FnMut()>);
+//!
+//!     // Start non-blocking game loop
+//!     setInterval(&f, 100);
+//!     f.forget();
+//!
+//!     Ok(())
+//! }
+//! // Bind setInterval to make a basic game loop
+//! #[wasm_bindgen]
+//! extern "C" {
+//!     fn setInterval(closure: &Closure<dyn FnMut()>, time: u32) -> i32;
+//! }
+//! ```
+
 use log::{debug, error, info, trace, warn, Level};
 use std::cell::RefCell;
 use std::rc::Rc;