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
Navigation
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
| Aspect | Shoji Monocle | macOS Full Screen |
|---|---|---|
| Menu bar | Visible | Hidden |
| Dock | Visible | Hidden |
| macOS Space | Normal | Dedicated |
| Window switching | Focus hotkeys | Mission Control |
| Animation | None | Slide 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 },})