{"id":50543838,"url":"https://github.com/colonelpanic8/hypr-oled-saver","last_synced_at":"2026-06-03T22:01:54.119Z","repository":{"id":355149263,"uuid":"1225858643","full_name":"colonelpanic8/hypr-oled-saver","owner":"colonelpanic8","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-02T05:13:45.000Z","size":26,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-02T06:17:50.756Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/colonelpanic8.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-30T18:04:51.000Z","updated_at":"2026-05-02T05:13:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/colonelpanic8/hypr-oled-saver","commit_stats":null,"previous_names":["colonelpanic8/hypr-oled-saver"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/colonelpanic8/hypr-oled-saver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fhypr-oled-saver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fhypr-oled-saver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fhypr-oled-saver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fhypr-oled-saver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/colonelpanic8","download_url":"https://codeload.github.com/colonelpanic8/hypr-oled-saver/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fhypr-oled-saver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33881107,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-03T02:00:06.370Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-03T22:01:53.405Z","updated_at":"2026-06-03T22:01:54.110Z","avatar_url":"https://github.com/colonelpanic8.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# hypr-oled-saver\n\n`hypr-oled-saver` is an OLED-friendly Hyprland plugin screensaver.\n\nIt renders a black compositor overlay and animated live previews of open\nHyprland windows. Large, dim previews follow staggered accelerating Bezier\ncrossing paths so the display stays mostly black while cycling through real\ndesktop state.\n\nThis is an idle visual, not a lock screen. Use `hyprlock` for locking.\n\n## Build\n\n```sh\nnix build\n```\n\nFor local development:\n\n```sh\ndirenv allow\ncmake -S . -B build\ncmake --build build\n```\n\n## Hyprland\n\nLoad the built plugin from Hyprland, then use the dispatcher:\n\n```conf\nexec-once = hyprctl plugin load /path/to/hypr-oled-saver.so\n\nbind = SUPER, O, hyproledsaver, toggle\n```\n\nDispatcher actions:\n\n```sh\nhyprctl dispatch hyproledsaver start\nhyprctl dispatch hyproledsaver stop\nhyprctl dispatch hyproledsaver toggle\nhyprctl dispatch hyproledsaver activate\nhyprctl dispatch hyproledsaver deactivate\nhyprctl dispatch hyproledsaver present\nhyprctl dispatch hyproledsaver dismiss\n```\n\nIf your Hyprland config layer has trouble passing dispatcher arguments, the\nplugin also registers no-argument dispatchers:\n\n```sh\nhyprctl dispatch hyproledsaverstart\nhyprctl dispatch hyproledsaverstop\nhyprctl dispatch hyproledsavertoggle\nhyprctl dispatch hyproledsaveractivate\nhyprctl dispatch hyproledsaverdeactivate\nhyprctl dispatch hyproledsaverpresent\nhyprctl dispatch hyproledsaverdismiss\n```\n\nLua-based Hyprland configs can call the plugin directly:\n\n```lua\nhl.plugin.hyproledsaver.set_active(true)\nhl.plugin.hyproledsaver.set_active(false)\nhl.plugin.hyproledsaver.is_active()\nhl.plugin.hyproledsaver.activate()\nhl.plugin.hyproledsaver.deactivate()\nhl.plugin.hyproledsaver.present()\nhl.plugin.hyproledsaver.dismiss()\nhl.plugin.hyproledsaver.start()\nhl.plugin.hyproledsaver.stop()\nhl.plugin.hyproledsaver.toggle()\n```\n\nExample Lua bind:\n\n```lua\nbind(main_mod .. \" + O\", function()\n  if hl.plugin and hl.plugin.hyproledsaver then\n    hl.plugin.hyproledsaver.toggle()\n  end\nend)\n```\n\nConfig values use the `hyproledsaver` plugin namespace:\n\n```conf\nplugin:hyproledsaver:background = rgba(000000ff)\nplugin:hyproledsaver:border_color = rgba(46c7d822)\nplugin:hyproledsaver:border_size = 2\nplugin:hyproledsaver:opacity = 0.34\nplugin:hyproledsaver:max_visible = 2\nplugin:hyproledsaver:target_window_area = 0.34\nplugin:hyproledsaver:min_window_scale = 0.55\nplugin:hyproledsaver:max_window_scale = 0.94\nplugin:hyproledsaver:path_duration_ms_min = 35000\nplugin:hyproledsaver:path_duration_ms_max = 70000\nplugin:hyproledsaver:start_stagger_ms_min = 2500\nplugin:hyproledsaver:start_stagger_ms_max = 9000\nplugin:hyproledsaver:curve_strength = 0.28\nplugin:hyproledsaver:path_accel_power = 1.35\nplugin:hyproledsaver:dismiss_on_activity = 1\nplugin:hyproledsaver:activity_grace_ms = 500\n```\n\n## Hypridle\n\nThe plugin intentionally does not own idle policy. Use the plugin API for\nmanual state changes and `hypridle` for idle/resume triggers. Keeping idle\ntiming in `hypridle` avoids duplicating lock/DPMS/inhibitor logic inside the\nplugin.\n\nManual activation still dismisses on activity by default. The plugin listens for\nkeyboard, pointer, and touch input while active, ignores activity for\n`activity_grace_ms` after activation, then dismisses itself and consumes the\nwake input.\n\nFor development, `Escape` and right click always dismiss immediately, bypassing\nthe activation grace period.\n\n```conf\nlistener {\n    timeout = 300\n    on-timeout = hyprctl dispatch hyproledsaverstart\n    on-resume = hyprctl dispatch hyproledsaverstop\n}\n\nlistener {\n    timeout = 600\n    on-timeout = hyprctl dispatch dpms off\n    on-resume = hyprctl dispatch dpms on\n}\n```\n\n## Notes\n\n- Uses Hyprland's compositor internals to snapshot window contents.\n- Cycles large previews along staggered, non-straight Bezier crossing paths.\n- Keeps the background pure black for OLED friendliness.\n- The old standalone GTK layer-shell prototype is kept in `src/standalone.cpp`\n  for reference, but the primary build artifact is now the Hyprland plugin.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcolonelpanic8%2Fhypr-oled-saver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcolonelpanic8%2Fhypr-oled-saver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcolonelpanic8%2Fhypr-oled-saver/lists"}