{"id":15687165,"url":"https://github.com/64kramsystem/pm-spotlight-old","last_synced_at":"2026-03-05T09:32:59.671Z","repository":{"id":42011015,"uuid":"114693679","full_name":"64kramsystem/pm-spotlight-old","owner":"64kramsystem","description":"Linux (Poor man's) Spotlight clone","archived":false,"fork":false,"pushed_at":"2022-04-18T17:55:39.000Z","size":90,"stargazers_count":10,"open_issues_count":3,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-08-12T06:41:23.196Z","etag":null,"topics":["desktop-search","gui","linux","ruby","spotlight","tk"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/64kramsystem.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}},"created_at":"2017-12-18T22:24:32.000Z","updated_at":"2023-10-09T04:36:09.000Z","dependencies_parsed_at":"2022-08-12T02:20:26.273Z","dependency_job_id":null,"html_url":"https://github.com/64kramsystem/pm-spotlight-old","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/64kramsystem/pm-spotlight-old","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/64kramsystem%2Fpm-spotlight-old","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/64kramsystem%2Fpm-spotlight-old/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/64kramsystem%2Fpm-spotlight-old/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/64kramsystem%2Fpm-spotlight-old/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/64kramsystem","download_url":"https://codeload.github.com/64kramsystem/pm-spotlight-old/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/64kramsystem%2Fpm-spotlight-old/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30117715,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T08:19:04.902Z","status":"ssl_error","status_checked_at":"2026-03-05T08:17:37.148Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["desktop-search","gui","linux","ruby","spotlight","tk"],"created_at":"2024-10-03T17:44:25.065Z","updated_at":"2026-03-05T09:32:59.593Z","avatar_url":"https://github.com/64kramsystem.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Poor Man's Spotlight (Ruby version; old)\n\nPMsS is a minimal desktop search service for Debian/Ubuntu machines, designed to simply open files/directories, without any indexing.\n\n![Example](/extra/example.png?raw=true)\n\n## Status\n\nDue to limitations of the project as it had been developed, I've written a [new (Rust) version](https://github.com/64kramsystem/pm-spotlight).\n\nThe Ruby problems were:\n\n1. Ruby was not well-suited to run GUI programs; due to its non-parallel nature, intensive background threads caused the GUI thread to lag noticeably\n2. Ruby-Tk is not well maintained (the last version, 0.4.0, was unstable)\n3. Ruby-Tk was very slow to start (on two machines I've tested)\n4. System-wide programs are better packaged as executable, rather than Ruby programs (that require version management)\n\nPoint 1 should be solved by running background tasks via [Ractor](https://docs.ruby-lang.org/en/3.0/Ractor.html), which didn't exist when this project was developed.\n\nPoint 2 and 3 should be solved by changing the GUI library to [FXRuby](https://github.com/larskanis/fxruby), which, when I wrote the project, had a showstopper bug (it has probably been fixed later).\n\nPoint 4 is not a big deal, but a single executable is a much more solid solution, and it can't be achieved in Ruby (even if possible, it'll likely make the startup slow; additionally, Ruby packers are not popular anymore - the most common has been discontinued).\n\nMy current plan is to rewrite this project with updated versions of Ruby and FXRuby (which solve the problems 1-3), and publish an article about writing GUIs in the two languages.\n\n## Usage\n\nThe user types the global hotkey (typically, `Super+space`), which will open a widget; by typing a string (e.g. `game`), a list of matching files/directories will be dynamically presented (e.g. the file `game_of_life.md` and the directory `my_games`); they can be opened by scrolling with the arrows and clicking enter.\n\nThe search locations are configured by the user in the configuration file.\n\n## Installation\n\nPMsS requires a Ruby interpreter with Tcl/Tk support; on Ubuntu, the easiest way is to use the BrightBox precompiled ruby interpreter:\n\n```sh\n$ sudo add-apt-repository -y ppa:brightbox/ruby-ng\n$ sudo apt install ruby2.3-tcltk\n```\n\nCurrently, versions 2.0 to 2.3 are available.\n\nAfter this, execute the following from the PMsS directory:\n\n```sh\nbundle install\nutils/configure.sh\n```\n\nBy default, PMsS will search in the `Desktop` directory, and the top-level directories of `$HOME`.\n\n## Configuration\n\nAfter executing the configuration script, one should configure the search paths, which are configured in \"$HOME/.spotlightd\"; this is an example:\n\n```\nsearch_paths=Desktop:studies:/home/myuser{1}:/usr/local/src\nskip_paths=Desktop/temp_dir\n```\n\nThe format is:\n\n- when a path doesn't start with `/`, it is relative to the home dir\n- in order to enforce a certain search depth, place it a the end of a path, between curly braces, e.g. `/home/myuser{1}` will find files and directories under `/home/myuser`, but won't recursively search inside the directories.\n\nThe above example will:\n\n- include `$HOME/Desktop` and its subdirectories\n- include `$HOME/studies` and its subdirectories\n- include `$HOME` top-level files, without recursion; for example, `$HOME/games` will be included, but not `$HOME/games/metroid`\n- include `/usr/local/src` and its subdirectories\n- skip `Desktop/temp_dir`\n\n## Design\n\nThe purpose of this project is, beside my personal usage, to provide an example for Ruby simple GUIs development, and message-based concurrent programming.\n\n### Architecture\n\nPMsS's architecture has been inspired by the microservices philosophy, and Golang; it's a shared-nothing composition of independent services (running in threads), which communicate via messages sent through pipes:\n\n- `GlobalManager`: initializes/coordinates the services\n  - `CommandsListener`: listens for GUI commands (show/quit)\n  - `SearchService`: listen for patterns; sends the list of matching files\n    - `FindSearch`: the current search backend, which uses `find`\n  - `TkInterface`: listens for GUI commands and for find results; sends patterns typed by the user\n\nThis gives significant advantages (for example, services can be swapped trivially, as long as they respect the messaging protocols), but also some complexities (at least a basic message brokering needs to be implemented).\n\n### GUI Toolkit\n\nTk has been used because years ago, when I wrote this tool, I tried all the other GUI frameworks, and they had limitations (e.g. Shoes 3 was missing a listener) and/or bugs (e.g. FXRuby had a showstopper bug). Things may have changed in the meanwhile (FXRuby fixed the crucial bug after some time; Shoes 3 may have developed the missing listener).\n\nThe GUI toolkit will be replaced in the future with something easier to install, and possibly better documented (Tk has a very nice tutorial, but it misses threading information, for which there is little information around).\n\n### Other\n\nThis project is in my `script` category (no public users and little complexity), therefore has no testing, although I use it very frequently.\n\nFor my testing practices, see other projects, like [Spreadbase](https://github.com/saveriomiroddi/spreadbase) and [Geet](https://github.com/saveriomiroddi/geet).\n\n## Plan\n\nPlans are provided through GibHub issues.\n\nLong-term plans are:\n\n- review the GUI toolkits, and switch if another GUI toolkit provides easier packaging\n- package as gem\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F64kramsystem%2Fpm-spotlight-old","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F64kramsystem%2Fpm-spotlight-old","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F64kramsystem%2Fpm-spotlight-old/lists"}