diff --git a/CHANGELOG.md b/CHANGELOG.md
index a9f109421324fe3876a0fcdabadc8d64e04f1d19..958c75f9196ec450d456da2a124b3eb2b572b1db 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ## [Unreleased]
 - Gamepad API added
 - Support setting an initial window position
+- Support hiding the window initially
+- Support creating maximized windows
 
 ## [v0.10.0-beta] 2020-05-10
 - Add `WindowConfig.TransparentFramebuffer` option to support window transparency onto the background
diff --git a/pixelgl/window.go b/pixelgl/window.go
index 2632c068877d081d49e47ee0013a536a90891248..af1f1a7b4ff39c6197fac14c3a68163b2c98f428 100644
--- a/pixelgl/window.go
+++ b/pixelgl/window.go
@@ -43,10 +43,10 @@ type WindowConfig struct {
 	// specified Monitor.
 	Monitor *Monitor
 
-	// Whether the Window is resizable.
+	// Resizable specifies whether the window will be resizable by the user.
 	Resizable bool
 
-	// Undecorated Window ommits the borders and decorations (close button, etc.).
+	// Undecorated Window omits the borders and decorations (close button, etc.).
 	Undecorated bool
 
 	// NoIconify specifies whether fullscreen windows should not automatically
@@ -68,6 +68,13 @@ type WindowConfig struct {
 	// VSync (vertical synchronization) synchronizes Window's framerate with the framerate of
 	// the monitor.
 	VSync bool
+
+	// Maximized specifies whether the window is maximized.
+	Maximized bool
+
+	// Invisible specifies whether the window will be initially hidden.
+	// You can make the window visible later using Window.Show().
+	Invisible bool
 }
 
 // Window is a window handler. Use this type to manipulate a window (input, drawing, etc.).
@@ -122,6 +129,8 @@ func NewWindow(cfg WindowConfig) (*Window, error) {
 		glfw.WindowHint(glfw.Floating, bool2int[cfg.AlwaysOnTop])
 		glfw.WindowHint(glfw.AutoIconify, bool2int[!cfg.NoIconify])
 		glfw.WindowHint(glfw.TransparentFramebuffer, bool2int[cfg.TransparentFramebuffer])
+		glfw.WindowHint(glfw.Maximized, bool2int[cfg.Maximized])
+		glfw.WindowHint(glfw.Visible, bool2int[!cfg.Invisible])
 
 		if cfg.Position.X != 0 || cfg.Position.Y != 0 {
 			glfw.WindowHint(glfw.Visible, glfw.False)
@@ -477,3 +486,11 @@ func (w *Window) Color(at pixel.Vec) pixel.RGBA {
 func (w *Window) Canvas() *Canvas {
 	return w.canvas
 }
+
+// Show makes the window visible, if it was previously hidden. If the window is
+// already visible or is in full screen mode, this function does nothing.
+func (w *Window) Show() {
+	mainthread.Call(func() {
+		w.window.Show()
+	})
+}