Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

LayoutLight

LayoutLight is a small macOS menu-bar utility that makes the active keyboard layout visible without interrupting typing.

It can show the current layout near the text caret, around the focused window, along a screen edge, and as a compact flag overlay when the input source changes.

This is a personal macOS project. Source code is here; signed and notarized DMGs are published on the Releases page when available.

Features

  • Status bar flag — the current input source is shown in the menu bar.
  • Caret indicator — a colored line, square, dot, or underline follows the text caret in supported applications.
  • Window / edge indicator — highlight the focused window with a frame, or show a single edge line similar to ShowyEdge.
  • Language-aware colors — use separate colors for English and Russian indicators.
  • Hotkeys:
    • ⌃ ⌥ ⇧ ⌘ 1 switches to Russian.
    • ⌃ ⌥ ⇧ ⌘ 2 switches to English.
    • ⌃ ⇧ L shows the current language overlay.
  • Auto overlay on switch — briefly shows the current language when the system input source changes.
  • Launch at login — optional startup through macOS Service Management.
  • Localized settings — English and Russian UI.

Install

  1. Download LayoutLight-x.y.dmg from the latest release.
  2. Open the DMG and drag LayoutLight.app to Applications.
  3. On first launch, grant Accessibility access: System Settings -> Privacy & Security -> Accessibility -> enable LayoutLight.
  4. Optional: enable Launch at Login in LayoutLight settings.

Build From Source

Open LayoutLight.xcodeproj in Xcode 16+ and build the LayoutLight scheme.

LayoutLight currently requires macOS 15.5 or later.

Command-line debug build:

xcodebuild -project LayoutLight.xcodeproj -scheme LayoutLight -configuration Debug build

Command-line release build:

xcodebuild -project LayoutLight.xcodeproj -scheme LayoutLight -configuration Release build

Tested on Apple Silicon.

Because the project is intended to be built locally, macOS may ask for Accessibility permission for your locally signed copy of the app.

Permissions

  • Caret and window indicators require Accessibility access because macOS exposes caret and focused-window geometry through Accessibility APIs.
  • Hotkeys and input-source observation use public macOS APIs and do not require extra permissions.
  • LayoutLight does not use networking, analytics, or remote update code.

How Caret Tracking Works

LayoutLight uses two Accessibility paths to find the caret position:

  1. Native Cocoa text fieldsAXSelectedTextRange + AXBoundsForRange.
  2. WebKit / Chromium contentAXSelectedTextMarkerRange + AXBoundsForTextMarkerRange.

The indicator is event-driven: a per-app AXObserver fires on focus and selection changes, with a low-rate fallback poll for apps that do not emit all notifications.

Known Limitations

Application Status Reason
TextEdit, Notes, Mail, Pages, Xcode Works Native Accessibility text geometry
Safari URL bar and web inputs Works Native + text-marker geometry
Chrome, Edge, Arc Works Text-marker geometry
VS Code, Cursor Requires editor.accessibilitySupport: "on" Accessibility is disabled by default unless a screen reader is detected
Slack, Discord Usually works Modern Electron text-marker geometry
Microsoft Word Partial Office Accessibility support is incomplete
Sublime Text Does not work Custom rendering, no text bounds
Terminal.app, iTerm2, Warp Does not work Terminals do not expose text-range bounds
Figma, some JetBrains IDEs Does not work Custom rendering, no text bounds

This is a macOS API limitation: there is no public API to globally recolor the native caret in every application.

Security and Privacy

See SECURITY.md.

License

MIT License. See LICENSE.

About

Утилита для macOS, которая делает текущую раскладку клавиатуры заметной: индикаторы у каретки, рамкой вокруг окна и полосой по краю экрана

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /