Skip to content

Monocle

All windows occupy the full screen area, stacked on top of each other. Only the focused window is visible. Perfect for distraction-free work.

Layout

Any window count

┌───────────────────────────────────────────────────────────┐
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ [focused window] │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└───────────────────────────────────────────────────────────┘

Other windows are hidden behind the focused window.

Every window gets the same position and size. The focused window sits on top.

Capabilities

  • Adjustable ratio: No
  • Adjustable main count: No
  • Stateful: No

Since windows overlap completely, directional focus does not work. Use next and prev to cycle through windows:

spoon.Shoji:bindHotkeys({
focus_next = { { "ctrl", "alt" }, "n" },
focus_prev = { { "ctrl", "alt" }, "p" },
})

When to use

Monocle layout is ideal for:

  • Focus mode when distractions need to disappear
  • Writing, reading, or single-task work
  • Presentations and demos
  • Temporary maximum screen real estate

Monocle vs macOS native fullscreen

AspectShoji MonoclemacOS Full Screen
Menu barVisibleHidden
DockVisibleHidden
macOS SpaceNormalDedicated
Window switchingFocus hotkeysMission Control
AnimationNoneSlide animation

Shoji monocle is instant and keeps the familiar macOS Space. macOS native fullscreen creates a separate macOS Space with hidden UI.

Picture-in-picture

Toggle individual windows to floating for overlays:

spoon.Shoji:bindHotkeys({
toggle_float = { { "ctrl", "alt", "shift" }, "t" },
})

A floating window appears on top of the monocle layout. Useful for video calls, documentation, or reference material.

Edge-to-edge monocle

By default, gaps apply to monocle windows too. For true edge-to-edge, use the Gaps modifier:

local Modifiers = require("layouts.modifiers")
local Gaps = require("layouts.modifiers.gaps")
local Monocle = require("layouts.monocle")
local trueMonocle = Modifiers.wrap(Monocle, Gaps.create({
inner = 0,
outer = 0,
}), {
name = "true-monocle",
displayName = "True Monocle",
})
spoon.Shoji:configure({
layouts = { trueMonocle },
})