Omahub
← All plugins
C

OmaMotion

by Christopher Garay

Visual motion studio for Hyprland animations: edit every animation leaf, draw bezier curves by hand, and watch a live preview before anything touches your config.

Security review

No obvious issues detected

Deterministic scan — not a security guarantee

None
Risk level
None
Analyzed commit
d914499
Scanned
1 month ago

No potentially dangerous behavior detected in the analyzed commit.

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

None
AI risk level
None
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
d914499
Reviewed
1 month ago

The plugin is a well-engineered QML editor for Hyprland animation settings. It writes only to a fenced block in the user's looknfeel.lua, uses a guarded file helper with fixed PATH, O_NOFOLLOW, bounded reads, and atomic renames, and validates all preset data. No obfuscation, hidden persistence, credential theft, or destructive behavior was found.

How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/cgaray/omarchy-omamotion --enable
Appearance #Hyprland #bar #quickshell

OmaMotion

OmaMotion is an Omarchy shell plugin for editing Hyprland animation settings. It provides a preset picker, a simple editor, an advanced editor, a curve editor, and a live preview.

OmaMotion studio OmaMotion bar picker

Install

omarchy plugin add https://github.com/cgaray/omarchy-omamotion.git --enable --yes

Open OmaMotion from the application menu or bind it directly:

o.bind("SUPER + SHIFT + M", "OmaMotion", "omarchy-shell shell toggle io.github.cgaray.omamotion")

Remove it with:

omarchy plugin remove io.github.cgaray.omamotion --yes

The plugin does not change Hyprland configuration during removal. Use Reset all first to remove OmaMotion's managed animation block.

Bar Picker

The bar widget provides the Instant, Snappy, Balanced, Smooth, and Playful presets. Click a preset to apply it. Right-click the widget to open the studio. Saved custom presets are also available in this menu.

For a manual installation, enable the widget with:

omarchy plugin enable io.github.cgaray.omamotion right

Editors

Simple mode uses labels such as Window opens, Panel fades out, Fast, and Slide. Advanced mode exposes every animation leaf, curve selection, raw style tokens, and custom curves.

The preview supports window and layer open, close, move, and layer modes. It also shows two workspace panes and uses stacked panes for vertical workspace styles. The preview is an approximation of the compositor.

Custom Presets

Use Save current preset in the studio. A preset contains the current animation state and curve library. The bar picker previews and applies saved presets.

Presets are stored as validated JSON in:

~/.config/omarchy/plugins/io.github.cgaray.omamotion/presets.json

The file is limited to 32 presets and 64 KiB. Presets contain data only; they cannot contain commands or executable hooks.

Configuration

OmaMotion owns one fenced block at the end of:

~/.config/hypr/looknfeel.lua

Only the content between these markers is rewritten:

-- >>> omamotion managed block >>>
-- <<< omamotion managed block <<<

Content outside the block is preserved. Reset removes the block. State reading uses a literal parser and does not evaluate the user's Lua configuration.

OmaMotion never opens any file directly. Every file it reads or writes — the config, its backup, the preset store, and the launcher entry — goes through one helper, so nothing follows symlinks, blocks, or reads unbounded, and the helper resolves its own tools from a fixed PATH. Reads open with O_NOFOLLOW|O_NONBLOCK and stop just past the 1 MiB limit. Saves are staged in a sibling temporary file, given the live file's permission bits, checked for a complete byte count, and only then renamed over the original — so an interrupted save cannot truncate the config. The file being replaced is snapshotted, after the stage is verified, to:

~/.config/hypr/looknfeel.lua.omamotion.bak

Restore backup in the studio puts that copy back. The snapshot is written by rename, never by redirection, so a symlink planted at that predictable path is replaced rather than followed. A failed save leaves the snapshot alone, so an aborted write never destroys the recovery point. A config or backup that is a symlink, a fifo, or not a regular file is refused rather than followed, and a looknfeel.lua larger than 1 MiB is neither parsed nor rewritten; the editor reports the file and leaves it alone.

Because nothing watches the file, the studio reads it when it opens and the bar picker when its menu opens, rather than live.

Hyprland watches looknfeel.lua, so saved changes apply live. The QML preview is separate from the compositor and is intended for visual comparison.

Managed Settings

Section Leaves
Global global
Windows windows, windowsIn, windowsOut
Layers layers, layersIn, layersOut, fadeLayersIn, fadeLayersOut
Fades fadeIn, fadeOut, fade, fadeSwitch
Workspaces workspaces
Chrome border

Theme colors are not edited. Omarchy's theme system owns them.

Launcher Integration

The service installs a desktop entry at:

~/.local/share/applications/omamotion.desktop

The entry contains an X-OmaMotion-Managed=true marker. The service only updates or removes an entry carrying that marker.

Requirements

  • Omarchy 4 with omarchy-shell
  • Hyprland 0.56 or newer with Lua configuration support
  • No external runtime dependencies

Development

Run the local checks before submitting changes:

qmllint *.qml
node tests/preset-store.test.js
node tests/config-writer.test.js
omarchy plugin validate .

License

MIT. See LICENSE.