diff --git a/init.go b/init.go
deleted file mode 100644
index ff33fb4c60d5e8cb37df6de772a8c2240c4dc60f..0000000000000000000000000000000000000000
--- a/init.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package pixel
-
-import (
-	"github.com/faiface/pixel/pixelgl"
-	"github.com/go-gl/glfw/v3.2/glfw"
-	"github.com/pkg/errors"
-)
-
-// Init initializes Pixel library. Call this function before using any of Pixel's functionality.
-//
-// If the initialization fails, an error is returned.
-func Init() error {
-	err := pixelgl.DoErr(func() error {
-		return glfw.Init()
-	})
-	if err != nil {
-		return errors.Wrap(err, "initializing GLFW failed")
-	}
-	return nil
-}
-
-// MustInit initializes Pixel library and panics when the initialization fails.
-func MustInit() {
-	err := Init()
-	if err != nil {
-		panic(err)
-	}
-}
-
-// Quit terminates Pixel library. Call this function when you're done with Pixel.
-func Quit() {
-	pixelgl.Do(func() {
-		glfw.Terminate()
-	})
-}
diff --git a/run.go b/run.go
new file mode 100644
index 0000000000000000000000000000000000000000..50ae2a589eebb0ac33e6eed792aa29188e756d73
--- /dev/null
+++ b/run.go
@@ -0,0 +1,37 @@
+package pixel
+
+import (
+	"github.com/faiface/pixel/pixelgl"
+	"github.com/go-gl/glfw/v3.2/glfw"
+	"github.com/pkg/errors"
+)
+
+// Run is essentialy the "main" function of Pixel. It exists mainly due to the technical limitations of OpenGL and operating systems,
+// in short, all graphics and window manipulating calls must be done from the main thread. Run makes this possible.
+//
+// Call this function from the main function of your application. This is necessary, so that Run runs on the main thread.
+//
+//   func run() {
+//       window := pixel.NewWindow(...)
+//       for {
+//           // your game's main loop
+//       }
+//   }
+//
+//   func main() {
+//       pixel.Run(run)
+//   }
+//
+// You can spawn any number of goroutines from you run function and interact with Pixel concurrently.
+// The only condition is that the Run function must be called from your main function.
+func Run(run func()) error {
+	err := glfw.Init()
+	if err != nil {
+		return errors.Wrap(err, "failed to initialize GLFW")
+	}
+	defer glfw.Terminate()
+
+	pixelgl.Run(run)
+
+	return nil
+}